TCP 的四次挥手是用于可靠终止连接的过程,确保双方都能安全关闭通信。以下是详细步骤和逻辑:
四次挥手流程
-
第一次挥手(FIN)
- 主动关闭方(如客户端)发送
FIN=1
报文,进入FIN_WAIT_1
状态,表示不再发送数据,但可接收数据。
- 主动关闭方(如客户端)发送
-
第二次挥手(ACK)
- 被动关闭方(如服务器)收到
FIN
后,回复ACK
确认,进入CLOSE_WAIT
状态。 - 客户端收到
ACK
后进入FIN_WAIT_2
状态,等待服务器的关闭请求。 - 此时连接处于半关闭状态:服务器仍可向客户端发送剩余数据。
- 被动关闭方(如服务器)收到
-
第三次挥手(FIN)
- 服务器处理完数据后,发送
FIN=1
报文,进入LAST_ACK
状态,表示准备关闭。
- 服务器处理完数据后,发送
-
第四次挥手(ACK)
- 客户端收到
FIN
后,回复ACK
确认,进入TIME_WAIT
状态,等待 2MSL(最大报文生存时间)后关闭。 - 服务器收到
ACK
后立即关闭连接。
- 客户端收到
关键机制解析
-
为什么需要四次?
- TCP 是全双工协议,双方需独立关闭各自的通道。
- 被动关闭方可能需要时间处理剩余数据,因此
ACK
和FIN
分开发送(无法合并为三次)。
-
TIME_WAIT 的作用
- 防止旧连接的延迟报文干扰新连接(相同端口复用场景)。
- 确保被动关闭方收到最后的 ACK(若 ACK 丢失,被动方会重传
FIN
,客户端可再次响应)。
-
CLOSE_WAIT 状态的意义
- 表示被动关闭方正在处理关闭前的收尾工作(如释放资源或发送剩余数据)。
特殊情况
- 三次挥手可能吗?
如果服务器没有数据要发送,可能将ACK
和FIN
合并为一次发送(变为三次),但多数场景仍为四次。
示意图
客户端 服务器
|––FIN––> (客户端:FIN_WAIT_1)
|<––ACK––– (服务器:CLOSE_WAIT;客户端:FIN_WAIT_2)
|<––FIN––– (服务器:LAST_ACK)
|––ACK–––> (客户端:TIME_WAIT → 关闭;服务器:关闭)
理解四次挥手的关键是认识到 TCP 的双向通道独立关闭机制,以及通过状态和计时器保证可靠性。