本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!
首先确定搜索关键字:use python to verify TCP Checksum
查看《TCP/IP详解:卷1》{Page 26}
IP数据报的“首部校验和”字段是根据IP首部计算出的校验和,它不对首部后面的数据进行计算。
ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据的校验和。
为了计算一份数据报的IP校验和,首先把校验和字段置为0。然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在校验和字段中。
ICMP、IGMP、UDP和TCP都采用相同的校验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段。在RFC 1071中有关于如何计算Internet检验和的实现技术;在RFC 1141中有一个很有效的方法。
使用Python实现:
#!/usr/bin/env python
# coding=utf-8
import struct
data = "45 00 00 47 73 88 40 00 40 06 a2 c4 83 9f 0e 85 83 9f 0e a1"
def carry_around_add(a, b):
c = a + b
return (c & 0xffff) + (c >> 16)
def checksum(msg):
s = 0
for i in range(0, len(msg), 2):
w = ord(msg[i]) + (ord(msg[i+1]) << 8)
s = carry_around_add(s, w)
return ~s & 0xffff
data = data.split()
data = map(lambda x: int(x,16), data)
data = struct.pack("%dB" % len(data), *data)
print ' '.join('%02X' % ord(x) for x in data)
print "Checksum: 0x%04x" % checksum(data)
参考链接: