【发布时间】:2015-10-08 19:39:16
【问题描述】:
我需要按照http://www.faqs.org/rfcs/rfc1071.html 中的说明计算 IP 数据包的校验和。
我已经有以下代码:
#!/usr/bin/python
import struct
data = "45 00 00 47 73 88 40 00 40 06 a2 c4 83 9f 0e 85 83 9f 0e a1"
# a test for the checksum calculation
def _checksum(data):
#calculate the header sum
ip_header_sum = sum(struct.unpack_from("6H", data))
#add the carry
ip_header_sum = (ip_header_sum & 0xFFFF) + (ip_header_sum >> 16 & 0xFFFF)
#invert the sum, python does not support inversion (~a is -a + 1) so we have to do
#little trick: ~a is the same as 0xFFFF & ~a
ip_header_sum = ~ip_header_sum & 0xFFFF
return ip_header_sum #should return 0 if correct
data = data.split()
data = map(lambda x: int(x,16), data)
data = struct.pack("%dB" % len(data), *data)
print " ".join(map(lambda x: "0x%02x" % ord(x), data))
print "Checksum: 0x%04x" % _checksum(data)
它适用于我用wireshark捕获的包,它应该有正确的校验和,因此应该评估为0
不幸的是,结果是 0x6524。 有趣的是,对于每个正确的数据包,结果总是 0x6524...
谁发现了错误?
已编辑以使错误更清晰 *第二次修改*
【问题讨论】:
-
Python 说:
NameError: global name 'a' is not defined。你是说ip_header_sum = ~ip_header_sum & 0xFFFF吗? -
是的,抱歉。现已更正。
标签: python network-protocols checksum