网络中的TIME-WAIT和CLOSE-WAIT

TCP网络编程:CLOSE_WAIT和TIME_WAIT导致端口耗尽的问题与解决方案 - CLOSE_WAIT问题的根源是代码逻辑错误,修复代码即可解决。 - TIME_WAIT积压的本质是TCP的安全机制,需根据场景选择解决方法: - 强制关闭:使用`SO_LINGER`。 - 快速重用:使用`SO_REUSEADDR`。 - 理解TCP状态和内核行为,才能在解决问题时更有针对性。 阅读详情


在这里插入图片描述

1、主动关闭方发送FIN包,进入FIN-WAIT1状态

2.1、被动关闭方收到FIN包后,回复ACK包,进入CLOSE_WAIT状态

2.2、主动关闭方收到ACK包后,等待对方关闭,进入FIN_WAIT2状态

3、被动关闭方在完成所有数据发送后,调用close()操作;此时,协议层发送FIN包给主动关闭方,等待对方的ACK,被动关闭的一方进入LAST_ACK状态;

4、主动关闭方收到FIN包,协议层回复ACK;此时,主动关闭方,进入TIME_WAIT状态;而被动关闭方收到ACK后,进入CLOSED状态 ;

5、主动关闭方等待2MSL(max segment lifetime)时间后,结束TIME_WAIT,进入CLOSED状态 ;

这里有个问题,就是主动关闭方发送最后一个ACK包后,为什么要进入TIME-WAIT等待2MSL而不是进入CLOSED状态,2MSL是一个发送加一个回复的最大时间,如果直到2MSL后主动关闭方没有再次收到FIN,那么可以推断出ACK已被成功接收,结束TCP连接。

而主动关闭方为什么会在发出ACK后又收到FIN包,这是因为被动关闭方在发出最后一个ACK包后也会等待2MSL的时间,如果在这个时间内没有收到主动关闭方回复的ACK后,可能是由于被动关闭方发送的FIN包没有被收到,也可能是主动关闭方回复的ACK包由于网络等原因没有发送成功,此时被动关闭方会再次发送一个FIN包给主动关闭方。

TIME_WAIT有什么用?

TIME_WAIT的出现,是为了解决网络的丢包和网络不稳定所带来的其他问题

1)**防止前一个连接上延迟的数据包或者丢失重传的数据包,被后面复用的连接错误地接收。**如果没有TIME_WAIT,或者TIME_WAIT时间非常端,那么连接关闭后源端口可能马上被服用,此时,前面一个连接上的数据被后面的一个连接错误的接收。

2)确保连接方能在时间范围内,关闭自己的连接。 如果主动关闭的一方回复的最后一个ACK丢失,而被动关闭的一方还继续停留在LAST_ACK状态,如果没有TIME_WAIT的存在,或者说,停留在TIME_WAIT上的时间很短,则主动关闭的一方很快就进入了CLOSED状态,也即是说,如果此时新建一个连接,源随机端口如果被复用,在新连接上发送SYN包后,由于被动方仍认为这条原先的连接还在等待ACK,但是却收到了SYN,则被动方会回复RST,造成新建立的连接无法成功。

服务器异常解决方案

如果服务器出了异常,百分之八九十都是下面两种情况:

1.服务器保持了大量TIME_WAIT状态

基于TCP的HTTP协议,关闭连接的不是客户端,而是服务器,所以web服务器也是会出现大量的TIME_WAIT的情况的。解决思路就是让服务器能够快速回收和重用那些TIME_WAIT的资源,可以修改对应的配置文件。

/etc/sysctl.conf

  1. #对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间
  2. net.ipv4.tcp_syn_retries=2
  3. #net.ipv4.tcp_synack_retries=2
  4. #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒
  5. net.ipv4.tcp_keepalive_time=1200
  6. net.ipv4.tcp_orphan_retries=3
  7. #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
  8. net.ipv4.tcp_fin_timeout=30
  9. #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  10. net.ipv4.tcp_max_syn_backlog = 4096
  11. #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
  12. net.ipv4.tcp_syncookies = 1
  13. #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
  14. net.ipv4.tcp_tw_reuse = 1
  15. #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
  16. net.ipv4.tcp_tw_recycle = 1
  17. ##减少超时前的探测次数
  18. net.ipv4.tcp_keepalive_probes=5
  19. ##优化网络设备接收队列
  20. net.core.netdev_max_backlog=3000
2.服务器保持了大量CLOSE_WAIT状态

