为什么要Time_wait

为什么要Time_waitTime_wait啊,老哥们肯定会想,time_wait什么鬼?为毛我主动断开tcp连接。发完最后一个ACK后不能直接断开连接啊,我能做的都做了。但是…..老铁们你们想一下,ACK丢包是不会重传的,但是FIN呢?最后被动关闭的一直要是收不到ACK它会怎么想,它肯定认为FIN包丢包了,那怎么样,重发呗。重发之后呢,如果对端一直不会回复ACK,那么重传一定次数后就会发送重置报文段然后断开连接

大家好,又见面了,我是你们的朋友全栈君。

Time_wait

啊,老哥们肯定会想,time_wait什么鬼? 为毛我主动断开tcp连接。发完最后一个ACK后不能直接断开连接啊,我能做的都做了。但是…..
老铁们你们想一下,ACK丢包是不会重传的,但是FIN呢? 最后被动关闭的一直要是收不到ACK它会怎么想,它肯定认为FIN包丢包了,那怎么样,重发呗。
重发之后呢,如果对端一直不会回复ACK,那么重传一定次数后就会发送重置报文段然后断开连接。那么这些精彩的来了,现在网络上有这么多FIN的重传包,如果主动断开连接的一方又重新立刻再次建立连接呢?直接血崩……
正传数据就会发现一个FIN段,怎么办呢?一看序列号不是当前连接里的序列号啊… 这怎么办只能发送重置报文段了关闭连接。这岂不是又浪费资源,又得不偿失影响下一次通信吗~~~~
所以主动断开的最后一个ACK发送完后,不能直接断开连接,它必须确保对方收到最后一个ACK才能断开连接,所以ACK过去一个MSL,如果ACK快到丢包这消耗了一个MSL,那么对端会重传FIN,这个FIN段又消耗了一个MSL,所以啊共2个MSL。所以time_wait时间俩个MSL。
所以说time_wait 就是为了防止在连接上有多个重传的FIN包出现,所以必须time_wait这个是为了防止当再一次建立相同的新连接时防止收到老连接的数据包从而导致的影响。
不知道这波解释为什么time_wait,老哥们听懂了没有
对于为什么3次握手?为毛不是2次/4次?
首先有个点是必须得知道的,tcp三次握手不止是为了建立连接,还要互相确认对方的当前的初始化序列号(这个序列号在Linux下是有哈希算法得来的),确保当前连接的安全性,如果不初始化,都是0开始的话,那么连接将不安全。其次还要互相决定下来MSL的大小。
所以如果2次握手。client 发生了 SYN + 自己的初始化序列号,server收到了,这时候server将 syn+ack+自己序列号回复给client , 如果这个包丢了,那么client将不知道server的序列号。但是server自己并不知道 这个syn+ack丢包了如果2次的话,那么client发现一直收到回复就重传了SYN段,那么server收到后,会知道自己的包丢了,就会再次重发syn+ack。假设这个包 client接到了,现在通信状态是OK的。不过这个假设是建立在server发完后没有立即发送数据段的前提下。
但是如果 server发完数据段,它认为是连通的,并立即发送一个数据,第一个syn+ack丢包了,client并不知道server的初始化序列号,突然收到了一个数据段,会发什么? 很简单,它误以为是上一个同一连接的延迟包,发送RST段,然后中断连接,直接雪崩!!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139583.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月29日 下午3:46
下一篇 2022年5月29日 下午3:46


相关推荐

  • 深入学习Linux摄像头(二)v4l2驱动框架

    深入学习Linux摄像头系列深入学习Linux摄像头(一)v4l2应用编程深入学习Linux摄像头(二)v4l2驱动框架深入学习Linux摄像头(三)虚拟摄像头驱动分析深入学习Linux摄像头(五)三星平台fimc驱动详解一深入学习Linux摄像头(六)三星平台fimc驱动详解二深入学习Linux摄像头(二)v4l2驱动框架文章目录深入学习Linux摄像头(二)v4l2驱动框架一、V…

    2022年4月8日
    201
  • 使用Dependency Walker和dumpbin工具定位C++软件启动时找不到接口的报错问题

    使用Dependency Walker和dumpbin工具定位C++软件启动时找不到接口的报错问题本文详细介绍如何使用 DependencyWa 和 dumpbin 工具定位 C 软件启动时找不到接口的报错问题

    2026年3月19日
    1
  • Openclaw(Clawbot)+Kimi K 2.5 部署+飞书使用手把手教程:让AI接管所有,24小时不停机

    Openclaw(Clawbot)+Kimi K 2.5 部署+飞书使用手把手教程:让AI接管所有,24小时不停机

    2026年3月13日
    2
  • Python爬虫程序实例

    Python爬虫程序实例在这个爬虫程序中使用到“BeautifulSoup”与“requests”两个包,所以我们之前要安装这两个包,如果不清楚是否安装,可以使“piplist”查看是否已经安装。做“爬虫程序”时建议用谷歌浏览器对网页元素进行检查,在网页空白处右击鼠标在弹出菜单中,使用“检查”菜单项。在检查元素窗口中,在“Elements”窗口仔细查看网页元素,特别要观察所要截取的内容前后HTML元素的特征。在上述代码中:主要抓取中的元素,这里看到它们的class元素的名称都是“news_li_strong”,所以在代

    2022年6月17日
    36
  • aspose合并单元格

    aspose合并单元格工作中遇到处理 word 模板用到了 aspose 插件 其中遇到了合并单元格 其中分为上下单元格合并 以及左右单元格合并 1 一行中相邻单元格合并 合并所有左右相邻单元格一致的行 publicstatic HashMap String Object m1 Stringfilepa throwsExcept Maprs getcf m1 Iteratoriter rs keySet itera String Object

    2026年3月18日
    2
  • 作为一个程序员,什么是脚本。必须要理解「建议收藏」

    作为一个程序员,什么是脚本。必须要理解「建议收藏」Javascript是一门动态类型、面向对象的脚本语言。对脚本进行一个感性的认识。就是一个跟计算机执行的文本。理解脚本如果你打开一本JavaScript教程,那么很可能在第一章就看到这句话

    2022年8月2日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号