也说说TIME_WAIT状态
也说说TIME_WAIT状态
一个朋友问到,自己用go写了一个简单的HTTP服务端程序,为什么压测的时候服务端会出现一段时间的TIME_WAIT超高的情况,导致压测的效果不好呢?
记得老王有两篇文章专门说这个,当时粗粗看了一遍,正好碰上这个问题,又翻出来细细搂了。
第一个要弄懂的,是TIME_WAIT是怎么产生的。
TIME_WAIT状态是怎么产生的
要弄懂TIME_WAIT要从TCP的四次握手的分手协议说起。
上面这个图片展示了TCP从连接建立到连接释放的过程中,客户端和服务端的状态变化图。如果只看连接释放阶段,四次握手
客户端先发送FIN,进入FIN_WAIT1状态
服务端收到FIN,发送ACK,进入CLOSE_WAIT状态,客户端收到这个ACK,进入FIN_WAIT2状态
服务端发送FIN,进入LAST_ACK状态
客户端收到FIN,发送ACK,进入TIME_WAIT状态,服务端收到ACK,进入CLOSE状态
客户端TIME_WAIT持续2倍MSL时长,在linux体系中大概是60s,转换成CLOSE状态
当然在这个例子和上面的图片中,使用客户端和服务端来描述是不准确的,TCP主动断开连接的一方可能是客户端,也可能是服务端。所以使用主动断开的一方,和被动断开的一方替换上面的图可能更为贴切。
不管怎么说,TIME_WAIT的状态就是主动断开的一方,发送完最后一次ACK之后进入的状态。并且持续时间还挺长的。
能不能发送完ACK之后不进入TIME_WAIT就直接进入CLOSE状态呢?不行的,这个是为了TCP协议的可靠性,由于网络原因,ACK可能会发送失败,那么这个时候,被动一方会主动重新发送一次FIN,这个时候如果主动方在TIME_WAIT状态,则还会再发送一次ACK,从而保证可靠性。那么从这个解释来说,2MSL的时长设定是可以理解的,MSL是报文最大生存时间,如果重新发送,一个FIN+一个ACK,再加上不定期的延迟时间,大致是在2MSL的范围。
所以从理论上说,网上调试参数降低TIME_WAIT的持续时间的方法是一种以可靠性换取性能的一种方式。嗯,质量守恒定理还是铁律。
服务端TIME_WAIT过多
回到上面的问题,go写了一个HTTP服务,压测发现TIME_WAIT过多。
首先判断是不是压测程序放在服务的同一台机器...当然不会犯这么低级的错误...
那么这个感觉就有点奇怪了,HTTP服务并没有依赖外部mysql或者redis等服务,就是一个简单的Hello world,而TIME_WAIT的是主动断开方才会出现的,所以主动断开方是服务端?
答案是是的。在HTTP1.1协议中,有个 Connection 头,Connection有两个值,close和keep-alive,这个头就相当于客户端告诉服务端,服务端你执行完成请求之后,是关闭连接还是保持连接,保持连接就意味着在保持连接期间,只能由客户端主动断开连接。还有一个keep-alive的头,设置的值就代表了服务端保持连接保持多久。
HTTP默认的Connection值为close,那么就意味着关闭请求的一方几乎都会是由服务端这边发起的。那么这个服务端产生TIME_WAIT过多的情况就很正常了。
虽然HTTP默认Connection值为close,但是现在的浏览器发送请求的时候一般都会设置Connection为keep-alive了。所以,也有人说,现在没有必要通过调整参数来使TIME_WAIT降低了。
解决方法
按照HTTP协议的头,我们在压测程序发出的HTTP协议头里面加上connection:keep-alive当然能解决这个问题。
还有的方法就是系统参数调优:
sysctl net.ipv4.tcp_tw_reuse=1sysctl net.ipv4.tcp_tw_recycle=1sysctl net.ipv4.tcp_timestamps=1
tcp_tw_reuse
这个参数作用是当新的连接进来的时候,可以复用处于TIME_WAIT的socket。默认值是0。
tcp_tw_recycle和tcp_timestamps
默认TIME_WAIT的超时时间是2倍的MSL,但是MSL一般会设置的非常长。如果tcp_timestamps是关闭的,开启tcp_tw_recycle是没用的。但是一般情况下tcp_timestamps是默认开启的,所以直接开启就有用了。
参考文章
记一次TIME_WAIT网络故障
再叙TIME_WAIT
Time-wait状态(2MSL)一些理解
tcp_tw_recycle和tcp_timestamps导致connect失败问题
https://blog.csdn.net/tmq1225/article/details/52183216
原文参考:https://www.cnblogs.com/yjf512/p/5327886.html
转载于:https://blog.51cto.com/tenderrain/2116058
也说说TIME_WAIT状态相关推荐
- 为什么TCP的TIME_WAIT状态要保持2MSL?
TIMEWAIT状态也称为 2MSL等待状态. 每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime). 它是任何报文段被丢弃前在网络内的最长时间. ...
- Linux-TCP/IP TIME_WAIT状态原理
TIME_WAIT状态原理 ---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动关闭连接时,会发送最后一个 ...
- 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 几个方面: 问题描述:什么现象?什么影响? 问题分析 解决 ...
- TIME_WAIT状态及存在原因
1. 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态为TIME_WAIT: 2. 主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度, ...
- 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | ningg.top/computer-basi ...
- time_wait状态产生的原因,危害,如何避免
1.先来了解TCP四次挥手的过程: ①第一次:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段:此 ...
- 网络:为什么会出现大量的time_wait状态
TIME_WAIT状态是什么? TIME_WAIT状态是主动关闭TCP连接的一方(即先发起FIN包的一方),在发送完最后一个ACK包后进入的状态.系统需要在TIME_WAIT状态下等待2MSL(max ...
- TCP/IP / TIME_WAIT 状态的作用 / MSL、TTL、RTT
目录 作用 解释 拓展 作用 可靠地实现TCPIP全双工的终止,即:允许老的重复的TCP数据包在网络中终止,保证老的数据包不会干扰到新的连接. 解释 针对"可靠的实现TCPIP全双工的终止& ...
- TIME_WAIT状态的一些总结
前言: TCP断开连接的四次握手中, 主动关闭连接的一方的TIME_WAIT状态尤为重要. 1:TCP连接的三次握手和断开的四次挥手 2:由上图可知 在主动关闭的一方, 会经历TIME_WAIT状态, ...
最新文章
- 磁盘文件整理工具,让你的电脑清清爽爽的!
- 关于python中程序流程结构-Python程序结构
- edHat linux光盘引导,Red Hat Linux 9光盘启动安装过程
- 【数据结构与算法】之深入解析“预测赢家”的求解思路与算法示例
- 学习MFC首先要知道的--程序执行顺序
- dp递推 hdu1978
- idea创建springmvc项目
- c++opencv显示中文_OpenCV如何入门秘籍
- qtableview点击行将整行数据传过去_掌握这15个可视化图表,小白也能轻松玩转数据分析...
- ajaxFileUpload+struts2多文件上传(动态添加文件上传框)
- Google官方 详解 Android 性能优化【史诗巨著之内存篇】
- Mac 系统 go-kit安装
- 文件系统 - 文件类型 - 二进制/文本类型
- 计算机未检测到任何网络硬件,win10系统连不上网提示“检测不到任何网络硬件”怎么办...
- 基于字的二元模型拼音输入
- 社会责任·价值共创,中关村网络安全与信息化产业联盟对话网信企业家海泰方圆董事长姜海舟
- iPhone出现绿屏问题怎么修复?可以尝试这些解决方案
- 收集整理威尔逊定理的证明
- EC-PCA: 利润中心会计配置
- 图灵的停机问题背后令人着迷的数学(哲学)原理
热门文章
- 让win7提速几倍的10个方法
- GraphPad Prism 9.0.2 for MacOS 2021最新完美版科研绘图统计软件 附安装使用教程
- scanf_s 发送访问冲突_程序员如何解决并发冲突的难题?
- WCHAR,CHAR,TCHAR的区别
- SQLite学习手册(临时文件)
- 电子工程可以报考二建_毕业证上财务管理专业,可以报考二建吗?
- 机器学习实践:onnx模型转为Tensorflow2的pb模型2020
- c++17(20)-双向循环链表(不依赖具体数据)
- cuda-gpu计算随笔(1)
- 牛客多校三 B Black and white