Centos6的TCP Retransmission问题

环境:

CentOS release 6.8 (Final)

现象

通过本地访问生产网页或者ssh时 有时可以有时不行
通过在生产机与本地抓包得到下列信息:

tcp_retransmission.png

通过百度了下(TCP Retransmission),原因是net.ipv4.tcp_tw_recycle 内核参数引起的。

当多个客户端使用同一个外网IP通过NAT访问内网服务器的时候,服务器如果在内核参数中打开了net.ipv4.tcp_tw_recycle = 1
就有可能导致服务器收到SYN但是不会向客户端发送SYN+ACK包。因为打开recyle参数后会识别这些包的时间戳(net.ipv4.tcp_timestamps = 1),但是nat过来的数据包又因为时间戳有可能不是顺序的,导致服务器认为包不可信而丢弃。

解决方法:

vi /etc/systcl.conf

net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps=0

最后执行生效命令:

sysctl -p

timestamp扩展:

同时开启timestamp(时间戳)和tw_recycle(快速回收),会导致在一个MSL时间内只响应timestamp递增的请求,对于时间戳较小的请求都抛弃了(不响应ack)
MSL扩展: RFC793中规定MSL为2分钟,也就是说2分钟内同一个ip的请求的时间戳要求递增,不是递增的话服务器不予响应。

# linux
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×