UDP
**UDP(User Datagram Protocol,用户数据协议)**:提供 **无连接** 的,**尽最大努力** 的数据传输服务(不保证数据传输的可靠性),简单高效。
[!info] related notes
UDP
Overview
UDP(User Datagram Protocol,用户数据协议):提供 无连接 的,尽最大努力 的数据传输服务(不保证数据传输的可靠性),简单高效。
UDP(User Datagram Protocol,用户数据报协议)是互联网传输层里的一个非常核心的协议。它的特点可以概括成一句话: 它很轻、很快,但不帮你兜底。 也就是说,UDP只负责“尽力把数据包发出去”,但不保证一定送达、不保证顺序、不保证不重复,也不保证对方一定在线或可处理。
下面按“是什么、怎么工作、有什么特点、适合什么场景、和 TCP 的区别”来讲。
1. UDP 是什么
UDP 是运行在 传输层 的协议,和 TCP 是同一层级。
如果把网络通信类比成寄快递:
- IP 负责把包从一个地方送到另一个地方,类似“道路系统”
- UDP/TCP 负责定义“怎么把应用的数据交给网络发送”
UDP 的基本单位叫做:
数据报(Datagram)
应用程序把一段数据交给 UDP,UDP 给它加一个很小的首部,然后交给 IP 层发出去。
2. UDP 的核心特征
2.1 无连接
UDP 在发送数据前,不需要像 TCP 那样先三次握手建立连接。
也就是说:
- 发送方想发就发
- 接收方只要在对应端口监听,就能收到
这让 UDP 的启动成本很低,延迟也更小。
2.2 不可靠传输
这里的“不可靠”不是说它“很差”,而是说:
协议本身不提供可靠性保证。
具体包括:
- 可能丢包:数据报在网络中可能被丢弃
- 可能乱序:后发的数据可能先到
- 可能重复:某些情况下同一个包可能收到多次
- 没有确认机制:发送方不知道对方是否收到了
- 没有重传机制:丢了通常就丢了,UDP自己不补发
所以如果业务需要可靠性,通常要:
- 由应用层自己做确认和重传
- 或者直接使用 TCP
2.3 面向报文
UDP 是面向报文的,而不是面向字节流。
这点非常重要。
意思是:
- 应用层一次发送一个消息
- UDP 会尽量按一个完整数据报发送
- 接收方一次
recvfrom通常对应收一个完整报文
比如你发三次:
- “hello”
- “world”
- “udp”
接收方看到的通常也是三个独立消息,而不是像 TCP 那样可能变成:
helloworldudp- 或者拆成几段
当然,如果接收缓冲区太小,UDP 报文可能被截断。
2.4 首部很小,开销低
UDP 首部只有 8 字节,非常简洁。
它的四个字段是:
- 源端口(Source Port)
- 目的端口(Destination Port)
- 长度(Length)
- 校验和(Checksum)
相比 TCP 那种较大的首部、序号、确认号、窗口、拥塞控制等复杂机制,UDP 明显更轻量。
2.5 没有流量控制和拥塞控制
UDP 本身不做流量控制,也不做拥塞控制。
这意味着:
- 发得太快,接收方可能来不及处理
- 网络拥塞时,UDP 不会像 TCP 那样自动降速
优点是:
- 灵活
- 实现简单
- 时延低
缺点是:
- 容易丢包
- 对网络更“粗放”
- 需要应用自己控制发送节奏
3. UDP 头部结构
UDP 头部总共 8 字节:
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| 源端口 | 目的端口 |
+--------+--------+--------+--------+
| 长度 | 校验和 |
+--------+--------+--------+--------+
各字段含义
1)源端口
发送方的端口号。
可以用于让接收方知道“回给谁”。
2)目的端口
接收方应用程序监听的端口号。
这是 UDP 能把数据交给正确应用的关键。
3)长度
表示 UDP 首部 + 数据的总长度。
最小值是 8,因为只有头部也有 8 字节。
4)校验和
用于检查数据在传输中有没有损坏。
注意:
- 在 IPv4 中,UDP 校验和理论上可选
- 在 IPv6 中,UDP 校验和是必须的
4. UDP 是怎么工作的
发送过程
- 应用程序准备好数据
- 指定目标 IP 和目标端口
- UDP 给数据加上 8 字节首部
- 交给 IP 层封装并发送
- 网络设备把数据包路由到目标主机
接收过程
- 目标主机收到 IP 包
- IP 层发现上层协议是 UDP
- 把 UDP 数据交给 UDP 层
- UDP 根据目的端口找到对应的应用程序
- 应用程序读出这个数据报
整个过程里,没有“连接建立”“确认应答”“重传补发”这些动作。
5. UDP 为什么会快
UDP 快,主要不是因为“传得更快”,而是因为额外机制少:
- 不需要建立连接
- 不需要维护连接状态
- 不需要确认应答
- 不需要重传
- 不需要排序
- 不需要滑动窗口
- 不需要拥塞控制
所以它的优势通常表现为:
- 首包时延低
- 协议处理开销低
- 适合实时性要求高的业务
但这不代表它在任何场景下吞吐都比 TCP 好。因为一旦丢包严重,UDP 自己不修复,业务效果可能反而更差。
6. UDP 的典型应用场景
6.1 实时音视频
比如:
- 语音通话
- 视频会议
- 直播互动
原因:
- 实时场景通常更在意“现在的数据赶紧到”
- 某一小部分丢失可以接受
- 旧数据重传回来时,往往已经没用了
比如视频通话里,一帧晚到 2 秒,比直接丢掉还糟糕。
6.2 在线游戏
很多实时游戏会用 UDP 传输:
- 角色位置
- 朝向
- 技能状态
- 操作输入
原因是:
- 状态更新频繁
- 延迟比绝对可靠更重要
- 下一帧状态会覆盖上一帧状态
当然,游戏里一些关键数据(登录、支付、结算)可能还是用 TCP 或应用层可靠机制。
6.3 DNS
DNS 查询经常用 UDP。
因为:
- 请求和响应通常很小
- 一问一答
- 用 UDP 成本低、速度快
如果响应太大,或者需要更可靠的传输,也可能退回 TCP。
6.4 DHCP
DHCP 用于给设备动态分配 IP 地址,也大量依赖 UDP。
6.5 QUIC / HTTP/3 的基础承载
现代的 QUIC 协议就是建立在 UDP 之上的。
为什么不用 TCP 再实现 QUIC?
因为 TCP 已经把可靠性、顺序、拥塞控制等机制“写死”在内核里,不够灵活。基于 UDP,QUIC 可以在用户态自己实现:
- 更灵活的可靠传输
- 更快的连接建立
- 多路复用
- 改进的拥塞控制
- 避免 TCP 队头阻塞的一些问题
也就是说:
UDP 本身很简单,但它也能作为更高级协议的底座。
7. UDP 的优点
优点一:低延迟
没有连接建立和复杂确认流程,首发很快。
优点二:开销小
头部只有 8 字节,协议逻辑简单。
优点三:支持一对多、多对多
更容易做广播、组播这类通信。
优点四:应用层灵活
你可以自己决定是否需要:
- 重传
- 排序
- 纠错
- 限速
- 拥塞控制
这让很多定制协议更容易设计。
8. UDP 的缺点
缺点一:不保证送达
丢了就是丢了,协议不补救。
缺点二:不保证顺序
应用层要自己处理乱序问题。
缺点三:不保证接收端处理能力
发太快会把对方缓冲区打满,造成丢包。
缺点四:不适合强一致、强可靠的数据传输
比如:
- 文件传输
- 金融交易核心报文
- 数据库同步
- 重要日志完整上传
这些通常更适合 TCP 或专门的可靠协议。
9. UDP 和 TCP 的区别
可以把两者对比着理解:
| 项目 | UDP | TCP |
|---|---|---|
| 是否连接 | 无连接 | 面向连接 |
| 是否可靠 | 不保证 | 保证可靠 |
| 是否保序 | 不保证 | 保证顺序 |
| 是否重传 | 没有 | 有 |
| 是否确认 | 没有 | 有 |
| 数据形式 | 面向报文 | 面向字节流 |
| 首部开销 | 小(8 字节) | 较大 |
| 速度/时延 | 通常更低延迟 | 相对更重 |
| 适合场景 | 实时、容忍丢包 | 文件、网页、事务 |
一个很实用的判断方法:
- 要“数据必须完整正确到达”:优先考虑 TCP
- 要“尽快到,偶尔丢一点没关系”:优先考虑 UDP
10. 为什么说 UDP “不可靠但并不落后”
很多人刚学网络会误会:
“TCP 功能更多,所以 UDP 是低级方案。”
其实不是。
UDP 的价值恰恰在于它少做事。
因为它不强行替你做这些事情:
- 可靠传输
- 排序
- 拥塞控制
- 流控
所以应用层可以根据业务特点,自定义更合适的机制。
举例:
- 直播:更重视实时性
- 游戏:更重视低时延
- QUIC:要灵活控制可靠性和多路复用
这些都说明 UDP 不是“功能不够”,而是“故意保持简单”。
11. UDP 常见误区
误区一:UDP 一定比 TCP 快
不绝对。
UDP 协议开销更小,但如果业务必须自己补上重传、排序、纠错,整体未必更简单,也未必更高效。
误区二:UDP 不安全
UDP 本身不提供安全机制,但 TCP 也一样。
安全性通常靠更上层协议实现,比如:
- DTLS(UDP 上的 TLS)
- QUIC 内建加密
误区三:UDP 不适合大型系统
不对。很多大型系统大量使用 UDP,只是通常会在应用层加上自己的控制机制。
12. 一个简单例子
比如客户端向服务器发一句:
Hello
UDP 做的事大概是:
- 给这段数据加上源端口、目的端口、长度、校验和
- 交给 IP 发出
但它不会:
- 先问服务器“你准备好了吗?”
- 收到后让服务器回“我收到了”
- 丢了再补发
- 把多个包重新排序
这些都不是 UDP 干的。
13. 一句话理解 UDP
可以这样记:
UDP 是一个“极简传输协议”,只负责把离散消息尽力发出去,强调低开销和低时延,但把可靠性问题留给应用自己处理。
14. 学习 UDP 时最该抓住的几个关键词
你只要先记住这几个词,UDP 基本就清楚了:
- 无连接
- 不可靠
- 面向报文
- 开销小
- 低时延
- 适合实时场景
15. 再给你一个非常直观的类比
把 TCP 和 UDP 看成两种沟通方式:
TCP 像“打电话”
- 先建立连接
- 双方持续保持会话
- 确认对方听到了
- 顺序清晰
- 可靠,但流程更重
UDP 像“发广播”
- 不先建立连接
- 直接喊出去
- 谁听到了不一定知道
- 可能漏听、重听、听乱
- 但很快,适合实时通知
你要是愿意,我可以继续给你讲下面两个方向之一:
- 从抓包角度讲 UDP 包长什么样
- 从编程角度讲 socket 里 UDP 怎么收发