TCP计算校验和

TCP calculate checksum

我正在尝试计算以下数据包的校验和: A TCP packet captured with wire shark

但我从未设法获得正确的校验和 (0x67ea)。

我试着像下面这样计算它(当然用一个补码和):

source IP + destination IP + TCP protocol + (TCP header length + payload length) + payload

c0a8 + ae80 + c0a8 + ae01 + 0006 + 0026 + 6c69 + 646f + 720a = 420df

With the one's complement: 4 + 20df = 20e3

not(20e3) = df1c

这肯定不是当前校验和。

我还注意到,每次我发送相同的有效负载时,校验和都会发生变化,所以我猜它不可能是那些不变的变量,它必须更多(例如时间戳..)。

校验和使用的具体参数和公式是什么? 我该如何计算?

感谢您的帮助!

您可能忽略了 TCP 固定 header 和 TCP 选项。这些字节也有助于校验和(不仅仅是 TCP 负载)。请注意,为了正确计算,TCP 校验和字段 (ddff) 已替换为 0

IPv4 SRC + IPv4 DST + IPv4 Protocol + TCP Segment Length +

TCP Fixed Header (with checksum field set to 0) +

TCP Options +

TCP Payload

给你

c0a8 + ae80 + c0a8 + ae01 + 0006 + 0026 +

115c + dcba + 28d5 + 41da + 64e8 + 6a10 + 8018 + 01fe + 0000 + 0000 +
                                                       (csum)

0101 + 080a + 5c86 + c6f8 + bd62 e36f + 

6c69 + 646f + 720a

等于9980c。接下来,9 + 980c = 9815,最后,这会给你 67ea