抓包结果

客户端访问服务端时断时续,抓包:TCP Retransmission_linux

问题分析处理

从TCP 抓包上看问题描述:TCP Retransmission

SYN重传,第三次握手被重传了,没有收到服务器放的ACK确认

在服务器上抓包能捕获SYN的请求,那就说明服务器端接收到了请求但是没有回应ACK包,于是想起了以前nat环境下tw_recyle``的坑,当多个客户端使用同一个外网IP通过NAT访问内网服务器的时候,服务器如果在内核参数中打开了net.ipv4.tcp_tw_recycle = 1`

就有可能导致服务器收到SYN但是不会向客户端发送SYN+ACK包。因为打开recyle参数后会识别这些包的时间戳(net.ipv4.tcp_timestamps = 1),但是nat过来的数据包又因为时间戳有可能不是顺序的,导致服务器认为包不可信而丢弃。

故当我们在使用阿里云的VPC虚拟专网的时候,使用弹性IP接入,一定要注意NAT的问题,在服务器参数上关闭net.ipv4.tcp_tw_recycle。 否则从一个ip来的不同客户端请求很有可能导致大量请求失败

修改 linux /etc/sysctl.conf后sysctl -p

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

扩展

timestamp扩展:

同时开启timestamp(时间戳)和tw_recycle(快速回收),会导致在一个MSL时间内只响应timestamp递增的请求,对于时间戳较小的请求都抛弃了(不响应ack)

MSL扩展: RFC793中规定MSL为2分钟,也就是说2分钟内同一个ip的请求的时间戳要求递增,不是递增的话服务器不予响应。


作者:明明就_c565

链接:https://www.jianshu.com/p/869c15b46a7b

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。