传输层有两大主角:TCP 和 UDP。几乎所有互联网应用都建立在这两个协议之上——网页用 TCP,视频通话用 UDP。它们一个追求"一个不落",一个追求"越快越好"。本文用对比的方式讲清两者的本质区别与适用场景。
1. 传输层在做什么
传输层位于网络层之上,负责为两台主机上的进程提供通信通道,用端口号区分不同的应用程序。TCP 和 UDP 就是它的两种实现思路。
2. TCP:可靠但开销大
TCP(Transmission Control Protocol)是面向连接的协议,通信前必须先建立连接,即著名的"三次握手":
- 客户端发送
SYN,表示"我想建立连接"。 - 服务端回复
SYN + ACK,表示"收到,我也准备好了"。 - 客户端再发
ACK,连接建立完成。
除此之外,TCP 还提供确认重传、流量控制、拥塞控制、按序交付等机制,保证数据不丢、不乱、不重。
3. UDP:轻快但不管不顾
UDP(User Datagram Protocol)是无连接的:不握手、不确认、不重传,发出去就不管了。它的报文头只有 8 字节,而 TCP 至少 20 字节,因此延迟低、开销小,适合对实时性要求高、能容忍少量丢失的场景。
4. 核心差异对比
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠,有确认与重传 | 不可靠,尽力而为 |
| 有序性 | 保证按序到达 | 不保证顺序 |
| 报文头 | 20~60 字节 | 8 字节 |
| 传输方式 | 字节流 | 数据报 |
| 典型应用 | HTTP、FTP、SMTP | DNS、视频、游戏、VoIP |
5. 如何选型
选型不是看哪个"更好",而是看业务容忍什么:
- 文件传输、网页浏览:数据必须完整,选 TCP。
- 视频直播、语音通话:卡顿比丢帧更难受,选 UDP。
- DNS 查询:一条请求一个响应,用 UDP 足够,失败就重发。
- 游戏:位置同步用 UDP,登录、交易等关键操作走 TCP。
值得注意,Google 主导的 QUIC(HTTP/3 的基础)在 UDP 之上实现了可靠性,试图"既要速度又要可靠",是传输层的新趋势。
6. 动手实验
# 查看本机 TCP 连接状态
ss -t
# 查看 UDP 监听端口
ss -u -l
# 用 nc 模拟一个 TCP 服务器(终端 A)
nc -l 12345
# 从终端 B 连接并发送消息
echo "hello tcp" | nc 127.0.0.1 12345
# UDP 方式:先开监听(终端 A)
nc -u -l 12345
再用 tcpdump 看看两种协议的报文差异:
# 抓取访问 80 端口的 TCP 包(root 权限)
sudo tcpdump -i any tcp port 80 -nn
# 抓取 DNS 使用的 UDP 包
sudo tcpdump -i any udp port 53 -nn
对比观察:TCP 断开时服务端会收到 EOF,而 UDP 没有"连接"概念,收不到任何通知。
7. 常见误区
- 误区一:"UDP 一定比 TCP 快"。小包场景差异不大,TCP 的慢主要来自握手和拥塞控制,但换来的是可靠。
- 误区二:"TCP 一定不会丢数据"。TCP 保证的是"要么送达要么报错",网络断开时连接照样会中断。
💡 学习建议:用 Wireshark 抓一次 HTTP 请求,亲眼看看三次握手、四次挥手的过程,比背十遍理论都管用。