为何要等待2MSL?


1.假如第四次挥手失败了,因为丢失而未到达服务器会怎样呢?这样,服务器会一直收不到客户端的回应,也就无法得知客户端是否收到了即将要断开连接的请求。客户端此刻还蒙在鼓里,还在等待服务器继续发送消息。服务器不能判断客户端是否收到,本身就是一个BUG,于是才有的等待2MSL的情况。为了保证客户端最后一次挥手的报文能够到达服务器,若第4次挥手的报文段丢失了,服务器就会超时重传第3次挥手的报文段,所以客户端此时不是直接进入CLOSED,而是保持TIME_WAIT(等待2MSL就是TIME_WAIT)。当客户端再次受到服务器因为超时重传而发送的第3次挥手的请求时,客户端就会重新给服务器发送第4次挥手的报文(保证服务器能够受到客户端的回应报文)。最后,客户端、服务器才真正断开连接。说白了,等待2MSL就是为了确保服务器能够受到客户端最后的回应。
2.如果客户端直接CLOSED,然后又再次向服务器发起一个新连接,谁也不能保证新发起的连接和刚关闭的连接的端口号是不同的,有可能新、老连接的端口号就是一样的。假设新、老连接端口号一致,若老连接的一些数据仍滞留在网络中,这些滞留数据在新连接建立后才到达服务器,鉴于前后端口号一致,TCP协议就默认这些数据属于新连接,于是数据就这样乱成一锅粥了。所以TCP连接还要在TIME_WAIT状态下等待2MSL,确保所有老连接的数据都在网络中消失!

总结来说:
1.为了确保第四次挥手的ACK能被服务器接收到
2.确保所有的老链接都在网络中消失。

等待时间为什么是2MSL?

首先说明什么是MSL,MSL是Maximum Segment Lifetime的缩写,译为报文最大生存时间,也就是任何报文在网络上存活的最大时间,一旦超过该时间,报文就会被丢弃。2MSL也就是指的2倍MSL的时间。
为什么是2倍呢?
主动断开的一侧为A,被动断开的一侧为B。
第一个消息:A发FIN
第二个消息:B回复ACK
第三个消息:B发出FIN此时此刻:B单方面认为自己与A达成了共识,即双方都同意关闭连接。此时,B能释放这个TCP连接占用的内存资源吗?不能,B一定要确保A收到自己的ACK、FIN。所以B需要静静地等待A的第四个消息的到来:
第四个消息:A发出ACK,用于确认收到B的FIN
当B接收到此消息,即认为双方达成了同步:双方都知道连接可以释放了,此时B可以安全地释放此TCP连接所占用的内存资源、端口号。
所以被动关闭的B无需任何wait time,直接释放资源。
但,A并不知道B是否接到自己的ACK,A是这么想的:
1)如果B没有收到自己的ACK,会超时重传FiN那么A再次接到重传的FIN,会再次发送ACK
2)如果B收到自己的ACK,也不会再发任何消息,包括ACK
无论是1还是2,A都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:

去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。

这恰恰就是2MSL( Maximum Segment Life)。

等待2MSL时间,A就可以放心地释放TCP占用的资源、端口号,此时可以使用该端口号连接任何服务器。同时也能保证网络中老的链接全部消失。

