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)

  • 步骤
    1. 伪首部构造:发送方构造一个 12 字节的伪首部(包含源 IP、目的 IP、协议类型、UDP 长度等),仅用于校验和计算。
    2. 数据填充:若 UDP 数据部分长度为奇数,填充一个零字节(不实际发送)。
    3. 按 16 位分组:将伪首部、UDP 头部(含校验和字段置零)和数据部分划分为 16 位的字。
    4. 求和取反:对所有 16 位字求和,结果取反码(1 的补码),得到校验和。
  • 写入头部:将校验和写入 UDP 头部的校验和字段。

1.2 发送数据报

  • 将完整的 UDP 数据报(含校验和)通过 IP 层发送。

2. 接收方差错检验流程

2.1 重新计算校验和

  • 步骤
    1. 伪首部构造:与发送方相同,使用接收到的 IP 和 UDP 信息构造伪首部。
    2. 数据分组:将伪首部、UDP 头部(含校验和字段)和数据部分按 16 位分组。
    3. 求和验证:对所有 16 位字求和(包括校验和字段),若结果为全 1(即 16 位全 1,),则数据无差错;否则丢弃或标记错误。

2.2 处理结果

  • 无差错:数据报被传递给应用层。
  • 有差错
    • 静默丢弃(UDP 无重传机制)。
    • 部分系统可能通过 ICMP 报告错误(如“端口不可达”)。

3. 关键点总结

项目说明
校验和覆盖范围伪首部 + UDP 头部 + 数据部分(确保端到端完整性)。
校验和算法16 位反码求和(RFC 1071)。
容错机制UDP 本身不重传,依赖应用层处理(如 DNS 重试)。
可选性校验和字段可为 0(表示未计算),但 IPv6 强制要求校验和。

4. 注意事项

  • 性能权衡:UDP 校验和是轻量级的差错检测,不保证 100% 可靠(如偶数位错误可能漏检)。
  • 与 TCP 对比:TCP 有更复杂的序列号和确认机制,而 UDP 仅依赖校验和。