网络协议选型:TCP vs UDP vs QUIC

做网络编程,绕不开协议选型。很多人上来就 TCP,觉得稳定可靠。但我踩过不少坑,选错协议的场景最后都付出了代价。你想想看,一个实时通话用 TCP,丢包重传直接卡成 PPT。所以今天咱们把 TCP、UDP、QUIC 掰开揉碎,看看它们到底适合什么。

3.1 TCP —— 稳字当头的“老大哥”

TCP 干了四件事:保证数据到达、保证顺序、做流量控制、做拥塞控制。说白了,它就是个“强迫症”,丢包就重传,乱序就排队。但代价呢?头部 20 字节起步,三次握手加四次挥手,端到端延迟比 UDP 高一个数量级。

核心特性

  • 面向连接(三次握手)
  • 可靠传输(确认与重传)
  • 有序交付(序列号排序)
  • 流量控制(滑动窗口)
  • 拥塞控制(慢启动、拥塞避免、快速重传)

我在项目里遇到过一个问题:一个视频监控平台,IPC 上传采用 TCP,结果 Wi-Fi 丢包时画面卡死十几秒。为什么?TCP 的队头阻塞——一个包丢了,后面所有包都得等。所以你问我 TCP 什么时候用?Web、邮件、文件传输、数据库事务,这些要求“死也要到”的场景。实时互动?赶紧绕道。

3.2 UDP —— 轻装上阵的“快枪手”

UDP 就是个“懒人”,不握手、不确认、不排队。应用层给它什么,它直接扔给对端。延迟低,开销小。但责任也全在应用层——丢了你得自己补。

什么时候选 UDP?

  • 实时音视频通话(WebRTC)
  • 在线游戏(FPS 类,丢帧比卡顿好)
  • DNS 查询
  • 物联网传感器数据上报(可容忍少量丢包)
  • 广播/多播场景

我曾经在做一个流媒体推送项目时,开始用的 TCP,用户反馈在弱网下直播延迟飙到 10 秒。换成 UDP + 自定义 FEC 后,延迟降到 500ms,丢包率仅 1% 以内。记住了:UDP 不是“不可靠”,而是把可靠性交给应用自己控制。

3.3 QUIC —— 新一代“全能选手”

QUIC 是 Google 搞出来的,现在已经是 HTTP/3 的传输层基础。它基于 UDP,却内建了 TLS 1.3 加密、多路复用、0-RTT 握手、前向纠错。最狠的是:它解决了 TCP 的队头阻塞——一条流丢了包,只会阻塞那条流,其他流照发不误。

注意陷阱
QUIC 目前并不是银弹。它的实现(比如 Chromium 的 IETF QUIC 或 quiche)有内存开销,且一些中间件(防火墙、NAT)可能会丢弃 UDP 长连接。我在某电商 App 中试用 QUIC 时,发现部分老旧路由器会拦截 UDP 443,导致回退到 TCP 慢路径。所以 QUIC 必须做好“fallback 方案”。

我建议你按这个节奏评估:如果网络环境可控(比如自建 CDN、移动端全包),大胆上 QUIC。如果还是用公共网络,混用模式——QUIC 做主,TCP 做保底。

3.4 三协议对比表

特性 TCP UDP QUIC
传输层基础 协议栈自带 协议栈自带 基于 UDP,应用层实现
可靠性 内置(确认 + 重传) 无,应用自建 内置(类似 TCP 但更灵活)
有序性 严格有序 不保证有序 按流有序,多流可乱序
队头阻塞 整个连接 HOB 无 仅单流 HOB
握手延迟 3 RTT(含 TLS) 0 RTT 0~1 RTT
多路复用 需多个连接 需应用层管理 原生多流
加密 可选(TLS 附加) 需上层加密 内置 TLS 1.3
适用场景 文件传输、Web、DB 实时互动、广播 HTTP/3、移动弱网

3.5 选型决策流程

我习惯用这张图来帮团队做判断。你只需要回答三个问题:丢包完全不能容忍吗?延迟是否敏感?需要同时发送很多请求吗?然后就能知道该用哪个。

协议选型决策流程图 业务需求 需要可靠交付? 是 → TCP 否 → 看延迟 容错但有序? 传统 TCP 延迟敏感? 是 → UDP 否 → 考虑TCP 多流复用? 否 → TCP 是 → QUIC 说明:QUIC 在移动弱网场景优势明显,但需要处理 NAT 穿越和防火墙问题。 UDP 适用于实时互动;TCP 适用于文件/Web/DB。

我的个人习惯
每当新项目架构评审,我会问三个问题:1. 数据必须按顺序到达吗?2. 用户能忍受 200ms 以上的延迟吗?3. 是否有多条独立的逻辑通道?三个“是” -> TCP;前两个“是” -> 考虑 QUIC;第一个“否”且第二个“是” -> UDP。这样做决策几乎没出过错。

最后说一点:协议选型不是非此即彼。我在视频会议系统里用过“混合模式”——信令走 TCP(保证可靠性),媒体流走 UDP(保证低延迟),上传日志走 QUIC(弱网优化)。你完全可以根据业务不同部分,选最适合的那个。千万别一把梭。好了,这一章就聊到这儿,去实战中试试吧。