我最近开始使用网络和 tcp/ip。RFC 793 文档告诉校验和由以下部分组成:伪标头+tcp 标头+tcp 有效负载+零(如果不能被 16 整除)。所以我必须取 16 位片段并将它们相加。最后一个补码到结果上。我已经捕获了一个简单的通信,服务器多次ping客户端。
Device: lo
Number of packets: 900
Filter expression: port 8080
Packet number 1:
IP Header length : 20
From: 127.0.0.1
To: 127.0.0.1
Protocol: TCP
Len : 101 CLen: 101
Seq: 1812084491
Ack: 818336762
Src port: 8080
Dst port: 45336
Payload (35 bytes):
00000 81 21 34 32 5b 22 6d 65 73 73 61 67 65 22 2c 7b .!42["message",{
00016 22 67 72 65 65 74 69 6e 67 22 3a 22 70 69 6e 67 "greeting":"ping
00032 22 7d 5d "}]
CRC: 0100101111111110
Packet number 2:
IP Header length : 20
From: 127.0.0.1
To: 127.0.0.1
Protocol: TCP
Len : 66 CLen: 66
Seq: 818336762
Ack: 2399287051
Src port: 45336
Dst port: 8080
Payload empty
CRC: 0010100011111110
Packet number 3:
IP Header length : 20
From: 127.0.0.1
To: 127.0.0.1
Protocol: TCP
Len : 101 CLen: 101
Seq: 2399287051
Ack: 818336762
Src port: 8080
Dst port: 45336
Payload (35 bytes):
00000 81 21 34 32 5b 22 6d 65 73 73 61 67 65 22 2c 7b .!42["message",{
00016 22 67 72 65 65 74 69 6e 67 22 3a 22 70 69 6e 67 "greeting":"ping
00032 22 7d 5d "}]
CRC: 0100101111111110
Packet number 4:
IP Header length : 20
From: 127.0.0.1
To: 127.0.0.1
Protocol: TCP
Len : 66 CLen: 66
Seq: 818336762
Ack: 2986489611
Src port: 45336
Dst port: 8080
Payload empty
CRC: 0010100011111110
Packet number 5:
IP Header length : 20
From: 127.0.0.1
To: 127.0.0.1
Protocol: TCP
Len : 101 CLen: 101
Seq: 2986489611
Ack: 818336762
Src port: 8080
Dst port: 45336
Payload (35 bytes):
00000 81 21 34 32 5b 22 6d 65 73 73 61 67 65 22 2c 7b .!42["message",{
00016 22 67 72 65 65 74 69 6e 67 22 3a 22 70 69 6e 67 "greeting":"ping
00032 22 7d 5d "}]
CRC: 0100101111111110
我注意到数据包 1、3、5 的 CRC 是相同的。为什么这样?我认为序列号不同,因此 crc 也必须不同。
如果发送 TCP 数据包,校验和究竟是什么时候计算的,如何触发层进行计算?(在通过网络发送数据包之前将校验和设置为 0?)