你的位置:首页 > 软件开发 > Java > TIME_WAIT、 CLOSE_WAIT

TIME_WAIT、 CLOSE_WAIT

发布时间:2015-12-11 16:00:37
内容提要TCP连接释放的过程TIME_WAIT大量TiME_WAIT的后果解决方案CLOSE_WAIT大量CLOSE_WAIT的后果解决方案 TCP 连接释放的过程 图中,A是主动关闭的一方,B是被动关闭的一方。 从图中可以看出,如果处于TIME_WAIT ...

TIME_WAIT、 CLOSE_WAIT

 内容提要

  • TCP连接释放的过程
  • TIME_WAIT
    • 大量TiME_WAIT的后果
    • 解决方案
  • CLOSE_WAIT
    • 大量CLOSE_WAIT的后果
    • 解决方案

 

 

TCP 连接释放的过程

 TIME_WAIT、 CLOSE_WAIT

 

图中,A是主动关闭的一方,B是被动关闭的一方。

 从图中可以看出,如果处于TIME_WAIT状态,说明是主动关闭的。如果处于CLOSE_WAIT,说明是被动关闭的。

 

TIME_WAIT

         从图上看出,TIME_WAIT状态下,会有2个MSL(最大报文存活时间)的等待时间,之后才会处于CLOSED状态,并释放资源。

 TIME_WAIT、 CLOSE_WAIT

 

         为了保证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 (#换成@)。

可能感兴趣文章

我的浏览记录