🌐 第三章 网络间的通用语言TCP/IP
📄 一句话概括

私有地址出了围墙就是废纸(3.13 结论),所以路由器必须在边界上当场改名换姓:出站时把包头的源地址换成自己的全局地址,同时在表里记下"谁换成了谁";回程时按那张表把目标地址换回去。这台路由器做的事就是 NAT——本节把它翻译的每一个动作拆开看。

📝 与上一节的关系

3.13 讲的是"两种地址怎么衔接",NAT 是那节的配角;本节是它的放大镜版——只讲 NAT 自己:怎么改、改哪几个字段、有几种做法、付什么代价。

一、NAT 要解决的问题

一句话:地址不够用,但大家都得能上网。

NAT 最早出现在 1994 年(RFC 1631),当时只当成临时应急方案——结果成了 IPv4 能活到今天的关键。所以它是"工程上的续命术",不是网络设计之初的本意(第四部分会讲它的代价)。

💡 一个前提:NAT 只发生在边界

内网里两台设备互相通信,不经过 NAT——因为地址在同一个网段里都有意义(收 3.8:同段靠交换机直接送)。只有跨过私有/全局这条线时,才需要翻译。

二、翻译的完整过程

出站:改源地址 + 记一笔

内网设备 192.168.1.101 想访问网站服务器 198.51.100.7:443:

步骤 发生了什么
1 设备发出包:源 192.168.1.101:50000 → 目标 198.51.100.7:443
2 包到达路由器,路由器一看源地址是私有段——这个地址上不了互联网
3 把源 IP 换成 WAN 口的全局地址 203.0.113.5,同时把源端口换成一个自己指定的新端口 40000
4 在 NAT 会话表里记一笔:192.168.1.101:50000 ↔ 203.0.113.5:40000
5 把包转发出去;IP 首部校验和必须重算(改了首部就得重算,收 3.7)

为什么连端口也要换? 因为不同设备的源端口可能撞车(两台电脑恰好都用了 50000)。如果不换端口,路由器就无法从回包的目的端口判断该给谁——所以它干脆给每条会话分发一个自己管理的新端口。这正是 NAPT 的本质(3.3 的"IP 找楼、端口找房",在边界上的实战)。

回程:查表还原

服务器回包,目标写的是 203.0.113.5:40000(它压根不知道内网的存在):

  1. 包到达路由器,拿目的端口 40000 去查 NAT 表
  2. 命中记录 → 把目标 IP 和端口换回 192.168.1.101:50000
  3. 转发给内网设备
  4. 设备收到后毫无察觉——它以为自己一直在和服务器直接对话
📝 出去改"源",回来改"目标"

这一条最容易记混:出站改源地址,回程改目标地址。因为对路由器来说,"是谁发出来的"和"该交给谁"是同一个身份的两个方向——表里那一行就是把这个身份的两副面孔绑在一起。

表项的寿命:会老化

NAT 表不是永久表,每条记录都有超时时间,长时间没有流量就自动删除:

协议 常见老化时间
TCP 几分钟到几小时(看设备,常见的默认值在 300 秒 ~ 2 小时之间)
UDP 明显更短,常见 30 秒 ~ 3 分钟

这条能解释两个日常现象: - 挂了很久的网页,点一下要重新加载——TCP 连接和 NAT 表项一起超时了 - UDP 打洞要发"保活包"——因为 UDP 表项几十秒就没了,不续命洞就塌了

三、NAT 的三种形态

(对应上面那张对照图)区别就在"谁跟谁配对":

类型 配对方式 典型用途
静态 NAT 一对一,人工写死 内网有台服务器要对外提供服务时,给它一个固定的公网号
动态 NAT 多对多,从地址池里临时借 手上有几个公网号,谁先出网就借给谁,用完还回去
NAPT / PAT 多对一,靠端口区分 家用和小办公室路由器实际在用的就是这种,几十台设备共用一个公网号

术语别混: - NAT = 广义的"地址转换"(三种都算 NAT) - NAPT(Network Address Port Translation)= 端口也一起换,也叫 PAT、IP 伪装

