我们目前正在调查不同设备的一个奇怪行为:如果我们发送“空”ICMP 数据包(即 ICMP-SEQ 和 ICMP-ID 为 0x0000 且没有 ICMP 有效负载),例如使用
nping --icmp --icmp-seq=0 --icmp-id=0 8.8.8.8
那么不同的系统会有不同的答复:
- 华硕路由器、Windows 7 PC、Fritz!Box、Kali Linux 盒子,全部回复校验和0xFFFF,根据 wireshark 的说法是正确的
- 然而,8.8.8.8 和 heise.de (193.99.144.80) 都回复了0x0000,被wireshark标记为错误。
我很确定我也在 8.8.8.8 中看到过 0xFFFF,但我目前无法重现这一点。
那么,我的问题是:
- 对于仅由零组成的数据包,正确的互联网校验和是多少
- 如果数据包通过 NAT 中继(即通过我们的路由器中继),这种行为是否会有所不同?
注意:此 ICMP 数据包符合 RFC 792 的规定
附言:我希望 serverfault 是提问的正确论坛。如果不是,我提前道歉 ;)
答案1
在研究了tcpdump
大约三个小时nping
后nmap
,我终于确定了以下几点:Windows 可以正确计算校验和,而其他系统基本上都做不到。当你有一个全为 0 的数据包时,你应该得到一个校验和 0xffff (来源),但我 ping 过的每台 linux/BSD 机器都返回了 0x0000 的校验和。我认为这只是因为许多服务器上的校验和计算方式存在错误。