办公室无法请求服务器(tcp_timestamps 设置引发的网络问题)

问题描述:
办公室突然无法访问阿里云的其中一台服务器,IP可以ping通,但是端口不通,并不是完全不能访问,有时可以,有时不可以,有的电脑可以,有的电脑不可以,外网是可以的,问题一直没有解决,发现IDC机房的服务器是可以访问的,所以使用隧道技术,将办公室的80端口请求转发到阿里云,临时解决。一段时间后IDC服务器又出现类似问题。将问题报告给IDC机房,IDC机房更换端口后,恢复正常,过一段时间又出现问题。

解决方法:
寻求阿里云技术支持,多次后,终于找到问题解决方案,修改阿里云服务器的内核参数。

cat /proc/sys/net/ipv4/tcp_tw_recycle
cat /proc/sys/net/ipv4/tcp_timestamps
如果两个参数同时为1,则有可能出现以上问题,将timestamps参数改为0,即可。

修改该值的方法:vim /etc/sysctl.conf  添加 net.ipv4.tcp_timestamps=0

使用该命令使其立马生效:/sbin/sysctl-p

并不是所有的阿里云服务器都存在此问题。

问题原因:

如果要理解这个问题,首先要了解TCP断开链接的流程(假设已经知道)。

我们知道在TCP连接断开时,最后客户端(发送中断请求的一方)需要有一个time_wait状态,等待2MS(MS即报文在网络中存在的最长时间,1MS为30s),以确保服务端收到了客户端发送的ACK,如果服务端为收到客户端发送的ACK,那么会告知客户端,客户端重新发送ACK信号,time_wait时间重新开始计算,2MS刚好可以确保收到服务端的信号。

当服务器并发量大的时候,time_wait连接数会很大,一直占用连接不释放,造成服务器资源浪费,还有可能把服务器的连接数撑满。所以我们希望time_wait可以快速释放,不用等待2MS,我们可以通过修改内核参数,使连接可以快速回收。

如果单独开启tcp_tw_recycle是不生效的,还需要开启tcp_timestamps(默认是开启的),这样服务器可以根据客户端发来请求的时间戳和服务器当前的时间戳作对比,如果发来的时间戳小于服务端时间戳,则认为是一个旧的请求,服务端丢弃。

这样造成的问题是客户端和服务端的时间戳必须一致,否则会导致客户端到服务端的请求被服务端直接丢弃。

你可能感兴趣的:(linux)