zoukankan      html  css  js  c++  java
  • Linux上的TIME_WAIT和tcp_fin_timeout

    当Linux服务器的TIME_WAIT过多时,
    通常会想到去修改参数降低TIME_WAIT时长,
    以减少TIME_WAIT数量,但Linux并没有提供这样的接口,
    除非重新编译内核。


    Linux默认的TIME_WAIT时长一般是60秒(等于2MSL),
    定义在内核的include/net/tcp.h文件中:
    #define TCP_TIMEWAIT_LEN (60*HZ)
    /* how long to wait to destroy TIME-WAIT state,
     * about 60 seconds
     */
    #define TCP_FIN_TIMEOUTTCP_TIMEWAIT_LEN
    /* BSD style FIN_WAIT2 deadlock breaker.
     * It used to be 3min, new value is 60sec,
     * to combine FIN-WAIT-2 timeout with
     * TIME-WAIT timer.
     */


    注意tcp_fin_timeout不是TIME_WAIT时间(吴功宜审校的W.Richard Stevens和Kevin R.Fall所著《TCP/IP详解 卷1:协议》中文第二版第13.5.2节称net.ipv4.tcp_fin_timeout为2MSL值):
    # cat /proc/sys/net/ipv4/tcp_fin_timeout
    60
    tcp_fin_timeout实为FIN_WAIT_2状态的时长,
    Linux没有提供修改TIME_WAIT时长接口,除非修改宏的定义重新编译内核。
    但Windows可以修改注册表中的TcpTimedWaitDelay值来控制TIME_WAIT时长。


    RTO:超时重传(Retransmission Timeout)
    MSL:包最大存活时长(Maximun Segment Lifetime)


    TIME_WAIT是一个常见经常的问题,相关内容(/etc/sysctl.conf或/proc/sys/net/ipv4):
    1) net.ipv4.tcp_timestamps
       为1表示开启TCP时间戳,用来计算往返时间RTT(Round-Trip Time)和防止序列号回绕
    2) net.ipv4.tcp_tw_reuse
       为1表示允许将TIME-WAIT的句柄重新用于新的TCP连接
    3) net.ipv4.tcp_tw_recycle
       为1表示开启TCP连接中TIME-WAIT的快速回收,NAT环境可能导致DROP掉SYN包(回复RST)
    4) net.ipv4.tcp_fin_timeout
       FIN_WAIT_2状态的超时时长
    5) net.ipv4.tcp_syncookies
       为1时SYN Cookies,当SYN等待队列溢出时启用cookies来处理,可防范少量SYN攻击
    6) net.ipv4.tcp_max_tw_buckets
       保持TIME_WAIT套接字的最大个数,超过这个数字TIME_WAIT套接字将立刻被清除并打印警告信息
    7) net.ipv4.ip_local_port_range
    8) net.ipv4.tcp_max_syn_backlog
       端口最大backlog内核限制,防止占用过大内核内存
    9) net.ipv4.tcp_syn_retries
       对一个新建连接,内核要发送多少个SYN连接请求才决定放弃,不应该大于255
    10) net.ipv4.tcp_retries1
       放弃回应一个TCP连接请求前﹐需要进行多少次重试,RFC规定最低的数值是3,这也是默认值
    11) net.ipv4.tcp_retries2
       在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试,默认值为15
    12) net.ipv4.tcp_synack_retries
       TCP三次握手的SYN/ACK阶段重试次数,缺省5


    13) net.ipv4.tcp_max_orphans
       不属于任何进程(已经从进程上下文中删除)的sockets最大个数,超过这个值会被立即RESET,并同时显示警告信息
    14) net.ipv4.tcp_orphan_retries
       孤儿sockets废弃前重试的次数,缺省值是7
    15) net.ipv4.tcp_mem
       内核分配给TCP连接的内存,单位是page:
       第一个数字表示TCP使用的page少于此值时,内核不进行任何处理(干预),
       第二个数字表示TCP使用的page超过此值时,内核进入“memory pressure”压力模式,
       第三个数字表示TCP使用的page超过些值时,报“Out of socket memory”错误,TCP 连接将被拒绝
    16) net.ipv4.tcp_rmem
       为每个TCP连接分配的读缓冲区内存大小,单位是byte
    17) net.ipv4.tcp_wmem
       为每个TCP连接分配的写缓冲区内存大小,单位是byte:
       第一个数字表示,为TCP连接分配的最小内存,
       第二个数字表示,为TCP连接分配的缺省内存,
       第三个数字表示,为TCP连接分配的最大内存(net.core.wmem_max可覆盖该值)
    18) net.ipv4.tcp_keepalive_time
       当keepalive起用的时候,TCP发送keepalive消息的频度,单位为秒,缺省是7200秒(即2小时)
    19) net.ipv4.tcp_keepalive_intvl
       keepalive探测包的发送间隔    
    20) net.ipv4.tcp_keepalive_probes
       如果对方不予应答,探测包的发送次数


    代码中可通过SO_LINGER来控制。

  • 相关阅读:
    003_饿了么chaosmonkey实现
    mysql-5.7 innodb_buffer_pool刷新机制详解
    mysql-5.7中的innodb_buffer_pool_prefetching(read-ahead)详解
    mysql-5.7中innodb_buffer_pool页面淘汰算法
    scrapy 的一个例子
    scrapy 的框架的安装
    python 例程的一个好例子
    django中跨app引用model
    用ansible 完成一次性的工作(ad-Hoc)工作
    django 在建模时的一个手贱
  • 原文地址:https://www.cnblogs.com/aquester/p/9891484.html
Copyright © 2011-2022 走看看