timewait过多的原因是什么,发现大量timewait解决方法。今天我们来探讨一下服务器产生大量 TIME_WAIT 状态的 TCP连接的情况
对一台服务器进行压测(模拟高并发场景),会发现大量 TIME_WAIT 状态的 TCP连接,连接关闭后,这些TIME_WAIT会被系统回收
一般来讲,在高并发的场景中,出现TIME_WAIT连接是正常现象,一旦四次握手连接关闭之后,这些连接也就随之被系统回收了
但是在实际高并发场景中,很有可能会出现这样的极端情况——大量的TIME_WAIT连接
TIME_WAIT状态连接过多的危害
TIME_WAIT 状态下,TCP连接占用的本地端口将一直无法释放 如果TIME_WAIT连接把所有可用端口都占完了(TCP端口数量上限是65535)而且还未被系统回收,就会出现无法向服务端创建新的socket连接的情况,此时系统几乎停转,任何链接都不能建立:address already in use : connect 异常
在遇到一个问题时,我们不但要看到其现象,更要看到问题产生背后的原理是什么,这样不但解决了问题,还能够拓展自己的知识面
什么是TIME_WAIT连接?
TCP三次握手
第一次握手:客户端发送一个SYN包给服务端,然后进入到SYN_ SENT状态
第二次握手:处在监听状态的服务端收到客户端的SYN包后进行回应:发送一个ACK包给客户端,同时发送一个SYN包给客户端, 然后进入到SYN_ RCVD状态
第三次握手:客户端在收到服务端的SYN包后发送一个ACK包进行确认, 然后进入到ESTABLISHED (连接成功状态)。服务端在收到ACK包后也进入ESTABLISHED (连接成功状态)
通信结束后,需要关闭连接,这时候就要通过TCP的四次挥手来进行关闭连接了
TCP四次挥手
第一次挥手:客户端先发送一个FIN包给服务端,然后进入到FIN _WAIT1 (终止等待1)状态
第二次挥手:服务端收到FIN包之后对其进行回应:发送一个ACK包给客户端, 然后进入到close__ wait (关闭等待)状态。这时候服务端处于半关闭状态。
第三次挥手:同时服务端也请求关闭连接,发送一个FIN包给客户端, 然后进入LAST__ ACK (最后确认)状态
第四次挥手:客户端在收到服务端发送的ACK包之后进入到FIN__ WAIT2 (终止等待2)状态,对服务端发来的FIN包进行回应:发送一个ACK包给服务端, 然后进入到TIME__WAIT (时间等待)状态,等待2MSL (最长报文段寿命)后进入关闭状态,服务端在收到客户端发来的ACK包之后立即进入关闭状态
$ netstat -tan |grep TIME_WAIT
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}'
$ vim /etc/sysctl.confnet.ipv4.tcp_tw_reuse = 1 #默认为0,表示关闭
$ vim /etc/sysctl.confnet.ipv4.tcp_tw_recycle = 1#默认为0,表示关闭
#查看默认的MSL值$cat /proc/sys/net/ipv4/tcp_fin_timeout #修改$echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout 或者 $ vim /etc/sysctl.confnet.ipv4.tcp_fin_timeout = 30
本文地址:百科问答频道 https://www.neebe.cn/wenda/886323.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!