关于内核参数设置:net.ipv4.tcp_max_tw_buckets = 20000

0

设置之后 TIME_WAIT始终处于20000左右.
我现在设置了TW回收,通常TW处于200。
请问:为什么一定要把这项值设的这么大呢?


还有,文档建议net.ipv4.tcp_tw_recycle = 0
如果是为了尽快回收TW,是不是该设置为1?

已邀请:

walkor

赞同来自: Aug

TIME_WAIT状态原理
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。
客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。


TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:


1)可靠地实现TCP全双工连接的终止
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。


2)允许老的重复分节在网络中消逝
TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。


MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。
 
以上摘自网络。


设置大一些为了让网络更可靠,能够安全的关闭连接以及让迷途的tcp分节不影响新的连接通讯。


如果设置的小比如200,假如系统有高频的连接创建断开的操作,会迅速增加TIME_WAIT状态的连接,但是实际上只能容纳200个TIME_WAIT状态的连接,导致很多连接断开后没等到2MSL就消逝了,那么有可能会导致连接断开异常以及tcp通讯异常。


net.ipv4.tcp_tw_recycle = 0
这个文档有注释。为了防止nat网络里的客户端连接服务端超时。
如果服务器开了 tcp_tw_recycle和tcp_timestamps,那么会导致nat网络里的客户端连接以及通讯超时。
所以要关闭其中的一个。关闭tcp_timestamps也可以。

softshare - 老程序员

赞同来自:

谢谢!

要回复问题请先登录注册