解决TIME_WAIT过多造成的问题

2023-05-16

        三次握手​​​​​​​​​​​​​​​​​​​​​​​​​​​​

这里写图片描述        

        看到TIME_WAIT状态是在tcp断开链接时产生的,因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭;后发FIN包的一方执行的是被动关闭。主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留两倍的MSL时长。 MSL指的是报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃。关于MSL的大小,RFC 793协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置,以Linux为例,通常是半分钟,两倍的MSL就是一分钟,也就是60秒,并且这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它。

        TIME_WAIT状态存在的必要性。虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,比如丢包或者延迟到达,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文,并保证于此。

        简单说timewait之所以等待2MSL的时长,是为了避免因为网络丢包或者网络延迟而造成的tcp传输不可靠,而这个time_wait状态则可以最大限度的提升网络传输的可靠性。

        TIME_WAIT状态过多的危害

        TIME_WAIT状态是TCP链接中正常产生的一个状态,但凡事都有利弊,TIME_WAIT状态过多会存在以下的问题:

(1)在socket的TIME_WAIT状态结束之前,该socket所占用的本地端口号将一直无法释放。这也是文章开头的提到问题的一个原因之一。

(2)在高并发(每秒几万qps)并且采用短连接方式进行交互的系统中运行一段时间后,系统中就会存在大量的time_wait状态,如果time_wait状态把系统所有可用端口 都占完了且尚未被系统回收时,就会出现无法向服务端创建新的socket连接的情况。此时系统几乎停转,任何链接都不能建立。

(3)大量的time_wait状态也会系统一定的fd,内存和cpu资源,当然这个量一般比较小,并不是主要危害

如何尽量处理TIMEWAIT过多?

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


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 时间  

        然后执行 /sbin/sysctl -p 让参数生效.


/etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。  

        简单来说,就是打开系统的TIMEWAIT重用和快速回收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决TIME_WAIT过多造成的问题 的相关文章

