[linux] linux 内核参数tcp_tw_reuse、tcp_tw_recycle、tcp_timestamp详解


本文总阅读量

1、参数概述

1
2
3
tcp_tw_reuse:允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
tcp_tw_recycle:表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
tcp_timestamps:tcp时间戳

2、查看三个参数当前的状态

1
2
3
4
shell > sysctl -a|grep -E "tcp_timestamp|tw_reuse|tw_recycle"
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0

3、参数解析

tcp_tw_reuse:仅在TCP套接字作为客户端,调用connect时起作用。绝大部分的TCP服务器,应该不会有大量主动连接的动作(或许会连接DB等,但一般也是长连接)。因此这个选项对于TCP服务来说,基本上是无用的,完全是没必要打开。只有服务器作为客户端,发起一下短小事务的连接的时候该参数才能凸显作用。必须启用net.ipv4.tcp_timestamps参数,才允许重用TIME_WAIT套接字,tcp_tw_reuse参数才会起作用。
tcp_tw_recycle:这种回收参数,在nat环境过会存在重大问题,丢弃大量的可用连接。例如:公司使用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK。
因此在nat环境下建议禁用该参数。
禁用方式:
echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle;
可以保留tcp_timestamps参数,默认是开启的,只要把tcp_tw_recycle参数禁用了回收机制就不起作用了。
当然也可以把这个参数禁用,禁用命令如下:
sysctl -w net.ipv4.tcp_timestamps=0

目录
  1. 1. 1、参数概述
  2. 2. 2、查看三个参数当前的状态
  3. 3. 3、参数解析

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog