文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>TIME_WAIT状态

TIME_WAIT状态

时间:2010-08-04  来源:wwm

该状态主要是两个作用:
 第一:确保主动发起关闭一方响应最后的一个ACK能够正常送达
 第二:网络上仍然有可能有残余的数据包(wandering duplicates,或老的重复数据包),我们也必须能够正常处理。
见图解。

 

分析过程要分析 是应用程序调用close 发起关闭还是tcp协议栈。
第一种情况好理解。保留连接状态2MSL(大约1-4分钟)长时间,确保4次握手最后一次ok。

第二种情况 分析
  如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。
第二个拥有相同相关五元组的连接出现,而第一 个连接的重复报文到达,干扰了第二
个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT
状态保 持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被
丢弃。建立第二个连接的时候,不会混淆。
  编程中会经常使用SO_REUSEADDR,来表示可重用处于TIME_WAIT状态的相同五元组的连接。

  现在有一个新的连接被建立起来,使用的IP地址与端口与先前的完全相同,后建立的连接又称作是原先连接的一个化身。还假定原先的连接中有数据报残存于网络 之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点,TCP不允许从处于TIME_WAIT状态的socket建立一个连接。处 于TIME_WAIT状态的socket在等待两倍的MSL时间以后(之所以是两倍的MSL,是由于MSL是一个数据报在网络中单向发出到认定丢失的时 间,一个数据报有可能在发送图中或是其响应过程中成为残余数据报,确认一个数据报及其响应的丢弃的需要两倍的MSL),将会转变为CLOSED状态。这就 意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。在主动连接一次就要小心使用了,可能会造成混乱。所以要更具具体情况来确定是否使用。
   
    由于TIME_WAIT状态所带来的相关问题,我们可以通过设置 SO_LINGER标志来避免socket进入TIME_WAIT状态,这可以通过发送RST而取代正常的TCP四次握手的终止方式。但这并不是一个很好 的主意,TIME_WAIT对于我们来说往往是有利的。


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载