TCP 与 UDP 详解
2026/8/24大约 4 分钟
TCP 与 UDP 详解
TCP 与 UDP 是传输层的两大核心协议。本章对比两者的特性,详解 TCP 的三次握手、四次挥手以及可靠性保障机制。
一、核心区别
| 对比项 | TCP | UDP |
|---|---|---|
| 全称 | Transmission Control Protocol(传输控制协议) | User Data Protocol(用户数据包协议) |
| 连接方式 | 面向连接 | 面向无连接 |
| 建立连接 | 三次握手 | 不需要 |
| 断开连接 | 四次挥手 | 不需要 |
| 报头长度 | 最小 20 字节 | 仅 8 字节 |
| 传输模式 | 面向字节流 | 面向报文 |
| 可靠性 | 可靠交付 | 尽最大努力交付,不保证可靠 |
| 效率 | 慢,占用资源高 | 快,开销小 |
| 应用场景 | 文件传输、网页浏览等 | 音视频通话、游戏、DNS 等 |
二、面向字节流与面向报文
面向报文(UDP): 应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。因此应用程序必须选择合适大小的报文:太长 IP 层需要分片降低效率,太短则 IP 头开销占比过大。UDP 对应用层交下来的报文既不合并也不拆分,保留报文的边界。
面向字节流(TCP): 虽然应用程序与 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序看成是一连串无结构的字节流。TCP 有缓冲:数据块太长可划分短一些再传,太短则等待积累足够字节后再构成报文段发送。
三、TCP 三次握手
客户端 服务器
| |
|---- SYN=1, SEQ=X ----------->| 1. 客户端发送连接请求
|<--- SYN=1, ACK=X+1, SEQ=Y ---| 2. 服务器确认并同意连接
|---- ACK=Y+1, SEQ=X+1 ------->| 3. 客户端确认- 客户端发送:
SYN = 1, SEQ = X(请求建立连接)。 - 服务器回复:
SYN = 1, ACK = X + 1, SEQ = Y(同意连接)。 - 客户端发送:
ACK = Y + 1(确认收到)。
确认应答信号
ACK = 收到的 SEQ + 1;连接建立过程中同步信号SYN始终为 1,建立后SYN = 0。
为什么需要三次握手? 防止已失效的连接请求报文突然又传到服务器,导致服务器建立不必要的连接,浪费资源。三次握手可以让双方都确认"自己发送能力、接收能力正常"。
四、TCP 四次挥手
客户端 服务器
| |
|---- FIN = 1 ---------------->| 1. A 提出停止连接请求
|<--- ACK = 1 -----------------| 2. B 确认收到
| | (B 可能还有数据要发送)
|<--- FIN = 1 -----------------| 3. B 提出停止连接请求
|---- ACK = 1 ---------------->| 4. A 确认收到- A 向 B 提出停止连接请求(FIN = 1)。
- B 收到,回复 ACK = 1。
- B 向 A 提出停止连接请求(FIN = 1)——此时 B 可能还有数据未发送完。
- A 收到,回复 ACK = 1,连接关闭。
为什么是四次? 因为 TCP 是全双工通信,A 发送 FIN 只代表 A 不再发送数据,B 可能还有数据要发给 A,所以 B 的确认(第 2 步)和 B 的结束请求(第 3 步)必须分开发送。
五、TCP 的可靠性保障
优点(可靠、稳定):
- 传递数据前,三次握手建立连接。
- 传递数据时,有确认、窗口、重传、拥塞控制机制。
- 传递数据后,断开连接节省系统资源。
如何保证接收的顺序性?
TCP 使用 SEQ 和 ACK 机制保证顺序性:每个报文都有序号,确认应答信号 ACK = 收到的 SEQ + 1,接收方按序号重组数据。
缺点(代价):
- 传输慢、效率低、占用系统资源高:建立连接耗时,确认、重传、拥塞控制消耗大量时间和 CPU/内存资源。
- 易被攻击:因为有确认机制、三次握手等机制,容易被人利用实现 DoS / DDoS 攻击(如 SYN Flood)。
六、UDP 的特点
- 传输数据前源端和终端不建立连接,想传送时直接抓取应用程序的数据发送。
- 发送速度仅受应用程序生成数据的速度、计算机能力和传输带宽限制。
- 接收端把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
- 不需要维护连接状态(收发状态),一台服务器可同时向多个客户机传输相同消息。
- 信息包标题短(8 字节),额外开销小。
- 吞吐量不受拥塞控制算法调节。
- 使用"尽最大努力交付",主机不需要维持复杂的连接状态表。
使用
ping命令测试两台主机之间 TCP/IP 通信是否正常,其原理就是向对方主机发送数据包,对方确认收到后及时反馈,网络就是通的。