TIME_WAIT状态可以通过优化服务器参数得到解决,因为发生TIME_WAIT的情况是服务器自己可控的,要么就是对方连接的异常,要么就是自己没有迅速回收资源,总之不是由于自己程序错误导致的。

但 是CLOSE_WAIT就不一样了,如果一直保持在CLOSE_WAIT状态,那么只有一种情况,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直被程序占着。所以解决方法只能是检查代码。

别再傻傻分不清!Synopsys DC综合中link/target/symbol/synthetic四大库的保姆级配置指南 本文详细解析了Synopsys DC综合中link_library、target_library、symbol_library和synthetic_library四大库的配置方法,帮助工程师避免常见错误。通过实战示例和调试技巧,指导如何正确设置工艺库与IP库,提升数字芯片设计效率。 阅读详情

相关推荐

WinForm布局

登录模板页面UILoginForm

m0_71541781的博客 470

服务器出现大量TIME_WAIT状态怎么解决

1. TIME_WAIT产生的原因 1.1 四次挥手 假设主动关闭连接的一方为A,被动关闭连接的一方为B A调用close();协议层发送FIN包 B收到FIN包后,回复ACK,进入CLOSE_WAIT状态,A等待对方关闭,进入FIN_WAIT_2状态,此时,A会等待B的应用程序调用close操作 B在完成所有数据发送后,调用close()操作;此时,协议层会发送FIN包给A,然后等待对方的ACK,进入LAST_ACK状态; A收到FIN包,回复ACK,进入TIME_WAIT状态;B收到ACK后,进入

不才的专栏 5419

GitHub工业级开源利器:StreamPipes如何简化工业物联网数据分析

Apache StreamPipes是一款GitHub上的工业级开源利器,旨在简化工业物联网数据分析。它通过图形化界面连接各类工业协议数据源,以拖拽方式构建流处理管道,并实现实时可视化,有效降低了数据分析的技术门槛,让业务人员也能自助完成从数据接入到洞察的全流程。

weixin_29279153的博客 181

TCP连接状态CLOSE_WAIT和TIME_WAIT详细分析

TCP协议规定,对于已经建立的连接,网络双方要进行四次挥手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。CLOSE_WAIT和TIME_WAIT。服务器保持了大量TIME_WAIT状态;服务器保持了大量CLOSE_WAIT状态;

bjmsb79的博客 5820

vrep和matlab,使用Matlab与V-REP联合仿真 - Play V-REP with Matlab

OS: Win10 x64Matlab: R2016bV-REP: V-REP PRO EDU v3.5.0 下载、安装与支持V-REP操作基础V-REP仿真基础Matlab环境准备一个简单的例子对V-REP有一定了解的读者可以直接跳到第三节Matlab环境准备。下载、安装与支持V-REP提供Windows、Linux和MacOS三个平台的应用程序支持,任意平台都提供教育版和专业版两个版本。教育版...

weixin_42660494的博客 3211

缠中说禅交易指南

战胜市场,其实就是战胜自己的贪婪、恐惧、愚蠢,缠中说禅技术分析理论只是把市场拔光给各位看,而拔光一个人并不意味着就等于征服一个人,对于市场,其道理是一样的。不干,不可能征服市场。对于市场来说,干就是一切。技术分析的最终意义不是去预测市场要干什么,而是分析市场正在干什么,是一种当下的直观。在市场上所有的错误都是离开了这当下的直观,用想象、用情绪来代替。 市场是有规律的,但市场的规律并不是显而易见的,是需要严格的分析才能得到。更重要的是,市场的规律是一种动态的,在不同级别合力作用下显示出来的规律,企图用些单纯的

baidu_25764509的博客 2万+

TIME_WAIT和CLOSE_WAIT的区别

系统上线之后,通过如下语句查看服务器时,发现有不少TIME_WAIT和CLOSE_WAIT。 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 297 ESTABLISHED 53 CLOSE_WAIT 5 解释 TIME_WAIT:表示主动关闭,通过优化系统内核参数可容易解决。 CLO...

mingwulipo的博客 7127

Unity Addressable资源缓存路径自定义指南:告别C盘爆满烦恼

本文详细介绍了如何自定义Unity Addressable系统的资源缓存路径,解决其默认存储在C盘导致的磁盘空间不足问题。通过配置CacheInitializationSettings并编写编辑器脚本,开发者可以将缓存迁移至项目目录,实现资源的集中管理,提升团队协作效率与开发环境一致性。

pytorch8learner的博客 475

