TIME_WAIT状态

发布时间:2016-12-11 6:27:14 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"TIME_WAIT状态",主要涉及到TIME_WAIT状态方面的内容,对于TIME_WAIT状态感兴趣的同学可以参考一下。

一、TIME-WAIT是什么         TIME-WAIT状态是在连接拆除阶段开始起作用的。在拆除一个TCP连接通常需要交换 4 个分段。        (1)主机 1 上的应用程序关闭自己这端的连接,使得 TCP 向主机 2 发送了一个 FIN。        (2)主机 2 对着(1)中的 FIN 进行 ACK 确认。        (3)一段时间之后,主机 2 上的应用程序关闭它这端的连接,这样就向主机 1 发送一个 FIN。        (4)主机 2 会以一个 ACK 应答。         主机1在收到主机2的结束报文段(报文3中的FIN)之后,并没有直接进入CLOSED状态,而是转到TIME_WAIT状态。在这个状态,客户端连接要等待一段长为 2MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。         关于TIME-WAIT状态,还要弄清楚三点:        (1)通常,只有一端——主动关闭的那一端会进入TIME-WAIT状态。        (2)RFC 793 将 MSL 定义为 2 分钟。根据这个定义,连接会在TIME-WAIT状态停留 4 分钟。但实际上这个值基本上被忽略了。        (3)如果连接处于TIME-WAIT状态时有分组到达,就重启2MSL的定时器。 二、为什么要使用它         使用TIME-WAIT状态主要有两个目的:        (1)可靠地终止TCP连接        (2)为耗尽网络中所有此连接的“走失段”提供时间         第一个目的很好理解。假设主动关闭的这一端没有进入TIME-WAIT状态,而只是关闭了连接,并且对最后一条ACK丢失掉了。因为最后一条ACK丢失了,被动关闭的这一端会超时,并重传FIN。而主动关闭端收到重传的FIN时,TCP已经没有这条连接的记录了(已经关闭了连接),所以它会用RST(重置)来响应,对等实体会产生一个错误状态,而不会有序地终止。但如果发送最后一条ACK的这一端处于TIME-WAIT状态,仍然有这条连接的记录,所以它可以对来自对应实体的重传FIN进行正确的响应。         在Linux系统上,一个TCP端口不能被同时打开多次(两次及以上)。当一个TCP连接处于TIME_WAIT状态时,我们将无法立即使用该连接占用的端口来建立一个新的连接。反过来思考,如果不存在TIME_WAIT状态,则应用程序能够立即建立一个和刚关闭的连接相似的连接。这个新连接可能接受到属于原来的连接的、携带应用程序数据的TCP报文段(迟到的报文段),这显然是不应该发生的。这就是TIME-WAIT状态存在的第二个原因。         另外,因为TCP报文段的最大生存时间是MSL,所以坚持2MSL时间的TIME_WAIT状态能够确保网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经消失(被中转路由器丢弃)。因此,一个连接的新的化身可以在2MSL时间之后完全的建立,而绝对不会接收到属于原来连接的应用程序数据,这就是TIME-WAIT状态要持续2MSL时间的原因。

上一篇:spring security抛出AuthenticationException异常的原因
下一篇:新手必看:究竟哪种编程语言最有前途?

相关文章

关键词: TIME_WAIT状态

相关评论