⚖️ TCP vs UDP:可靠慢 vs 快但不可靠
一个面向连接重可靠,一个无连接拼速度。为什么直播用 UDP?DNS 又为什么用 UDP?
一句话:两种哲学的传输层协议
🚚 TCP:可靠但慢
TCP(Transmission Control Protocol)是面向连接、可靠、基于字节流的协议。
三次握手建连接,确认+重传+排序+流量控制+拥塞控制,保证数据不丢不错不乱序。
适合对完整性要求高的场景。
✈️ UDP:快但不可靠
UDP(User Datagram Protocol)是无连接、不可靠、基于数据报的协议。
发前不建连接,没有确认和重传,开销小,速度仅受带宽限制,支持广播和多播。
适合实时性要求高、允许少量丢包的场景。
核心区别对比
| 维度 | 🚚 TCP | ✈️ UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接(直接发) |
| 可靠性 | 可靠(确认+重传) | 不可靠(尽最大努力) |
| 有序性 | 有序(序列号) | 可能乱序 |
| 速度 | 较慢(有开销) | 快(无开销) |
| 头部 | 20-60 字节 | 固定 8 字节 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有(慢启动/拥塞避免) | 无(应用层控制) |
| 传输方式 | 字节流 | 报文 |
| 广播/多播 | 仅单播 | 支持广播和多播 |
TCP
可靠、有序
有流控/拥塞
头部大、慢
UDP
不可靠、可乱序
无流控/拥塞
头部小、快
适用场景
🌐 TCP 适合
数据完整性要求高的场景:
• HTTP/HTTPS 网页
• FTP 文件传输
• SMTP/IMAP 邮件
• SSH 远程登录
🎬 UDP 适合
实时性要求高、允许少量丢包的场景:
• 视频直播/会议
• 在线游戏
• DNS 查询
• VoIP 语音通话
• DHCP / NTP
高频追问
直播为什么用 UDP
TCP 的拥塞控制和重传会导致延迟不可控;直播可以容忍少量丢包,但不能容忍高延迟/卡顿。
DNS 为什么用 UDP
DNS 请求通常几十字节,用 TCP 建连接的开销远大于传输本身;响应超 512 字节时才切到 TCP。
QUIC 融合两者
QUIC 基于 UDP,但在应用层实现类似 TCP 的可靠性和拥塞控制,同时解决 TCP 队头阻塞,是 HTTP/3 的底层。
什么时候 TCP 比 UDP 慢
网络质量差时 TCP 的重传和慢启动使吞吐量下降;UDP 无此机制,但应用层要自己处理丢包。
TCP 面向连接、可靠、有序、有流控拥塞(头部 20-60B),适合 HTTP/FTP/邮件等重完整性场景;UDP 无连接、不可靠、可能乱序、速度快(头部 8B),适合直播/游戏/DNS/VoIP 等实时场景。直播用 UDP 因容忍丢包不能容忍延迟,DNS 用 UDP 因请求小建连开销不值。
核心区别:TCP 面向连接,三次握手建立连接,可靠传输(确认加重传加排序),有序到达,有流量控制和拥塞控制,头部 20 到 60 字节,速度相对慢;UDP 无连接,发送前不用建立连接,不可靠没有确认重传,可能乱序,没有流量控制和拥塞控制,头部只有 8 字节,速度快。TCP 适合对数据完整性要求高的场景比如网页、文件传输、邮件;UDP 适合实时性要求高、允许少量丢包的场景比如视频直播、在线游戏、DNS。
因为 TCP 的拥塞控制和重传机制会导致延迟不可控——网络一波动,TCP 就重传、就慢启动,直播就卡顿。而直播是可以容忍少量丢包的,但不能容忍高延迟。UDP 没有这些开销,速度快、延迟可控,丢包就丢几帧,用户感知不明显。所以实时场景用 UDP。
因为 DNS 请求通常只有几十字节,用 TCP 先建连接再传输的开销远大于传输本身,不值得。UDP 一发一收很快。不过当 DNS 响应超过 512 字节时,就会切换到 TCP 传输,避免 UDP 报文被截断。