UDP:简单到"尽力而为"的数据报
更新时间:2026-09-17。网络协议域·传输层。现代基于 UDP 自建可靠与安全的代表是 QUIC,见 HTTP/3 与 QUIC。
UDP(User Datagram Protocol,用户数据报协议)在 IP 之上只加了最薄的一层:端口复用、校验和、长度。它无连接、不保证可靠、不保证有序、不做拥塞控制,但因此极快、极简单,并保留消息边界。
一、头部与特点
UDP 头固定仅 8 字节:源端口、目的端口、长度、校验和(checksum IPv4 可选/IPv6 必选)。
| 特性 | UDP | TCP |
|---|---|---|
| 连接 | 无连接,直接发,无握手 | 面向连接,三次握手 |
| 可靠性 | 不保证到达、不重传 | 保证有序可靠,重传 |
| 顺序 | 不保证 | 按序交付 |
| 拥塞/流控 | 无(要应用自律) | 有(cwnd/rwnd) |
| 消息边界 | 有,一个数据报一个边界 | 字节流,无边界 |
| 广播/多播 | 支持 | 不支持 |
| 头部开销 | 8 字节 | 20 字节起步 |
| 典型用途 | DNS、QUIC、WebRTC、游戏、SNMP | Web、文件、邮件等 |
正因为无连接,UDP 没有 TIME_WAIT、没有握手 RTT、没有连接表,服务器能支撑海量客户端;但丢包、乱序、重复都要应用自己接受或补偿。
二、什么时候用 UDP
- DNS 查询:一次请求一次响应、短到常只需一个报文,省去握手;UDP 53,响应过大或区域传输才用 TCP/TLS。
- 实时音视频(WebRTC/RTP):偶尔丢一帧不该停下来等重传(延迟比完整更重要),用序号+时间戳在应用层处理抖动、丢帧、FEC。
- 在线游戏:状态同步高频、容忍丢失旧状态、追求最低延迟。
- QUIC(HTTP/3):在 UDP 之上用应用层实现可靠、有序、TLS 1.3 加密、多路复用与连接迁移,兼具低握手延迟与可靠性。
- 多播/广播、SNMP、syslog、NTP:一对多或对延迟敏感的短消息。
准则:能容忍部分丢失、强延迟敏感、或通信模型简单到不需要连接时选 UDP;需要可靠字节流、对丢零容忍(文件、事务、大多数 HTTP API)用 TCP。
三、UDP 的"消息边界"
与 TCP 字节流不同(见粘包拆包),UDP 每个 sendto 对应一个独立数据报,recvfrom 一次取一个完整数据报,不会粘包,但:
- 数据报大于接收缓冲,超出部分在普通 socket 下被截断丢弃。
- 缓冲区满时后续数据报直接丢弃(UDP 没有发送方降速机制)。
- 每个数据报独立路由,可能乱序、重复、丢失,应用要靠序号处理。
四、大包与 IP 分片
单个 UDP 数据报超过路径 MTU(约 1500 以太网下 IP 包 ~1472 字节载荷较安全)会在 IP 层分片:
- 任一分片丢失,整个数据报都交不上去(UDP 不分片重传),丢一个等于丢全部,放大丢包率。
- 分片还可能被防火墙丢弃、带来重组资源消耗与安全问题。
- 实践建议 UDP 应用把报文控制在路径 MTU 安全尺寸内(常见 1200 字节,QUIC 就规定初始包不超过 1200),应用层自行分片并编号。详见IP 分片与 MTU/MSS。
五、丢包与缓冲观测
ss -uapn # UDP socket 与进程
nstat -az | grep -i 'Udp\|Ip' # UdpRcvbufErrors(接收缓冲满丢包)、UdpNoPorts、IpReasmFails
netstat -su # UDP 统计:接收错误、缓冲区错误、校验和错误
sysctl net.core.rmem_max net.core.rmem_default # 调接收缓冲(高频多播常要调大)
UdpRcvbufErrors增长说明应用recv不够快或缓冲太小,数据报被丢——UDP 不会像 TCP 那样通过窗口/重传让发送方减速,必须应用自己限速或加大缓冲。
六、在 UDP 上自建可靠:为什么是 QUIC
UDP 只是"信封",完全可以在其上实现可靠性:QUIC 在内含的流里做序号、ACK、重传、拥塞控制(CUBIC/BBR)、TLS 1.3,并解决 TCP 一些历史包袱(队头阻塞、中间盒僵化、连接迁移)。这让"基于 UDP ≠ 不可靠",区别在于可靠性由谁实现、能否按流/场景定制。
相关阅读
可靠字节流对照见 TCP 重传与滑动窗口,分片见MTU/MSS,UDP 上的现代协议见 HTTP/3 与 QUIC。
总结
UDP 是 8 字节头、无连接、无握手、不保证可靠有序、无拥塞控制但保留消息边界、支持多播的"尽力而为"数据报协议,胜在低延迟、无连接状态,适合 DNS、实时音视频、游戏和一对多;代价是丢包/乱序/大包分片全丢要应用承担,现代 QUIC 则在 UDP 之上自建可靠、加密与多路复用。