赞
踩
TCP涉及连接建立和连接终止的操作可以用状态转换图(state transition diagram)来说明,如图1所示:
图1图解:
图2展示了一个完整的TCP连接所发生的的实际分组交换情况,其中包含了连接建立、数据传送和连接终止3个阶段的分组交换和其中的状态转换。
图2图解:
图2注意:
TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态。在图3中可以看到执行主动关闭的那一端经历了这个状态。该端点停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime,MSL)的两倍,有时候称之为2MSL。
任何TCP实现都必须为MSL选择一个值。RFC 1122 [Braden 1989]的建议是2分钟,不过源自Berkeley的实现传统上改用30s这个值。这意味着TIME_WAIT状态的持续时间在1分钟到4分钟之间。
MSL是任何IP数据报能够在因特网中存活的最长时间。我们知道这个时间是有限的,因为每个数据报含有一个称为跳限(hop limit)的8位字段(在IPv4的TTL字段和IPv6的跳限字段),它的最大值为255。
尽管这是一个跳数限制而不是真正的时间限制,但可以假设:具有最大跳限(255)的分组在网络中存在的时间不可能超过MSL秒。
分节在网络中的“迷途”通常是路由异常的结果。
假设1:某个路由器崩溃或某两个路由器之间的某个链路断开时,路由协议需花数秒钟到数分钟的时间才能稳定并找出另一条通路。在这段时间内有可能发生路由循环(路由器A把分节发送给路由器B,而B再把他们发送给A),比较关心的分节可能就此陷入这样的循环。
假设2: 陷入“迷途”的分节是一个TCP分节,在它迷途期间,发送端TCP超时并重传该分组,而重传的分节却通过某条候选路径到达最终目的地。然而不久之后(自迷途的分节开始起其旅程起最多MSL秒以内)路由循环修复,早先迷失在这个循环中的分节最终也被送到目的地。这个原来的分节称为迷途的重复分组(lost duplicate)或漫游的重复分组(wandering duplicate)。TCP必须正确处理这些重复的分组。
理由1注解:
理由2注解:
为理解存在TIME_WAIT状态的第二个理由,作如下假设说明:
假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个TCP连接。先关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。
TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。
既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。
通过实施这个规则,就能保证没成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了。
但是TIME_WAIT规则存在一个例外:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。