TIME_WAIT的危害

news2024/11/25 12:19:36

前言

该文章主要讨论下TIME_WAIT的存在意义和潜在危害,以及解决措施。

具体内容

首先看一下下面这幅图

这幅图来自《TCP IP详解卷1:协议 原书第2版中文》TCP状态变迁图。

TIME_WAIT存在意义
  • 可靠的终止TCP连接。
  • 保证让迟来的TCP报文有足够的时间被识别并丢弃。

假如用于确认服务器结束报文段6的TCP报文段7丢失,那么服务器要重发此结束报文段,客户端要在某个状态等待结束报文段然后回复确认报文段,这样才能可靠的终止TCP连接。

在linux系统上,一个TCP端口不能被同时打开多次,当一个TCP连接处于TIME_WAIT状态时,我们无法使用该链接的端口来建立一个新连接。反过来思考,如果不存在TIME_WAIT状态,则应用程序能过立即建立一个和刚关闭的连接相似的连接(这里的相似,是指他们具有相同的IP地址和端口号)。这个新的、和原来相似的连接被称为原来连接的化身。新的化身可能受到属于原来连接携带应用程序数据的TCP报文段(迟到的报文段),这显然是不该发生的。这是TIME_WAIT状态存在的第二个原因。

那么为什么TIME_WAIT的时间是2MSL呢?

  MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,否则服务器立即重启,可能会收到来自上一个进程迟到的数据,但是这种数据很可能是错误的,同时也是在理论上保证最后一个报文可靠到达,假设最后一个ACK丢失,那么服务器会再重发一个FIN,这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK。

危害

问题来了,如果在QPS每秒几万以上的高并发的场景下,就会出现系统存在几万多个time_wait状态。虽然TIME_WAIT存在是解决之前说过的两个主要问题,但是TIME_WAIT状态过多会存在以下的问题:

(1)在socket的TIME_WAIT状态结束之前,该socket所占用的本地端口号将一直无法释放。

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

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

解决措施

  • 修改系统配置参数

修改/etc/sysctl.conf文件,一般为如下几个参数:

比较常用的更安全的设置是net.ipv4.tcp_tw_reuse

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 时间
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,(默认是18000). 当TIME_WAIT连接数量达到给定的值时,所有的TIME_WAIT连接会被立刻清除,并打印警告信息。但这种粗暴的清理掉所有的连接,意味着有些连接并没有成功等待2MSL,就会造成通讯异常。一般不建议调整
net.ipv4.tcp_timestamps = 1(默认即为1)60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。也就是说服务器打开了 tcp_tw_reccycle了,就会检查时间戳,如果对方发来的包的时间戳是乱跳的或者说时间戳是滞后的,那么服务器就会丢掉不回包,现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象,所以根据情况使用

其他优化:

net.ipv4.ip_local_port_range = 1024 65535 增加可用端口范围,让系统拥有的更多的端口来建立链接,这里有个问题需要注意,对于这个设置系统就会从1025~65535这个范围内随机分配端口来用于连接,如果我们服务的使用端口比如8080刚好在这个范围之内,在升级服务期间,可能会出现8080端口被其他随机分配的链接给占用掉,这个原因也是文章开头提到的端口被占用的另一个原因
net.ipv4.ip_local_reserved_ports = 7005,8001-8100 针对上面的问题,我们可以设置这个参数来告诉系统给我们预留哪些端口,不可以用于自动分配。

Linux 系统对于net.ipv4.tcp_tw_reuse的解释如下:

Allow to reuse TIME-WAIT sockets for new connections when it is safe from protocol viewpoint. Default value is 0.It should not be changed without advice/request of technical experts.

这段话的大意是从协议角度理解如果是安全可控的,可以复用处于 TIME_WAIT 的套接字为新的连接所用。只适用于连接发起方(C/S 模型中的客户端);对应的 TIME_WAIT 状态的连接创建时间超过 1 秒才可以被复用。

使用这个选项,还有一个前提,需要打开对 TCP 时间戳的支持,即net.ipv4.tcp_timestamps=1(默认即为 1)。要知道,TCP 协议也在与时俱进,RFC 1323 中实现了 TCP 拓展规范,以便保证 TCP 的高可用,并引入了新的 TCP 选项,两个 4 字节的时间戳字段,用于记录 TCP 发送方的当前时间戳和从对端接收到的最新时间戳。由于引入了时间戳,我们在前面提到的 2MSL 问题就不复存在了,因为重复的数据包会因为时间戳过期被自然丢弃。

  • 短连接->长连接

参考文章

如何优化高并发TCP链接中产生的大量的TIME_WAIT的状态-腾讯云开发者社区-腾讯云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring中@Conditional

多环境切换 java配置使用profile Profile设置在某个环境下,spring注入对应的bean public class JavaConfig {BeanProfile("dev")DataSource devDs(){DataSource ds new DataSource();ds.setUrl("dev");ds.setUsername("dev");ret…

Win11 删除文件时提示“找不到该项目,请重试”的解决办法

1、Win R 打开运行窗口,输入 notepad 并回车打开文本文档(记事本)软件,如下图: 2、在文本文档(记事本)软件中复制粘贴以下代码,如下图: del /f /a /q \\?\%1 rd /s /q \\?\%1或DEL /F /A /Q \\?\%1 RD /S /Q \\?…

基于SpringBoot+Vue农产品管理与销售APP设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

python 版本切换,更换当前默认版本

电脑可以安装多个版本,但是好像没有正规的维护python版本的工具,比如前端就有nvm切换node版本,但是python我没找到比较好的(有大佬知道路过方便留言一下,跪谢。。) 废话不多说,更改默认版本很简…

反射复习(java)

文章目录 反射机制的作用反射机制的原理加载机制详细解释 获取 Class 对象反射获取构造方法:获取 Class 对象里面 Constructor 对象反射获取成员变量:获取Class 对象里面的 Field 对象反射获取成员方法:获取 Class 对象里的 Method 对象其他常…

融合创新,共筑未来 | 人大金仓为轨道交通发展注入新质力量

METROTRANS 2024 6月13日~15日,以“多元融合 高质量可持续发展”为主题的2024北京-南京国际城市轨道交通展览会暨高峰论坛在南京国际博览中心隆重举行。人大金仓受邀亮相本次大会,展示了其在轨道交通的创新应用和解决方案。 ‍点击视频 直击现场‍ 规模最…

机器学习课程复习——奇异值分解

1. 三种奇异值分解 奇异值分解(Singular Value Decomposition, SVD)包含了: 完全奇异值分解(Complete Singular Value Decomposition, CSVD)紧奇异值分解(Tight Singular Value Decomposition, TSVD&…

年终奖发放没几天,提离职领导指责我不厚道,我该怎么办?

“年终奖都发了,你还跳槽?太不厚道了吧!” “拿完年终奖就走人,这不是典型的‘骑驴找马’吗?” 每到岁末年初,关于“拿到年终奖后是否应该立即辞职”的话题总会引发热议。支持者认为,这是个人…

GLSB是什么?带你深入了解GLSB核心功能

伴随互联网的快速发展,大型企业等组织单位通过建设多数据中心,以提升用户体验。然而想要在多个数据中心实现流量的智能管理,提高网站的可靠性和可用性,则需要全局服务器负载均衡技术——GLSB的助力。GLSB是什么?它又有…

笔记本系统盘移植与windowsLinux双系统安装

目录 一、 前言二、 Windows系统移植二、 安装Linux三、 Windows分区配置 一、 前言 笔记本内存不够了,之前给笔记本添加了一个机械硬盘,也几乎爆满了,于是购置了1T的固态硬盘,打算用这个固态硬盘安装双系统,剩余空间…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch 简介基本概念ElasticSearch概念-倒排索引安装基本命令ik 分词器SpringBoot整合测试存储数据:测试复杂检索同步与异步调用 参考 简介 Elasticsearch 是一…

【UE数字孪生学习笔记】 Apifox一体化接口测试平台

声明:部分内容来自于b站,知乎,慕课,公开课等的课件,仅供学习使用。如有问题,请联系删除。 部分内容来自UE官方文档,博客等 Apifox接口测试 Apifox 是集 API 文档、API 调试、API Mock、API 自动…

DDMA信号处理以及数据处理的流程---距离速度测量

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…

腾讯《地下城与勇士:起源》手游在部分安卓平台停止更新

原标题:因合约到期 《DNF手游》停止安卓平台更新 易采游戏网6月19日消息:《地下城与勇士:起源》(简称DNF手游)官方今天公告,因合作协议到期,自6月20日起,该游戏将不再在某些安卓应用商店提供。腾讯公司已经…

OpenAI 发布多模态 GPT-4 模型,会开创哪些新的研究方向?

作者:JioNLP 链接:https://www.zhihu.com/question/589640227/answer/2936760622 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 短期看,GPT4 就是个终结者 。开创不了什么新的方…

Redis学习|Jedis、SpringBoot整合Redis

Jedis 我们要使用Java 来操作 Redis,知其然并知其所以然,授人以渔!学习不能急躁,慢慢来会很快!什么是Jedis 是 Redis 官方推荐的java连接开发工具!使用java 操作Redis 中间件!如果你要使用 java操作redis,那么一定要对Jedis 十分的熟悉! 1、…

C++初学者指南第一步---7.控制流(基础)

C初学者指南第一步—7.控制流(基础) 文章目录 C初学者指南第一步---7.控制流(基础)1.术语:表达式/语句Expressions表达式Statements语句 2.条件分支3.Switching(切换):基于值的分支4.三元条件运算符5.循环迭代基于范围的循环   C…

STM32人工智能检测-筛选机器人

前言 本文描述了一种使用STM32进行机器人筛选的办法。筛选对象是我的粉s,删选办法是瞪眼法。 问题现象 每次当我的STM32 向外界发出一篇新的的报文,总能在1H之内得到focus,格式如下 [title][body][tail]于是我对各个focus 我报文的对象进…

Midjourney和Stable Diffusion哪个更适合商业应用?

midjourney的绘画,在撰写有效的prompt需要精确地定义你想要展现的画面,详细描述越准确,生成出的图片结果也会越吻合你的预期。为了提升你midjourney的写作prompt的技巧,可以通过模仿他人的成功案例,亲自尝试编写&#…

UWA发布 | Unity手游性能年度蓝皮书

UWA本次发布的《2023-2024年度Unity手游性能蓝皮书》将汇总游戏行业使用Unity引擎进行手游开发过程中及游戏上线后的性能表现,从测试机型分布、引擎各模块开销、内存占用等方面剖析定位Unity手游性能瓶颈和趋势,反映了Unity手游行业的现状,帮…