1. 主机内部的端口
- 在一台主机上,每个网络应用(浏览器、SSH 客户端、游戏等)都会绑定一个“源端口”(通常是 1024–65535 之间的临时端口),操作系统内核借此区分不同的进程/连接。
- 当 A 进程想和 B 服务器通信时,它选一个源端口(如
12345),目标是服务器的 IP+端口(如180.101.49.11:443)。
Outbound Packet (from PC A):
源 IP: 192.168.1.100
源端口: 12345 ← A 进程的端口
目 标 IP: 180.101.49.11
目标端口: 443
2. NAT 路由器的“重写”动作
-
接收:路由器收到这个发往互联网的数据包。
-
修改源地址和源端口:
- 把源 IP
192.168.1.100→ 换成公网 IP123.45.67.89 - 把源端口
12345→ 换成一个路由器随机/预分配的外网端口,比如60001
- 把源 IP
-
记录映射表:
内网 (IP:Port) ↔ 外网 (IP:Port) 192.168.1.100:12345 ↔ 123.45.67.89:60001 -
转发:把修改后的包发到互联网。
3. 流量返回时的处理
当互联网服务器把响应发回 123.45.67.89:60001,路由器:
- 查表:发现这条记录对应内网
192.168.1.100:12345 - 还原包头:把目的 IP/端口从
123.45.67.89:60001改回192.168.1.100:12345 - 转发到主机:内核看到目标端口
12345,就交给发起请求的进程。
4. 为什么要改端口?
- 如果不改端口,多个内网主机同时用同一个源端口(比如都用
12345),路由器就无法区分哪个包给哪台机器/进程。 - 通过改成不同的外网端口,路由器就能一一对应,每个连接都有唯一的外网
(IP, Port)。
5. 重点回顾
-
路由器并不“为每个连接启动进程”,它只是在内存里维护一张“内网 IP:端口 ↔ 外网 IP:端口” 的映射表。
-
真正的进程端口(如
12345)只在主机内部被使用,路由器只是在转发时改写包头而已。 -
端口始终是“端到端”的概念:
- 主机看的是“内网 IP + 原端口”,
- 互联网看的是“公网 IP + 新端口”。
这样就解决了“多台机器共享一个公网 IP 时,如何正确区分不同进程/连接”的问题。希望这个梳理能让你对 NAT 中端口转换的全过程更加清晰!
这种映射表应该会很大,因为一台电脑可能会和不同服务器建立连接,然后局域网中又有多台电脑
在 NAT 路由器中维护的映射表确实可能很大,因为:
- 一台内网电脑可能同时访问多个公网服务器(浏览器开多个标签页、微信、QQ、Steam等);
- 每一个 TCP/UDP 连接(或“会话”)都需要单独映射一条记录;
- 局域网里有多台设备,每台都在做这些连接。
✅ 映射表的实际规模举例
假设你有 10 台电脑
每台电脑:
- 浏览器开 10 个网页(10 个连接)
- 正在用微信(5 个连接)
- 正在打游戏(3 个连接)
- 还有系统更新、NTP 校时等后台请求(2 个连接)
总连接数 ≈ 10 × (10 + 5 + 3 + 2) = 200 条连接映射记录
这还只是比较轻量的场景。比如公司网络有 100 台设备,那就成了几千条甚至上万条连接。
✅ NAT 路由器是怎么应对的?
1. 使用哈希表 / 哈希映射数据结构
- 路由器通常使用高效的数据结构(如哈希表)来维护这张表,查找/插入/删除都在常数时间复杂度完成;
- 映射项按五元组索引:
源内网IP + 源端口 + 目标IP + 目标端口 + 协议(TCP/UDP)
2. 端口重用范围大
- 路由器有 65535 个端口(除去保留的一部分),大多数用于 NAT 分配。
- 在一个公网 IP 下,可以同时维护几万个不同的
(公网IP:端口)映射。
3. 设置连接超时清理
-
路由器会定期清理长期不活动的连接,释放资源。
协议 空闲连接超时时间(常见) UDP 30~60 秒(无状态协议) TCP 300 秒(5 分钟)或更久
所以如果一个连接建立后长时间没数据传输,就会被 NAT 表清理掉。
4. 大型企业或运营商使用“会话容量更大的设备”
- 普通家用路由器支持几千到几万个 NAT 映射;
- 企业级防火墙/路由器(如 Cisco、华为设备)可支持百万级连接。
✅ 总结
- NAT 映射表确实会变大,尤其是局域网设备多、访问频繁的时候;
- 但现代路由器通过高效算法和超时清理机制来应对;
- 所以哪怕一台主机同时连接多个服务、局域网中设备众多,只要 NAT 设备容量足够,都能正常运作。
1662

被折叠的 条评论
为什么被折叠?



