TIME_WAIT 状态过多怎么办?

这道题目是腾讯考察的题目,当时没有回答上来,这也是面试过程中的一道经典题目,结合网上的一些博客,做一个记录,好以后复习。

上图是四次挥手的示意图,左边表示active close, 右边表示passive close, 当然active close 不一定就表示客户端,passive close 一定就表示服务端。

time_wait 的危害

  • 如果服务端有大量的close-wait的连接没有及时关闭,而在高并发短连接的HTTP请求下,客户端又不断地发送新的连接请求,这样就会打开的文件描述符数会不断增加。在linux系统中,一个进程最大可以同时打开的文件描述符是有上限的,ulimit命令可以查到。当达到这个上限时,服务端进程将无法新建socket来响应新的请求。
  • 过多的话会占用内存,一个TIME_WAIT占用4k大小

解决方案

编辑内核文件/etc/sysctl.conf,加入以下内容:

  • net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;打开这个syncookies的目的实际上是:“在服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求”。
  • 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 = 30 修改系默认的 TIMEOUT 时间
  • 客户端,HTTP 请求的头部,connection 设置为 keep-alive,
  • 应用层面尽量避免频繁关闭连接,如业务优化,或者使用长连接等;
posted @ 2021-05-30 15:14  wsl-hitsz  阅读(366)  评论(0编辑  收藏  举报