服务器TIME_WAIT和CLOSE_WAIT分析和解决办法

查看TIME_WAIT和CLOSE_WAIT数的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 它会显示例如下面的信息:TIME_WAIT 、CLOSE_WAIT 、FIN_WAIT1 、ESTABLISHED 、SYN_RECV 、L...

weixin_33937913的博客 515

从符号到基元:Token的技术演化史与“词元”汉化的术语学

中文摘要:Token概念演化与"词元"译名的确立 本文系统梳理了"Token"概念从信息论符号到AI基元的完整演化史,揭示了"词元"这一中文译名确立的必然性。概念发展经历了三个阶段:早期作为编译原理中的词法单元(1960s),统计NLP时期作为概率空间的原子(1990s-2000s),以及神经时代成为动态语义载体(2010s后)。随着Transformer架构兴起,Token从静态符号转变为上下文相关的语义基元,其定义彻底突破"词&quo

AllenLV的博客 1222

SAP MM委外加工保姆级教程:从BOM配置到MIGO发货的完整避坑指南

本文提供SAP MM模块中委外加工的完整操作指南,涵盖从BOM配置到MIGO发货的全流程。详细解析委外采购和工序委外两种模式,包括主数据配置、采购订单创建及物料移动等关键步骤,帮助用户规避常见错误,提升供应链管理效率。特别适合制造业企业实施SAP外包业务参考。

weixin_26905487的博客 527

【计算机网络】通信中Time_wait和Close_wait

1.Socket的关闭的过程(四次挥手) 主动关闭连接的一方,调用close();协议层发送FIN包 被动关闭的一方收到FIN包后,协议层回复ACK;然后被动关闭的一方,进入CLOSE_WAIT状态,主动关闭的一方等待对方关闭,则进入FIN_WAIT_2状态;此时,主动关闭的一方 等待 被动关闭一方的应用程序,调用close操作。 被动关闭的一方在完成所有数据发送后,调用close()操作;此时,协议层发送FIN包给主动关闭的一方,等待对方的ACK,被动关闭的一方进入LAST_ACK状态; 主动关闭

lixiaohulife的博客 3294

【人工智能】架构演进:基于本体论与 LLM Agent 的供应链备件决策闭环实践

本文探讨了如何将本体论(Ontology)与大语言模型(LLM)Agent结合,构建供应链备件管理的智能决策系统。针对LLM在垂直领域存在的幻觉和逻辑缺陷问题,提出通过本体论建立结构化知识框架,形成四层架构:知识建模、动态感知、深度分析和决策闭环。系统利用图数据库实例化领域本体,融合多源数据实现实时感知,结合图谱推理和时序预测进行确定性分析,最终通过工具调用完成决策执行。技术选型推荐Gemini 1.5 Pro、Neo4j和LangChain等工具,实现从自动化到智能化的升级。该架构为工业领域提供了可解释、

奶爸的编程之路,也就一周冷个三天 170

C++网络编程之十四TIME_WAIT和CLOSE_WAIT

通过分析TIME_WAIT和CLOSE_WAIT的机制和产生的相关原因,就已经明白了二者的真正的意图和各种情况下的处理应对方式。这恰恰说明了,要想从根本上解决问题,一定要掌握问题的本质,并结合实际的应用场景有针对性的进行处理(调优)。凡事有好的一面,就会有不好的一面,这是基础的哲学问题。做为开发者要做的,就是尽量在开发的实际环境中扬长避短,解决实际问题而不是引入新的问题。一定不能学会只转移问题而不解决问题的风格!

fpcc的专栏 793

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

网络-TIME_WAIT和CLOSE_WAIT

TIME_WAIT和CLOSE_WAIT 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: 再谈应用环境下的TIME_WAIT和CLOSE_WAIT 作者:谐音太郎 服务器开发之大量time_wait 和 close_wait现象 作者:codergeek 转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,如果带来不便请联系我删除。 1...

迷路剑客个人博客 925

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

高性能网络 | 你所不知道的TIME_WAIT和CLOSE_WAIT

本文是我将最近两篇文章,重新整理成一篇,方便收藏。如果你已经阅读过前两篇,并且已经做了收藏,可以重新收藏本文即可。 你有收藏和整理文章的习惯吗?好好利用Evernote或者印象笔记,不要吝啬那点年费,你值得购买,并养成收藏和整理的习惯! 本文源于大家在公众号里面的留言,既然很多人都搞不清楚TIME_WAIT和CLOSE_WAIT,那么小胖哥今天还是抽个时间,统一帮大家理理...

