ICMP回显校验和

15

当需要计算包含数据部分的ICMP回显请求或回复的校验和时,如果数据部分大小可变且无法预先确定数据大小,该如何操作?

以下是有关如何计算ICMP头部校验和的文档

ICMP头部校验和。16位。 ICMP消息的一's补码和的一's补码(从ICMP类型字段开始)。在计算校验和时,应首先将校验和字段清除为0。当数据包被传输时,计算校验和并插入此字段。在接收数据包时,再次计算校验和并与校验和字段进行验证。如果两个校验和不匹配,则发生错误。

3个回答

14
当发送方计算校验和时,该值被插入到零字段中。接收方然后执行相反的操作,它提取出校验和,将该字段设置为零并使用此字段计算校验和。它将计算出的值与提取的值进行比较。
传输的双方都使用零字段计算校验和。
更新
如何执行此计算的示例存在于此Scribd presentation上,从幻灯片44开始。我还包括下面相关的示例幻灯片。

图9.19显示了一个简单回显请求消息(参见图9.14)的校验和计算示例。我们随机选择标识符为1,序列号为9。将消息分成16位(2字节)字。将这些字相加,然后取补码。现在,发送方可以将此值放入校验和字段中。

Ping Checksum calculation

你需要将ICMP报文头和数据拆分成16位字(使用0x0000作为校验和字段),获取这些字的总和,然后获取总和的一补数。然后将这个一补数插入到校验和字段中。

我认为此时更好的问题是,你如何解析数据包?数据包数据应该是你的数据包解析的一部分。这将给你数据的大小。 - Andy
我该如何找出数据的长度? - Rose Perrone
你需要剥离数据包头和ICMP头。这样就可以留下ICMP负载供你使用了。 - Andy
最大尺寸为[65507](https://dev59.com/WmDVa4cB1Zd3GeqPhd-W) - Andy
1
发送方计算校验和的描述是正确的。但对于接收方来说,它要简单得多:它不必提取校验和,将其设置为零,计算校验和并将其与提取的值进行比较。接收方只需在整个icmp数据包上计算校验和。如果结果为0,则一切正常。这是因为发送方在数据包中包含了反转的校验和。 - Grandswiss
显示剩余4条评论

4
您可以通过从IP头中的“总长度”字段中减去IP头的大小来计算ICMP消息的长度。

有任何证据吗? - Incerteza
一个ICMP数据包由IP头和ICMP消息组成。RFC 792将总长度字段描述为“互联网头和数据的八位字节长度。”对于ICMP数据包,数据是ICMP消息。 - Rose Perrone
哦,我以为你在谈论校验和。但是你的问题是关于校验和的。 - Incerteza

2
请记住,在IPv6中,IPv6头的伪头部也包括在校验和计算中。在IPv4中不会这样做,因为头部已经对自身进行了校验和计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接