"挥手是为了终止TCP连接"
```
TCP采用四次挥手来释放连接
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态;
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态;
第三次挥手:Server 发送一个FIN,用来关闭 Server到Client的数据传送,Server 进入LAST_ACK状态;
第四次挥手:Client收到FIN后,Client 进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server 进入CLOSED状态,完成四次挥手。
```
原因&作用
因为TCP连接是全双工(双方都有发送数据和接收数据功能),发送方和接收方都需要FIN报文和ACK报文
有人会说,为什么不像三次握手一样,把第二次挥手和第三次挥手放在一起,我认为这个原因是因为,通常情况下,我们建立连接不需要准备什么,而我们在做断开连接时候,需要一定时间确认自己现在任务已经完成,所以接收方需要当自己任务完成时候再另外发送一个FIN断开信号.
对方关闭socket连接,我方忙于读或写,没有及时关闭连接 解决方案
概念:MSL是报文在网络中最长生存时间,这是一个工程值(经验值),不同的系统中可能不同。 场景:1. A发出ACK后,等待一段时间T,确保如果B重传FIN自己一定能收到 分析:
另外等待 2MSL 可以避免
前后两个使用相同四元组的连接中的前一个连接的报文干扰后一个连接
,换句话说,就是为了让此次 TCP 连接中的所有报文在网络中消失.
详细可以看