关于TIME_WAIT重用与RFC1337

浏览:
字体:
发布时间:2013-12-10 00:03:20
来源:
关于TIME_WAIT重用与RFC1337
 
《TCP的TIME_WAIT快速回收与重用》http://www.vm888.com/net/201311/254232.html中提到了“从外部干掉TIME_WAIT”。其实方法就是用RESET来终止一个TW状态的连接。之所以要终止掉这个TW连接是因为某种程度上我们对无聊等待一个行将就木的套接字的愤慨,另一方面也说明了要么我们没有关于old duplicate数据的概念,要么根本就不在乎它带来的损失,比如我们使用了SSL协议对连接进行了保护。
       然而,不考虑这些额外的防护,也可以原谅我们知识的浅薄!仅仅针对TCP规范,RFC1337给出了几个骇人听闻的old duplicate带来的噩梦实例值得一读。鉴于从不深拷贝整篇RFC文档的原则,这里就不再贴出来了,直接阅读更好,那几个例子也十分简单易懂。之所以会出这种事,是因为TIME_WAIT状态的提前终止。提前终止的原因就是发送了一个ACK到已经不存在的连接上,进而对方反发了RESET,至于说为何会发送一个ACK,很多情况,比如收到了一个old duplicate数据,比如收到了FIN,比如收到了一个特意构造的符合该TW套接字的数据,不一而足。
       RFC1337说了这么多令人发指的old duplicate带来的危害,无非就是为了找一个为TIME_WAIT存在意义的正当辩护理由。不管怎样,TIME_WAIT虽然很烦人,但是确实是有存在必要的。在Linux上,RFC1337也就一个配置,其实现很简单,那就是即时收到了一个RESET也要保证TIME_WAIT状态到底,而不是直接释放TIME_WAIT连接。
       值得注意的是,很多人都会把TIME_WAIT的目的理解为“为了阻止使用相同的IP,端口连接相同的服务”,理解为“不允许使用相同的IP,端口连接相同的服务”,这真是一派胡言!真是本末倒置!可是是听别人说的,也可能是看书看多了!实际上TIME_WAIT的目的只有一个,这也是协议设计者的初衷,那就是“确认老的连接所有的数据包要么到达,要么消失”,而这个目标在连接的ESTABLISHED状态是可以通过ACK以及窗口机制保证的,到了最后的收尾阶段,不得不使用外部物理条件,即等待MSL来保证,所谓的阻止新连接并不是目的,而只是一个结果。理解这一点非常必要,你会走出一个误区,即不再认为TIME_WAIT是为了阻止新连接!
       既然TIME_WAIT不是为了阻止新连接,那么只要能证明自己确实属于新连接而不是老连接的残留数据,那么该连接即使匹配到了TIME_WAIT的四元组也是可以接受的,即可以重用TIME_WAIT的连接。如何来保证呢?很简单,只需要把老的数据丢在窗口外即可。为此,只要新连接的初始序列号比老连接的FIN包末尾序列号大,那么老连接的所有数据即使迟到也会落在窗口之外,从而不会破坏新建连接!
       即使不使用序列号,还是可以使用时间戳,因为TCP/IP规范规定IP地址要是唯一的,根据这个唯一性,欲重用TIME_WAIT连接的新连接的必然发自同一台机器,而机器时间是单调递增不能倒流的,因此只要新连接带有时间戳且其值比老连接FIN时的时间戳大,就认为该新连接是可以接受的,时间戳重用TW连接的机制的前提是IP地址唯一性导出的发起自同一台机器,那么不满足该前提的则不能基于此来重用TIME_WAIT连接,因此NAT环境不能这么做遍成了自然而然的结论。
       机场安检的目的并不是为了阻碍你登机,恰恰相反,它是为了你的安全!
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();