我使用这行
打包了一个结构n = len(pkt)
two_bytes = struct.unpack("%sH" % (n/2), pkt)
chksum = sum(two_bytes)
现在我正在使用校验和计算功能,该功能以一种方式解包数据包,即校验和所在的16位(packet_checksum)被删除。但我不知道它是如何做到的,总和功能实际上做了什么?加起来不同的元素?:
{{1}}
代码运作良好我只是想知道它是如何工作的。
答案 0 :(得分:0)
您似乎正在尝试创建ICMP数据包,然后为其计算校验和。为此,您应该使用pack
执行校验和的初始0
,而不是尝试将其删除。然后,您可以按如下方式提取每个WORD:
for x in xrange(0, len(packet), 2):
print struct.unpack("H", packet[x:x+2])[0]
这假设您的数据包是偶数个字节,因此如果长度为奇数,您可能会暂时为计算添加额外的0。
注意,ICMP校验和不是将这些添加在一起的简单情况,它需要一个补码和。有关详细信息,请参阅以下answer。