TCP 与 UDP:可靠性、实时性、连接语义到底该怎么对比?
面试速答(30 秒版 TL;DR)
- TCP 和 UDP 都属于传输层协议,但设计目标不同。
- TCP 强调 面向连接、可靠传输、按序到达、流量控制、拥塞控制,适合对正确性要求高的场景。
- UDP 强调 无连接、低开销、尽力而为,适合更看重实时性、时延和简单性的场景。
- 不能简单说“TCP 好、UDP 差”,要看业务目标:文件下载、HTTP 通常选 TCP;音视频、实时游戏、DNS 常选 UDP。
- 面试官最想听到的是:为什么某场景更适合 UDP,而不是只背 TCP 更可靠。
一、先看核心差异
| 维度 | TCP | UDP |
|---|---|---|
| 连接语义 | 面向连接 | 无连接 |
| 可靠性 | 有确认、重传、按序保证 | 尽力而为,不保证到达 |
| 数据形态 | 字节流 | 报文 |
| 开销 | 较大 | 较小 |
| 时延 | 相对更高 | 相对更低 |
| 拥塞/流控 | 有 | 协议本身不提供 |
| 典型场景 | HTTP、数据库、文件传输 | DNS、音视频、实时游戏 |
二、TCP 的核心特征
1. 面向连接
通信前先三次握手,结束时有序挥手。
它的设计目标是:建立一个可靠、可维护状态的会话。
2. 可靠传输
TCP 通过这些机制保证可靠性:
- 序列号
- 确认应答(ACK)
- 超时重传
- 按序重组
- 去重
3. 流量控制
接收方可以告诉发送方:我当前还能接收多少。
这样可以避免把接收方缓冲区打爆。
4. 拥塞控制
TCP 会根据网络状况动态调整发送速率,避免把整个网络打崩。
面试里一句话:
- TCP 追求的是“可靠 + 有序 + 尽量公平地用网络”,代价是额外状态和时延。
三、UDP 的核心特征
1. 无连接
发送前不需要建连,直接发。
2. 保留报文边界
应用层一次发送一个报文,接收层看到的也是报文语义,而不是像 TCP 那样连续字节流。
3. 协议本身简单
UDP 头部小、状态少,没有强制确认、重传、拥塞控制这些机制。
这意味着:
- 更轻量
- 更低延迟
- 但应用如果需要可靠性,要自己补
四、为什么“实时业务”常选 UDP
因为很多实时场景更怕“迟到”,而不是“丢一个包”。
例如音视频通话:
- 某一帧晚了 2 秒才到,基本没有价值
- 适度丢包比整体卡顿更可接受
这时如果强依赖 TCP:
- 丢包后会重传
- 后续数据要等前面补齐
- 实时体验可能反而更差
所以实时业务常选 UDP 或基于 UDP 的协议,再在应用层做针对性的抗丢包设计。
五、TCP 的“粘包半包”和 UDP 的“报文边界”怎么答
TCP
TCP 是字节流,没有应用层消息边界。
所以你发两次:
"hello"
"world"
接收方可能一次读到:
helloworldhelloworld
所以应用层要自己设计长度字段、分隔符或协议格式。
UDP
UDP 天然保留报文边界。
一次 sendto 对应一次报文语义,接收方读取时不会自动和下一条报文拼在一起。
但注意:
- UDP 报文可能丢
- 可能乱序
- 可能根本收不到
所以“有边界”不等于“更可靠”。
六、常见协议和场景怎么选
更常见跑在 TCP 上的
- HTTP/1.1
- HTTP/2
- WebSocket(通常基于 TCP)
- MySQL / PostgreSQL 等数据库协议
- 文件传输
更常见跑在 UDP 上的
- DNS
- RTP/RTCP 音视频
- 局域网广播/发现
- 部分游戏实时同步
- QUIC(进而承载 HTTP/3)
这里有个面试加分点:
- HTTP/3 虽然最终给你的是“可靠 HTTP 语义”,但底层已经不是 TCP,而是基于 UDP 的 QUIC。
七、什么时候 UDP 不一定更快
很多人会机械地说 UDP 一定比 TCP 快,这不严谨。
更准确的说法:
- UDP 协议开销更低、建连成本更低
- 但如果业务层自己要补确认、重传、排序、拥塞控制,复杂度和额外开销也会上来
所以“快不快”要看:
- 业务需求
- 网络环境
- 上层协议实现
高频题标准答法
1. TCP 和 UDP 最大区别是什么?
TCP 面向连接并提供可靠有序传输;UDP 无连接、尽力而为、开销更低。
本质是两者设计目标不同。
2. UDP 不可靠,为什么 DNS 还大量使用 UDP?
因为 DNS 查询通常报文小、追求低延迟、一次问答就结束,用 UDP 成本低;
如果丢了,上层重试也相对容易。超大响应或特殊场景也可能切到 TCP。
3. 视频通话为什么常选 UDP?
因为实时性优先。
少量丢包通常比大面积等待重传更可接受。
4. UDP 能做可靠传输吗?
能,但要在上层协议里自己实现。
QUIC 就是典型例子:它基于 UDP,但提供了可靠传输、多路复用和拥塞控制等能力。
易错点 / 坑
- 把 UDP 说成“完全不能保证任何事”,忽略上层协议可补能力。
- 把 TCP 的可靠性理解成“绝不丢数据”;更准确地说是通过机制尽量可靠交付给对端协议栈。
- 认为 UDP 一定更快、TCP 一定更慢。
- 混淆“TCP 是字节流”和“UDP 是报文”这两个核心差异。
速记要点(可背诵)
- TCP:面向连接、可靠、有序、字节流。
- UDP:无连接、低开销、报文、尽力而为。
- 正确性优先常选 TCP,实时性优先常选 UDP。
- QUIC 是加分点:基于 UDP,但补上了很多 TCP 级能力。