p656456564545的专栏 388

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

网络连接存在大量time_wait和close_wait的原因以及解决方法

如果对tcp中的握手挥手不了解的同学,请先看这篇博客:《关于三次握手与四次挥手你要知道这些》。四次挥手过程:第一次挥手:主机A(可以是客户端,也可以是服务器端),设置Sequence Nu...

全菜工程师小辉的博客 1344

java socket close wait_不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT...

原标题:不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT1、前言最近一段时间一直在学习阅读mina和nio的源码,也发现了一些问题无法解决,然后重读了一下tcp协议,收获颇多。(这就是带着问题去读书的好处)这次就和大家分享一下我们的netframework服务总会抛出一个“connet reset by peer”的原因吧。通过抓包工具分析,主动关闭方直接...

weixin_39606019的博客 504

TCP连接关闭的艺术:从CLOSE_WAIT与TIME_WAIT的根源到高性能网络服务的优化实践

本文深入解析TCP连接关闭中CLOSE_WAIT与TIME_WAIT状态的根源,并探讨高性能网络服务的优化实践。CLOSE_WAIT通常源于应用程序未及时关闭套接字,是必须解决的资源泄漏问题;而TIME_WAIT是TCP协议为保证可靠性的重要机制,但在高并发短连接场景下可能导致端口耗尽。文章提供了从代码规范、内核参数调优到架构设计的系统性解决方案。

assembly8low的博客 739

Windows中CLOSE_WAIT、TIME_WAIT网络连接

Windows下写网络程序时遇到很多TIME_WAIT、CLOSE_WAIT的网络连接,可以通过调整 注册表中的TCP参数来处理: C:\Users\user1>netstat -ano | findstr 110:80 TCP 192.168.1.110:80 192.168.1.7:33083 TIME_WAIT 0 TCP 1

sunrising_hill的专栏 4735

网络优化之TIME_WAIT和CLOSE_WAIT

来源微信订阅号:大房说 你遇到过TIME_WAIT的问题吗? 我相信很多都遇到过这个问题。一旦有用户在喊:网络变慢了。第一件事情就是,netstat -a | grep TIME_WAIT | wc -l 一下,哎呀妈呀,几千个TIME_WAIT。 然后,做的第一件事情就是:打开Google或者Bing,输入关键词:too many time wait。一定能找到解决

cgm88s的专栏 776

Linux网络tcp连接大量CLOSE_WAIT和TIME_WAIT状态的出现和解决方法

关于CLOSE_WAIT和TIME_WAIT状态,服务器端都有可能出现,TIME_WAIT出现应该是短连接较多,需要通过修改内核参数解决,CLOSE_WAIT状态则是服务器程序可能有问题,服务器需要主动close,以及epoll多路复用模型中使用linger调整关闭等待时间 分析解决这类问题,关键在于对照tcp3次握手4次挥手过程来查找,对着图看和想最易理解了 http://blog.youkuaiyun.com/shootyou/article/details/6622226/ 昨天解决了一个HttpCl.

花飘万家雪 3184

[网络协议] Tcp协议中的临界状态半打开、半关闭、TIME_WAIT、CLOSE_WAIT

前言: tcp协议栈是个面向连接的协议栈,其面向连接不是说真的有一个什么连接在,而是收发双方在协议栈层面各自会维持一个数据结构,这个数据结构保存了当前通讯的状态、数据和其他重要信息。可以理解为tcp的状态机诠释了什么是 “有链接”。 状态机: 半打开: 半打开状态出现在 三次握手阶段,主动建立链接方 和 被动建立链接方都会进入这个状态。 三次握手由 2个 SYN 和 2个 ACK组成,发送出SYN 还没 收到对端的 ACK的状态就是半打开状态,所以主动/被动都可能进入半打开状态。...

ykun089的博客 1396

服务器大量TIME_WAIT和CLOSE_WAIT的原因及解决办法

原文:https://www.cnblogs.com/whx7762/p/9413787.html 今天登陆服务器想查看一个端口的占用情况,发现好多TIME_WAIT的情况,吓我一跳。 如下是TCP 建立连接的示意图 缘由 time_wait的作用 1 2 3 4 5 6 7 8 9 10 TIME_WAIT状态存在的理由: 1)可靠地实现TCP全双工连接的终止 ...

hyl999的专栏 7498
上一篇: 计算机网络基础知识点
下一篇: HTTP keep-alive和TCP keepalive
jf-lin
博客等级 码龄7年 37粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值