UDP 校验的具体内容是什么?
UDP(用户数据报协议)的校验机制用于检测 UDP 数据报在传输过程中是否发生错误(如比特翻转、数据丢失或篡改等)。其校验内容不仅包括 UDP 数据报本身的字段,还引入了伪首部(Pseudo Header) 来增强校验的准确性,确保数据报被正确交付到目标应用。
UDP 校验的具体内容
UDP 校验的对象是一个拼接后的字节流,包含以下三部分:
- 伪首部(Pseudo Header)
伪首部并非 UDP 数据报的实际组成部分,仅用于校验时临时拼接,目的是确保 UDP 数据报能正确发送到目标主机的指定端口。其包含以下字段(共 12 字节):- 源 IP 地址(4 字节):发送端的 IP 地址
- 目的 IP 地址(4 字节):接收端的 IP 地址
- 保留字段(1 字节):固定为 0
- 协议字段(1 字节):表示承载的上层协议,UDP 固定为 17(0x11)
- UDP 长度(2 字节):UDP 数据报的总长度(首部 + 数据)
- UDP 首部(Header)
UDP 首部固定为 8 字节,包含以下字段:- 源端口(2 字节):发送端的端口号
- 目的端口(2 字节):接收端的端口号
- UDP 长度(2 字节):UDP 数据报总长度(首部 + 数据,范围 8~65535 字节)
- 校验和(2 字节):用于存储计算出的校验值(若不校验,可设为 0)
- UDP 数据(Data)
即 UDP 承载的应用层数据(如 DNS 查询、实时音视频数据等)。
注意:若数据部分的字节数为奇数,会在末尾补一个字节的 0(仅用于校验,不实际传输),以保证校验时按 16 位分组计算。
校验过程
- 拼接数据:将伪首部、UDP 首部、UDP 数据(若长度为奇数则补 0)拼接成一个连续的字节流。
- 计算校验和:
- 将拼接后的字节流按 16 位分组,计算所有分组的反码求和(即先对每组 16 位二进制数求和,再取反码)。
- 发送端将计算结果存入 UDP 首部的 “校验和” 字段。
- 接收端校验:
- 接收端按同样规则拼接伪首部、收到的 UDP 首部和数据(补 0 处理同上),重新计算校验和。
- 若计算结果为全 1(0xFFFF),则表示数据未出错;否则,认为数据出错,会丢弃该 UDP 数据报(不返回错误通知)。
特点与注意事项
- 可选性:虽然 UDP 协议允许校验和设为 0(表示不校验),但实际应用中几乎都会启用校验(尤其是 TCP/IP 协议栈默认强制校验)。
- 局限性:校验和只能检测错误,无法纠正错误;且存在极小概率的漏检(如两个位同时出错且抵消),但足以满足 UDP 的轻量级需求。
- 与 TCP 校验的区别:TCP 校验同样使用伪首部,但 TCP 的校验范围还包括 TCP 序号、确认号等更多首部字段,且校验是强制的。
通过包含伪首部,UDP 校验不仅能检测自身数据的完整性,还能间接验证 IP 层的路由和端口信息,是 UDP 协议中保障数据可靠性的重要机制。