我们做性能测试或者服务端调优时,经常会查看服务器的tcp连接情况, 偶尔会出现大量的TIME_WAIT状态,本篇文章将解释一下这个状态,并用实际性能测试例子模拟一下出现的场景与调优办法。 1、TCP连接的状态 我们在学习计算网络的时候,都知道TCP的三次握手与四次挥手(面试经常问哈),四次挥手如下图所示: 如图所示挥手过程...
综上,对TIME_WAIT状态的优化思路是尽量缩小等待时长,而不是暴力的直接关闭(可能会引起新连接收到旧连接数据的风险),也不要直接发送RST复位连接(可能会引起发送、接收缓冲区中的数据丢失),所以使用修改内核参数 tcp_tw_reuse 参数是最保险的方式,通过根据实际网络情况和应用场景适当的调节 tcp_timestamp 的值,可以...
1、tcp_timestamp 开启TCP的timestamp的option,两个4字节的时间戳字段,其中第一个4字节字段用来保存发送该数据包的时间,第二个4字节字段用来保存最近一次接收对方发送到数据的时间戳。 2、tcp_tw_recycle 开启后,缩短time_wait的回收时间,回收时间为3*RTO(Retransmission Timeout),RTO 时间在200ms~ 120s 具体时间...
所谓的TCP keepalive是指TCP连接建立后会通过keepalive的方式一直保持,不会在数据传输完成后立刻中断,而是通过keepalive机制检测连接状态。 Linux控制keepalive有三个参数:保活时间net.ipv4.tcp_keepalive_time、保活时间间隔net.ipv4.tcp_keepalive_intvl、保活探测次数net.ipv4.tcp_keepalive_probes,默认值分别是 7200...
TIME_WAIT状态是TCP中最容易被人误解的特性之一。因为很多的标准文档都没有对该状态做一个详细的说明和解释。设置TIME_WAIT状态的原因主要有以下两个: 用来实现全双工的连接关闭; 它使过时的重复报文段作废; 下面我们对这两个原因做详细的说明。 4.3.1 实现TCP全双工连接的关闭 ...
大家都知道tcp正常的关闭连接要经过四次握手。如下所示: 在这四次握手状态中,有一个特别要注意的状态TIME_WAIT。这个状态是主动关闭方在收到被关闭方的FIN后会处于并长期(2个MSL时间,根据具体的实现不同,这个值会不同,在RFC 1122建议MSL=2分钟,但在Berkeley的实现上使用的值为30s,具体可以看www.rfc.net,要是...
TIME_WAIT状态是TCP中最容易被人误解的特性之一。因为很多的标准文档都没有对该状态做一个详细的说明和解释。设置TIME_WAIT状态的原因主要有以下两个: 用来实现全双工的连接关闭; 它使过时的重复报文段作废; 下面我们对这两个原因做详细的说明。 4.3.1 实现TCP全双工连接的关闭 ...
从上述过程中,我们会发现TIME_WAIT仅在主动断开连接的一方出现,被动断开连接的一方会直接进入CLOSED状态,进入TIME_WAIT的客户端需要等待 2 MSL 才可以真正关闭连接。TCP 协议需要TIME_WAIT状态的原因和客户端需要等待两个 MSL 不能直接进入CLOSED状态的原因是一样的: ...
在“注册表编辑器”中打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”路径。 在“编辑”菜单中,选择“新建 > DWORD (32-位)值”,输入名称“TcpTimedWaitDelay”。 右键单击TcpTimedWaitDelay,选择“修改”。 在“编辑 DWORD(32位)值”对话框的“基数”区域中,选择十进制值为“30”,并...
这是个很经典的问题,TCP断开连接时的四次挥手中,客户端在发送最后的ACK后要进入TIME-WAIT状态,这个状态时长为2倍MSL。 MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文寿命”,它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃。