UDP 用户数据报协议
用户数据报协议 UDP(User Datagram Protocol)
UDP 支持单播、多播以及广播
换句话说,UDP 支持一对一,一对多,以及一对全的通信
运输过程

UDP 对应用进程交下来的报文既不合并也不拆分,而是保留这些报文的边界
换句话说,UDP 是面向应用报文的
UDP 向上层提供无连接不可靠传输服务

UDP 首部格式

UDP 首部固定为 8 字节,包含 4 个字段,每个字段占 2 字节(16 位)。
字段详解
| 字段名 | 长度 | 含义 | 示例/备注 |
|---|---|---|---|
| 源端口号 | 16 位 | 发送方的端口号。 | - 范围:0~65535。 - 可选(可为 0),表示无需回复。 |
| 目的端口号 | 16 位 | 接收方的端口号。 | - 必须指定,用于目标应用寻址(如 DNS=53)。 |
| UDP 长度 | 16 位 | UDP 数据报的总长度(含首部和数据部分)。 | - 最小值为 8(仅首部,无数据)。 - 最大理论值:65535 字节(受 IP 层 MTU 限制)。 |
| 校验和 | 16 位 | 差错检测字段,覆盖伪首部、UDP 首部和数据部分。 | - 若为 0,表示未计算校验和(IPv6 中禁止)。 - 计算方式见前文流程。 |
UDP 的检验

1. 发送方差错检验流程
1.1 计算校验和(Checksum)
- 步骤:
- 伪首部构造:发送方构造一个 12 字节的伪首部(包含源 IP、目的 IP、协议类型、UDP 长度等),仅用于校验和计算。
- 数据填充:若 UDP 数据部分长度为奇数,填充一个零字节(不实际发送)。
- 按 16 位分组:将伪首部、UDP 头部(含校验和字段置零)和数据部分划分为 16 位的字。
- 求和取反:对所有 16 位字求和,结果取反码(1 的补码),得到校验和。
- 写入头部:将校验和写入 UDP 头部的校验和字段。
1.2 发送数据报
- 将完整的 UDP 数据报(含校验和)通过 IP 层发送。
2. 接收方差错检验流程
2.1 重新计算校验和
- 步骤:
- 伪首部构造:与发送方相同,使用接收到的 IP 和 UDP 信息构造伪首部。
- 数据分组:将伪首部、UDP 头部(含校验和字段)和数据部分按 16 位分组。
- 求和验证:对所有 16 位字求和(包括校验和字段),若结果为全 1(即 16 位全 1,),则数据无差错;否则丢弃或标记错误。
2.2 处理结果
- 无差错:数据报被传递给应用层。
- 有差错:
- 静默丢弃(UDP 无重传机制)。
- 部分系统可能通过 ICMP 报告错误(如“端口不可达”)。
3. 关键点总结
| 项目 | 说明 |
|---|---|
| 校验和覆盖范围 | 伪首部 + UDP 头部 + 数据部分(确保端到端完整性)。 |
| 校验和算法 | 16 位反码求和(RFC 1071)。 |
| 容错机制 | UDP 本身不重传,依赖应用层处理(如 DNS 重试)。 |
| 可选性 | 校验和字段可为 0(表示未计算),但 IPv6 强制要求校验和。 |
4. 注意事项
- 性能权衡:UDP 校验和是轻量级的差错检测,不保证 100% 可靠(如偶数位错误可能漏检)。
- 与 TCP 对比:TCP 有更复杂的序列号和确认机制,而 UDP 仅依赖校验和。