踩过的坑之TIME_WAIT过高的处理
https://blog.51cto.com/cangzihu/1888622
https://its201.com/article/zxx901221/87528414
主动断开的一方的TCP连接会在TIME_WAIT这个状态下保持2MSL,其作用就2个:
-
确保对方收到自己发送的最后一个ACK(因为对方发送了FIN),如果对方没有收到自己发送的ACK必定会重新发送FIN,这样保证4次断开的完整性。因为MSL是最大报文生存时间,如果在1个MSL时间内自己发送的ACK对方没有收到那就注定收不到了,而且对方肯定还会发送FIN,那么一个FIN发送过来的最长时间也是1个MSL,所以这里要等待2MSL。
-
另外一个原因就是避免延迟的IP报文,在频繁短连接的场景下客户端通常会对同一个IP和端口在短时间内发起多次连接,而客户端使用的端口是自己系统随机分配的高位端口,有一定概率发生上一个socket四元组和下一个socket四元组一样,如果这时候一个原本属于上一个socket四元组的被延迟的IP报文送达,那么这将发送数据混乱的状态,所以为了避免这种情况就利用MSL这个报文最大生存时长机制让残余的IP报文在网络中消失。这时候同样的四元组又可以被使用了。
一、net.ipv4.tcp_tw_recycle
功能:系统会假设对端开启了 tcp_timestamps,然后会去比较时间戳,如果时间戳变大了,就可以重用fd。开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量
打开后的副作用:如果对端是一个NAT网络的话(如:一个公司只用一个IP出公 网)或是对端的IP被另一台重用了,或者一个机器上多个docker Node,这个事就复杂了。建链接的SYN可能就被直接丢掉了(你可能会看到connection time out的错误) -- 这就是为什么一个公司连接在测试服务器时,会很慢,但是服务器本身负载很低的问题的原因。
建议:对外服务器不能打开该开关!!!对内服务器如果没有docker(Nat转换)的可以打开。
二、net.ipv4.tcp_timestamps
功能:记录数据包的发送时间,其为双向的选项,当一方不开启时,两方都将停用timestamps,默认打开
打开后的副作用:1.10字节的TCP header开销 2. allow you to guess the uptime of a target system
建议:保持打开状态
三、net.ipv4.tcp_tw_reuse
功能:表示开启重用。当从协议认为安全,则允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。 协议什么情况下认为是安全的?从代码来看是收到最后一个包后超过1s :(sysctl_tcp_tw_reuse && get_seconds() - tcptw->tw_ts_recent_stamp > 1)
打开后的副作用:主动关闭方有可能在下次使用时收到上一次连接的数据包,包括关闭连接响应包或者正常通信的数据包(因为数据包需要经过MSL时间才会消失),主动关闭方会出现奇怪的表现。
建议:服务器应该打开该配置,因为内网网络状态一般比较好。
本文来自博客园,作者:up~up,转载请注明原文链接:https://www.cnblogs.com/soft-engineer/articles/15699488.html
浙公网安备 33010602011771号