TCP 与 UDP 对比
传输层的两大协议对决 — 什么时候选 TCP,什么时候选 UDP?
1. UDP 简介
UDP(User Datagram Protocol,用户数据报协议) 是 TCP/IP 协议族中另一个重要的传输层协议。与 TCP 的"重型可靠"相反,UDP 追求轻量、快速、无连接。
UDP 头部(仅 8 字节)
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| 源端口 | 目的端口 |
+--------+--------+--------+--------+
| 长度 | 校验和 |
+--------+--------+--------+--------+
| 数据... |
+-----------------------------------+
极简设计——没有序列号、确认号、窗口、标志位。UDP 只做了两件事:
- 区分不同应用(端口号)
- 检测传输错误(校验和,可选)
2. TCP vs UDP 核心对比
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接,直接发送 |
| 可靠性 | 可靠(确认+重传) | 不可靠,尽力而为 |
| 顺序 | 保证有序 | 不保证,可能乱序 |
| 流量控制 | 滑动窗口 | 无 |
| 拥塞控制 | 有(慢启动/拥塞避免等) | 无 |
| 头部开销 | 20-60 字节 | 8 字节 |
| 传输模式 | 字节流 | 数据报(保留消息边界) |
| 广播/多播 | 不支持 | 支持 |
| 速度 | 较慢(有连接建立和确认开销) | 较快 |
| 双工 | 全双工 | 全双工 |
形象比喻
- TCP:打电话。先拨号建立连接,对方确认接通后再通话,保证每句话都能被对方听到且顺序正确。
- UDP:寄明信片。直接投递,不确认对方是否收到,可能丢也可能乱序,但速度快。
3. 适用场景分析
3.1 TCP 适用场景
一句话:数据完整性 > 实时性的场景。
| 场景 | 原因 |
|---|---|
| 网页浏览 (HTTP/HTTPS) | 页面内容一个字都不能错 |
| 文件传输 (FTP/SFTP) | 文件必须完整 |
| 电子邮件 (SMTP/IMAP) | 邮件内容不能丢 |
| 数据库查询 | 查询结果必须可靠 |
| 远程登录 (SSH/Telnet) | 每个字符都要正确到达 |
| API 调用 (REST/gRPC) | 请求和响应必须可靠 |
3.2 UDP 适用场景
一句话:实时性 > 数据完整性 或 可以容忍少量丢包的场景。
| 场景 | 原因 |
|---|---|
| 视频直播/会议 | 丢几帧比卡顿等待好 |
| VoIP 语音通话 | 实时性要求高,少量丢包听不清但可接受 |
| 在线游戏 | 延迟比丢包更致命(位置更新丢了可以靠下一包弥补) |
| DNS 查询 | 请求简单,超时重试即可,不需要 TCP 连接开销 |
| DHCP | 广播发现服务器,无连接更合适 |
| IoT 传感器数据 | 设备资源有限,少量丢包可接受 |
| 实时监控视频流 | 延迟要求高的视频传输 |
4. 编程接口差异
TCP Socket 编程典型流程
服务器端 客户端
socket() socket()
| |
bind() |
| |
listen() |
| |
accept() ←──────── 三次握手 ──────→ connect()
| |
read() ←──────── 数据 ─────────→ write()
write() ─────────→ 数据 ←──────── read()
| |
close() ←──────── 四次挥手 ──────→ close()
UDP Socket 编程典型流程
服务器端 客户端
socket() socket()
| |
bind() |
| |
recvfrom() ←────── 数据 ───────── sendto()
| |
sendto() ──────→ 数据 ←──────── recvfrom()
| |
close() close()
关键区别:
- TCP 需要
listen/accept/connect建立连接,UDP 直接sendto/recvfrom - TCP 用
read/write(字节流),UDP 用sendto/recvfrom(保留消息边界) - TCP 一个连接一个 socket,UDP 一个 socket 可以和多个对端通信
5. QUIC:新一代的融合方案
Google 开发的 QUIC 协议(Quick UDP Internet Connections,已标准化为 RFC 9000)在 UDP 之上实现了类似 TCP 的可靠传输,并加入 TLS 1.3 加密。
| 维度 | TCP + TLS 1.3 | QUIC (UDP) |
|---|---|---|
| 握手延迟 | TCP 握手 + TLS 握手(2-3 RTT) | 0-1 RTT(合并了传输和加密握手) |
| 队头阻塞 | TCP 层存在(一个流丢包阻塞所有流) | 消除了(各流独立) |
| 连接迁移 | 不支持(换 IP 需重建连接) | 支持(通过连接 ID 而非 IP 标识) |
| 部署 | 内核实现,更新困难 | 用户态实现,灵活迭代 |
HTTP/3 基于 QUIC,正在逐步替代 HTTP/2(基于 TCP)。
6. 选择建议
你的数据需要 100% 可靠吗?
├── 是 → 用 TCP
└── 否 →
实时性比完整性更重要吗?
├── 是 → 用 UDP(或 QUIC)
└── 否 → 还是用 TCP
经验法则:
- 传输文件、网页、邮件、数据库 → TCP
- 音视频通话、直播、游戏、DNS → UDP
- 既想要可靠又想要低延迟 → QUIC (HTTP/3)
本篇要点
- TCP 面向连接、可靠、有序、有流量/拥塞控制、字节流;UDP 无连接、不可靠、无序、无控制、保留消息边界
- UDP 头部仅 8 字节(源端口+目的端口+长度+校验和),追求轻量低延迟
- TCP 适用:数据完整性优先(网页、文件、邮件、数据库);UDP 适用:实时性优先(音视频、游戏、DNS)
- TCP 队头阻塞:一个段丢失会阻塞后续所有已到达段的交付,HTTP/2 多路复用会放大这个问题
- QUIC 基于 UDP 实现可靠传输 + TLS 1.3,优势:0-1 RTT 握手、消除队头阻塞、支持连接迁移
- 选择原则:需要可靠选 TCP,需要低延迟且能容忍丢包选 UDP,两者都要选 QUIC