Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking can';t计算TCP校验和并获得wireshark中的结果_Networking_Tcp_Checksum - Fatal编程技术网

Networking can';t计算TCP校验和并获得wireshark中的结果

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

我试图计算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)不同

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)