Appearance
题目
假设路由器实现 NAT 功能,内网中主机 H 的 IP 地址为 192.168.1.5/24。若 H 运行某应用向 Internet 发送一个 UDP 报文段,则路由器在转发封装该 UDP 报文段的 IP 数据报的过程中,UDP 报文的首部字段会被修改的是( )。
Ⅰ. 源端口号 Ⅱ. 目的端口号 Ⅲ. 总长度 Ⅳ. 校验和
错因
A
源端口号(Ⅰ)会改判对了,但总长度(Ⅲ)会改判错——NAT 工作于 IP 层,对 UDP 应用数据零字节修改,UDP 长度字段(首部 + 数据的字节数)恒定不变。错的根源:把 IP 数据报总长度(IP 头里的 Total Length 字段,确实可能因 IP 头变化而调整)和 UDP 报文的总长度字段混淆了——题面问的是后者。
C
把方向搞反了——以为 NAT "把对方端口改成自己分配的"。实际 NAT 是给本机出去的报文打 NAT 标签,记录"内网某 IP:端口 ↔ 公网某端口"的映射,所以源端口(Ⅰ)才是改的对象,目的端口(Ⅱ)保持不变(对端服务还是通过原有目的端口接收)。
D
同时犯了两个错:① 把目的端口(Ⅱ)当作 NAT 修改对象(应该是源端口);② 关于校验和(Ⅳ)需要重算这部分思路是对的——但配上错的 Ⅱ 仍然不对。
总解析
第一步:理清 NAT/NAPT 在 IP 层和传输层各做什么
| 层 | NAT 修改 | NAT 不改 |
|---|---|---|
| IP 层 | 源 IP(私网→公网);IP 头校验和(必重算) | 目的 IP、TTL(仅 -1)、协议号 |
| UDP 头 | 源端口(NAPT 端口复用);UDP 校验和(伪首部含源 IP,必重算) | 目的端口、UDP 长度 |
第二步:逐项核对 UDP 首部 4 个字段
UDP 首部共 8 字节,4 个字段:
| 字段 | 是否会被 NAT 修改 | 原因 |
|---|---|---|
| Ⅰ 源端口号 | 会 | NAPT 用公网 IP 的端口复用对应内网各连接,必然改写源端口(如 192.168.1.5:5000 → NAT 公网 IP:60001) |
| Ⅱ 目的端口号 | 不会 | NAT 不知道(也不关心)对端服务的端口语义,原样转发 |
| Ⅲ 总长度 | 不会 | UDP 数据载荷未变 → UDP 报文长度(首部 + 数据)保持不变 |
| Ⅳ 校验和 | 会 | UDP 校验和的"伪首部"包含源 IP、目的 IP、协议号、UDP 长度。源 IP 改写后伪首部值变了,校验和必须重算 |
第三步:核对
会被修改的字段是 Ⅰ 源端口 + Ⅳ 校验和,命中选项 B。
最终答案是 B。
编者注(知识延伸):UDP 校验和的"伪首部"是 UDP/TCP 校验和算法里一个跨层概念——为了让传输层校验和也能验证 IP 头的关键字段(源 IP、目的 IP),UDP/TCP 计算校验和时虚构出一段不存在于真实报文里的"伪首部"(含源 IP + 目的 IP + 协议号 + UDP 长度),把它和 UDP 头 + 数据一起做反码求和。这是为什么 NAT 改了源 IP 后,UDP 校验和必须重算——伪首部里的源 IP 变了。