家用路由器在设置页里写"NAT"、写"端口映射",实际干的是 NAPT——因为只有一个公网 IP。

💡 端口转发就是"手工写一条固定的 NAPT 表项"

3.13 说的端口转发,本质上就是跳过"自动记表"这一步,人工先把表项写好:公网:8080 ↔ 192.168.1.200:80,长期有效。所以它才允许外网主动连进来——表里已经有那条记录了。

四、NAT 的代价:换来的是"够用",付出的是"不透明"

代价一:端到端原则被打破

互联网最初的设计是任何两台设备都能直接对话(收 1.4:网络的网络,谁也不该被拦在外面)。NAT 在中间插了一道"必须有记录才放行"的关卡,"外 → 内"的主动连接就断了。

代价二:有些协议会卡在墙外

协议 撞墙原因
FTP 主动模式 服务器要回头主动连客户端,被 NAT 拦下(改用被动模式可绕开)
SIP / IP 电话 地址信息写在数据里(应用层),NAT 只改 IP 头,改不到内容里的那串地址
P2P / 游戏联机 双方都在内网,谁也没法主动连谁 → 需要 NAT 打洞(UPnP、STUN/TURN,3.13 提过)

为了救这类协议,专门的设备/软件会做 ALG(应用层网关):把数据里的地址也翻一遍。但 ALG 规则复杂、易出错,现在已经不流行——主流方案是让协议自己去适应 NAT。

代价三:地址藏在应用层,NAT 看不见

NAT 只能操作它看得懂的包头(IP 头、TCP/UDP 头)。如果某个协议把 IP 地址放进了数据部分,NAT 是两眼一抹黑的——这就是代价二的根因。

代价四:校验和要重算

改了 IP 头 → IP 首部校验和必须重算;改了端口 → TCP/UDP 校验和也要重算(TCP 校验和会把源/目的地址、端口一起算进去)。所以路由器在这里并不是"顺手改两个字",而是要重算两处校验和——这是台台路由器都在做的开销。

代价五:排查变难

同一个内网地址,在不同时刻可能对应不同的公网端口。查日志时"这两个会话到底是不是同一台设备"常常对不上——这也是为什么企业排障时更希望有真实地址。

五、那 IPv6 呢?——NAT 的"退休方案"

IPv6 有 128 位地址,多到能给地球上每一粒沙子都发一个。地址不再短缺 → 端到端原则可以恢复,理论上不再需要 NAT。

但要记两条现实: 1. 现实中仍有 NAT66(少见),多是出于管理习惯而非地址短缺 2. 没有 NAT ≠ 没有防火墙——IPv6 时代边界上照样要有防护设备

一句话记住定位:NAT 是 IPv4 地址不够用的续命方案,不是网络该有的样子。 它做得很好,但它是"补丁"。

六、动手 Demo28:给 NAT 做一次体检

  1. 看翻译发生在哪一跳 tracert -4 www.baidu.com 第一跳通常是 192.168.1.1(自家路由器)——NAT 就在这一跳发生。出了第二跳地址就进入运营商段,再也看不到私有地址(收 3.7 Demo21)。

  2. 看自己刚出去的端口 netstat -an | findstr ESTABLISHED 本机侧显示的全是私有地址 + 一个高位端口(49152~65535 这一段是系统分配的"临时端口")。那个端口就是 NAT 表里"内网侧"的那一列。

  3. 看路由器怎么管这件事 进路由器管理页,找 NAT / 端口转发 / 虚拟服务器 / 连接数 这几栏:

  4. 端口转发 / 虚拟服务器:手工写死表项(静态配对)
  5. NAT 会话数 / 连接数:能看到现在有多少条会话在这台路由器里活着
  6. UPnP:开着的话,应用能自己申请开洞(游戏、下载工具爱用)
  7. DMZ:把某台内网设备完全暴露到公网——最危险的一个开关,非必要别开

  8. 30 秒实验:看表项老化

    打开几个网页,跑一遍 netstat -an | findstr ESTABLISHED,记下条数和几个端口号。

    然后什么都不做,静置 5~10 分钟,再跑一遍——条数会变少,之前记下的端口有几个已经消失了。 消失的那几条就是"TCP 连接 + NAT 表项一起超时"的结果。

    这也顺便解释了为什么有些网站在你离开一会儿后需要重新登录——不是网站把你踢了,是连接从根上断了。

  9. (可选)从外面敲自己家的门

    用手机流量(不要连 Wi-Fi)访问自家公网 IP 的某个端口,比如 http://你的公网IP:8080——打不开。

    因为 NAT 表里没有这条记录,路由器直接把包丢了(3.13 的"出站容易入站难")。这就是那句"外面默认进不来"的实物证据。

