TCP 和 UDP 有什么区别?各适合什么场景?
简化版
TCP 面向连接、可靠、有序、有流量和拥塞控制,但开销大、慢一点,适合不能丢数据的场景(网页、文件传输、邮件)。UDP 无连接、不保证可靠和顺序、开销小、快,适合要实时、能容忍少量丢包的场景(音视频通话、直播、游戏、DNS)。核心取舍:TCP 换可靠、UDP 换实时。
详细版
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(先三次握手) | 无连接,直接发 |
| 可靠性 | 可靠(确认、重传、有序) | 不可靠,可能丢包、乱序 |
| 传输方式 | 字节流 | 数据报(保留消息边界) |
| 流量/拥塞控制 | 有 | 无 |
| 首部开销 | 20 字节起 | 8 字节 |
| 传输效率 | 较低(机制多) | 高 |
| 一对多 | 只能一对一 | 支持单播/多播/广播 |
| 典型应用 | HTTP、FTP、SMTP | DNS、视频/语音、直播、游戏、QUIC |
- TCP 靠三次握手建连、序列号 + 确认 + 重传保证可靠、滑动窗口做流量控制、拥塞算法适应网络,代价是慢、开销大。
- UDP 就是「打包即发」,不管对方在不在、收没收到,所以快、简单,但可靠性要应用层自己兜。
完整版教学
一、抓住本质:可靠 vs 实时
TCP 和 UDP 的所有差异,都源于一个根本取舍:要可靠,还是要快/实时。
- TCP 为了「一个字节都不能错、不能乱、不能丢」,加了握手、确认、重传、排序、流控、拥塞控制一整套机制——安全但重。
- UDP 为了「尽快把包发出去」,把这些全省了——轻快但不保证送达。
理解了这个取舍,剩下的区别都能推出来:TCP 有连接(要维护状态做可靠传输),UDP 无连接(不需要);TCP 有序(要保证顺序),UDP 无序;TCP 开销大(首部字段多),UDP 开销小。
二、为什么丢包容忍场景反而选 UDP
反直觉的一点:音视频通话、直播、游戏这些「重要」的实时应用,反而用不可靠的 UDP。原因是实时性比完整性更重要:
- 视频通话丢了一帧,你希望它直接播下一帧,而不是卡住等它重传——等重传到了,画面早过时了;
- TCP 的重传和有序保证会导致队头阻塞:一个包丢了,后面的包即使到了也得排队等它,造成卡顿。
所以实时场景宁可丢几帧(UDP),也不要卡顿(TCP)。丢包的补偿交给应用层(如前向纠错、丢帧策略)。
三、UDP 保留消息边界,TCP 是字节流
一个容易忽略但高频的区别:
- TCP 是字节流:它不保留「消息边界」,你发两次
send,接收方可能一次recv全收到,或分几次收到——这就是粘包/拆包问题的根源(详见那道题)。 - UDP 是数据报:一个
sendto对应一个recvfrom,消息边界被保留,不会粘包。
所以 TCP 应用要自己定义消息边界(长度头/分隔符),UDP 不用。
四、现代趋势:QUIC —— 用 UDP 重造可靠
HTTP/3 底层用的是 QUIC,而 QUIC 建立在 UDP 之上。这看起来矛盾(可靠的 HTTP 用不可靠的 UDP?),其实是聪明的选择:TCP 的可靠机制固化在操作系统内核里,难以升级;QUIC 在 UDP 之上、于用户态重新实现了可靠、有序、多路复用,还解决了 TCP 的队头阻塞,且能更快建连(0-RTT)。所以「UDP 不可靠」不代表「基于 UDP 的协议不可靠」。
五、常见误区
- ❌ 以为 UDP「没用」——DNS、视频、游戏、QUIC/HTTP3 都用它,实时场景它是首选。
- ❌ 以为 TCP 一定比 UDP 好——看需求,实时场景 TCP 的重传/有序反而是负担(队头阻塞)。
- ❌ 以为 TCP 也保留消息边界——它是字节流,会粘包,需应用层划边界。
- ❌ 以为用了 UDP 就一定丢数据——UDP 只是不保证,网络好时照样不丢;可靠性可由应用层补。
六、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| TCP | 面向连接、可靠、有序、字节流 |
| UDP | 无连接、不保证可靠、保留报文边界 |
| 选择标准 | 可靠性优先选 TCP,实时性和自定义协议可选 UDP |
TCP: stream, retransmission, order
UDP: datagram, no built-in retransmission
QUIC: reliable transport built on UDP
TCP 和 UDP 不是简单的“安全 vs 不安全”,而是可靠有序和实时轻量之间的取舍。
- 误区:UDP 一定不可靠,所以不能用于可靠业务。 UDP 本身不保证可靠,但应用层可以自己实现确认、重传和拥塞控制。
- 误区:TCP 总是比 UDP 慢。 TCP 提供可靠性有成本,但具体性能取决于场景、网络和协议设计。
- 误区:TCP 保留消息边界。 TCP 是字节流,应用需要自己定义消息边界;UDP 每个 datagram 有边界。
- 追问:为什么音视频常用 UDP? 实时业务更怕延迟堆积,少量丢包可容忍或用应用层补偿。
- 追问:DNS 为什么常用 UDP? 请求响应小、交互简单,UDP 开销低;响应过大或区域传送等场景也会用 TCP。
- 追问:QUIC 为什么基于 UDP? 避免 TCP 队头阻塞和内核升级限制,在用户态实现可靠传输和 TLS 集成。
七、加强记忆
TCP 面向连接、可靠有序、有流控拥塞控制但重且慢,适合不能丢数据的场景;UDP 无连接、不保证可靠但轻快、保留消息边界,适合要实时、能容忍丢包的场景。本质取舍是可靠 vs 实时:网页文件用 TCP,音视频游戏 DNS 用 UDP;HTTP/3 的 QUIC 更是在 UDP 上重造了可靠传输。