TIMEWAIT状态「建议收藏」

TIMEWAIT状态「建议收藏」TIMEWAIT是友好的修改内核参数/proc/sys/net/ipv4/tcp_tw_recycle来快速回收被关闭的socket,使得TCP连接根本就不进入TIME_WAIT状态客户端在接收到服务器发送的FIN段后,没有立即进入CLOSED状态,而是进入TIME_WAIT状态;在TIME_WAIT状态,客户端连接要等待一段长为2MSL的时间才能完全关闭。TIME_WAIT状态存在的原因有…

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


在这里插入图片描述
    图中可以看到:主动关闭方将进入TIME_WAIT状态;被动关闭方将进入CLOSE_WAIT状态。

    该计时器就是TIME_WAIT计时器,即当主动方A发送FIN给对方B后,被动方B回复ACK后,主动方A将进入TIME_WAIT状态(用来等待B发送FIN+ACK)。如果在计时器时间内没有接收到B发来的FIN+ACK,A将会重启TIME_WAIT计时器继续等待B发来的FIN+ACK。保证全双工管道的安全断开。

TIMEWAIT是友好的

Note1:什么是TIME_WAIT状态?
    客户端在接收到服务器发送的FIN段后,没有立即进入CLOSED状态,而是进入TIME_WAIT状态;在TIME_WAIT状态,客户端连接要等待一段长为2MSL的时间才能完全关闭。

Note2:TIME_WAIT状态存在的2个原因
(1)可靠的终止TCP连接
    假如报文段7(ACK)丢失:那么服务器将会重发报文段6(FIN),客户端需要停留在TIME_WAIT状态以处理重复收到的报文段6(FIN),(补充说明:假如没有2MSL的延时等待,客户端只能以RST段回应服务器,异常终止连接
(2)允许老的重复分解在网络中消失
     假设在12.106.32.254的1500端口和206.168.112.219的21端口之间建立连接,我们关闭这个连接。过段时间后在相同的IP和端口之间建立另一个链接。后一个连接成为前一个连接的化身,因为它们的IP和端口相同。 ==> TCP必须防止来自某个连接的老的重复分组在该连接已经终止后再现,从而被误解成属于同一连接的某个新的化身。==> 为了做到这点,TCP协议栈规定,处于TIME_WAIT状态的连接不能发起新的化身。(又因为,TIME_WAIT状态的持续时间时MSL的2倍,这就足以让发送方向上的分组最多存活MSL秒后被丢弃,让接收应答方向上的分组最多存活MSL也被丢弃,所以,TIME_WAIT状态保证了该连接先前化身的老的重复分组已在网络中消逝了)

大量TIMEWAIT在某些场景中导致的令人头疼的业务问题

    在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接。这个场景下,会出现大量socket处于TIMEWAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。 ⇒ ⇒ 来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。为什么我们要关注这个高并发短连接呢?有两个方面需要注意:

  1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
  2. 在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。这里有个相对长短的概念,比如,取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高)

    综合这两个方面,持续的到达一定量的高并发短连接,会使服务器因端口资源不足而拒绝为一部分客户服务。同时,这些端口都是服务器临时分配,无法用SO_REUSEADDR选项解决这个问题。

    一对矛盾:TIMEWAIT既友好,又令人头疼。但是还是要抱着一个友好的态度来看待它,因为它尽它的能力保证了服务器的健壮性。

可行而且必须存在,但是不符合原则的解决方式

  1. linux没有在sysctl或者proc文件系统暴露修改这个TIMEWAIT超时时间的接口,可以修改内核协议栈代码中关于这个TIMEWAIT的超时时间参数,重编内核,让它缩短超时时间,加快回收;
  2. 利用SO_LINGER选项的强制关闭方式,发RST而不是FIN,来越过TIMEWAIT状态,直接进入CLOSED状态。(详细请看socket套接字选项详解的SO_LINGER

为什么说上述两种解决方式我觉得可行,但是不符合原则?
    首先认为,要依靠TIMEWAIT状态来保证服务器程序健壮,网络上发生的乱七八糟的问题太多了,先要服务功能正常。
    那是不是就不要性能了呢?并不是。如果服务器上跑的短连接业务量到了我真的必须处理这个TIMEWAIT状态过多的问题的时候,解决原则是尽量处理,而不是跟TIMEWAIT干上,非先除之而后快:)如果尽量处理了,还是解决不了问题,仍然拒绝服务部分请求,那我会采取分机器的方法,让多台机器来抗这些高并发的短请求。持续十万并发的短连接请求,两台机器,每台5万个,应该够用了吧。一般的业务量以及国内大部分网站其实并不需要关注这个问题,一句话,达不到需要关注这个问题的访问量。
    真正地必须使用上述我认为不合理的方式来解决这个问题的场景有没有呢?答案是有,像淘宝、百度、新浪、京东商城这样的站点,由于有很多静态小图片业务,如果过度分服会导致需要上线大量机器,多买机器多花钱,得多配机房,多配备运维工程师来守护这些机器,成本增长非常严重。这个时候就要尽一切可能去优化。