❓ 自测一下
  1. 私有地址为什么不能直接上互联网?NAT 是怎么绕过这个限制的?
  2. 出站和回程,NAT 分别改包的哪个字段?
  3. 为什么 NAT 连端口也要换?
  4. 内网两台电脑互相发消息,会不会经过 NAT?为什么?
  5. NAT 表项会不会一直留着?这对 UDP 打洞意味着什么?
  6. 三种 NAT 的区别是什么?家用路由器用的是哪种?
  7. 端口转发和"自动的 NAT"是什么关系?
  8. NAT 改了包头,为什么必须重算校验和?要重算几处?
  9. IPv6 普及之后还需要 NAT 吗?

答案: ① 因为私有地址不在互联网上被路由,运营商不认。NAT 在边界上把私有地址临时"顶替"成全局地址,回程再换回来,让内网设备借用一个公网号出门。 ② 出站改源地址(+源端口),回程改目标地址(+目标端口)——改的是同一个身份的两副面孔。 ③ 因为不同设备的源端口可能撞车,且多台设备要共用一个公网地址。换端口后,路由器才能靠"目的端口"这个唯一编号判断回包该给谁。 ④ 不会。同网段通信靠交换机直接送(3.8),地址在网内都有意义;只有跨过私有/全局边界才需要翻译。 ⑤ 不会,有超时老化:TCP 几分钟到几小时,UDP 明显更短(几十秒到几分钟)。所以 UDP 打洞必须定期发保活包续命。 ⑥ 静态 NAT 一对一固定配对(服务器对外服务);动态 NAT 多对多从池里临时借;NAPT 多对一靠端口区分。家用路由器用的是 NAPT(端口复用/IP 伪装)。 ⑦ 端口转发 = 手工预写一条固定的 NAT/NAPT 表项。因为表里已有记录,外网主动连进来就不再被丢——这正是它能让外部访问内网的原因。 ⑧ IP 首部校验和是给头部算的,改了源/目标地址就必须重算;TCP/UDP 的校验和把地址和端口也纳入计算,所以改端口还得再重算一次。共两处。 ⑨ 理论上不再需要(地址够用,端到端可恢复),现实中仍有极少数的 NAT66,但防火墙该有还是有。记住 NAT 是 IPv4 的续命补丁,不是设计本意。

常见误区:

  1. ❌ "NAT 就是路由器" → 路由器是一个设备角色,NAT 只是它的一项功能;NAT 也可以由专门的设备或软件来承担
  2. ❌ "NAT 只改源地址" → 出站改源、回程改目标,两个方向改的不是同一个字段
  3. ❌ "内网设备知道自己的地址被换了" → 完全不知道。NAT 对通信两端都是透明的:服务器只看到路由器,设备只看到服务器
  4. ❌ "NAT 表一旦建立就永久有效" → 有超时老化,UDP 尤其短。这也是"挂久了要重连"的原因
  5. ❌ "改了地址,TCP 校验和不用管" → 必须重算,而且IP 头和 TCP 头两处都要重算
  6. ❌ "有 NAT 什么协议都能穿" → FTP 主动模式、SIP、P2P 都可能卡住,需要 ALG 或打洞(3.13 的 UPnP 就是干这个的)
  7. ❌ "NAT 是安全设备" → 它的"挡"是副产物(3.13 讲过)。DMZ 一开、端口转发一加,内网就暴露了——安全性跟 NAT 无关
  8. ❌ "IPv6 来了 NAT 立刻消失" → 理论上不需要,现实中仍有少数 NAT66;而且没有 NAT 不等于没有防护

七、下一步学什么

相关笔记