Networking can';t计算TCP校验和并获得wireshark中的结果
我试图计算tcp数据包的校验和,但无法获得与wireshark捕获的数据包相同的值 原始捕获的数据包是: “6c f0 49 e8 a3 0d 24 b6 fd 52 40 cb 08 00 45 00 28 02 22 40 00 80 06 00 00 0a 2a 00 1c 1f 0d 5a 24 ca 7d 01 bb 3f 44 f8 6e 6c 83 75 20 50 10 02 83 91 00” 正如我在wireshark中看到的: 前14个字节是ETH。 之后(在IP部分)有12个字节的“头长度”、“DSCP”、“总长度”、“标识”、“片段偏移量”、“TTL”、“协议”、“头校验和”。 然后有4个字节的IP src和4个字节的IP dst(这是IP报头中唯一对计算重要的字节)。 剩下20个字节的TCP头(没有数据) 我创建了用于计算的新数据包,其伪头的形式如下: IPsrc/IPdst/保留(0x00)/协议(0x06)/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” 将tcp校验和字段归零(根据wireshark的0x8391)会得到: “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” 计算新数据包上的校验和得到的值为0xcc45,该值与原始数据包中的值(0x8391)不同Networking can';t计算TCP校验和并获得wireshark中的结果,networking,tcp,checksum,Networking,Tcp,Checksum,我试图计算tcp数据包的校验和,但无法获得与wireshark捕获的数据包相同的值 原始捕获的数据包是: “6c f0 49 e8 a3 0d 24 b6 fd 52 40 cb 08 00 45 00 28 02 22 40 00 80 06 00 00 0a 2a 00 1c 1f 0d 5a 24 ca 7d 01 bb 3f 44 f8 6e 6c 83 75 20 50 10 02 83 91 00” 正如我在wireshark中看到的: 前14个字节是ETH。 之后(在IP部分)有1
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 00”
def随身携带添加(a、b):
c=a+b
返回(c&0xffff)+(c>>16)
def校验和(msg):
s=0
对于范围内的i(0,len(msg),2):
w=ord(msg[i])+(ord(msg[i+1])您的测试数据总长度是55个字节,应该是14(ETH)+20(IP)+20(TCP)。这并不是说它太长了,因为它与0x8391校验和不匹配。但是,IP协议字节(0x06-TCP)IP偏移量9仍然存在。IP源地址似乎不太可能:0.10.40.0
“which got me”部分以“0a 2a”开头,它是IP源地址的第二个和第三个字节。因此,让我们假设此地址之前的三个零字节实际上应该是两个零字节。如果这是正确的,我们仍然在正确的轨道上
到目前为止,12字节的TCP伪头是:IPsrc/IPdst/0x00/0x06/TCP长度(0x0014)(没有TCP头)。TCP校验和是通过:伪头+TCP头+TCP数据计算的。但是您的测试数据只使用伪头和TCP头数据,TCP数据本身丢失
我没有真正检查您的Python代码,但我没有看到任何明显的问题。主要问题似乎是计算中缺少TCP有效负载数据。TCP校验和与OSI无关。有一个RFC为TCP校验和提供C代码。如果您没有使用它,您应该这样做,因为您都没有提供你自己的代码,甚至没有指定一种语言,都不可能看到这个问题实际上是关于什么的。
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)