TCP四次挥手中的TIME_WAIT状态存在的理由

网络编程 · 2019-05-29 · 214 人浏览

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。


(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。


(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。


(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。


注意到,第四次握手时,Client接收到Fin后,并没有立即进入CLOSED状态,而是进入TIME_WAIT状态,这是为什么呢?


(1)Client不能保证最后的ACK能到达Server,所以还应该观望一段时间,护送一段时间。如果最后的ACK丢失,那么Server显然收不到,于是Server发起了重传FIN的操作,此时如果Client处于CLOSED状态,就无法重发ACK了。所以Client要等待一个2MSL的时间,这段时间就是TIME_WAIT。 

因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的Server端必须维持TIME_WAIT状态 。


2)允许老的重复分节在网络中消逝 

TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

---------------------