如何尽量并合理地处理TIMEWAIT过多

  1. sysctl改两个内核参数就行了,如下:
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
        简单来说,就是打开系统的TIMEWAIT重用和快速回收,至于怎么重用和快速回收,这个问题我没有深究,实际场景中这么做确实有效果。用netstat或者ss观察就能得出结论。
  2. 还有些朋友同时也会打开syncookies这个功能,如下:
    net.ipv4.tcp_syncookies = 1
        打开这个syncookies的目的实际上是:“在服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的 syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求”。
    如果并发量真的非常非常高,打开这个其实用处不大。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132662.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • server2003怎么进入安全模式_windows2003server

    server2003怎么进入安全模式_windows2003serverWINDOWS SERVER 2003 上出现 超过响应缓冲区限制 错误,如何解决?Response 对象 错误 ASP 0251 : 80004005超过响应缓冲区限制/py11g/list.asp,行 0此 ASP 页的执行造成响应缓冲区超过其配置限制。我要RESPONSE.WRITE 的数据量的确非常大,但是必须回写的,如何更改设置或者程序 ———————–

  • C语言和Java哪个难学?[通俗易懂]

    C语言和Java哪个难学?[通俗易懂]有人说:世界上有两种程序员,一种用Tab键,另一种用Space键。在程序员圈子有这样一条鄙视链(小道传说):C++程序员看不起C程序员,C程序员看不起Java程序员,Java程序员看不起C#程序员,C#程序员看不起美工。为什么大家普遍认为C语言比Java难?我认为原因如下:C属于底层代码,能窥探到底层,也就是说可以拿它写硬件驱动,学习C语言前面的内容比Java简单但是到了后来特别是指针、…

  • 数据库概念结构设计_数据库概念结构设计怎么写

    数据库概念结构设计_数据库概念结构设计怎么写一、概念模型在需求分析阶段所得到的应用需求应该首先抽象为信息世界的结构,然后才能更改、更准确地用某一数据库管理系统实现这些需求。概念模型的主要特点:1.能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求,是现实世界的一个真是模型。2.易于理解,可以用它和不熟悉计算机的用户交换意见。用户的积极参与是数据库设计成功的关键。3.易于更改,当应用环境和应用要求改变时容易对概念模型修改和扩充。4.易于向关系、网状、层次等各种数据模型转换…

    2022年10月12日
  • HTTP.sys remote code execution vulnerability「建议收藏」

    HTTP.sys remote code execution vulnerability「建议收藏」IIS系列Http.sys处理Range整数溢出漏洞导致远程代码执行1.漏洞概要2015年04月14日,微软发布严重级别的安全公告MS15-034,编号为CVE-2015-1635,据称在Http.sys中的漏洞可能允许远程执行代码。2.漏洞描述CWE:CWE-119 CVE:CVE-2015-1635   Http.sys是一个位于Windows操作系统核…

  • 如何在MAC机器中实现移动设备WiFI上网(没有专门的无线路由器的情况)

    如何在MAC机器中实现移动设备WiFI上网(没有专门的无线路由器的情况)

  • Python3对股票数据进行分析

    Python3对股票数据进行分析目录一、量化交易概述1、量化交易(投资方法)2、算法交易(自动交易、黑盒交易或机器交易)3、量化策略4、量化选股5、股票回测二、股票数据三、股票数据分析1、导入股票时间序列数据2、绘制股票成交量的时间序列图3、绘制股票收盘价和成交量的时间序列图3、绘制K线图(蜡烛图)(1)K线图理论(2)K线图绘制4、股票指标相关性分析(1)相关关系…

发表回复

您的电子邮箱地址不会被公开。

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