精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

UDP 协议 ​

考情分析 ​

UDP 在 408 中主要以选择题形式出现,考查 UDP 的特点、首部格式以及与 TCP 的区别。单独出大题的概率不高,但经常作为干扰项出现在 TCP 相关的题目里。

考频:★★★

UDP 的特点 ​

UDP(User Datagram Protocol,用户数据报协议)是传输层的两个核心协议之一。它的设计哲学非常简单——在 IP 数据报服务之上只增加了最基本的功能:复用/分用 和 差错检测。

UDP 有四个核心特点:

1. 无连接

发送数据之前不需要建立连接,减少了开销和延迟。发送方想发就发,不需要像 TCP 那样先三次握手。

2. 不可靠

UDP 尽最大努力交付,不保证数据一定到达,也不保证数据按序到达。没有确认机制、没有重传机制。数据丢了就丢了,UDP 不管。

3. 面向报文

UDP 对应用层交下来的报文,既不拆分也不合并,保留报文的边界。应用层给 UDP 多大的报文,UDP 就原样加个首部发出去。这意味着应用层需要自己选择合适的报文大小——太大了 IP 层要分片,太小了首部开销占比过高。

4. 支持一对一、一对多、多对一、多对多通信

TCP 只能一对一,但 UDP 可以进行广播和多播。

5. 没有拥塞控制

UDP 没有拥塞控制机制,发送方不会因为网络拥塞而降低发送速率。这是一把双刃剑:好处是实时性有保障,坏处是可能加剧网络拥塞。在网络拥塞时,所有 TCP 连接都会自觉降速,但 UDP 流量不受影响,这可能导致 TCP 连接的性能进一步恶化。

UDP 首部格式 ​

UDP 首部非常简洁,只有 8 个字节(对比 TCP 最少 20 字节)。

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          源端口号             |          目的端口号           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            长度               |           校验和              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段长度说明
源端口16 位发送方端口号,可选字段(不需要回复时可填 0)
目的端口16 位接收方端口号
长度16 位UDP 数据报的总长度(首部 + 数据),最小值为 8(仅首部)
校验和16 位检测 UDP 数据报在传输中是否出错,可选字段

一个容易记混的点:UDP 的"长度"字段包含首部在内的整个 UDP 数据报长度,而不仅仅是数据部分的长度。

UDP 校验和计算 ​

UDP 校验和的计算范围不仅包括 UDP 首部和数据,还要加上一个 12 字节的伪首部。

伪首部的结构:

字段长度来源
源 IP 地址4 字节IP 首部
目的 IP 地址4 字节IP 首部
全零填充1 字节固定
协议号1 字节UDP = 17
UDP 长度2 字节同 UDP 首部的长度字段

伪首部不会被发送出去,它仅在计算校验和时临时使用。引入伪首部的目的是让 UDP 层能够检验数据报是否被送到了正确的目的地(验证 IP 地址和协议号)。

计算步骤:

  1. 将伪首部、UDP 首部和数据部分按 16 位分组
  2. 如果数据部分长度为奇数字节,末尾填充一个全零字节
  3. 所有 16 位字按二进制反码求和
  4. 将结果取反码,填入校验和字段

UDP 适用场景 ​

虽然 UDP"不可靠",但在很多场景下反而比 TCP 更合适:

应用协议选择 UDP 的原因
DNS 域名解析端口 53查询报文小,一次请求一次响应,不值得建立 TCP 连接
DHCP端口 67/68客户端还没有 IP 地址,需要广播,TCP 无法广播
实时视频/音频RTP实时性要求高,偶尔丢帧可以容忍,重传反而会造成卡顿
SNMP 网络管理端口 161管理报文简短,丢失后重新查询即可

一句话总结选用原则:对实时性要求高、偶尔丢失可容忍、报文较短的场景,优先选 UDP。

UDP 在应用层可靠性 ​

虽然 UDP 本身不提供可靠传输,但应用层可以在 UDP 之上自行实现可靠性机制。几个典型的例子:

TFTP(简单文件传输协议): 基于 UDP,但在应用层实现了自己的确认和重传机制——每发送一个数据块(512 字节),等待对方确认后才发送下一个。

DNS: 如果 UDP 查询超时没有收到响应,客户端会重新发送查询。这就是在应用层处理丢包。

QUIC 协议(HTTP/3.0): 基于 UDP,在传输层之上实现了类似 TCP 的可靠传输、拥塞控制和多路复用。QUIC 选择 UDP 而非 TCP 是因为 TCP 的队头阻塞问题无法在协议栈内部解决,而 UDP 提供了更大的灵活性。

这说明"不可靠"只是 UDP 协议层的特性,不意味着基于 UDP 的应用一定不可靠。选择在哪一层实现可靠性,取决于应用的需求。

交互可视化 ​

加载可视化中...

易错点 ​

1. UDP 校验和是可选的,但 TCP 校验和是必须的

UDP 发送方可以选择不计算校验和(校验和字段填 0),但 TCP 的校验和是强制的。

2. UDP 首部长度是固定的 8 字节

不像 TCP 首部有可变的选项字段。UDP 首部永远是 8 字节,没有例外。

3. "面向报文"的含义

面向报文意味着 UDP 不对报文做任何拆分或合并。一次 sendto() 调用对应一个完整的 UDP 数据报。接收端一次 recvfrom() 也恰好收到一个完整的报文。这和 TCP 的"面向字节流"形成鲜明对比。

4. UDP 的长度字段最小值是 8

即使数据部分为空,长度字段 = 首部长度 = 8 字节。

5. UDP 伪首部的协议号是 17

IPv4 中 TCP 的协议号是 6,UDP 的协议号是 17。校验和计算时伪首部中填的协议号必须正确,否则即使数据没有出错,校验和也会验证失败。

6. UDP 的源端口是可选的

如果发送方不需要接收回复(比如单向数据流),源端口可以填 0。但实际应用中大多数场景都需要回复,所以通常会填一个有效的源端口。

本文对应考点 ​

  • UDP 的四个特点(无连接、不可靠、面向报文、支持多种通信方式)
  • UDP 首部格式(4 个字段各 2 字节,共 8 字节)
  • UDP 校验和计算需要加伪首部(12 字节)
  • 伪首部不实际发送,仅用于校验和计算
  • UDP 适用场景及对应协议/端口号
  • UDP 和 TCP 的核心区别

真题练习 ​