传输层有两大主角:TCP 和 UDP。几乎所有互联网应用都建立在这两个协议之上——网页用 TCP,视频通话用 UDP。它们一个追求"一个不落",一个追求"越快越好"。本文用对比的方式讲清两者的本质区别与适用场景。

1. 传输层在做什么

传输层位于网络层之上,负责为两台主机上的进程提供通信通道,用端口号区分不同的应用程序。TCP 和 UDP 就是它的两种实现思路。

2. TCP:可靠但开销大

TCP(Transmission Control Protocol)是面向连接的协议,通信前必须先建立连接,即著名的"三次握手":

  1. 客户端发送 SYN,表示"我想建立连接"。
  2. 服务端回复 SYN + ACK,表示"收到,我也准备好了"。
  3. 客户端再发 ACK,连接建立完成。

除此之外,TCP 还提供确认重传、流量控制、拥塞控制、按序交付等机制,保证数据不丢、不乱、不重

3. UDP:轻快但不管不顾

UDP(User Datagram Protocol)是无连接的:不握手、不确认、不重传,发出去就不管了。它的报文头只有 8 字节,而 TCP 至少 20 字节,因此延迟低、开销小,适合对实时性要求高、能容忍少量丢失的场景。

4. 核心差异对比

维度TCPUDP
连接面向连接(三次握手)无连接
可靠性可靠,有确认与重传不可靠,尽力而为
有序性保证按序到达不保证顺序
报文头20~60 字节8 字节
传输方式字节流数据报
典型应用HTTP、FTP、SMTPDNS、视频、游戏、VoIP

5. 如何选型

选型不是看哪个"更好",而是看业务容忍什么:

值得注意,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. 常见误区

💡 学习建议:用 Wireshark 抓一次 HTTP 请求,亲眼看看三次握手、四次挥手的过程,比背十遍理论都管用。