关于TIME_WAIT重用与RFC1337
然而,不考虑这些额外的防护,也可以原谅我们知识的浅薄!仅仅针对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相关推荐
- TCP的TIME WAIT快速回收与重用
声明一点: Linux中是无法修改tcp的TIME_WAIT值的,除非重新编译,起码我是没有找到怎么改.值得注意的是,net.ipv4.tcp_fin_timeout这个参数是FIN_WAIT_2的值 ...
- tcp协议系列文章(2):从man 7 tcp开始
本文从tcp的man手册内容开始.以下是man 7 tcp的翻译.翻译参考了一些网络上同道中人的翻译成果,对此表示感谢.下文中的错误之处请读者指出. 文末有文中所有/proc选项的列表,文中所有soc ...
- 从TCP三次握手说起——浅析TCP协议中的疑难杂症(转载)
[转载] 原博文来自:https://blog.csdn.net/qiansg123/article/details/80126677 作者:黄日成,手Q游戏中心后台开发,腾讯高级工程师. 因为写得太 ...
- 从TCP三次握手说起——浅析TCP协议中的疑难杂症
PeterWang_bupt 贡献值:2 等級:L1 0 发布 0 评论 1 顶 发布链接发布图文 全部主题 我关注的主题 GEEKNEWS Rust Swift 全栈工程师 /home Pres ...
- 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)
在"从TCP三次握手说起–浅析TCP协议中的疑难杂症(1)"文章中,我们提到第6个疑问:TCP的头号疼症TIME_WAIT状态,下面我们继续这个问题的解答: 6. 疑症(6) TC ...
- 820-彻底弄懂TCP协议
疑症(1)TCP 的三次握手.四次挥手 下面两图大家再熟悉不过了,TCP 的三次握手和四次挥手见下面左边的"TCP 建立连接"."TCP 数据传送"." ...
- 【转载】万字详文彻底弄懂TCP协议:从三次握手和四次挥手说起
今日头条 腾讯技术工程 作者:morganhuang,腾讯 IEG 后台开发工程师 说到 TCP 协议,相信大家都比较熟悉了,对于 TCP 协议总能说个一二三来,但是 TCP 协议又是一个非常复杂的协 ...
- Linux内核Socket参数调优
可调优的内核变量存在两种主要接口:sysctl命令和/proc文件系统,proc中与进程无关的所有信息都被移植到sysfs中.IPV4协议栈的sysctl参数主要是sysctl.net.core.sy ...
- 【 Tomcat 】tomcat8.0 调优配置
2019独角兽企业重金招聘Python工程师标准>>> 1.优化内核及TCP连接: fs.file-max = 655350 # 系统文件描述符总量 net.ipv4.ip_loca ...
- Linux TCP/IP大合集
简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp. 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在 ...
最新文章
- commonjs是什么_JavaScript模块化标准CommonJS/AMD/CMD/UMD/ES6Module的区别
- SAP Spartacus配置后台Commerce Cloud的位置
- android数据存储_SharedPreferences的简单使用
- 交通安全与智能控制专业学计算机吗,交通安全与智能控制专业主要做什么
- 【Flink】Flink连接prometheus报错 IOException :Response code formxxx/metrics/job/rule
- mysql使用命令访问数据库_mysql命令操作数据库
- 对某目录下的文件按照日期进行排序
- Oracle 9i的标量数据类型
- java odbc timesten_TimesTen 使用ODBC连接数据库的程序问题
- matlab自适应滤波,基于MATLAB与DSP的自适应滤波器设计与实现
- FPGA_电机控制(Verilog)
- 移动硬盘访问错误 - 磁盘结构损坏且无法读取、拒绝访问
- MATLAB图像处理(包括图像类型转换)----转载
- 根据IP查询地理位置(简单易懂,详细注解)
- 解决电脑可以上网却连不上局域网服务器问题
- 这一次我要真正学会C语言
- Ip2region 离线IP地址定位库
- 上海计算机协会-10月月赛-丙组-T5-组队竞赛
- 图像传感器的这9个知识点,你都懂吗?
- golang时间字符串转时间戳
热门文章
- Atitit 项目中的勋章体系,,mvp建设 ,荣典体系建设
- Atitti.数字证书体系cer pfx attilax总结
- Atitit 自动化gui 与 发帖机 技术
- Atitit.android播放smb 网络邻居视频文件解决方案
- atitit.web 推送实现方案集合
- atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
- paip.mysql fulltext 全文搜索.最佳实践.
- paip.提升用户体验---导入导出
- 阿里云祝顺民:云网络的十年“修路”历程
- 可用性SLA还不懂?看完这个故事就懂了........ | 凌云时刻