跳转到内容

🚀 UDP 用户数据报协议:无连接的极速传输

🌱 创建: 2026/04/01 ⏱️ 更新: 2026/05/22

UDP(User Datagram Protocol,用户数据报协议) 与 TCP 同属 OSI 模型的第四层(传输层),其核心规范定义于 1980 年的 RFC 768

如果说 TCP 是一个要求双方签收、确认、若丢失必补发的“挂号信”系统,那么 UDP 就是一个只管往外扔的“平信”系统。它提供了一种无连接、尽力而为(Best-Effort)、不可靠的数据报投递服务。尽管看似简陋,但正是这种没有历史包袱的极简设计,支撑起了当今互联网的实时音视频、在线游戏和海量基础网络查询服务。


为了实现最低的延迟和最小的协议开销,UDP 的报文头(Header)被压缩到了极致的 8 个字节。相比之下,TCP 的基础报文头至少需要 20 个字节,且包含了复杂的序列号和状态机标志位。

UDP 的 8 字节报头仅包含 4 个字段(每个字段 2 字节 / 16 位):

  1. 源端口(Source Port):发送方应用程序的端口号。如果是单向通信,此字段可全为 0。
  2. 目的端口(Destination Port):接收方应用程序的端口号。
  3. 长度(Length):UDP 报头加上 UDP 数据载荷的总长度。最小值为 8(即只有报头,没有数据)。
  4. 校验和(Checksum):提供对报头和数据的极其基础的差错检测。如果接收方计算出的校验和与报头中的不匹配,该 UDP 数据报将被直接丢弃,且不会通知发送方

2. 核心特性:放弃控制,拥抱速度

Section titled “2. 核心特性:放弃控制,拥抱速度”

UDP 之所以能在特定场景下击败 TCP,完全得益于它“有所不为”的底层设计逻辑:

在使用 UDP 发送数据之前,不需要像 TCP 那样经历耗时的“三次握手”。应用程序只要知道目标的 IP 和端口,就可以在任何时刻直接将数据包“轰炸”出去。这种“发射后不管(Fire and forget)”的特性,将通信延迟降到了物理极限。

UDP 内部没有序列号(Sequence Number),也没有确认应答(ACK)机制。

  • 可能丢包:如果网络拥塞导致路由器丢弃了 UDP 报文,协议栈不会进行任何重传。
  • 可能乱序:由于网络路径的动态变化,先发出的 UDP 数据包完全有可能晚于后发出的包到达目标。UDP 不负责重新排序,乱序处理的责任被全部推给了第七层的应用程序。

TCP 是面向字节流的,它会将应用层交下来的数据拆分或合并。而 UDP 是面向报文的:应用层交给 UDP 多长的报文,UDP 就原样发送,既不合并也不拆分,绝对保留报文的逻辑边界。每次 send() 必定对应接收端的一次 recv()

2.4 无拥塞控制 (No Congestion Control)

Section titled “2.4 无拥塞控制 (No Congestion Control)”

TCP 包含复杂的拥塞控制算法(如慢启动、拥塞避免),一旦检测到网络变慢,就会主动降低发送速率。而 UDP 没有任何刹车机制。应用层以多快的速度生成数据,UDP 就以多快的速度向网络中倾泻。


3. 工程应用场景:何时必须使用 UDP?

Section titled “3. 工程应用场景:何时必须使用 UDP?”

既然 UDP 如此“不可靠”,为什么还要使用它?在以下三类核心场景中,UDP 是无可争议的王者:

  1. 实时通信与流媒体(如 VoIP 电话、直播、视频会议)
    • 逻辑:在视频通话中,偶尔丢失一帧画面(屏幕闪现马赛克)是可以容忍的;但如果为了重传这一帧而导致画面卡顿等待两秒,用户体验将是灾难性的。在实时场景中,低延迟的优先级远高于数据的绝对完整性
  2. 海量请求与一问一答服务(如 DNS、DHCP、NTP 时钟同步)
    • 逻辑:DNS 查询的数据量极小(通常在 512 字节以内)。如果使用 TCP,每次查询都要经历三次握手和四次挥手,连接建立的开销甚至超过了数据本身。使用 UDP,一个包过去,一个包回来,瞬间完成。
  3. 快速动作类游戏(FPS / MOBA 游戏状态同步)
    • 逻辑:玩家的移动坐标每秒更新数十次。如果使用的是 0.1 秒前的位置信息(旧包丢失后 TCP 强制重传回来的),对游戏毫无意义,客户端只需要拿到最新的状态即可。

4. 终端状态洞察:UDP 的监听面貌

Section titled “4. 终端状态洞察:UDP 的监听面貌”

由于 UDP 没有“连接(Connection)”的概念,我们在终端中查看网络状态时,UDP 的套接字永远只有两种状态:UNCONN(监听中,未关联特定远端)或 ESTAB(在某些系统工具中用来表示最近有数据收发,但并非真正的 TCP 级连接)。

admin@tech-fortress:~# ss -uan
协议 (Netid)状态 (State)本地地址:端口 (Local Address:Port)远端地址:端口 (Peer Address:Port)典型业务识别
udpUNCONN0.0.0.0:530.0.0.0:*DNS 服务器 正在监听全网的域名解析请求。
udpUNCONN0.0.0.0:670.0.0.0:*DHCP 服务器 正在监听来自局域网的地址分配广播。
udpUNCONN127.0.0.1:1230.0.0.0:*NTP 进程 正在本地监听时钟同步服务。
udpUNCONN192.168.10.5:518200.0.0.0:*WireGuard VPN 隧道入口(WireGuard 是基于现代 UDP 的典型应用)。

5. 现代演进:基于 UDP 的“可靠”协议

Section titled “5. 现代演进:基于 UDP 的“可靠”协议”

纯粹的 UDP 过于裸奔,而 TCP 又过于笨重。近年来,网络工程界掀起了一股**“在 UDP 之上利用应用层代码实现可靠性”**的浪潮:

  • QUIC(HTTP/3 的底层,RFC 9000):Google 牵头开发的协议。它在底层的 UDP 之上,使用极其精简的代码重新实现了连接管理、加密(内置 TLS 1.3)和无头阻塞的丢包重传机制。它使得网页加载速度获得了质的飞跃,并且支持移动端在切换 Wi-Fi 和 5G 时保持连接不断开(Connection Migration)。
  • KCP:常用于游戏领域的快速可靠协议。它牺牲了部分带宽(大约比 TCP 多浪费 10%-20%),换取了比 TCP 快 30%-40% 的重传响应速度。
  • RFC 768: User Datagram Protocol (1980 年最初的基础规范)
  • RFC 9000: QUIC: A UDP-Based Multiplexed and Secure Transport (基于 UDP 的现代传输层革命)

最近更新: