如果数据包完全由零组成,则 ICMP/Internet 校验和

如果数据包完全由零组成,则 ICMP/Internet 校验和

我们目前正在调查不同设备的一个奇怪行为:如果我们发送“空”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大约三个小时npingnmap,我终于确定了以下几点:Windows 可以正确计算校验和,而其他系统基本上都做不到。当你有一个全为 0 的数据包时,你应该得到一个校验和 0xffff (来源),但我 ping 过的每台 linux/BSD 机器都返回了 0x0000 的校验和。我认为这只是因为许多服务器上的校验和计算方式存在错误。

相关内容