随机推荐

  • windbg 的常用命令--强大!常用!

    如何手工抓取dump文件 在生产环境下进行故障诊断时 xff0c 为了不终止正在运行的服务或应用程序 xff0c 有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试 首先一种比较直观简洁的方式就是用WinDbg等调试器直接atta
  • 用Windbg调试.NET程序的资源泄漏

    在产品环境中的一个Windows服务出现了异常情况 这是一个基于WCF的 NET程序 xff0c 它向网络应用 xff08 Web Application xff09 提供WCF服务 xff0c 同时也调用其他WCF服务以完成任务 突然 x
  • 堆与栈的区别【收藏】

    网上看到的两篇关于 堆与栈 的介绍 xff0c 讲的比较清楚 1 堆和栈的区别 原地址 xff1a http blog csdn net goingup archive 2006 03 07 618309 aspx 在bbs上 xff0c
  • vimdiff 使用笔记

    vimdiff 是建立在 diff 命令之上的 启动方法 xff1a vimdiff file left file right 或者 vim d file left file right 只在某一文件中存在的行的背景色被设置为蓝色 xff0
  • 负数的二进制表示方法 原码、反码、补码

    6 5 原码 反码 补码 结束了各种进制的转换 xff0c 我们来谈谈另一个话题 xff1a 原码 反码 补码 我们已经知道计算机中 xff0c 所有数据最终都是使用二进制数表达 我们也已经学会如何将一个10进制数如何转换为二进制数 不过
  • 二、十六进制数互相转换

    6 1 为什么需要八进制和十六进制 编程中 xff0c 我们常用的还是10进制 必竟C C 43 43 是高级语言 比如 xff1a int a 61 100 b 61 99 不过 xff0c 由于数据在计算机中的表示 xff0c 最终以二
  • 移位运算符 位逻辑运算符

    移位运算符 移位运算符就是在二进制的基础上对数字进行平移 按照平移的方向和填充数字的规则分为三种 xff1a lt lt xff08 左移 xff09 gt gt xff08 带符号右移 xff09 和 gt gt gt xff08 无符号
  • 数据类型对应字节数(32位,64位 int 占字节数)

    一 程序运行平台 不同的平台上对不同数据类型分配的字节数是不同的 个人对平台的理解是CPU 43 OS 43 Compiler xff0c 是因为 xff1a 1 64位机器也可以装32位系统 xff08 x64装XP xff09 xff1
  • 【JAVA】03版本excle导出数据

    03版本excle导出list lt Object gt 数据 前端页面请求 使用流返回 public static String exportExcel HttpServletRequest request HttpServletResp
  • C++码农要读的经典

    刚大四 xff0c 还在忙着找工作 xff0c 读过的书不是很多 xff0c 还有一些好书在读 xff0c 还有一些书将来必读 C语言程序设计 谭浩强版本 这个版本一致被人说误导子弟 xff0c 当然还有很多人推崇 我觉得这本书不是什么好书
  • 进阶训练赛(四)题解

    A 交换a b的值 直接输出b a void solve int a b cin gt gt a gt gt b cout lt lt b lt lt 34 34 lt lt a B 素数回文数的个数 从11 n遍历一遍找出满足即是回文数又
  • AtCoder Beginner Contest 285(A~E)

    A Edge Checker 2 在满二叉树中 xff0c 判断两个两个点是否是父子关系 void solve int a b cin gt gt a gt gt b if b 61 61 2 a b 61 61 2 a 43 1 puts
  • 进阶训练赛(十二)

    目录 问题 A 符文宗师的魔方阵 问题 B APP的成绩单 问题 C 6 1 4 1 最大的节点 问题 D 6 2 2 1 油田 问题 E 6 3 2 1 电话网络 问题 F 7 1 4 1 重型运输 问题 G 打怪兽version 3 问
  • 进阶训练赛(二十)

    目录 问题 A 计算矩阵边缘元素之和 问题 B 图像旋转 问题 C 最长最短单词 问题 D 输出亲朋字符串 问题 E 蓝桥杯2022初赛 李白打酒加强版 1 朴素版dfs 2 dfs 43 记忆化搜索 43 剪枝 问题 F 蓝桥杯2022初
  • 用EditPlus配置MASM汇编

    最开始写汇编程序 xff0c 是打开一个记事本就写 但是记事本不是专门的程序编辑器 xff0c 格式不好控制 xff0c 更容易写错程序 于是想到 xff0c 能有一个简单的文本编辑器 xff0c 能控制好ASM的格式 xff0c 有关键字
  • Codeforces Round #852(A~D)

    比赛原地址 xff1a Dashboard Codeforces Round 852 Div 2 Codeforces A Yet Another Promotion 买a种商品会买m送1 xff0c b种则不会 那么当a种商品单价小于等于
  • 动态联编和静态联编

    基本概念 1 静态联编 xff08 早联编 xff09 xff1a 在程序被编译时进行联编 程序执行快 xff0c 但灵活性较小 2 动态联编 xff08 晚联编 xff0c 滞后联编 xff09 xff1a 编译时无法确定要调用的函数 x
  • 函数重载常见问题

    问题一 cannot bind non const lvalue reference of type 39 Complex amp 39 to an rvalue of type 39 Complex 39 该错误提示出现的原因是 xff0
  • 输入输出流

    iomanip的控制符 resetiosflags long f 关闭由参数f指定的格式标志 xff0c 用于输入输出 setprecision int n 设置数据小数位数 xff0c 缺省时为6 xff0c 用于输入输出 setw in
  • 解决TIME_WAIT过多造成的问题

    看到TIME WAIT状态是在tcp断开链接时产生的 xff0c 因为TCP连接是双向的 xff0c 所以在关闭连接的时候 xff0c 两个方向各自都需要关闭 先发FIN包的一方执行的是主动关闭 xff1b 后发FIN包的一方执行的是被动关