TCP的三次握手与四次挥手
2025/11/4大约 3 分钟
TCP 三次握手与四次挥手
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠传输的协议。
在建立与断开连接时,TCP 通过**三次握手(Three-way Handshake)与四次挥手(Four-way Handshake)**来确保通信可靠。
一、TCP 三次握手(建立连接)
目的
确保客户端和服务器双方都具备收发能力,并建立可靠的逻辑连接。
握手过程
第一次握手(SYN)
- 客户端 → 服务器:发送连接请求(
SYN=1, seq=x) - 表示:“我想建立连接,这是我的初始序列号 x”
- 客户端进入
SYN_SENT状态
- 客户端 → 服务器:发送连接请求(
第二次握手(SYN+ACK)
- 服务器 → 客户端:回应确认(
SYN=1, ACK=1, seq=y, ack=x+1) - 表示:“我同意连接,你的请求我收到了,我的序号是 y”
- 服务器进入
SYN_RCVD状态
- 服务器 → 客户端:回应确认(
第三次握手(ACK)
- 客户端 → 服务器:确认(
ACK=1, ack=y+1) - 表示:“连接建立,我准备好了”
- 双方进入
ESTABLISHED状态,连接建立成功
- 客户端 → 服务器:确认(
三次握手示意图
为什么要三次?
防止旧连接请求误触发新连接(避免滞留的旧 SYN 包)
确认双方通信能力:
- 客户端能发、服务器能收
- 服务器能发、客户端能收
二、TCP 四次挥手(断开连接)
目的
确保数据传输完成后,双方能安全、有序地关闭连接。
TCP 是全双工通信,因此关闭连接需要四步。
挥手过程
第一次挥手(FIN)
- 客户端 → 服务器:发送断开请求(
FIN=1, seq=u) - 表示:“我已无数据要发”
- 客户端进入
FIN_WAIT_1状态
- 客户端 → 服务器:发送断开请求(
第二次挥手(ACK)
- 服务器 → 客户端:确认收到(
ACK=1, ack=u+1) - 表示:“收到请求,但我还没发完数据”
- 服务器进入
CLOSE_WAIT,客户端进入FIN_WAIT_2
- 服务器 → 客户端:确认收到(
第三次挥手(FIN)
- 服务器 → 客户端:请求关闭(
FIN=1, seq=w) - 表示:“我也发完了,可以断开”
- 服务器进入
LAST_ACK状态
- 服务器 → 客户端:请求关闭(
第四次挥手(ACK)
- 客户端 → 服务器:确认关闭(
ACK=1, ack=w+1) - 客户端进入
TIME_WAIT,等待 2MSL 后彻底关闭 - 服务器收到 ACK 后进入
CLOSED状态
- 客户端 → 服务器:确认关闭(
四次挥手示意图
TIME_WAIT 的作用
客户端在 TIME_WAIT 状态等待 2 × MSL(最大报文寿命时间),目的有:
- 确保服务器收到最后的 ACK(若丢失可重传 FIN)
- 避免旧连接残留数据干扰新连接
三、常见异常与优化
| 异常情况 | 原因 | 优化建议 |
|---|---|---|
| SYN 洪泛攻击 | 大量 SYN 包不完成握手导致半开连接过多 | 启用 SYN Cookie、限制半连接数量 |
| CLOSE_WAIT 过多 | 服务端未及时关闭 socket | 检查代码逻辑、释放连接 |
| TIME_WAIT 过多 | 高频连接建立与关闭 | 调整系统内核参数、使用连接复用 |
四、总结
| 阶段 | 次数 | 核心目的 |
|---|---|---|
| 建立连接 | 三次握手 | 确认双方通信能力,防止误连接 |
| 断开连接 | 四次挥手 | 确保数据传输完成并安全关闭 |
| TIME_WAIT | 等待 2MSL | 保证 ACK 可靠传达与旧数据清除 |