客户端tcp_timestamp=0导致断开不能重新连接

客户端tcp_timestamp=0导致断开不能重新连接,第1张

解决方法:
寻求阿里云技术支持,多次后,终于找到问题解决方案,修改阿里云服务器的内核参数。
cat /proc/sys/net/ipv4/tcp_tw_recycle
cat /proc/sys/net/ipv4/tcp_timestamps
如果两个参数同时为1,则有可能出现以上问题,将timestamps参数改为0,即可。
修改该值的方法:vim /etc/sysctlconf 添加 netipv4tcp_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(默认是开启的),这样服务器可以根据客户端发来请求的时间戳和服务器当前的时间戳作对比,如果发来的时间戳小于服务端时间戳,则认为是一个旧的请求,服务端丢弃。
这样造成的问题是客户端和服务端的时间戳必须一致,否则会导致客户端到服务端的请求被服务端直接丢弃。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13242998.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-25
下一篇 2023-06-25

发表评论

登录后才能评论

评论列表(0条)

保存