TCP协议四次挥手过程-TIME_WAIT-CLOSE_WAIT状态的作用-大量出现如何处理?

TCP协议四次挥手过程

TCP协议四次挥手过程-TIME_WAIT-CLOSE_WAIT状态的作用-大量出现如何处理?

TIME_WAIT状态

  1. 被动关闭方发送FIN(第三次挥手),并等待主动关闭方返回ACK(第四次挥手)
  2. 若最终ACK丢失(第四次挥手失败),被动关闭方将重新发送FIN(第三次挥手),主动关闭方必须维护状态信息TIME_WAIT,保证自己可以接收,然后再重发最终ACK.不能让主动方发送完报文以后立马进入CLOSE状态

TIME_WAIT状态所带来的问题

  1. 主动断开方处于TIME_WAIT状态时,源端口无法使用
  2.  端口最大数是65535,因此如果频繁主动断开TCP连接,将很快耗尽端口号。一旦达到了上限,则新的请求就无法被处理,接着就是大量Too Many Open Files异常,然后tomcat、nginx、apache崩溃

如何解决TIME_WAIT问题

  1. 解决TIME_WAIT大量出现,最核心的思想,就是打开系统的TIME_WAIT重用快速回收
  2. net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME_WAIT sockets的快速回收,默认为0,表示关闭
  3. net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接,默认为0,表示关闭

CLOSE_WAIT状态

如果出现了CLOSE_WAIT过多的状态

1.在对方关闭连接后,自身程序里没有检测 -(被动方的角度)

2.本身忘了需要关闭连接,于是整个资源就一直被程序占用着。-(主动方的角度)

如何解决CLOSE_WAIT问题

  1. 关闭正在运行的程序
  2. 尽快修改程序bug,然后测试提交到线上服务器