TCP 校验和计算

网络工程 tcp 传输协议 第 4 层 校验和
2022-02-19 05:23:49

我最近开始使用网络和 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?)

1个回答

想想看。16 位校验和只有 65,536 个唯一值,因此在多个段上重复校验和值是相当普遍的。对于不同的段有效负载,您所拥有的不会是不寻常的。

源 TCP 在创建分段时计算校验和,而目标 TCP 在接收分段时计算校验和。校验和是一种简单的方法,可以让人确信段中没有沿路径发生任何变化。您可以拥有几乎无限数量的不同段,但只有 64K 不同的校验和值。

如果发送 TCP 数据包,校验和究竟是什么时候计算的,如何触发层进行计算?(在通过网络发送数据包之前将校验和设置为 0?)

您的操作系统实际上所做的在这里是题外话。


顺便说一句,ping 使用 ICMP 回显请求和回复,因此您实际上并没有 ping。