Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7194118
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: C/C++

2010-08-04 13:00:33

该状态主要是两个作用:
 第一:确保主动发起关闭一方响应最后的一个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对于我们来说往往是有利的。


阅读(2293) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~