貌似 1.9.3 的客户端有 python2.7 的环境要求,于是弹出了警告,我们今天主要是了解 ssdb 状态,暂时不理会此警告
来源:http://ningg.top/computer-basic-theory-tcp-time-wait/
PS:此文需要一定的电脑基础知识的人员,没有基础的请关闭本页,避免不适。玩这个的前提是你的微信升级到了最新版。 相关工具下载: https://developer.android.com/studio/run/win-usb.html 或者:https://pan.lanzou.com/b135032/ 密码:150x 百度网盘链接:https://pan.baidu.com/s/1nuNm5fz 密码:ho3t 记得在你你手机的开发者选项里面打开USB调试。具体方法不累述,各个机型自行搜索。下面说一下,
如果您使用命令提示符执行命令查看网络连接情况,您会发现,PID为0的System Idle Process(系统空闲进程)将会出现很多网络端口占用情况。下面是一个示例: Proto Local Address Foreign Address State PID TCP 127.0.0.1:30606 127.0.0.1:3129 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3131 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3133 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3135 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3137 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3139 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3141 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3143 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3145 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3147 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3149 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3151 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3153 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3155 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3157 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3159 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3161 TIME_WAIT 0 TCP 127.0.0.1:30606 127.0.0.1:3165 TIME_WAIT 0 我们这里使用了“netstat -a -n -o”命令,参数-a用来显示所有的连接和监听端口,参数-o用来显示相应系统进程的PID,使用了参数-n以数字(IP)的方式显示地址和端口。 那么是不是说明计算机中了病毒了呢?其实并不是这样,这要从为什么系统空闲进程要占用端口说起了。 通过仔细观察,我们可以发现,命令结果列出的所有PID为0的通信的状态均为Time_Wait,而决不会是Established建立状态或者是Listening监听状态,这个就要涉及到一个TCP Socket的问题了,有兴趣深入研究的朋友们可以查阅一下更多的有关文章,因为概念性的东西太多了,因此我们在此仅进行一个简要的解释。 原因是这样的: 一、关于Time_Wait状态: TCP TIME-WAIT 延迟断开TCP 连接时,套接字对被置于一种称为TIME-WAIT 的状态。这样,新的连接不会使用相同的协议、源 IP 地址、目标 IP 地址、源端口和目标端口,直到经过足够长的时间后,确保任何可能被错误路由或延迟的段没有被异常传送。因此,Time_Wait不是多余的状态,而是为了保证通信的正确性、准确性而存在的。而且,这样的状态往往都交给系统空闲进程处理了,因为具体的应用程序已经完成了通信过程,发出了数据。因此,这里PID为0的通信均是已
他抓到一个抓包图,客户端和服务端四次挥手后,客户端在 17 秒内又复用了与上一次连接相同的端口,向服务端发起了 SYN 报文, 并成功建立了连接。
在构建基于 TCP 协议的 C/S 系统的时候,经常会因为一些简单的错误而导致严重的影响系统的可扩展性。 其中一些错误是因为对TIME_WAIT状态不理解导致的。 在本文中,我将会讲解为什么要存在TIME_WAIT 状态,它的存在所造成的一些问题以及如何解决这些问题。
写在开头,大概 4 年前,听到运维同学提到 TIME_WAIT 状态的 TCP 连接过多的问题,但是当时没有去细琢磨;最近又听人说起,是一个新手进行压测过程中,遇到的问题,因此,花点时间,细深究一下。
C:\Windows\System32>netstat -ano | find “8002” TCP 0.0.0.0:8002 0.0.0.0:0 LISTENING 2884 TCP [::]:8002 [::]:0 LISTENING 2884
相信很多运维工程师遇到过这样一个情形: 用户反馈网站访问巨慢, 网络延迟等问题, 然后就迫切地登录服务器,终端输入命令"netstat -anp | grep TIME_WAIT | wc -l " 查看一下, 接着发现有几百几千甚至几万个TIME_WAIT 连接数. 顿时慌了~
统计在一台前端机上高峰时间TCP连接的情况,统计命令: netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
Nginx 作为反向代理时,大量的短链接,可能导致 Nginx 上的 TCP 连接处于 time_wait 状态:
笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右。线上实际却存在TIME_WAIT超过100s的Socket。由于这牵涉到最近出现的一个复杂Bug的分析。所以,笔者就去Linux源码里面,一探究竟。
之所以起这样一个题目是因为很久以前我曾经写过一篇介绍TIME_WAIT的文章,不过当时基本属于浅尝辄止,并没深入说明问题的来龙去脉,碰巧这段时间反复被别人问到相关的问题,让我觉得有必要全面总结一下,以备不时之需。
然后打开Google,输入关键词:too many timewait。一定能找到解决方案,而排在最前面或者被很多人到处转载的解决方案一定是:
工作中无论是开发环境还是线上环境,我们都出现过大量的 timewait 状态的连接,例如下面这个例子
TIME-WAIT是服务器优化必然会谈到的一个话题,而我们常见的问题就是TIME-WAIT过多怎么处理?
很多面试中,特别是后端岗位,特别是和服务器相关岗位的面试中喜欢问这两个状态,首先回忆下这两个状态出现的时间,下面是三次握手和四次挥手的状态图
netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。 netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。
Linux下查看Nginx的并发连接数和连接状态 : 查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 或者: netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}' 返回结果一般如下: LAST_ACK 5 (正在等待处
为了摸底项目的性能,需要进行性能测试。经过一番调研之后,决定使用基于腾讯云TKE的分布式jmeter进行压测,好处是有jmeter-suite可用,搭建环境方便;容器化部署可以方便的增加pod来提升压力。
里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT的状态。
TIME_WAIT是主动关闭连接的一方保持的状态,对于爬虫服务器来说他本身就是“客户端”,在完成一个爬取任务之后,他就会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。为什么要这么做?明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定的,主要出于以下两个方面的考虑:
使用HttpClient可以很方便的请求Web API,但在使用时有一些需要注意的地方,不然会给你的程序带来毁灭性的问题。
[FIN_WAIT1] :FIN_WAIT1和FIN_WAIT2均为等待对方的FIN报文。两者区别为,当SOCKET在ESTABLISHED状态时,想主动关闭连接从而想对方发送FIN报文,此时进入FIN_WAIT1状态。当收到ACK报文进入FIN_WAIT2状态。
从图中可以看出,若服务器主动关闭连接,在四次挥手的最后一个ACK后连接端口会变为TIME_WAIT状态, 状态停留时长为两个MSL(最大分段寿命),这个状态只有在主动关闭连接方会出现, 另一端可以在连接断开后立刻投入后续使用。
最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O、机器性能外,还考虑到了网络协议的问题。
TCP 断开连接四次挥手过程中,主动断开连接的一方,在第四次挥手(回复 ACK 报文)后,会进入 TIME_WAIT 状态,等待 2*MSL 后才进入 CLOSE 状态。
TCP是全双工传输协议,也就是说双方都可进行读写操作,当一方不需要写数据时,会通过发送FIN报文告知对方,我要关闭连接了,对方接受到并返回ACK报文,这就表示一方的连接已经关闭,此时另一方的连接还是OK的,也就是说另一方还是可以继续写数据的,等到另一方也发完数据之后就可以发送FIN报文。
TCP 连接关闭时,会有 4 次通讯(四次挥手),来确认双方都停止收发数据了。如上图,主动关闭方,最后发送 ACK 时,会进入 TIME_WAIT 状态,要等 2MSL 时间后,这条连接才真正消失。
昨天频繁的收到MySQL实例关于Aborted告警邮件,看到告警邮件的实例信息,测试实例,优先级没没那么高,晚点抽空在看,可能到时候就好了,抱着侥幸的心理继续划水,但是没过1个小时,收到50多封告警邮件,实在受不了了,准备放下手头的事情优先处理该告警问题; 如下是告警邮件相关信息截图:
之前使用github.com/olivere/elastic库遇到了一个TIME_WAIT堆积的问题,因为问题比较共性(引入新库、性能测试、TIME_WAIT原理),所以简单记录下,新同学可以关注下
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ajianyingxiaoqinghan/article/details/89736329
MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”.
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。
该文章讲述了TCP连接中的TIME_WAIT状态,即TCP连接在关闭之后,等待2*MSL时间后才能重新被调用。同时,也介绍了TCP连接的Close_wait状态,即TCP连接在关闭之后,发送方等待2*MSL时间才能重新调用该连接。此外,文章还介绍了如何通过三次挥手来关闭TCP连接,并强调了TCP连接的半关闭状态,即只关闭了应用层未关闭传输层。
tcp 0 0 192.168.10.7:52160 172.16.11.11:16091 TIME_WAIT
TCP 的 11 个状态,每一个状态都缺一不可,自然 TIME_WAIT 状态被赋予的意义也是相当重要,咱们直接结论先行
在Liunx服务器上发现有 10倍于 LISTEN 服务的 time_wait 状态,服务并非高并发,日常的连接数也比较少,因此该现象明显异常
在《网络编程-从TCP连接的建立说起》中介绍了TCP的三次握手以及一些常见问题,那么四次挥手又有哪些需要特别关注的问题?四次挥手你真的懂了吗?
在网络通信中,TCP(Transmission Control Protocol)是一种可靠的传输协议,它通过三次握手建立连接,实现数据的可靠传输。而当通信结束时,需要进行四次挥手来关闭连接。本文将深入探讨TCP四次挥手的过程,并解释为什么TIME_WAIT状态至少设置两倍的MSL(Maximum Segment Lifetime)时间。
线上有几台QPS每秒几万请求的服务器,大致访问链路如下:client -> nginx -> web 服务器,由于每台机器上混布了多个web服务并通过nginx反向代理统一分发请求,在服务升级的时候经常出现端口被占用的情况,排查问题时,发现系统过存在几万多个 time_wait状态。统计命令如下:
测试工具选用locust,locust中文意思为蝗虫,可以想象,locust就像成片的蝗虫,扑向我们的服务。
我们经常碰到端口被占用的各种情况,在Windows下查看使用端口: C:\Windows\System32>netstat -aon | findstr "8080" 执行结果如下: TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14572 TCP 10.38.67.34:58868 10.14.36.100:8080 CLOSE_WAIT 5832 TCP 10
网络上类似的图有很多,但是有的细节不够,有的存在误导。有的会把两条线分别标记成 client 和 server。给读者造成困惑。对于断开连接这件事,客户端和服务端都能作为主动方发起,也就是 active close 可以是客户端,也可以是服务端。而对端相应的就是 passive close。不管谁发起,状态迁移如上图。
测试环境有一个后台服务,部署在内网服务器A上(无外网地址),给app提供接口。app访问这个后台服务时,ip地址是公网地址,那这个请求是如何到达我们的内网服务器A呢,这块我咨询了网络同事,我画了简图如下:
注意事项:代码均可优化,因我写的为了结合案例,未曾使用框架,可替换内容,可自行优化。
本文主要分析为什么TIME_WAIT状态的持续时间是2MSL而不是1MSL,3MSL或其它的时长,而不会详细描述为什么需要TIME_WAIT状态。
领取专属 10元无门槛券
手把手带您无忧上云