TCP 三次握手(连接建立)
TCP 连接建立通过三次握手完成,确保双方同步初始序列号并确认可达性。
阶段说明
第一次握手
- 客户端 → 服务器:发送
SYN
(同步请求),携带初始序列号seq = x
。 - 客户端状态:
SYN_SENT
(等待服务器响应)。
- 客户端 → 服务器:发送
第二次握手
- 服务器 → 客户端:回复
SYN + ACK
,确认客户端的seq
(ack = x + 1
),并发送自己的初始序列号seq = y
。 - 服务器状态:
SYN_RCVD
(等待客户端确认)。
- 服务器 → 客户端:回复
第三次握手
- 客户端 → 服务器:发送
ACK
,确认服务器的seq
(ack = y + 1
)。 - 客户端状态:
ESTABLISHED
(连接成功)。 - 服务器状态:收到
ACK
后进入ESTABLISHED
。
- 客户端 → 服务器:发送
TCP 四次挥手(连接关闭)
TCP 连接关闭需要四次挥手,因为服务器可能需要时间处理未发送的数据。
阶段说明
第一次挥手
- 客户端 → 服务器:发送
FIN
(结束请求),请求关闭写通道,携带序列号seq = u
。 - 客户端状态:
FIN_WAIT_1
(等待服务器确认)。
- 客户端 → 服务器:发送
第二次挥手
- 服务器 → 客户端:回复
ACK
,确认客户端的FIN
(ack = u + 1
),并继续处理剩余数据。 - 服务器状态:
CLOSE_WAIT
(等待应用层关闭连接)。 - 客户端状态:收到
ACK
后进入FIN_WAIT_2
(等待服务器关闭)。
- 服务器 → 客户端:回复
第三次挥手
- 服务器 → 客户端:发送
FIN
,携带序列号seq = v
,表示数据已发送完毕。 - 服务器状态:
LAST_ACK
(等待客户端最终确认)。
- 服务器 → 客户端:发送
第四次挥手
- 客户端 → 服务器:回复
ACK
,确认服务器的FIN
(ack = v + 1
)。 - 客户端状态:进入
TIME_WAIT
(等待 2MSL 确保所有数据包消失)。 - 服务器状态:收到
ACK
后直接关闭,进入CLOSED
。 - 客户端最终状态:
TIME_WAIT
超时后进入CLOSED
。
- 客户端 → 服务器:回复
状态转换总结
阶段 | 客户端状态 | 服务器状态 | 事件 |
---|---|---|---|
连接建立 | SYN_SENT → ESTABLISHED | SYN_RCVD → ESTABLISHED | SYN → SYN+ACK → ACK |
连接关闭 | FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED | CLOSE_WAIT → LAST_ACK → CLOSED | FIN → ACK → FIN → ACK |
关键细节
- SYN 洪泛攻击:利用
SYN_SENT
状态耗尽服务器资源,需通过 SYN Cookie 等机制防御。 - TIME_WAIT 作用:确保最后一个
ACK
到达服务器,避免旧连接的数据包干扰新连接。 - 半关闭状态:
FIN_WAIT_2
时客户端仍可接收数据,服务器需主动关闭。
通过四次挥手,TCP 确保数据完整传输后优雅断开连接。