理解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状态,保留次状态的时间为两个MSLlinux里一个MSL30s,是不可配置的)


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的协议规定来调整,对于twreuserecycle其实是违反TCP协议规定的,服务器资源允许、负载不大的条件下,尽量不要打开,当出现TCP: time wait bucket table overflow,尽量调大下面参数:

tcp_max_tw_buckets = 256000 

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

net.ipv4.tcp_fin_timeout = 30

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

 

     下面再说一下linuxTIME_WAIT专有的优化参数reuserecycle,默认也都是关闭的,这两个参数必须在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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 看看别人是如何进行大数据测试的?

    看看别人是如何进行大数据测试的?前言:我之前是做大数据测试的,熟悉我的小伙伴应该都知道,前面我写过两篇文章《什么是大数据测试?》、《怎么进行大数据测试?我们需要具备怎样的测试能力?》,当然,这篇文章我对大数据测试介绍的比较笼统,所以今天我在详细补充一下,主要是看看别人是如何进行大数据测试的,另外我推荐在做大数据测试的同学或者将要做大数据测试的同学去看看我正在看的两本书,我想看了之后你应该是有收获的——《机器人学习测试入门与实践》、《大数据测试技术与实践》,第一本书是我20年买的,第二本书是我21年买的,总体我收获还是挺多的!看看别人是如

    2022年5月8日
    130
  • lambda表达式用法_使用lambda表达式定义函数

    lambda表达式用法_使用lambda表达式定义函数一、Lamabda表达式定义二、Lamabda表达式语法三、C#中Lamabda使用场景四、J

    2022年9月19日
    2
  • Vim下多行同时编辑与删除技巧

    Vim下多行同时编辑与删除技巧问题 在 Vim 内同时对多行增加或删除相同的内容 如 item1item2it 变成 增加 my item1my item2my item3 再变成 删除 tem1tem2tem3 方法 编辑 1 将光标移到要插入相同内容的第一行第一个字符上 如上面代码中 item1 中的 i 上按下 ctrl v 进入 visualblock 模式 2 按两次 j 或者 2j 将光标移动到要插入的最后一样 如上面代码中 item3 中的 i 上按下 I 大写 i 进入编辑

    2025年10月24日
    4
  • codeforces Round #259(div2) E解决报告

    codeforces Round #259(div2) E解决报告

    2022年1月9日
    48
  • 简练网软考知识点整理-项目需求跟踪及需求跟踪矩阵[通俗易懂]

    简练网软考知识点整理-项目需求跟踪及需求跟踪矩阵[通俗易懂]需求跟踪矩阵是把产品需求从其来源连接到能满足需求的可交付成果的一种表格。使用需求跟踪矩阵,可以把每个需求与业务目标或项目目标联系起来,有助于确保每个需求都具有商业价值。需求跟踪矩阵提供了在整个项目生命周期中跟踪需求的一种方法,有助于确保需求文件中被批准的每项需求在项目结束的时候都能交付。最后,需求跟踪矩阵还为管理产品范围变更提供了框架。

    2025年5月24日
    5
  • 强悍的CSS工具组合:Blueprint, Sass, Compass

    强悍的CSS工具组合:Blueprint, Sass, Compass

    2021年9月1日
    60

发表回复

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

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