UDP 是什么
UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种核心协议,与TCP并列为互联网上最常用的两种传输方式。与 TCP 不同,UDP 是无连接的协议:发送方不需要与接收方预先建立连接,只需要把数据包(称为"数据报")直接发送出去,也不会等待对方确认收到与否。
这种设计让 UDP 的头部结构极其简单,只包含源端口、目的端口、长度和校验和等基本信息,处理开销远小于 TCP。UDP 的设计哲学可以概括为:把简单和速度放在第一位,可靠性问题留给需要的应用自己解决。
UDP 不保证什么
理解 UDP,关键是理解它"不做"什么:
- 不保证送达:数据包发出后是否到达接收端,UDP 本身不做确认,也不会重传丢失的包。
- 不保证顺序:多个数据包可能因为经过不同路径而乱序到达,UDP 不负责重新排序。
- 不做拥塞控制(协议本身):UDP 不会像 TCP 那样根据网络状况自动降速,发送方按照应用设定的速率持续发送,这既是优点(不会被意外限速)也是风险(可能加剧网络拥塞)。
正因为这些"不保证",UDP 才能省去大量握手、确认、排序的开销,换来更低的延迟和更高的传输效率。至于丢失的数据是否需要处理,完全取决于上层应用——例如语音通话可以容忍偶尔的丢帧,但游戏中的关键操作指令可能需要应用层自行设计重传逻辑。
为什么实时应用偏爱 UDP
对语音通话、视频会议、在线游戏这类实时应用来说,及时性远比完整性重要。一段延迟 0.5 秒才到达的语音数据,即便完整无损,实际使用体验也会很糟糕;相比之下,偶尔丢失一两帧画面,用户往往察觉不到明显差异。这正是这类应用普遍选择 UDP 而非 TCP 的核心原因——TCP 为了保证可靠性会等待丢失的数据包重传完成才继续处理后续数据(即"队头阻塞"问题),这在实时场景中反而会造成更明显的卡顿。
QUIC:UDP 之上的新一代传输协议
近年来,以 QUIC 为代表的新一代传输协议开始融合 TCP 和 UDP 的优点:QUIC 构建在 UDP 之上,但在应用层实现了连接迁移、多路复用、内置加密等能力,试图在保持低延迟的同时,弥补传统 UDP"完全不可靠"的短板。HTTP/3 就是基于 QUIC 构建的下一代 HTTP 协议。
这一思路也影响了网络代理协议的演进方向,Hysteria2 就是基于 QUIC(因而底层是 UDP)设计的代表性协议,相比传统基于 TCP 的 Shadowsocks、Trojan 等协议,在弱网、高丢包环境下往往能取得更好的传输表现。
TCP 与 UDP 的选择逻辑
| 维度 | TCP | UDP |
|---|---|---|
| 是否需要连接 | 需要(三次握手) | 不需要 |
| 可靠性保证 | 协议内置保证 | 不保证,交给应用层 |
| 延迟表现 | 相对更高 | 相对更低 |
| 典型场景 | 网页、文件、邮件 | 语音视频、游戏、DNS、部分新一代代理协议 |
两者并非互相替代关系,而是分别针对不同场景做出的权衡设计。判断某个应用该用哪种协议,核心问题只有一个:这个场景更在乎"数据完整",还是更在乎"响应及时"。
理解 UDP 的特性后,可以进一步阅读Hysteria2 协议介绍了解基于 UDP/QUIC 的代理协议如何实际运作,也可以对照TCP 是什么加深两者的对比理解。