《TCP的TIME_WAIT快速回收与重用》中提到了“从外部干掉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环境不能这么做遍成了自然而然的结论。

机场安检的目的并不是为了阻碍你登机,恰恰相反,它是为了你的安全!

本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1318986

关于TIME_WAIT重用与RFC1337相关推荐

  1. TCP的TIME WAIT快速回收与重用

    声明一点: Linux中是无法修改tcp的TIME_WAIT值的,除非重新编译,起码我是没有找到怎么改.值得注意的是,net.ipv4.tcp_fin_timeout这个参数是FIN_WAIT_2的值 ...

  2. tcp协议系列文章(2):从man 7 tcp开始

    本文从tcp的man手册内容开始.以下是man 7 tcp的翻译.翻译参考了一些网络上同道中人的翻译成果,对此表示感谢.下文中的错误之处请读者指出. 文末有文中所有/proc选项的列表,文中所有soc ...

  3. 从TCP三次握手说起——浅析TCP协议中的疑难杂症(转载)

    [转载] 原博文来自:https://blog.csdn.net/qiansg123/article/details/80126677 作者:黄日成,手Q游戏中心后台开发,腾讯高级工程师. 因为写得太 ...

  4. 从TCP三次握手说起——浅析TCP协议中的疑难杂症

    PeterWang_bupt 贡献值:2 等級:L1 0 发布 0 评论 1 顶 发布链接发布图文   全部主题 我关注的主题 GEEKNEWS Rust Swift 全栈工程师 /home Pres ...

  5. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)

    在"从TCP三次握手说起–浅析TCP协议中的疑难杂症(1)"文章中,我们提到第6个疑问:TCP的头号疼症TIME_WAIT状态,下面我们继续这个问题的解答: 6. 疑症(6) TC ...

  6. 820-彻底弄懂TCP协议

    疑症(1)TCP 的三次握手.四次挥手 下面两图大家再熟悉不过了,TCP 的三次握手和四次挥手见下面左边的"TCP 建立连接"."TCP 数据传送"." ...

  7. 【转载】万字详文彻底弄懂TCP协议:从三次握手和四次挥手说起

    今日头条 腾讯技术工程 作者:morganhuang,腾讯 IEG 后台开发工程师 说到 TCP 协议,相信大家都比较熟悉了,对于 TCP 协议总能说个一二三来,但是 TCP 协议又是一个非常复杂的协 ...

  8. Linux内核Socket参数调优

    可调优的内核变量存在两种主要接口:sysctl命令和/proc文件系统,proc中与进程无关的所有信息都被移植到sysfs中.IPV4协议栈的sysctl参数主要是sysctl.net.core.sy ...

  9. 【 Tomcat 】tomcat8.0 调优配置

    2019独角兽企业重金招聘Python工程师标准>>> 1.优化内核及TCP连接: fs.file-max = 655350 # 系统文件描述符总量 net.ipv4.ip_loca ...

  10. Linux TCP/IP大合集

    简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp. 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在 ...

最新文章

  1. commonjs是什么_JavaScript模块化标准CommonJS/AMD/CMD/UMD/ES6Module的区别
  2. SAP Spartacus配置后台Commerce Cloud的位置
  3. android数据存储_SharedPreferences的简单使用
  4. 交通安全与智能控制专业学计算机吗,交通安全与智能控制专业主要做什么
  5. 【Flink】Flink连接prometheus报错 IOException :Response code formxxx/metrics/job/rule
  6. mysql使用命令访问数据库_mysql命令操作数据库
  7. 对某目录下的文件按照日期进行排序
  8. Oracle 9i的标量数据类型
  9. java odbc timesten_TimesTen 使用ODBC连接数据库的程序问题
  10. matlab自适应滤波,基于MATLAB与DSP的自适应滤波器设计与实现
  11. FPGA_电机控制(Verilog)
  12. 移动硬盘访问错误 - 磁盘结构损坏且无法读取、拒绝访问
  13. MATLAB图像处理(包括图像类型转换)----转载
  14. 根据IP查询地理位置(简单易懂,详细注解)
  15. 解决电脑可以上网却连不上局域网服务器问题
  16. 这一次我要真正学会C语言
  17. Ip2region 离线IP地址定位库
  18. 上海计算机协会-10月月赛-丙组-T5-组队竞赛
  19. 图像传感器的这9个知识点,你都懂吗?
  20. golang时间字符串转时间戳

热门文章

  1. Atitit 项目中的勋章体系,,mvp建设 ,荣典体系建设
  2. Atitti.数字证书体系cer pfx attilax总结
  3. Atitit  自动化gui 与 发帖机 技术
  4. Atitit.android播放smb 网络邻居视频文件解决方案
  5. atitit.web 推送实现方案集合
  6. atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
  7. paip.mysql fulltext 全文搜索.最佳实践.
  8. paip.提升用户体验---导入导出
  9. 阿里云祝顺民:云网络的十年“修路”历程
  10. 可用性SLA还不懂?看完这个故事就懂了........ | 凌云时刻