面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
几个方面:
-
问题描述:什么现象?什么影响?
-
问题分析
-
解决方案
-
底层原理
1.问题描述
模拟高并发的场景,会出现批量的 TIME_WAIT 的 TCP 连接:

短时间后,所有的 TIME_WAIT 全都消失,被回收,端口包括服务,均正常。
即,在高并发的场景下,TIME_WAIT 连接存在,属于正常现象。
线上场景中,持续的高并发场景
-
一部分 TIME_WAIT 连接被回收,但新的 TIME_WAIT 连接产生;
-
一些极端情况下,会出现大量的 TIME_WAIT 连接。
Think:
上述大量的 TIME_WAIT 状态 TCP 连接,有什么业务上的影响吗?
Nginx 作为反向代理时,大量的短链接,可能导致 Nginx 上的 TCP 连接处于 time_wait 状态:
-
每一个 time_wait 状态,都会占用一个「本地端口」,上限为 65535(16 bit,2 Byte);
-
当大量的连接处于 time_wait 时,新建立 TCP 连接会出错,address already in use : connect 异常
统计 TCP 连接的状态:
1. `// 统计:各种连接的数量`
2. `$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'`
3. `ESTABLISHED 1154`
4. `TIME_WAIT 1645`
Tips:
TCP 本地端口数量,上限为 65535(6.5w),这是因为 TCP 头部使用 16 bit,存储「端口号」,因此约束上限为 65535。
2.问题分析
大量的 TIME_WAIT 状态 TCP 连接存在,其本质原因是什么?
-
大量的短连接存在
-
特别是 HTTP 请求中,如果 connection 头部取值被设置为 close 时,基本都由「服务端」发起主动关闭连接
-
而,TCP 四次挥手关闭连接机制中,为了保证 ACK 重发和丢弃延迟数据,设置 time_wait 为 2 倍的 MSL(报文最大存活时间)
TIME_WAIT 状态:
-
TCP 连接中,主动关闭连接的一方出现的状态;(收到 FIN 命令,进入 TIME_WAIT 状态,并返回 ACK 命令)
-
保持 2 个 MSL 时间,即,4 分钟;(MSL 为 2 分钟)
3.解决办法
解决上述 time_wait 状态大量存在,导致新连接创建失败的问题,一般解决办法:
1、客户端,HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间:现在的浏览器,一般都这么进行了 2、服务器端,
-
允许 time_wait 状态的 socket 被重用
-
缩减 time_wait 时间,设置为 1 MSL(即,2 mins)
结论:几个核心要点
1、 time_wait 状态的影响:
-
TCP 连接中,「主动发起关闭连接」的一端,会进入 time_wait 状态
-
time_wait 状态,默认会持续 2 MSL(报文的最大生存时间),一般是 2x2 mins
-
time_wait 状态下,TCP 连接占用的端口,无法被再次使用
-
TCP 端口数量,上限是 6.5w(65535,16 bit)
-
大量 time_wait 状态存在,会导致新建 TCP 连接会出错,address already in use : connect 异常
2、 现实场景:
-
服务器端,一般设置:不允许「主动关闭连接」
-
但 HTTP 请求中,http 头部 connection 参数,可能设置为 close,则,服务端处理完请求会主动关闭 TCP 连接
-
现在浏览器中, HTTP 请求 connection 参数,一般都设置为 keep-alive
-
Nginx 反向代理场景中,可能出现大量短链接,服务器端,可能存在
3、 解决办法:服务器端,
-
允许 time_wait 状态的 socket 被重用
-
缩减 time_wait 时间,设置为 1 MSL(即,2 mins)
相关视频推荐
10道tcp/ip的问题,让你对网络不再发怵
100行代码实现一个用户态协议栈
手写一个epoll组件,实现tcp的并发
免费学习地址:c/c++ linux服务器开发/后台架构师
需要C/C++ Linux服务器架构师学习资料加qun579733396获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

4.附录
几个方面:
-
TCP 连接状态的查询
-
MSL 时间
-
TCP 三次握手和四次握手
附录 A:查询 TCP 连接状态
Mac 下,查询 TCP 连接状态的具体命令:
1. `// Mac 下,查询 TCP 连接状态`
2. `$ netstat -nat |grep TIME_WAIT`
3. ``
4. `// Mac 下,查询 TCP 连接状态,其中 -E 表示 grep 或的匹配逻辑`
5. `$ netstat -nat | grep -E "TIME_WAIT|Local Address"`
6. `Proto Recv-Q Send-Q Local Address Foreign Address (state)`
7. `tcp4 0 0 127.0.0.1.1080 127.0.0.1.59061 TIME_WAIT`
8. ``
9. `// 统计:各种连接的数量`
10. `$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'`
11. `ESTABLISHED 1154`
12. `TIME_WAIT 1645`
附录 B:MSL 时间
MSL,Maximum Segment Lifetime,“报文最大生存时间”,
-
任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。(IP 报文)
-
TCP报文 (segment)是ip数据报(datagram)的数据部分。
Tips:
RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
2MSL,TCP 的 TIME_WAIT 状态,也称为2MSL等待状态:
-
当TCP的一端发起主动关闭(收到 FIN 请求),在发出最后一个ACK 响应后,即第3次握 手完成后,发送了第四次握手的ACK包后,就进入了TIME_WAIT状态。
-
必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后,可以再发一个ACK应答包。
-
在 TIME_WAIT 状态时,两端的端口不能使用,要等到2MSL时间结束,才可继续使用。(IP 层)
-
当连接处于2MSL等待阶段时,任何迟到的报文段都将被丢弃。
不过在实际应用中,可以通过设置 「SO_REUSEADDR选项」,达到不必等待2MSL时间结束,即可使用被占用的端口。
附录 C:TCP 三次握手和四次握手
详细细节,参考:
-
TCP的三次握手与四次挥手(详解+动图)
具体示意图:
-
三次握手,建立连接过程
-
四次挥手,释放连接过程

