Published on

用户数据报协议 (UDP):轻量、快速但不可靠

在 TCP/IP 协议栈的传输层 (Transport Layer) 中,用户数据报协议 (User Datagram Protocol, UDP) 是与传输控制协议 (Transmission Control Protocol, TCP) 并存的核心协议之一。与 TCP 提供的高度可靠、面向连接的字节流服务不同,UDP 的设计哲学是提供一种极简的、低开销的、无连接的数据报传输服务。它牺牲了 TCP 的可靠性保证,以换取更高的传输速度和更低的延迟。

UDP 的核心特性

无连接 (Connectionless)

UDP 在发送数据之前,不需要像 TCP 那样进行三次握手来建立一个正式的连接。它允许应用程序随时将数据报(datagrams)发送给指定的目标,每个数据报都是一个独立的、自包含的单元。这种模式避免了连接建立和拆除的开销,使得数据传输更为快捷。

“尽力而为”的传输 (Best-Effort Delivery)

UDP 不提供任何可靠性保证,它仅仅是尽其所能地将数据报发送出去。

UDP 的“不可靠性”

UDP 协议本身不保证:

  • 数据包必达: 数据包在网络传输中可能丢失,UDP 不会进行重传。
  • 数据包有序: 多个数据包的到达顺序可能与发送顺序不一致。
  • 数据包完整性: 除了一个可选的校验和外,不提供其他机制来保证数据在传输过程中未被篡改。
  • 拥塞控制: UDP 会以应用程序设定的速率发送数据,不会根据网络拥塞状况自动调整发送速率,这可能导致网络拥堵。

正因如此,UDP 有时也被戏称为“不可靠数据报协议 (Unreliable Datagram Protocol)”。所有可靠性需求都必须由上层应用程序自己实现。

轻量与高效

UDP 的头部仅有 8 字节,相比 TCP 至少 20 字节的头部,其开销极小。这种简洁性使其处理速度非常快,非常适合对时间敏感、能容忍少量数据丢失的应用。

UDP 的典型应用场景

  • 实时音视频流 (Real-time Video Streaming): 丢失一两帧视频数据通常不会严重影响观看体验,但由 TCP 重传机制带来的延迟则是不可接受的。
  • 在线游戏 (Online Gaming): 玩家位置等状态的更新,要求极低的延迟,最新的数据远比旧数据重要。
  • 域名系统 (DNS): 一次 DNS 查询通常很小,可以放入一个 UDP 数据报中,其快速的请求-响应模式远比建立 TCP 连接高效。
  • 网络电话 (VoIP)

UDP 数据报结构

当应用程序通过 UDP 发送数据时,这些数据会被封装在一个 UDP 段 (segment) 中,然后交由下层的 IP 协议进行传输。每个 UDP 段都由一个固定的 8 字节头部和一个可变长度的数据载荷组成。

UDP 数据报结构
  • 源端口 (Source Port): 16位,标识发送方应用程序的端口号。此字段是可选的。
  • 目标端口 (Destination Port): 16位,标识接收方应用程序的端口号。此字段是必需的。
  • 长度 (Length): 16位,记录了整个 UDP 段(包括头部和数据)的总长度,以字节为单位。
  • 校验和 (Checksum): 16位,用于对数据报进行基本的错误检测。
UDP 校验和 (Checksum)

UDP 的校验和提供了一种有限的数据完整性校验。

  • 计算范围: 其计算范围不仅包括 UDP 头部和数据,还包括一个由源/目标 IP 地址、协议号等信息组成的“伪头部”。这确保了数据不仅没有损坏,而且确实到达了正确的目的地。
  • 错误处理: 如果接收方计算出的校验和与头部中的值不匹配,就会认为数据报在传输中已损坏,并直接将其丢弃,不会通知发送方。
  • 可选性: 在 IPv4 中,UDP 校验和的使用是可选的(可以全置为0);但在 IPv6 中,它是强制性的。

UDP 与 TCP 的核心对比