简介:程序上 k8s后,数据库服务加上这些参数,不然连接会有问题。我们来探究下原因:
首先,看下这3个参数的意义:
1、net.ipv4.tcp_tw_recycle=0
为1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
2、net.ipv4.tcp_tw_reuse=0
为1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
在关闭net.ipv4.tcp_tw_reuse的情况下,是不能重复利用TIME_WAIT的,需要等待TIME_WAIT自己关闭,并且TIME_WAIT的时间不能通过参数进行配置,如果修改的话,需要自己编译内核。
3、net.ipv4.tcp_timestamps=0
tcp_timestamps设计目的是为了记录数据包的发送时间,过程如下
- 发送方在发送数据包时,在TCP协议中的TSopt选项记录当前的发送的时间戳TSval中。
- 接收方收到数据包,进行拆封并把发送的时间戳TSval记录在TSecr返回给发送方一个ack。
- 发送包收接收方的ack包,用当前时间戳 - ack中的TSecr时间戳就可以得到精确的RTT。
服务端
1、针对参数tcp_tw_recycle分析:
在服务端,不要启用net.ipv4.tcp_tw_recycle,除非你能确保你的服务器网络环境不是NAT。
2、针对参数tcp_tw_reuse分析:
在服务端,不要启用net.ipv4.tcp_tw_reuse,除非你能确保你的服务器网络环境不是NAT。
3、针对参数tcp_timestamps分析:
今天发生了一个奇怪的现象,在家里始终打开公司的网站打开不了,从ping到dig域名,然后curl,都是没有问题的,但是就是打不开,最好没有办法只能抓包了,从抓包的然后来看就是syn-ack没有返回,然后就看到底是因为什么原因:
原因就是net.ipv4.tcp_timestamps=1,启用了时间戳,原理如下:
问题出在了 tcp三次握手,如果有一个用户的时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp的3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。
解决方法:net.ipv4.tcp_timestamps = 0
总结:
1、开启net.ipv4.tcp_tw_reuse
可以复用TIME_WAIT的连接,但是要求服务器与客户端都必须开启net.ipv4.tcp_timestamps
。
为了保证安全性,假如说没有net.ipv4.tcp_timestamps
,当连接被复用后,如果这时候有延迟或者重发的数据包到达,新的连接就无法判断数据包属于复用前的连接还是复用后的连接了。
2、tcp_tw_reuse 服务器端应该不会有大量主动连接的动作(或许会连接DB等,但一般也是长连接)。因此这个选项对于TCP服务器来说,基本上是无用的,没必要打开。
参考:
以讹传讹的“tcp_tw_reuse” - 腾讯云开发者社区-腾讯云
运维中tcp_tw_recycle net.ipv4.tcp_timestamps引发的坑 - 知乎
net.ipv4.tcp_tw_reuse是干嘛的?_三天饿九顿的萌新的博客-优快云博客_net.ipv4.tcp_tw_reuse