【问题标题】:TCP calculate checksumTCP计算校验和
【发布时间】:2021-02-10 18:00:51
【问题描述】:
我正在尝试计算以下数据包的校验和:
A TCP packet captured with wire shark
但我从未设法得到正确的校验和 (0x67ea)。
我尝试如下计算(当然使用补码):
源IP+目的IP+TCP协议+(TCP头长度+
有效载荷长度)+有效载荷
c0a8 + ae80 + c0a8 + ae01 + 0006 + 0026 + 6c69 + 646f + 720a = 420df
用一个补码:4 + 20df = 20e3
not(20e3) = df1c
这显然不是当前的校验和。
我还注意到,每次发送相同的有效负载时,校验和都会发生变化,所以我猜它不可能是那些不变的变量,它必须更多(例如时间戳..)。
校验和使用的确切参数和公式是什么?
以及如何计算?
感谢您的帮助!
【问题讨论】:
标签:
networking
tcp
checksum
calculation
【解决方案1】:
您可能忽略了 TCP 固定标头和 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。