我的UDP校验和计算每次都会给出错误的结果

时间:2017-08-27 20:10:00

标签: udp checksum packet

我正在尝试手动计算各种UDP数据包的校验和,但与Wireshark中显示的相比,我总是得到错误的结果。以下是我如何做的示例:

Source Address: 192.168.0.103 (0xC0A8, 0x0067)
Destination Address: 192.168.0.1 (0xC0A8, 0x0001)

Source Port: 57090 (0xDF02)
Destination Port: 8000 (0x1F40)

Packet length: 19 (0x0013)
Data: hello world (0x6865, 0x6C6C, 0x6F20, 0x776F, 0x726C, 0x6400)

Expected checksum: 0xEDFD (from wireshark)

我知道UDP校验和是使用以下变量计算的:

Source IP + Destination IP + 17 (0x0011 - protocol code) + 10 (0x000A - pseudoheader length) + Source Port + Destination Port + UDP Packet Length + Data

所有这些都是16位组。

所以我的计算是(按照相同的顺序):

0xC0A8 + 0x0067 + 0xC0A8 + 0x0001 + 0x0011 + 0x000A + 0xDF02 + 0x1F40 + 0x0013 + 0x6865 + 0x6C6C + 0x6F20 + 0x776F + 0x726C + 0x6400

上述总和的结果是:

0x511F4

现在,由于结果高于0xFFFF,我会执行以下操作:

0x11F4 + 0x0005 = 0x11F9

翻转后我得到了结果:

0xEE06 <- which, as you can see, it is different from the expected one

所以我的问题是我做错了什么?我总是得到几乎 wireshark中显示的结果。

以下是Wireshark内部数据包的屏幕截图,作为参考 https://www.evernote.com/l/AWl0H1AGoxpGX4_zjgDlVBcytJM-HP_PvQE

1 个答案:

答案 0 :(得分:3)

我发现我做错了,以防其他人有类似的问题。

我计算伪标头的方式是这样的:

Source IP + Destination IP + 17 (0x0011 - protocol code) + 10 (0x000A - pseudoheader length)

问题出在长度字节上。它应该是UDP包长度,而不是伪头长度。

最终公式如下:

Source IP + Destination IP + 17 (0x0011 - protocol code) + UDP Packet Length + Source Port + Destination Port + UDP Packet Length + Data

请注意,UDP数据包长度出现两次。首先是伪头,第二个是实际的UDP头。