内容提要TCP连接释放的过程TIME_WAIT大量TiME_WAIT的后果解决方案CLOSE_WAIT大量CLOSE_WAIT的后果解决方案 TCP 连接释放的过程 图中,A是主动关闭的一方,B是被动关闭的一方。 从图中可以看出,如果处于TIME_WAIT ...
内容提要
- TCP连接释放的过程
- TIME_WAIT
- CLOSE_WAIT
TCP 连接释放的过程
图中,A是主动关闭的一方,B是被动关闭的一方。
从图中可以看出,如果处于TIME_WAIT状态,说明是主动关闭的。如果处于CLOSE_WAIT,说明是被动关闭的。
TIME_WAIT
从图上看出,TIME_WAIT状态下,会有2个MSL(最大报文存活时间)的等待时间,之后才会处于CLOSED状态,并释放资源。
为了保证A发送的最后一个ACk报文段能够到达B,其实就是为了让B真正的关闭,这样才能够保证连接的双方都关闭。毕竟是全双工的通信,总不能出现A到B的连接是关闭的,B到A的连接是打开的,这样只能算是半关闭状态。
MSL 的默认值是120s,也就是2分钟,所以2MSL就是4分钟。也就是说主动关闭的一方,会等待4分钟才会释放相关资源。
出现TIME_WAIT会带来的后果
1) 如果客户端出现了大量的TIME_WAIT,那么在这4分钟之内,想要再使用该Socket绑定的端口,肯定会报BindException了。
2) 如果服务端出现了大量的TIME_WAIT,则服务的性能会下降,因为底层有大量的Sturct Socket没有释放,占内存,在用户量很大时,会很卡。
3) 服务端重启时,ServerSocket绑定的端口可能会处于TIME_WAIT状态,也是会出现BindException异常的。
TIME_WAIT解决方案
从程序设计的角度讲:
服务端最好不要(或者少)出现TIME_WAIT状态,毕竟这个问题是不可避免的。也就是要把TIME_WAIT分散到客户端,即让客户端主动关闭连接。
从运维的角度来考虑讲:
就需要对操作系统的配置做调整了:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间,单位s
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:TIME_WAIT、 CLOSE_WAIT
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。