UDP 是传输层协议。
在 OSI 七层网络模型中,UDP 位于第四层;在 TCP/IP 模型中,它同样位于传输层。TCP 也在这一层,两者负责的都是应用进程之间的数据传输。
有人看到 UDP 可以直接发包,不需要提前建立连接,就把它归到网络层。这个判断混淆了“工作方式”和“协议职责”。无连接是 UDP 的传输方式,不代表它负责网络寻址和路由。
先区分 IP 地址和端口号
理解 UDP 所在层级,关键是分清 IP 地址与端口号各自解决什么问题。
IP 协议通过 IP 地址定位目标设备,主要负责主机之间的寻址与路由,属于网络层。
UDP 通过端口号定位设备中的具体应用程序,负责进程之间的数据交付,属于传输层。
例如,一条数据发往某台服务器时:
- IP 地址负责找到服务器;
- 目标端口负责找到服务器上的具体服务;
- UDP 负责承载应用数据并提供端口信息。
数据进入网络时,会经过下面几步:
应用数据 → UDP 首部 → IP 首部 → 数据链路层帧
从封装关系也能看出,UDP 位于应用数据与 IP 协议之间。
UDP 为什么叫用户数据报协议
UDP 的全称是 User Datagram Protocol,也就是用户数据报协议。
“数据报”意味着 UDP 面向一条条独立消息。应用程序发送一次数据,UDP 就把这段数据视为一个完整数据报。接收端同样按数据报接收,消息边界会被保留。
这和 TCP 不同。TCP 面向字节流,应用程序连续发送的数据进入 TCP 后,会被视为一串连续字节。接收端一次读到多少字节,不一定与发送端每次写入的数据长度一致。
因此,使用 UDP 时,应用程序更容易区分每条消息;使用 TCP 时,应用层往往需要自行设计消息长度或分隔规则。
UDP 首部为什么只有 8 字节
UDP 首部固定为 8 字节,包含四个字段:
- 源端口;
- 目标端口;
- 长度;
- 校验和。
UDP 不维护连接状态,也没有序号、确认号和窗口等字段,所以首部比 TCP 简单。
简单带来的结果是固定开销较小,但协议本身不提供以下保证:
- 数据一定送达;
- 数据只到达一次;
- 数据按照发送顺序到达;
- 网络拥塞时自动降低发送速度;
- 接收方来不及处理时自动协调发送速度。
这也是 UDP 被称为“不可靠传输协议”的原因。这里的“不可靠”是一个技术定义,不等于 UDP 不能用于重要业务。
如果应用层自行增加确认、重传、排序和拥塞控制,仍然可以在 UDP 之上实现可靠传输。
TCP 比 UDP 多做了什么
TCP 是面向连接的可靠传输协议。
正式传输数据前,TCP 通常需要建立连接。传输过程中,它会使用序号与确认机制判断数据是否到达;发现数据丢失时,可以进行重传;收到乱序数据后,会按照序号重新整理。
| 功能 | UDP | TCP |
|---|---|---|
| 建立连接 | 不需要 | 需要 |
| 确认数据送达 | 不提供 | 提供 |
| 丢包重传 | 不提供 | 提供 |
| 数据排序 | 不提供 | 提供 |
| 流量控制 | 不提供 | 提供 |
| 拥塞控制 | 不提供 | 提供 |
| 消息边界 | 保留 | 不保留 |
| 首部大小 | 8 字节 | 最少 20 字节 |
两者的差别不只是速度。TCP 替应用程序处理了大量可靠性问题,UDP 则让应用程序自己决定哪些问题需要处理。
UDP 为什么适合实时场景
直播、语音和在线游戏中的部分数据具有很强的时效性。
例如,一个表示游戏角色位置的数据包晚了两秒才到。即使它完整无误,也可能已经没有使用价值,因为角色早已移动到新位置。
对于这类数据,等待重传未必是好事。应用程序更可能选择跳过旧数据,直接处理最新状态。
UDP 不会因为前面的数据没有到达,就强制后面的数据等待,因此适合对实时性敏感的场景。但应用层仍然需要处理网络波动,不能认为换成 UDP 就能自动解决延迟问题。
实际性能还取决于:
- 网络是否拥塞;
- 路由是否稳定;
- 单个数据报是否过大;
- 应用是否控制发送速率;
- 是否实现必要的丢包恢复。
DNS 为什么经常使用 UDP
普通 DNS 查询的数据量通常较小,而且一次查询只需要一问一答。使用 UDP 可以直接发送请求,减少单次查询的连接开销。
但“DNS 使用 UDP”不是绝对规则。当响应被截断、数据量较大或者进行区域传送时,DNS 也可能使用 TCP。
现在还有不同的加密 DNS 方案,例如 DoH、DoT 和 DoQ,它们的底层传输方式也不完全相同。因此,不能把某个应用层协议永远固定到 TCP 或 UDP 中。
UDP 和 TCP 的选择标准
可以用两个问题来判断:
第一,数据丢失或乱序是否可以接受?
第二,业务是否愿意在应用层自行处理可靠性?
文件下载、邮件传输和数据库连接要求数据完整,通常更适合 TCP。实时语音、视频和游戏状态同步更看重时效性,可以考虑 UDP。
如果业务既需要低延迟,又需要可靠传输,也不一定只能选择 TCP。QUIC 就构建在 UDP 之上,并在应用协议中实现了可靠传输、拥塞控制和加密。
所以,UDP 属于传输层而不是网络层。它与 TCP 的根本区别,在于 UDP 只提供较基础的数据报传输能力,TCP 则在传输层加入了连接管理与可靠性机制。