• TIME_WAIT太多怎么办


    As we all know:

    TCP连接,主动关闭的一方在发出最后一个ACK后,TCP状态机进入 TIME_WAIT

    为啥要有这么个状态呢?作用有二:

    1.  防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)

    2. 可靠性保证,主动关闭方发送的最后一个ACK有可能丢失,这种情况下被动方会重新发FIN。如果主动关闭方早早地销毁了这个socket,那么被动关闭的一方重发的FIN报文到达主动关闭方时,内核会因为没有socket绑定在此端口,回复被动关闭方RST报文。所以主动方要处于TIME_WAIT 状态,维持这个状态2MSL(Max Segment Lifetime)时间 。


    据说:TIME_WAIT 并不会占用很大资源的(具体多大我没考证过,有空值得一试)

    写条命令查看当前TCP各个状态的连接条目数量:

    netstat -tan | awk '/^tcp/ {NR > 2 && ++S[$NF]} END {for(a in S) print a, S[a]}'

    /^tcp/  : 以tcp开头 

    NR > 2 : 不看 netstat -tan输出的前两行

    NF:当前这条Record的Field总数, $NF:最后一个字段内容

    S[$NF]:相当于一个python中的list吧

    awk 一条一条Record处理,处理完所有的Record后执行END { statements }

    回到我们的问题:太多TIME_WAIT怎么办??

    1. 
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies   // 表示开启SYN cookies(在TCP/IP卷一中有介绍)当出现SYN等待队列溢出,启用cookies来处理,可防范少量SYN攻击,默认为0(关闭)

    2.

    echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse    //表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

    3.

    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle   //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

    4. 

    cat /proc/sys/net/ipv4/tcp_fin_timeout             //查看当前生效的MSL时间,Ubuntu 14.04为60s

    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout     //修改系統默认的 TIMEOUT 时间

    据说,最好的办法是让每个TIME_WAIT早点过期。

    TIME_WAIT重用TCP协议本身就是不建议打开的。

    附加:

    不能重用端口可能会造成系统的某些服务无法启动,比如要重启一个系统监控的软件,它用了40000端口,而这个端口在软件重启过程中刚好被使用了,就可能会重启失败的。linux默认考虑到了这个问题,有这么个设定:

    #查看系统本地可用端口极限值
    cat /proc/sys/net/ipv4/ip_local_port_range

    用这条命令会返回两个数字,默认是:32768 61000,说明这台机器本地能向外连接61000-32768=28232个连接,注意是本地向外连接,不是这台机器的所有连接,不会影响这台机器的80端口的对外连接数。但这个数字会影响到代理服务器(nginx)对app服务器的最大连接数,因为nginx对app是用的异步传输,所以这个环节的连接速度很快,所以堆积的连接就很少。假如nginx对app服务器之间的带宽出了问题或是app服务器有问题,那么可能使连接堆积起来,这时可以通过设定nginx的代理超时时间,来使连接尽快释放掉,一般来说极少能用到28232个连接。

  • 相关阅读:
    MySQL 实训篇
    MySQL 操作部分
    MySQL 数据库设计部分
    Python Excel及setuptool安装
    泛型? extents super
    js中立即执行
    js的闭包
    js作用域与作用域链
    js编译和执行顺序
    文件下载
  • 原文地址:https://www.cnblogs.com/xiaokuang/p/4550223.html
Copyright © 2020-2023  润新知