tcp四次挥手及其状态变化
TCP 的四次挥手(Four-Way Handshake)是关闭一个可靠的 TCP 连接的过程。与三次握手建立连接时的状态变化一样,四次挥手在关闭连接的过程中也涉及双方状态的变化。以下是四次挥手的详细过程及连接状态的变化。
# 四次挥手过程
阶段 1:客户端主动关闭连接
- 客户端发送一个
FIN
(Finish)报文段,表示客户端没有数据要发送了,想要关闭连接。- 状态变化:
- 客户端状态:
ESTABLISHED
→FIN_WAIT_1
- 服务器状态:
ESTABLISHED
- 客户端状态:
- 状态变化:
阶段 2:服务器确认关闭请求
- 服务器接收到
FIN
报文段后,发送一个ACK
报文段,确认收到客户端的关闭请求,同时服务器可能会继续发送数据,直到没有数据为止。- 状态变化:
- 客户端状态:
FIN_WAIT_1
→FIN_WAIT_2
- 服务器状态:
ESTABLISHED
→CLOSE_WAIT
- 客户端状态:
- 状态变化:
阶段 3:服务器准备关闭连接
- 服务器准备关闭连接时,发送一个
FIN
报文段给客户端,表示服务器也没有数据要发送了。- 状态变化:
- 客户端状态:
FIN_WAIT_2
- 服务器状态:
CLOSE_WAIT
→LAST_ACK
- 客户端状态:
- 状态变化:
阶段 4:客户端确认关闭连接
- 客户端接收到服务器的
FIN
报文段后,发送一个ACK
报文段给服务器,表示连接关闭流程完成。- 状态变化:
- 客户端状态:
FIN_WAIT_2
→TIME_WAIT
- 服务器状态:
LAST_ACK
→CLOSED
- 客户端状态:
- 状态变化:
最终状态:
5. 客户端在 TIME_WAIT
状态保持一段时间(通常为 2倍的最大报文段生存时间(MSL))以确保服务器收到了 ACK,然后转换为 CLOSED
状态。
- 状态变化:
- 客户端状态:
TIME_WAIT
→CLOSED
- 客户端状态:
# 总结连接状态变化
操作 | 客户端状态 | 服务器状态 |
---|---|---|
Start Disconnect | ESTABLISHED → FIN_WAIT_1 | ESTABLISHED |
Receive FIN | FIN_WAIT_1 → FIN_WAIT_2 | ESTABLISHED → CLOSE_WAIT |
Send FIN | FIN_WAIT_2 | CLOSE_WAIT → LAST_ACK |
Receive ACK | FIN_WAIT_2 → TIME_WAIT | LAST_ACK → CLOSED |
Timeout (2MSL) | TIME_WAIT → CLOSED | CLOSED |
# 握手示意图
以下是 TCP 四次挥手的示意图:
Client Server
| FIN ------------------------------------------> |
| |
| <-------------------- ACK ------------------- |
| |
| <-------------------- FIN ------------------- |
| |
| ACK ------------------------------------------> |
| |
| Connection Closed |
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 总结
TCP 的四次挥手过程确保了正常和有序地关闭连接,每个阶段都通过状态变化反映连接的关闭过程。由于 TCP 是面向连接的协议,关闭连接的过程同样需要确保双方都确认没有更多的数据需要发送或接收。这种设计可以防止数据丢失,并确保连接的可靠性。
编辑 (opens new window)
上次更新: 2024/09/13, 11:59:12