在Tcp关闭连接过程中,主动关闭的一段会进入TIME_WAIT状态,且在该状态持续两倍最长分节生命期MSL的时间。Tcp实现中必须选择一个MSL(maximum segment lifetime)值,MSL是Ip数据包在互联网中生存的最长时间。
分组在路由异常时经常”迷途“。某个路由器崩溃或两个路由器间的链路断开时,路由协议需花费数秒或数分钟才能稳定找到另一条同路,在这段时间内可能产生路由循环(路由器A把分组发送给路由器B,而B再把分组发送给A),此时分组可能陷入这样的循环。在此期间,假设迷途的分组是一个tcp分节,发送方tcp超时重传该分组,而重传的分组最终选择另一条路径到达目的地。但是,不久(自从迷途的分组开始其旅途起最多MSL秒内)路由循环修复,迷失在该循环中的分组最终到达目的地。这个原来的分组称为迷途的重复分组(lost duplicate)或漫游的重复分组(wandering duplicate),与之相对的重复分组就是超时重传分组。Tcp必须正确处理这类重复分组。
存在TIME_WAIT状态的两个理由:
1、实现终止tcp全双工的可靠性。
2、允许老的重复分节在网络中消逝。
第一个理由:假设tcp连接终止过程中最终的ACK丢失,且客户为主动终止端,服务器被动终止,服务器将重发最终的FIN,因此客户必须维护状态信息以允许它重发最终ACK。如果不维护状态信息, 它将响应以RST,而服务器则把该分节解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某一个连接上两个方向(全双工关闭)的数据流,那么就必须正确处理终止连接中四个分节中任何一个分节的丢失情况。进入TIMW_WAIT状态,是因为主动端肯呢个不得不重新发送最终的ACK。
第二理由:假设终端A和B之间已建立一个tcp连接。当关闭该连接后,在以后某个时候又建立相同IP、端口之间的tcp连接。后一个连接称为前一个连接的化身,因为他们的端口号和ip地址都相同。tcp必须预防来自某个连接的老重复分组在连接钟之后再出现,从而被误解成属于同一连接的数据。因此,tcp不能给处于TIME_WAIT状态的连接启动新的化身。既然TIME_WAIT状态的持续时间2MLS,这就足够让某一个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存货MSL秒也被丢弃。以此保证成功建立一个tcp连接时,来自该链接先前化身的老重复数据都已在网络中消逝。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)