TCP第四次挥手后为什么要等待2MSL后才断开链接?等待时间为什么是2MSL?相关推荐

  1. TCP的四次挥手及为什么要等待2MSL

    一.四次挥手的详述 1.假设Client端发起中断连接请求,也就是发送FIN报文. 2.Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还 ...

  2. 【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )

    文章目录 一.TCP 连接管理 二.TCP 连接建立 三.TCP 连接建立 相关报文段 字段 四.SYN 洪泛攻击 五.TCP 连接释放 一.TCP 连接管理 TCP 传输数据过程 : 建立连接 -& ...

  3. tcp四次挥手为何最后要等待2MSL时间?

    之前别人问过的一个问题,说是四次挥手为何要等待2MSL时间? 首先我们需要明白,MSL是表示什么意思? 其实是maxinum segment lifttime(报文最大存活时间),tcp发出的包是有一 ...

  4. 【计算机网络】2、TCP:四次挥手与TIME_WAIT、shutdown() 优雅关闭 server、探活、拥塞窗口与 Nagle 算法、端口占用、tcp 的流式协议、可靠性

    文章目录 六.四次挥手 与 TIME_WAIT 6.1 TIME_WAIT 的作用 6.2 TIME_WAIT 的危害和方案 七.server 用 shutdown() 优雅关闭 7.1 close( ...

  5. 详解TCP连接释放四次挥手过程

    TCP连接释放的过程叫做挥手,挥手需要在客户和服务器之间交换四个TCP报文段. 下图是四报文挥手释放TCP连接的过程: 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状 ...

  6. TCP第四次挥手为什么要等待2MSL(最长报文段寿命,Maximum Segment Lifetime)

    当客户端进入TIME-WAIT状态的时候(也就是第四次挥手的时候),必须经过时间计数器设置的时间2MSL(最长报文段寿命)后,才能进入关闭状态,这时为什么呢??? 这最主要是因为两个理由: 1.为了保 ...

  7. TCP/IP / 四次挥手之状态转换图、过程说明和原因

    一.状态转换图 二.过程说明 1.Client:我要断开连接啦! 2.Server:好的!稍等,我这还有一些数据需要发送给你,等完事我再断开连接哈. --(server 向 client 发送数据) ...

  8. TCP第四次挥手为什么要等待2MSL

    当客户端进入TIME-WAIT状态的时候(也就是第四次挥手的时候),必须经过时间计数器设置的时间2MSL(最长报文段寿命)后,才能进入关闭状态,这时为什么呢???  这最主要是因为两个理由: 1.为了 ...

  9. TCP的四次挥手中的等待2MSL

    为什么time_wait需要等待2MSL? MSL:一个最大的生命周期,30秒--1分钟 1.保证TCP协议的全双工连接能够可靠关闭. 如果主动关闭方和被动关闭方的最后的一个确认(ack)包不等待2M ...

最新文章

  1. 半个月3篇Nature/Science,95后曹原3年8篇顶刊,网友:杀疯了杀疯了
  2. 基于超声波升压中周构建的150kHz的单管选频放大电路
  3. 【IBM Tivoli Identity Manager 学习文档】11 TIM设计思路介绍
  4. [转载]明天的数字营销分析工具2
  5. 曾经我也迷茫,你还在迷茫吗?写给像我一样的在校计算机专业学生作者:Cat_Lee 来源:博客园 发布时间:2009-05-30 20:25 阅读:1104 次 原文链接 [收藏]
  6. 【小代码讲解】独热编码(One-Hot编码)
  7. Java IDEA断点调试
  8. c语言实训作业总结,c语言程序设计上机实践心得报告
  9. @HystrixCommand 注解的作用与注意事项
  10. Redis的常用JavaAPI(Jedis)实现
  11. android 获取手机信息工具类
  12. AcWing 854. Floyd求最短路(模板)
  13. JSONObject 与 JSONArray 使用
  14. V4L2驱动的移植与应用(二+三)【转】
  15. 排队论的计算机模拟,系统容量有限的一类排队论模型的计算机模拟研究
  16. C语言求cidr,点分十进制子网掩码与CIDR相互转换详解
  17. 计算机网络——大数据、物联网
  18. linux下分配磁盘空间,linux如何分配磁盘空间
  19. python求三角形的角度
  20. 怎样快速开发属于自己的微信小程序?

热门文章

  1. 测绘界超强工具箱!CADCASS实用插件合集,各种功能应有尽有!断面、高程点、等高线、三角网、拓扑检查...
  2. 云服务器几核CPU几G内存几M带宽够用
  3. The Sandbox 与《足球小将》达成合作,将流行的足球漫画及动画带入元宇宙
  4. CSS进阶班笔记(五)
  5. EasyClick adb shell命令大全
  6. Unity3d制作2D游戏飞翔的小鸟(FlappyBird)
  7. android滑屏效果,Android使用ViewFlipper和GestrueDetector共同实现滑屏效果实例
  8. HDU - 6438 Buy and Resell(思维+ 贪心)
  9. 罗丹明 PEG 巯基,Rhodamine PEG Thiol,荧光染料标记巯基/硫醇
  10. SpringWeb项目Maven执行clean命令后编译拒绝访问的解决方法