我正在尝试计算以下数据包的校验和: 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
不(20e3) = df1c
这绝对不是当前的校验和。
我还注意到,每次我发送相同的有效负载时,校验和都会发生变化,所以我猜它不可能是那些不变的变量,它必须更多(例如时间戳......)。
校验和使用的确切参数和公式是什么? 我该如何计算?
感谢您的帮助!
答案 0 :(得分:0)
您可能忽略了 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
。