time_wait状态产生的原因,危害,如何避免

0.请说说你对TCP连接中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之后进入的状态。并且持续时间还挺长的。

0.能不能发送完ACK之后不进入TIME_WAIT就直接进入CLOSE状态呢?

不行的,这个是为了TCP协议的可靠性,由于网络原因,ACK可能会发送失败,那么这个时候,被动一方会主动重新发送一次FIN,这个时候如果主动方在TIME_WAIT状态,则还会再发送一次ACK,从而保证可靠性。那么从这个解释来说,2MSL的时长设定是可以理解的,MSL是报文最大生存时间,如果重新发送,一个FIN+一个ACK,再加上不定期的延迟时间,大致是在2MSL的范围。

所以从理论上说,网上调试参数降低TIME_WAIT的持续时间的方法是一种以可靠性换取性能的一种方式。嗯,质量守恒定理还是铁律。

1. time_wait状态如何产生?

由上面的变迁图,首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL的值是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。(IP:PORT already inuse)

2.time_wait状态产生的原因?

1)为实现TCP全双工连接的可靠释放

由TCP状态变迁图可知,假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源(client方的local_ip,local_port)不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。

如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生然而这事实上只是正常的关闭连接过程,并非异常。

2)为使旧的数据包在网络因过期而消失

为说明这个问题,我们先假设TCP协议中不存在TIME_WAIT状态的限制,再假设当前有一条TCP连接:(local_ip, local_port,remote_ip,remote_port),因某些原因,我们先关闭,接着很快以相同的四元组建立一条新连接。本文前面介绍过,TCP连接由四元组唯一标识,因此,在我们假设的情况中,TCP协议栈是无法区分前后两条TCP连接的不同的,在它看来,这根本就是同一条连接,中间先释放再建立的过程对其来说是“感知”不到的。这样就可能发生这样的情况:

前一条TCP连接由local peer发送的数据到达remote peer后,会被该remot peer的TCP传输层当做当前TCP连接的正常数据接收并向上传递至应用层而事实上,在我们假设的场景下,这些旧数据到达remote peer前,旧连接已断开且一条由相同四元组构成的新TCP连接已建立,因此,这些旧数据是不应该被向上传递至应用层的),从而引起数据错乱进而导致各种无法预知的诡异现象。作为一种可靠的传输协议,TCP必须在协议层面考虑并避免这种情况的发生,这正是TIME_WAIT状态存在的第2个原因。

设置2MSL使得A到B的旧连接发送的包失效(因为最大存活时间MSL),同时即使B回复了A的包,那也已经失效了

3)总结

具体而言,local peer主动调用close后,此时的TCP连接进入TIME_WAIT状态,处于该状态下的TCP连接不能立即以同样的四元组建立新连接,即发起active close的那方占用的local port在TIME_WAIT期间不能再被重新分配。由于TIME_WAIT状态持续时间为2MSL,这样保证了旧TCP连接双工链路中的旧数据包均因过期(超过MSL)而消失,此后,就可以用相同的四元组建立一条新连接而不会发生前后两次连接数据错乱的情况。

1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2. 可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

4.什么情况下会出现大量的time_wait状态?

由于主动关闭TCP连接的一方才会进入TIME_WAIT状态,一般情况服务器端不会出现TIME_WAIT状态,因为大多数情况都是客户端主动发起连接并主动关闭连接。但是某些服务如pop/smtp、ftp却是服务端收到客户端的QUIT命令后主动关闭连接,这就造成这类服务器上容易出现大量的TIME_WAIT状态的连接,而且并发量越大处于此种状态的连接越多。另外,对于被动关闭连接的服务在主动关闭客户端非法请求或清理长时间不活动的连接时(这种情况很可能是客户端程序忘记关闭连接)也会出现TIME_WAIT的状态。(简而言之,主动关闭连接一端会出现大量的TIME_WAIT状态)

5.什么情况下服务器会进行主动关闭的情况?

1)短连接的方式。如http服务器。

这确实是历史包袱。原因很简单,早先客户端处理HTTP是单线程的、阻塞的,服务器端发送完信息后客户端要一直等到信息处理完毕、渲染完毕,才能有处理能力来通知服务器处理完成。在当时这个过程可以长达数分钟,而且当时服务器没有能力去承载这么多等待响应的连接(可以用Erlang计算一下这个延迟下需要满足%99.9的可用性需要多么恐怖的硬件)。

所以解决方案就是服务器发送完之后就关闭连接,表明数据已经发送完成。等客户端接收到了所有信息,处理完毕,一看连接也关掉了,此时服务器早已在处理其他连接了。

另外这也是为什么有大量TIME_WAIT的原因,相比挂着连接等待客户端关闭,服务器等待确认TCP连接状态要快太多了。

2)已经进入了瓶颈。即连接数已经达到了极限值。

