UDP

**UDP(User Datagram Protocol,用户数据协议)**:提供 **无连接** 的,**尽最大努力** 的数据传输服务(不保证数据传输的可靠性),简单高效。

#status / growing #type / concept

[!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 是怎么工作的

发送过程

  1. 应用程序准备好数据
  2. 指定目标 IP 和目标端口
  3. UDP 给数据加上 8 字节首部
  4. 交给 IP 层封装并发送
  5. 网络设备把数据包路由到目标主机

接收过程

  1. 目标主机收到 IP 包
  2. IP 层发现上层协议是 UDP
  3. 把 UDP 数据交给 UDP 层
  4. UDP 根据目的端口找到对应的应用程序
  5. 应用程序读出这个数据报

整个过程里,没有“连接建立”“确认应答”“重传补发”这些动作。


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 的区别

可以把两者对比着理解:

项目UDPTCP
是否连接无连接面向连接
是否可靠不保证保证可靠
是否保序不保证保证顺序
是否重传没有
是否确认没有
数据形式面向报文面向字节流
首部开销小(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 像“发广播”

  • 不先建立连接
  • 直接喊出去
  • 谁听到了不一定知道
  • 可能漏听、重听、听乱
  • 但很快,适合实时通知

你要是愿意,我可以继续给你讲下面两个方向之一:

  1. 从抓包角度讲 UDP 包长什么样
  2. 从编程角度讲 socket 里 UDP 怎么收发
创建于 2026/3/12 更新于 2026/5/27