Linux上的TIME_WAIT和tcp_fin_timeout

原创 2018年04月17日 09:29:37
当Linux服务器的TIME_WAIT过多时,
通常会想到去修改参数降低TIME_WAIT时长,
以减少TIME_WAIT数量,但Linux并没有提供这样的接口,
除非重新编译内核。


Linux默认的TIME_WAIT时长一般是60秒,
定义在内核的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_TIMEOUT TCP_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时间:
# 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来控制。

TCP的TIME_WAIT快速回收与重用

声明一点:Linux中是无法修改tcp的TIME_WAIT值的,除非重新编译,起码我是没有找到怎么改。值得注意的是,net.ipv4.tcp_fin_timeout这个参数是FIN_WAIT_2的值,...
  • dog250
  • dog250
  • 2013-10-30 23:20:58
  • 45089

优化内核参数,减少TCP连接中的TIME_WAIT(经典)

vi /etc/sysctl.conf   编辑/etc/sysctl.conf文件,增加三行:        引用         net.ipv4.tcp_syncookies = 1  ...
  • zhangxinrun
  • zhangxinrun
  • 2011-09-22 10:13:42
  • 2290

修改系统的TIME_WAIT等待时间和其它的TCP属性

robert@ubuntu-vm:~$ vim /etc/sysctl.conf 在文件末尾添加: net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepa...
  • robertkun
  • robertkun
  • 2015-11-30 19:20:41
  • 2032

CentOS下存在大量的TCP TIME_WAIT解决方法

查看TIME_WAIT的数量
  • tomas_wade
  • tomas_wade
  • 2014-07-23 10:11:19
  • 2359

linux下如何释放TIME_WAIT

今天服务网站明显过慢查年了一下服务器联接数,纠结于怎么搞定TIME_WAIT # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c        68...
  • u014659211
  • u014659211
  • 2017-05-04 15:06:36
  • 1890

Linux服务器出现TIME_WAIT太多的问题

服务器很卡,mysql进程占用很高,出现了mysql大量连接TIME_WAIT状态 netstat -an |grep  TIME_WAIT tcp_syncookies 布尔值,默认值是...
  • sunny05296
  • sunny05296
  • 2017-03-30 20:37:11
  • 1091

linux下netstat发现很多TIME_WAIT

linux下使用netstat发现很多TIME_WAIT导致端口不可用的解决方法如下: vi /etc/sysctl.conf net.ipv4.tcp_syncookies = 1 net...
  • fzq1988215
  • fzq1988215
  • 2015-05-08 09:34:57
  • 1014

linux 解决TIME_WAIT数量过多的问题

1.查看各状态的端口数量;脚本如下: while true; do date; netstat -n | awk '/^tcp/ {++state[$NF]} END...
  • justfor3L
  • justfor3L
  • 2017-02-16 15:10:20
  • 1231

Linux TCP 服务器编程(五):端口重用及TIME_WAIT

上一节说到设置套接字选项的问题,我们这一节主要处理上一节说的“Address already in use”问题,这个问题通过设置设置一个套接字选项来解决。 这个错误提示是在bind函数调用时发生的,...
  • gentleliu
  • gentleliu
  • 2014-01-01 18:28:26
  • 2534

关于流量升高导致TIME_WAIT增加,MySQL连接大量失败的问题

转:http://www.searchtb.com/2012/05/mysql_time_wait.html 有个应用就是每次都会去查一个接口,接口返回用户的信息数据,从而展现不同的页面效果...
  • lcathm
  • lcathm
  • 2015-07-07 14:03:32
  • 444
收藏助手
不良信息举报
您举报文章:Linux上的TIME_WAIT和tcp_fin_timeout
举报原因:
原因补充:

(最多只允许输入30个字)