一、概要
TCP(传输控制协议)在完成数据传输后,需要通过一种可靠的方式来关闭连接,以确保所有数据都已正确传送并释放相关资源。这一过程称为“四次挥手”(Four-Way Handshake)。四次挥手的主要目的是确保双方都能有序地关闭连接,避免数据丢失。
二、四次挥手的步骤
四次挥手的过程包括四个主要的步骤,涉及主动关闭连接的一方和被动关闭连接的一方。
第一步:发送FIN
-
操作:
-
主动关闭连接的一方(例如客户端)发送一个FIN(Finish)报文,表示它已经完成数据发送,不再发送更多的数据,但仍然可以接收数据。
-
-
状态变化:
-
客户端:进入
FIN_WAIT_1
状态,等待服务器的确认。 -
服务器:保持在
ESTABLISHED
状态,准备接收FIN。
-
第二步:响应ACK
-
操作:
-
服务器收到FIN报文后,发送一个ACK(Acknowledgment)报文,确认收到关闭请求。同时,服务器可以继续发送未发送的数据。
-
-
状态变化:
-
客户端:进入
FIN_WAIT_2
状态,等待服务器的FIN。 -
服务器:进入
CLOSE_WAIT
状态,表示它知道客户端要关闭连接。
-
第三步:发送FIN
-
操作:
-
服务器在完成所有数据传输后,准备关闭连接,发送一个FIN报文,表示它也不再发送数据。
-
-
状态变化:
-
客户端:仍处于
FIN_WAIT_2
状态,等待服务器的ACK。 -
服务器:进入
LAST_ACK
状态,等待客户端的确认。
-
第四步:响应ACK
-
操作:
-
客户端收到服务器的FIN报文后,发送ACK报文以确认服务器的关闭请求。
-
-
状态变化:
-
客户端:进入
TIME_WAIT
状态,以保证服务器收到ACK报文,并在一段时间后进入CLOSED
状态。 -
服务器:在收到ACK后,进入
CLOSED
状态,表示连接已关闭。
-
三、状态变化图示
- 四次挥手的简化示意图:
客户端 服务器
| FIN |
| --------------------> |
| ACK |
| <---------------------|
| FIN |
| <---------------------|
| ACK |
| --------------------> |
- 四次挥手在CANoe中的Trace:
四、各状态的详细说明
-
FIN_WAIT_1:客户端在发送FIN后,等待服务器的ACK确认。
-
FIN_WAIT_2:客户端在收到ACK后,等待服务器的FIN。
-
CLOSE_WAIT:服务器在收到客户端的FIN后,准备关闭连接,但仍处于等待状态,直到它发送自己的FIN。
-
LAST_ACK:服务器在发送FIN后,等待客户端的ACK确认。
-
TIME_WAIT:客户端在发送ACK后,进入TIME_WAIT状态,保持一段时间以确保服务器接收到ACK,然后最终转入CLOSED状态。
-
CLOSED:连接完全关闭,双方释放资源。
五、四次挥手的特点
-
有序性:四次挥手确保双方都能有序地关闭连接,避免数据丢失。
-
可靠性:通过ACK确认机制,确保双方都确认对方的关闭请求。
-
资源释放:确保所有资源(如缓冲区和连接控制块)在连接关闭后被正确释放。
六、总结
四次挥手是TCP协议中至关重要的部分,它确保了在关闭连接时的可靠性和有序性。通过这个过程,TCP可以有效地管理连接的关闭,避免数据丢失和资源浪费。理解四次挥手的机制对于网络编程、故障排查和网络安全等领域具有重要意义。