本文主题内容
- 理解传输层与端口号
- 掌握 UDP 报头格式
- 理解 UDP 的封装与分用
- 理解 UDP 校验和
- 理解 UDP 缓冲区和数据报边界
- 分析 UDP 的特点与适用场景
- 理解 UDP 与 MTU 的关系
引言:UDP 报头只有 8 字节,协议机制简单,但它依然完成了传输层最核心的任务:通过端口号把数据从一台主机中的进程交付给另一台主机中的进程。
一、传输层与端口号
1.1 传输层的作用
网络层负责把 IP 数据报送到目标主机,传输层继续解决进程到进程的交付问题。

接收端根据 IP 报头中的协议字段选择 TCP 或 UDP,再根据传输层目的端口把数据交给对应 Socket。
1.2 端口号范围
端口号是 16 位无符号整数,范围为 0 到 65535。
常见划分:
- 0 到 1023:系统端口或知名端口
- 1024 到 49151:注册端口
- 49152 到 65535:常用动态或临时端口范围
具体临时端口范围由操作系统配置决定,不能简单假设所有系统都完全相同。
一条 UDP 通信关系可以用五元组描述:
text
源IP、源端口、目的IP、目的端口、UDP

二、UDP 报头

UDP 报头固定为 8 字节,包含四个 16 位字段:
| 字段 | 作用 |
|---|---|
| 源端口 | 标识发送进程,可以为 0 |
| 目的端口 | 标识接收进程 |
| UDP 长度 | UDP 报头与数据总长度 |
| 校验和 | 检查报文在传输中是否损坏 |
2.1 UDP 长度
UDP 长度字段只有 16 位,理论上 UDP 报文总长度最大为 65535 字节。但实际网络还受到 IP 报头、链路 MTU、系统缓冲区和应用协议限制。
工程中通常不发送接近理论上限的数据报。
2.2 校验和
UDP 校验和计算时不仅包含 UDP 报头和数据,还包含由源 IP、目的 IP、协议号和 UDP 长度组成的伪首部。
伪首部不会真正发送,它用于发现数据报是否被错误地交付到其他主机或协议。
IPv4 中 UDP 校验和可以为 0,表示不使用;IPv6 中 UDP 校验和通常是必须的。
UDP 报头虽然简单,但端口号负责进程分用,长度负责报文边界,校验和负责基本差错检测。
三、UDP 的封装与分用
3.1 发送过程
应用调用 sendto 后:
- 内核根据 Socket 确定源端口
- 根据目标地址填写目的端口
- 添加 UDP 报头
- 把完整 UDP 数据报交给 IP 层
- IP 层继续添加 IP 报头并路由
3.2 接收过程
接收端 IP 层根据协议号 17 把有效载荷交给 UDP。UDP 校验报文后,根据目的端口查找对应 Socket,并把完整数据报放入接收队列。
如果没有进程监听该端口,主机可能返回 ICMP Port Unreachable,但应用是否立即感知取决于 Socket 使用方式和系统实现。
四、UDP 缓冲区
4.1 接收缓冲区
UDP Socket 具有接收缓冲区,用于保存到达的数据报。
它具有以下特点:
- 保留数据报边界
- 缓冲区满后,新到达的数据报可能被丢弃
- UDP 本身不会通过重传恢复丢失数据
- 网络到达顺序不一定等于发送顺序
4.2 发送路径
常说 UDP 没有像 TCP 那样用于可靠重传的发送缓冲区。调用 sendto 时,内核会接收一份完整数据报并交给下层发送;成功返回只表示数据已经被本机协议栈接受,不表示对端已收到。
如果本机发送资源暂时不足,阻塞 Socket 可能等待,非阻塞 Socket 可能返回 EAGAIN。
五、UDP 的数据报特性
5.1 保留消息边界
一次应用发送对应一个 UDP 数据报。接收端不会得到半个数据报再等待下一次拼接:
- 缓冲区足够大,读取完整数据报
- 缓冲区太小,超出部分被截断
可以使用 recvmsg 配合 MSG_TRUNC 观察实际数据报长度。
5.2 无连接
UDP 不需要三次握手,发送前不维护 TCP 那样的连接状态。但应用仍然可以对 UDP Socket 调用 connect:
- 固定默认对端
- 后续可以使用
send和recv - 内核可以过滤非该对端的数据报
- 异步网络错误更容易反馈给 Socket
这不会把 UDP 变成可靠协议。
5.3 全双工
同一个 UDP Socket 可以同时发送和接收数据。无连接只表示协议不建立 TCP 式连接,不表示只能单向通信。
六、UDP 与 IP 分片
以太网常见 MTU 为 1500 字节。IPv4 不带选项时:
text
1500 - 20字节IP报头 - 8字节UDP报头 = 1472字节UDP数据
超过路径 MTU 的 IPv4 数据报可能被分片。任意一个分片丢失,接收端就无法重组整个数据报。
因此大 UDP 数据报的问题包括:
- 分片数量增加,整体丢失概率上升
- 路由器和接收端重组开销增加
- 部分网络设备会丢弃分片
- IPv6 路由器不会替发送方进行分片
注意:1472 只是在常见以太网、IPv4 无选项条件下的结果,不是所有网络中的固定安全值。应用应考虑路径 MTU,并给协议预留额外空间。
七、UDP 的优点与缺点
7.1 优点
- 报头小
- 无握手,启动延迟低
- 保留消息边界
- 支持广播和组播
- 应用可以自行设计可靠性和时延策略
7.2 缺点
- 不保证到达
- 不保证顺序
- 不自动去重
- 不提供 TCP 式流量控制和拥塞控制
- 过大数据报容易触发 IP 分片
八、适用场景
常见 UDP 应用包括:
- DNS 查询
- 实时音视频
- 在线游戏状态同步
- 局域网发现
- 监控和日志上报
- QUIC 的底层承载
实时业务经常宁可丢弃过期数据,也不愿等待重传;可靠业务也可以在 UDP 上实现序号、确认、重传和拥塞控制,但实现成本很高。
九、总结
UDP 通过源端口和目的端口完成进程到进程交付,固定 8 字节报头包含长度和校验和。协议保留数据报边界,不建立连接,也不保证可靠性、顺序和去重。
UDP 接收缓冲区按数据报排队,缓冲区溢出时可能直接丢包。应用应控制单个数据报大小,避免不必要的 IP 分片,并根据业务需要自行设计超时、序号和重传机制。
UDP 的价值不只是简单和快,而是把可靠性、实时性与重传策略的选择权交给应用层。