UDP 检验和:16 bit 反码加法

例题中的字段

源 IP 地址
192.168.1.1
目的 IP 地址
192.168.1.2
源端口 / 目的端口
1234 / 53
数据载荷
"ABCD"
UDP 长度
12 B

4 B 数据加 8 B UDP 首部,所以 UDP 长度为 0x000C。发送端计算时,检验和字段先置为 0x0000

计算规则

1

按网络字节序,每 2 B 组成一个 16 bit 字。

2

反码加法逐字相加:最高位产生进位时,把进位加回最低位。

3

把最终 16 bit 和逐位取反,写入检验和字段。

拆成 16 bit 字

伪首部
C0A80101C0A801020011000C
UDP 首部
04D20035000C0000
数据
41424344

几个容易漏掉的转换

192.168 对应字节 C0 A8,组成 0xC0A8

伪首部中的“全 0 + UDP 协议号 17”组成 0x0011

端口 1234 为 0x04D2,端口 53 为 0x0035

ASCII 字符 ABCD 的字节为 41 42 43 44,组成 0x41420x4344

第一次回卷

C1A9前两字之和
+C0A8再加目的 IP 高 16 bit
0xC1A9 + 0xC0A8 = 0x18251
回卷:保留低 16 bit 的 0x8251,再把最高位进位 1 加回,得到 0x8252

继续累加

按相同规则继续加剩余各字。加到最后一个数据字之前,16 bit 累加和为:

0xC9C6

最后再加 0x4344,还会产生一次最高位进位。

第二次回卷并取反

0xC9C6 + 0x4344 = 0x10D0A
0x0D0A + 1 = 0x0D0B

对最终累加和逐位取反:

~0x0D0B = 0xF2F4
发送端写入 UDP 检验和字段:0xF2F4

接收端验证

接收端把收到的检验和也作为一个 16 bit 字参与同样的反码加法:

0x0D0B + 0xF2F4 = 0xFFFF

结果为全 1,检验通过。若结果不是 0xFFFF,说明检验失败,UDP 丢弃该用户数据报。