【Linux网络编程】TCP连接的分组交换与状态转移
【1】TCP连接的状态转移
【2】TCP连接的分组交换
【3】TIME_WAIT状态说明
TIME_WAIT的作用
1. 可靠地实现TCP全双工连接的终止;
说明 : 假如这个最后回应的ACK丢失了,也就是服务器端接收不到这个ACK,那么服务器将继续发送它最终的那个FIN,因此客户端必须维护状态信息(TIME_WAIT)允许它重发最后的那个ACK。
如果没有这个TIME_WAIT状态,客户端处于CLOSED状态,那么客户端将响应RST,服务器端收到后会将该RST分节解释成一个错误,也就不能实现最后的全双工关闭了(可能是主动方单方的关闭)。
所以要实现TCP全双工连接的正常终止(两方都关闭连接),必须处理终止过程中四个分节任何一个分节的丢失情况,那么主动关闭连接的主动端必须维持TIME_WAIT状态,最后一个回应ACK的是主动执行关闭的那端。
从变迁图可以看出,如果没有TIME_WAIT状态,我们将没有任何机制来保证最后一个ACK能够正常到达。
2. 允许老的重复分节(数据报)在网络中消逝;
如果目前的通信双方都已经调用了 close(),都到达了CLOSED状态,没有TIME_WAIT状态时,会出现这样一种情况 :
现在有一个新的连接被建立起来,使用的IP地址和端口和这个先前到达了CLOSED状态的完全相同,假定原先的连接中还有数据报残存在网络之中,这样新的连接建立以后传输的数据极有可能就是原先的连接的数据报;
为了防止这一点,TCP不允许从处于TIME_WAIT状态的socket建立一个连接,处于TIME_WAIT状态的 socket 在等待了两倍的MSL(MSL是任何IP数据报能够在因特网中存活的最长时间)时间之后,将会转变为CLOSED状态。
这里TIME_WAIT状态持续的时间是2MSL,足以让这两个方向上的数据包被丢弃(最长是2MSL)。
通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已经在网络中消逝了。
参考
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。
【1】UNIX网络编程