TCP四次挥手

161 阅读2分钟

在TCP三次握手后,通信双方处于ESTABLISED状态,开始通信,等到数据传输结束,有一方想要断开连接时,于是开始了TCP的四次挥手

TCP四次挥手流程

TCP四次挥手 (2).png

1、第一次挥手:主动关闭方发送连接释放请求

TCP标志位FIN=1,表示主动关闭方不再发送数据,seq=x,表示主动关闭方发送数据的最后一个字节的序列号

此时主动关闭方进入FIN_WAIT_1状态

2、第二次挥手:被动关闭方确认接收到连接释放请求

ACK=1,表示收到了连接释放请求,ack=x+1,表示被动关闭方期望接收的下一个字节的序列号

此时被动关闭方进入CLOSE_WAIT状态,

主动方接收后进入FIN_WAIT_2状态,在这种时候,会继续处理未完成的请求和别的响应

3、第三次挥手:被动关闭方发送连接释放请求

FIN=1,表示被动方不再发送请求,seq=y,表示被动关闭方发送数据的最后一个字节的序列号 ACK=1,表示确认请求,ack=x+1,表示被动关闭方期望接收的下一个字节的序列号

此时被动方进入LAST_ACK状态

此时主动方进入TIME_WAIT状态,超时等待2*MSL时间,然后关闭连接。在这段超时等待时间内,本地的端口不能被新连接使用;避免延时的包的到达与随后的新连接相混淆。RFC793定义了MSL为2分钟,Linux设置成了30s,在这段时间内,若是被动方没有接受到第四次请求,则会去重新发送第三次的释放连接请求

4、第四次挥手:主动方确认接收到连接释放请求

ACK=1,ack=y+1,seq=x+1

为什么挥手是四次

因为需要双方都发起连接释放请求,并且请求都需要双方的确认