一,linux TIME_WAIT 相关参数
1,/proc/sys/net/ipv4/ip_local_port_range:端口范围,不要超过1024到65535,1024以下系统使用,65535以上会提示失败
2,/proc/sys/net/ipv4/tcp_max_tw_buckets:kernel中最多存在的TIME_WAIT数量
3,net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
4,net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
5,net.ipv4.tcp_fin_timeout = 60 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
6,net.ipv4.tcp_timestamps=0 Timestamps 用在其它一些东西中﹐可以防范那些伪造的sequence 号码。可用于计算往返时延RTT。
注意:
- 不像Windows 可以修改注册表修改2MSL 的值,linux 需要修改内核宏定义重新编译,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2状态超时时间.
- tcp_tw_reuse 和 SO_REUSEADDR 是两个完全不同的东西
SO_REUSEADDR 允许同时绑定 127.0.0.1 和 0.0.0.0 同一个端口; SO_RESUSEPORT linux 3.7才支持,用于绑定相同ip:port,像nginx 那样 fork方式也能实现
(1). tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开)
(2). tw_reuse 只对客户端起作用,开启后客户端在1s内回收
(3). tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。
内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量
二,可能的影响
当系统中socket出现大量timewait状态时,这些TIME_WAIT是占据端口号的,而且基本要1分钟左右才能被Kernel回收,因此会占用大量系统端口号。
1,导致客户端选不到可用端口,端口号耗尽,无法