TCP四次挥手
TCP的断开状态
客户端
1、建立完成状态 --- 发送完所有字节流后,携带最后一组字节流的数据同时将FIN标记位置1,之后进入到下一个状态。
2、FIN_WAIT_1 --- 等待服务器回复ACK,收到ACK应答之后,将进入到下一个状态。
3、FIN_WAIT_2 --- 等待服务器发送FIN断开请求,将恢复ACK进行确认,进入下一个状态。
4、TIME_WAIT --- 等待2MSL时间后进入下一个状态。
5、CLOSE --- 关闭状态,断开TCP的连接,释放掉所有TCP连接占用的资源。
为什么会有TIME_WAIT状态??
保证TCP会话可以正常关闭。断开连接发起方最后发送ACK可能出现问题(丢包),需要等待对方反馈。
为什么TIME——WAIT状态的时间是2MSL??
MSL --- 报文最大生存时间
原因:1、最后一个ACK报文丢失,等待对方重传,一来一回正好两个MSL时间,设置为此,则可以保证TCP会话的正常断开。
2、设置2MSL足以让两个方向上的数据报都丢弃,再出现新的连接时,不至于让历史报文造成数据错乱。
3、太长也不行,导致资源占用过大。
服务器
1、建立完成状态 --- 收到客户端发送的FIN断开请求后,服务器将回复一个ACK确认报文,之后进入到下一个状态
2、CLOSED_WAIT --- 等待服务器自身字节流的发送,当自身所有字节流传递完毕后,将发送一个FIN断开请求,之后进入到下一个状态
3、LAST_ACK --- 等待客户端进行最后的ACK答应,当收到客户端发送的ACK确认报文之后,将进入到下一状态。
4、CLOSE --- 关闭状态,断开TCP的连接,释放掉所有TCP连接占用的资源。