6.出现太多TIME_WAIT可能导致的后果?(持续的到达一定量的高并发短连接,会使服务器因端口资源不足而拒绝为一部分客户服务)

在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接。这个场景下,会出现大量socket处于TIMEWAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
我来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。为什么我们要关注这个高并发短连接呢?有两个方面需要注意:

高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
 ②在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。这里有个相对长短的概念,比如,取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高
     综合这两个方面,持续的到达一定量的高并发短连接,会使服务器因端口资源不足而拒绝为一部分客户服务。

7.time_wait状态如何避免?

首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

在很多场景中,为了能够处理更多的用户请求,一般取消timewait状态,用可靠性换取性能!

所以如果将大量CLOSE_WAIT的解决办法总结为一句话那就是:查代码。因为问题出在服务器程序里头啊。

网络:TIME-WAIT相关推荐

  1. 苹果设备iphone,ipad,macbook网络连接慢,开机开什么卡什么,一步解决

    苹果电脑网络连接慢,开机开什么卡什么??? 网络上的方法一种种,没有一个适用的? 如果你的macbook也是打开就没网,但有一些软件也能用,就是浏览器加载跑条儿,不妨试试! 系统偏好设置-网络-高级- ...

  2. 大数据学习01——配置虚拟机节点相关网络

    1.配置mac地址和ip (1)更改适配器设置 找到这个后开始设置windows中的网络连接 (2)接着对三台虚拟机的mac地址和ip进行设置 1.mac地址设置 进入linux节点中的这个位置进行设 ...

  3. 【Docker】容器的几种网络模式

    当你使用Docker时,你会发现需要了解很多关于网络的知识.Docker作为目前最火的轻量级容器引擎,因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求.本文介绍了Docker的4种 ...

  4. 2022-2028年中国网络直播行业深度调研及投资前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了网络直播行业相关概述.中国网络直播行业运行环境.分析了中国网络直播行 ...

  5. Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)

    Redis 是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等 ...

  6. ubuntu 修改时区、时间、同步网络时间、将时间写入硬件

    查看系统当前的时间状态 $ timedatectl statusLocal time: 六 2021-10-30 09:33:37 CSTUniversal time: 六 2021-10-30 01 ...

  7. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

  8. win10安装虚拟机提示主IP地址显示网络信息不可用

    问题:在虚拟机详情下面显示 主ip地址:网络信息不可用 解决方案 先root用户[root@localhost~]#cd - [root@localhost/]#cd /etc/sysconfig/n ...

  9. 虚拟机网络连接方式linuxcentos

    20210910 https://www.cnblogs.com/luxiaodai/p/9947343.html NAT 方式配置固定ipvmnet8 这块网卡的ip地址和虚拟机的ip地址要不一样 ...

  10. 笔记本电脑的有线和无线网络同时使用,如何设置?

    笔记本电脑的有线和无线网络同时使用,如何设置? 查看全文 http://www.taodudu.cc/news/show-64160.html 相关文章: transformer bert seq2s ...

最新文章

  1. 经济独立,是你最大的底气
  2. APUE(第七章)进程环境
  3. 遭遇IE8下的JavaScript兼容问题
  4. 固态硬盘量产工具_固态硬盘怎么修复
  5. 判断是否是闰年的方法,很简单噢
  6. Android开发之最简单的布局点击Tab和Fragment切换源码(特别适合初学者)
  7. redis核心技术与实战(四)高可用高扩展篇
  8. vue 指令 v-once
  9. 将多个markdown文件发布为一个html或pdf文件的方法梳理
  10. 42表盘直径是从哪测量_长度和时间的测量
  11. 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
  12. TServerSocket阻塞模式下Request-Response编程框架
  13. Mybaits整个Spring项目,简单示例,10分钟快速上手
  14. 华为手机安装GMS框架
  15. 上海学车科目二,科目三容易扣分点分享,你了解多少
  16. Python wxpy 操作微信 大全集
  17. 阿里云的这群疯子--深度好文请仔细看完
  18. C#中 //TODO: 的用法
  19. ESP32设备驱动-MMA7455L加速计驱动
  20. 简单易懂 LNMP 架构详解适合入门级别可跟做

热门文章

  1. 关于创建主键和索引的关系一个小小測试
  2. struts2+jquery+ajax实现上传校验实例
  3. 【技术总结】几种常用的无线串行通信技术
  4. 1024分辨率章子怡/郭富城《最爱》HD国语中字
  5. [导入]失败的软件实训课
  6. 使用异步 I/O 大大提高应用程序的性能
  7. OpenCV图像处理使用笔记(八)——Sobel算子
  8. Ubuntu14.04下FTP服务器的搭建配置
  9. 【机器学习入门笔记1:anaconda一站式开发环境搭建】20190122
  10. Weka学习四(属性选择)