为什么需要 TIME_WAIT 状态

这篇具有很好参考价值的文章主要介绍了为什么需要 TIME_WAIT 状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

还是用一下上一篇文章画的图

为什么需要 TIME_WAIT 状态,php,服务器,网络

TCP 的 11 个状态,每一个状态都缺一不可,自然 TIME_WAIT 状态被赋予的意义也是相当重要,咱们直接结论先行

上文我们提到 tcp 中,主动关闭的一边会进入 TIME_WAIT 状态,

另外 Tcp 中的有 TIME_WAIT 状态,主要是有如下 2 个原因:

  1. 为了防止被动关闭一方的延迟数据被其他连接窃取
  1. 为了防止被动关闭的一方,没有收到最后的一个 ACK 包

如何理解呢?

为什么需要 TIME_WAIT 状态,php,服务器,网络

为了防止被动关闭一方的延迟数据被其他连接窃取

对于第一个

咱们一个一个的来详细解释一下,还是上面这个图,咱们人为的加一点异常的情况

咱们在 tcp 连接中,客户端先发起关闭,那么 TIME_WAIT 状态就在客户端这边,如下:

为什么需要 TIME_WAIT 状态,php,服务器,网络

这是一个正常的客户端和服务端通信的基本过程,那么,如果在 client 和 server 建立连接后,server 端向 client 端发发送的数据,在网络环境中有延迟,短时间,没有顺利的达到 client 端的时候,就会出现如下情况

为什么需要 TIME_WAIT 状态,php,服务器,网络

如上图

  • 我们人为的画了一个会出现在现实工作中的问题,当 client 和 server 正常连接,server 给 client 发的 seq=100 的包,由于网络拥堵等原因,留在了网络环境中
  • client 首先发起关闭连接,如果这个时候,没有 TIME_WAIT 状态,或者咱们人为的将 TIME_WAIT 的值设小,就会出现 seq=100 这个包不能正常的被 client 收到,因为 client 已经是 CLOSED 状态了
  • 这个时候,和 client 占用同一端口的程序 client 路人启动程序并和 server 成功建立连接之后,刚才的 seq=100 的包才到目的地址,这个时候 client 路人并不期望收到这个 seq=100 的消息,那么这对 client 路人来说,这就是一个异常问题了

为什么需要 TIME_WAIT 状态,php,服务器,网络

如果咱们的 TIME_WAIT 状态存在,或者是正常保持 2MSL 的时间,就不会出现这个情况 ,1 个 MSL 是报文在网络环境中的最大存活时间,对于上面这个例子, client 现在那就还是 TIME_WAIT 状态, client 路人使用 client 的端口,是无法启动的,且 2MSL 的时间 seq=100 是完全可以达到 client 的

那是否会有人问,为什么 client 程序还在的时候,就不能启动 client 路人程序呢?

对于这个,咱们就需要知道 TCP 的一条连接,是由四元组组成的

  • 源地址
  • 源端⼝
  • ⽬的地址
  • ⽬的端⼝

此处我们知道,client 和 client 路人,源地址,目的地址,目的端口,都是一样的,那么此时如果源端口还是一样的话,那么是没有办法 2 个 client 都能正常启动的,其中一个正常启动了,那么另外一个就会报地址已经被使用

为了防止被动关闭的一方,没有收到最后的一个 ACK 包

再来看第二点

其实上面我们隐约已经说到了这一点,只不过不是 ack 包,再使用一下上面的图,我们人为的弄一个异常情况

为什么需要 TIME_WAIT 状态,php,服务器,网络

如上图,当我们的 TIME_WAIT 状态不存在,或者设置的时间较小的时候,就可能会发生被动关闭的一方,收不到最后的一个 ack 包的情况

  • 一条 tcp 连接的四元组现在我们知道是啥意思了,那么,当上述 server 对应的连接还未是 CLOSED 状态的时候,server 是认为当前连接还是存在的
  • 但是 client 自身已经是 CLOSED 状态了,所以对于 client 路人来说,我当前的连接是有效的,因此我去给 server 发握手包
  • 可是万万没有想到,server 拒绝我的连接,client 路人就很蒙圈

为什么需要 TIME_WAIT 状态,php,服务器,网络

此时,如果 TIME_WAIT 状态存在,并且等待的时间是 2MSL ,那么哪怕最后一个 ack 包丢失了,server 端也可以重新发送一个 FIN 包给到 client ,再等待一个新的 ack 包

