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,组成 0x4142、0x4344。
第一次回卷
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 丢弃该用户数据报。