理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow

理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow一直对这个问题知其然而不知其所以然,这些日子再次碰到,看了很多的资料,彻底解决一下,呵呵,先上个图,所有理解围绕着此图来看,此图描述了四次挥手的整个过程:650)this.width=650;”title=”QQ截图20160425180531.png”alt=”wKiom1cd6_mwEZr2AACU62IiAp4333.png”src=”http://s5.51cto.com/wyfs

大家好,又见面了,我是你们的朋友全栈君。

    一直对这个问题知其然而不知其所以然,这些日子再次碰到,看了很多的资料,彻底解决一下,呵呵,先上个图,所有理解围绕着此图来看,此图描述了四次挥手的整个过程:

wKiom1cd6_mwEZr2AACU62IiAp4333.png

通过此图先说明几个概念:

TIME_WAIT的产生条件:主动关闭方在发送四次挥手的最后一个ACK会变为TIME_WAIT状态,保留次状态的时间为两个MSL(linux里一个MSL为30s,是不可配置的)


TIME_WAIT两个MSL的作用:可靠安全的关闭TCP连接。比如网络拥塞,主动方最后一个ACK被动方没收到,这时被动方会对FIN开启TCP重传,发送多个FIN包,在这时尚未关闭的TIME_WAIT就会把这些尾巴问题处理掉,不至于对新连接及其它服务产生影响。


TIME_WAIT占用的资源:少量内存(查资料大概4K)和一个fd。


TIME_WAIT关闭的危害:1、  网络情况不好时,如果主动方无TIME_WAIT等待,关闭前个连接后,主动方与被动方又建立起新的TCP连接,这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接;

2、  同样网络情况不好并且无TIME_WAIT等待,关闭连接后无新连接,当接收到被动方重传或延迟的FIN包后,会给被动方回一个RST包,可能会影响被动方其它的服务连接。


TCP: time wait bucket table overflow产生原因及影响:原因是超过了linux系统tw数量的阀值。危害是超过阀值后﹐系统会把多余的time-wait socket 删除掉,并且显示警告信息,如果是NAT网络环境又存在大量访问,会产生各种连接不稳定断开的情况。

 

 

相关参数优化调整(当然得根据服务器的实际情况配置,这里着重讲参数意义):

    既然知道了TIME_WAIT的用意了,尽量按照TCP的协议规定来调整,对于tw的reuse、recycle其实是违反TCP协议规定的,服务器资源允许、负载不大的条件下,尽量不要打开,当出现TCP: time wait bucket table overflow,尽量调大下面参数:

tcp_max_tw_buckets = 256000 

调整次参数的同时,要调整TIME_WAIT_2到TIME_WAIT的超时时间,默认是60s,优化到30s:

net.ipv4.tcp_fin_timeout = 30

其它TCP本身的配合参数类似与synack重传次数、syn重传次数等以后介绍,优化后也是有所益处的。

 

     下面再说一下linux里TIME_WAIT专有的优化参数reuse、recycle,默认也都是关闭的,这两个参数必须在timestamps打开的前提下才能生效使用:

net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_tw_reuse = 1

机器作为客户端时起作用,开启后time_wait在一秒内回收

net.ipv4.tcp_tw_recycle = 0 (不要开启,现在互联网NAT结构很多,可能直接无法三次握手)

开启后在3.5*RTO(RTO时间是根据RTT时间计算而来)内回收TIME_WAIT,并60s内同一源ip主机的socket connect请求中的timestamp必须是递增的,对于服务端,同一个源ip可能会是NAT后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接,直接导致不能三次握手。

本文出自 “奔跑的linux” 博客,请务必保留此出处http://benpaozhe.blog.51cto.com/10239098/1767612

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144907.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 博客汇总-2016级本科东北师范大学软件工程「建议收藏」

    博客汇总-2016级本科东北师范大学软件工程「建议收藏」一、要做的请各位同学在博客园"http://www.cnblogs.com/"创建自己的博客园账号,然后在这篇你正在浏览的博客的评论区按照指定的格式留下你的姓名、博客地址。

    2022年7月4日
  • vb语法菜鸟教程_VS VB

    vb语法菜鸟教程_VS VB  VB.Net教程简介:VB.Net是一种简单,现代,面向对象的计算机编程语言,由微软开发,将.NET Framework和公共语言运行库的强大功能与作为Visual Basic标志的生产力优势相结合。VisualBasic.NET(VB.NET)是在.NETFramework上实现的面向对象的计算机编程语言。虽然它是经典的VisualBasic语言的演变,但是它不…

    2022年9月1日
  • 堆排序算法图解详细流程(堆排序过程图解)

    堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是一个不稳定性的排序目录一准备知识1.1大根堆和小根堆二堆排序基本步骤2.1构造堆2.2固定最大值再构造堆三总结四代码一准备知识堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆1.1大根…

    2022年4月18日
  • 域名、服务器、IP之间的关系[通俗易懂]

    域名、服务器、IP之间的关系[通俗易懂]文章转载自:[https://www.jianshu.com/p/c3d3f6629c13](https://www.jianshu.com/p/c3d3f6629c13)本文主要针对域名、服务器和IP之间的关系进行介绍,并通过实际案例讲解域名解析过程本文目录基础概念案例分析阿里云域名解析过程基础概念服务器:服务器其实就像我们的家用电脑一样,也有主板、CPU、内存、硬盘、电源等。根据功能来说服务器可分为web服务器、ftp服务器、数据库服务器、邮件服务器等等,做什么用途就可以叫做什么服务器

    2022年9月29日
  • Tomcat配置环境变量

    Tomcat配置环境变量Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程重新记录下来,以便以后如果忘记了可以随时查看。注意:首先要明确一点,Tomcat与Java密切相关,因此安装使用之前要先安装JDK并设置JDK的环境变量,由于机子上已经安装好了JDK,也设置好了JDK环境变量,因此这里不再过多叙述,只说明我设置好的环境变量:JAV…

    2022年5月4日
  • 春运里的“车轮战”:每天60多道工序保养轮对

    春运里的“车轮战”:每天60多道工序保养轮对

    2021年6月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号