某次和一个兄弟吃饭,他问了我这么一个问题: 一个 NAT 路由器,LAN 口地址为192.168.1.1/24,接了三台电脑PC1、PC2、PC3;WAN 口地址为192.168.2.1/24,接了一台电脑PC4,已知 WAN 口出去的报文,源 IP 地址都被转换为192.168.2.1。若 PC1-3 同时 ping PC4,在 WAN 口上(或者 PC4上)抓取 ICMP 报文,怎么确定某个 ICMP 报文究竟属于是 LAN 口哪个电脑发出的?
久了未学习网络的相关知识,当时确实没想起怎么确定。后来兄弟给出了答案:ICMP 包含在 IP 数据报中,网络传输过程中, IP 头里面的 Identification 字段不会发生变化,因此可以通过该字段确定 ICMP 报文是哪个电脑发出来的,在 PC1-3 上也同时抓取 ICMP 报文,然后使用 Identification 字段对比即可。
关于 Identification 字段。该字段占 16 bit,IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为 IP 是无连接服务,因此数据报不存在按序接收的问题。那么该字段究竟有什么用?当一个数据报长度过长,超过网络 MTU 而需要分片时,则把标识字段的值复制到所有分片数据报中,最后在目的设备才能依据标志字段而正确的重组数据报,因此该字段可以唯一标识某个 IP 报文。