几个核心疑问:
1、 time_wait 是「服务器端」的状态?or 「客户端」的状态?
-
RE:time_wait 是「主动关闭 TCP 连接」一方的状态,可能是「客服端」的,也可能是「服务器端」的
-
一般情况下,都是「客户端」所处的状态;「服务器端」一般设置「不主动关闭连接」
2、 服务器在对外服务时,是「客户端」发起的断开连接?还是「服务器」发起的断开连接?
-
正常情况下,都是「客户端」发起的断开连接
-
「服务器」一般设置为「不主动关闭连接」,服务器通常执行「被动关闭」
-
但 HTTP 请求中,http 头部 connection 参数,可能设置为 close,则,服务端处理完请求会主动关闭 TCP 连接
关于 Apache httpd 服务器的关联配置,参考:https://elf8848.iteye.com/blog/1739571
关于 HTTP 请求中,设置的主动关闭 TCP 连接的机制:TIME_WAIT的是主动断开方才会出现的,所以主动断开方是服务端?
-
答案是是的。在HTTP1.1协议中,有个 Connection 头,Connection有两个值,close和keep-alive,这个头就相当于客户端告诉服务端,服务端你执行完成请求之后,是关闭连接还是保持连接,保持连接就意味着在保持连接期间,只能由客户端主动断开连接。还有一个keep-alive的头,设置的值就代表了服务端保持连接保持多久。
-
HTTP默认的Connection值为close,那么就意味着关闭请求的一方几乎都会是由服务端这边发起的。那么这个服务端产生TIME_WAIT过多的情况就很正常了。
-
虽然HTTP默认Connection值为close,但是,现在的浏览器发送请求的时候一般都会设置Connection为keep-alive了。所以,也有人说,现在没有必要通过调整参数来使TIME_WAIT降低了。
关于 time_wait:
1、TCP 连接建立后,「主动关闭连接」的一端,收到对方的 FIN 请求后,发送 ACK 响应,会处于 time_wait 状态;
2、 time_wait 状态,存在的必要性:
-
可靠的实现 TCP 全双工连接的终止:四次挥手关闭 TCP 连接过程中,最后的 ACK 是由「主动关闭连接」的一端发出的,如果这个 ACK 丢失,则,对方会重发 FIN 请求,因此,在「主动关闭连接」的一段,需要维护一个 time_wait 状态,处理对方重发的 FIN 请求;
-
处理延迟到达的报文:由于路由器可能抖动,TCP 报文会延迟到达,为了避免「延迟到达的 TCP 报文」被误认为是「新 TCP 连接」的数据,则,需要在允许新创建 TCP 连接之前,保持一个不可用的状态,等待所有延迟报文的消失,一般设置为 2 倍的 MSL(报文的最大生存时间),解决「延迟达到的 TCP 报文」问题;
相关文章:
面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
几个方面: 问题描述:什么现象?什么影响? 问题分析 解决方案 底层原理 1.问题描述 模拟高并发的场景,会出现批量的 TIME_WAIT 的 TCP 连接: 短时间后,所有的 TIME_WAIT 全都消失࿰…...
前端就业宝典---目录
工作时候扭螺丝,面试时候造火箭,现状就是如此。不管是背八股文,还是掌握了知识的精华,对答如流才是硬道理。本专栏就是要集具前端精华,规范、算法、架构、封装、原理等一并汇集,让前端的小伙伴有个思路。 大剑师的微信 gis-dajianshi, 欢迎一起交流,并非常期望您能够提…...
Uniboot 系列光纤跳线简介
飞速(FS)Uniboot 系列光纤跳线产品质量可靠,性能优良,可满足数据中心的各种需求。其中,包括LC、CS™、MDC 和 SN 在内的不同类型的连接器能够满足不同应用的特定需求。下面将进一步介绍飞速(FS)…...
【面试题】Promise只会概念远远不够,还需这17道题目巩固!
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 在学习Promise相关题目之前,我们先做一些知识的回顾:JavaScript 是一门单…...
互联网医院牌照|互联网医院牌照审批流程和材料
随着科技的不断进步和社会的发展,互联网医院已经成为了当前的热点。而互联网医院的准入门槛自然也就越来越高。如果您计划成立一个互联网医院,您需要了解申请互联网医院牌照所需要注意的方面以及申请的流程。 一、资质申请前的准备 1、立项阶段准备 在立…...
第五章:C语言的数组
文章目录 1、数组的理解2、各类数组的定义3、变长数组4、字符数组 1、数组的理解 一维数组:比如定义一个int a[3];,那么可以将其看成两部分,a【3】为①,int为②。意思就是有一个数组名字为a,里面包含3个(池࿰…...
Spring面试题3:说一说MVC框架的底层实现
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MVC框架的底层实现 MVC(Model-View-Controller)是一种软件设计模式,常被用于构建用户界面和应用程序的架构。MVC框架的底层实现可以分为…...
云原生周刊:K8s 的 13 个最佳开源监控工具
开源项目推荐 Silver Surfer 该项目旨在检查 Kubernetes 对象的 API 版本兼容性,并为其提供迁移路径,以便为集群升级做好准备。 Actions Runner Controller Actions Runner Controller (ARC) 是一个 Kubernetes 操作器,可为 GitHub Actio…...
怎么克服一篇论文写作前的恐惧感?
作者 代陈锐 中国科学技术大学生命科学与医学部在读博士生,主要探究生理和病理过程中组蛋白翻译后修饰的调控机制。 1. 引言 在我们开始一篇文章的撰写时,往往不知如何下笔或是不停否认自己撰写的内容,最终的结果自然是撰写效率低而且陷入自我纠结。在这里我通过结合平时…...
Linux 安全 - Credentials
文章目录 一、简介1.1 Objects1.2 Object ownership1.3 The objective context1.4 Subjects1.5 The subjective context1.6 Actions1.7 Rules, access control lists and security calculations 二、Types of Credentials2.1 Traditional UNIX credentials2.2 Capabilities2.3 …...
网站服务器怎么部署
网站服务器怎么部署 1. 选择合适的服务器:根据网站的需求和流量,选择合适的服务器,包括硬件配置、操作系统和网络环境等。 2. 安装操作系统:根据服务器硬件配置选择合适的操作系统,并进行安装和配置,包括安…...
密码学【第一节:密码学概述】
前言 在区块链的整个体系中大量使用了密码学算法,比如用于 PoW 的哈希算法,用于完整性验证的 Merkle Tree,用于交易签名与验证的数字签名算法,用于隐私保护的零知识证明等等。 可以说密码学是保证区块链安全的基石,而区…...
Leetcode 95. 不同的二叉搜索树 II
文章目录 题目代码(9.21 首刷看解析) 题目 Leetcode 95. 不同的二叉搜索树 II 代码(9.21 首刷看解析) class Solution { public:vector<TreeNode*> generateTrees(int n) {return build(1,n);}vector<TreeNode*> bu…...
Nodejs+vue高校机房设备管理系统jt07u
开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 集成IDE对高校机房设备管理系统统进行开发,整合系统的各个模块。 拟开发的高校机房设备管理系统通过测试,确保在最大负载的情况下…...
Purple-Pi-OH OHOS SDK编译手册
一、源码获取 1.1 源码获取 链接:百度网盘 请输入提取码 提取码:1234 $ mkdir purple-pi #将下载的ido_purple_pi_oh_ohos3.2_sdk.tgz拷贝到purple-pi $ cd purple-pi $ md5sum ido_purple_pi_oh_ohos3.2_sdk.tgz e6ca2d96aa7c628992ae0bbf4d14c2ca …...
Java高级-stream流
stream流 1.介绍2.将List转成Set3.将List转成Map4.计算求和reduce5.查找最大值max和最小值min6.Match匹配7.过滤器 filter8.分页limit 跳过skip9.数据排序 sorted 1.介绍 stream流可以非常方便与精简的形式遍历集合,实现过滤、排序等功能 2.将List转成Set stream…...
Python环境搭建
Python|环境搭建&第一个py程序 文章目录 Python|环境搭建&第一个py程序运行环境搭建验证安装是否成功安装PyCharm第一个python程序避免每次打开都进入上次关闭的项目 运行环境搭建 官网:https://www.python.org/downloads/windows/ 注意:下载过…...
JOSEF约瑟 SSJ-41B SSJ-41A 静态时间继电器 延时范围0.02-9.99s
SSJ静态时间继电器 系列型号: SSJ-11A静态时间继电器;SSJ-12A静态时间继电器; SSJ-11B静态时间继电器;SSJ-21B静态时间继电器 SSJ-21A静态时间继电器;SSJ-22A静态时间继电器 SSJ-22B静态时间继电器SSJ-42B静态时间…...
文件MultipartFile上传同时,接收复杂参数
方案一MultipartFile和dto分开 PostMapping("/uploadData") public Result<Object> uploadData(RequestParam("file") MultipartFile file,RequestPart() DataDTO dataDTO) {// 处理文件上传逻辑,如保存文件到本地或云存储// 处理接收到…...
Nginx 获取当前机器IP- Protocol- Port
Full Example Configuration | NGINX Alphabetical index of variables $server_addr:当前nginx所部署的机器 $server_port:当前监听的port server {listen 12345 udp;return ‘$server_addr:$server_port; } 参数说明示例$remote_addr$remote_user$…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
