无法计算TCP校验和得到的结果为Wireshark的
我试图计算TCP数据包的校验和,我不能得到相同的值使用Wireshark无法计算TCP校验和得到的结果为Wireshark的
原始捕获捕获的数据包包是: “6c f0 49 e8 a3 0d 24 b6 fd 52 40 cb 08 00 45 00 00 28 02 22 40 00 80 06 00 00 00 0a 2a 00 1c 1f 0d 5a 24 ca 7d 01 bb 3f 44 f8 6e 6c 83 75 20 50 10 01 02 83 91 00 00“
正如我在wireshark中看到的: 前14个字节是ETH。然后(在IP部分)有12个字节的“标题长度”,“DSCP”,“总长度”,“标识”,“片段偏移量”,“TTL”,“协议”,“头校验和”。 然后有4个字节的IP-src和4个字节的IP-dst(这是IP报头中唯一对计算很重要的字节)。 我们剩下20个字节的TCP报头(无数据)。
我创建了新的分组用于与在形式伪报头中的计算: IPsrc/IPdst /保留(0×00)/协议(0×06)/ TCP-长度(0x0014)/ TCP报头
哪给我: “0a 2a 00 1c 1f 0d 5a 24 00 06 00 14 ca 7d 01 bb 3f 44 f8 6e 6c 83 75 20 50 10 01 02 83 91 00 00”
清零tcp校验和字段(0x8391根据wireshark)获得: “0a 2a 00 1c 1f 0d 5a 24 00 06 00 14 ca 7d 01 bb 3f 44 f8 6e 6c 83 75 20 50 10 01 02 00 00 00 00”
在新的数据包计算校验了我的价值:0xcc45这是一个比原始数据包differen(0x8391)
data="0a 2a 00 1c 1f 0d 5a 24 00 06 00 14 ca 7d 01 bb 3f 44 f8 6e 6c 83 75 20 50 10 01 02 00 00 00 00"
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)
我在做什么错?
您的总测试数据长度为55个字节,应该是14(ETH)+20(IP)+20(TCP)。这并不是说它只有一个字节太长,因为它与0x8391校验和不匹配。但是,IP协议字节(0x06-TCP)在IP偏移9处仍然存在。 IP源地址似乎不太可能:0.10.40.0。
'找到我'的部分从'0a 2a'开始,它是IP源地址的第二个和第三个字节。所以让我们假设这个地址应该实际上是两个零字节之前的三个零字节。如果这是正确的,我们仍然在正确的轨道上。
12个字节的TCP伪标头是:IPsrc/IPdst/0x00/0x06/TCP-长度(0x0014)(没有TCP标头),到目前为止这么好。 TCP校验和通过以下方式计算:伪头+ TCP头+ TCP数据。但是,您的测试数据只使用伪报头和TCP报头数据,TCP数据本身缺失。
我没有真正检查你的Python代码,但我没有看到任何明显的问题。主要问题似乎是计算中缺少TCP有效负载数据。
TCP校验和与OSI没有任何关系。有一个RFC为TCP校验和提供了C代码。如果你没有使用它,你应该是这样的,既然你既没有提供你自己的代码,也没有指定一种语言,就不可能看到这个问题实际上是什么。 – EJP