这样,2 MSL 之后,client 和 server 端,对于这一条连接,都是正常关闭的

所以,为什么需要 TIME_WAIT 状态,心里有点数了不

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI文章来源地址https://www.toymoban.com/news/detail-701501.html

到了这里,关于为什么需要 TIME_WAIT 状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网路学习-time_wait过多

    netstat -an|awk ‘/tcp/ {print $6}’|sort|uniq -c netstat -an 列出系统中所有处于活动状态的网络连接信息,包括 IP 地址、端口号、协议等。 其中,第六列是tcp的状态。 awk ‘/tcp/ {print $6}’ 按行进行匹配,筛选出包含 tcp 的行,只输出符合条件的结果 过滤 TCP 类型的连接,然后输出连接

    2024年02月09日
    浏览(29)
  • 【状态管理|概述】Flink的状态管理:为什么需要state、怎么保存state、对于state过大怎么处理

    按照数据的划分和扩张方式,Flink中大致分为2类: Keyed States:记录每个Key对应的状态值 因为一个任务的并行度有多少,就会有多少个子任务,当key的范围大于并行度时,就会出现一个subTask上可能包含多个Key(),但不同Task上不会出现相同的Key(解决了shuffle的问题?)   常

    2024年02月01日
    浏览(42)
  • 【无标题】服务器大量time_wait影响性能,如何解决

    调整内核参数:可以通过修改操作系统的内核参数来调整 TIME_WAIT 状态的处理。例如,可以调整 net.ipv4.tcp_tw_reuse 参数为 1,表示允许将 TIME_WAIT 状态的连接用于新的连接。这样可以减少 TIME_WAIT 状态连接占用的资源。 调整连接超时时间:可以调整操作系统的 TCP 连接超时时间,

    2024年01月19日
    浏览(34)
  • 为什么需要websocket?

    前端和后端的交互模式最常见的就是前端发数据请求,从后端拿到数据后展示到页面中。如果前端不做操作,后端不能主动向前端推送数据,这也是http协议的缺陷。        因此,一种新的通信协议应运而生---websocket,他最大的特点就是服务端可以主动向客户端推送消息,客

    2024年02月12日
    浏览(44)
  • 为什么需要单元测试?

    为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言,功能测试和系统测试以及其他性能测试等等对测试

    2024年02月12日
    浏览(54)
  • 为什么需要uboot?

    bootROM: 一种固化在芯片内部的只读存储器(ROM),用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码,用于完成系统启动前的基本初始化和配置, 例如初始化时钟、GPIO控制器、中断控制器、存储设备(SD卡、NAND Flash、SPicy Flash)等硬件资源, 检测启动设备

    2023年04月23日
    浏览(50)
  • 为什么需要数据仓库

    为什么不在OLTP环境下分析?  OLTP环境也会存储历史数据,但这些历史数据并不是业务运行所需的,这些历史数据需要经常归档到数据仓库,并且在OLTP数据库中删除。 相比之下,事务环境适用于连续处理事务,通常应用于订单录入以及财务和零售事务。它们并不依赖历史数据

    2024年01月25日
    浏览(53)
  • 为什么需要超时控制

    本文将介绍为什么需要超时控制,然后详细介绍Go语言中实现超时控制的方法。其中,我们将讨论 time 包和 context 包实现超时控制的具体方式,并说明两者的适用场景,以便在程序中以更合适的方式来实现超时控制,提高程序的稳定性和可靠性。 超时控制可以帮助我们避免程

    2024年02月03日
    浏览(43)
  • 为什么需要对相机标定?

    以下内容来自系统教程如何搞定单目/鱼眼/双目/阵列 相机标定? 点击领取相机标定资料和代码 为什么需要对相机标定? 我们所处的世界是三维的,而相机拍摄的照片却是二维的,丢失了其中距离/深度的信息。从数学上可以简单理解为,相机本身类似一个映射函数,其将输

    2024年02月06日
    浏览(42)
  • 爬虫为什么需要ip

    爬虫需要使用爬虫ip主要是为了解决以下问题: 1、反爬虫机制:许多网站会设置反爬虫机制来防止爬虫程序的访问,例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制,使得爬虫程序更难被检测到。 2、访问限制:有些网站可能会对某些地区的IP地址

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包