TCP四次挥手 2MSL TIME_WAIT详解

article/2025/11/5 10:41:09

TCP四次挥手 & 2MSL & TIME_WAIT详解

      • TCP四次挥手流程
        • 各状态解析
      • 2MSL(2倍最大报文段生成时间)
        • 2MSL (Maximum Segment Lifetime) TIME_WAIT状态的存在有两个理由
        • 该状态为什么设计在主动关闭这一方?
        • 如何正确对待2MSL TIME_WAIT?

TCP四次挥手流程

在这里插入图片描述
【注意】只要是申请关闭连接的,FIN都要置1。

各状态解析

  • FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是:

    • FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态

    • FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到

  • FIN_WAIT_2主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发

  • TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态

  • CLOSING: 这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接

  • CLOSE_WAIT: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接。

  • LAST_ACK: 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,即可以进入到CLOSED可用状态

2MSL(2倍最大报文段生成时间)

2MSL (Maximum Segment Lifetime) TIME_WAIT状态的存在有两个理由

(1)让4次握手关闭流程更加可靠

4次握手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。

(2)防止lost duplicate对后续新建正常链接的传输造成破坏。

lost duplicate在实际的网络中非常常见,经常是由于路由器产生故障,路径无法收敛,导致一个packet在路由器A,B,C之间做类似死循环的跳转(也有可能是网络时延导致)。

IP头部有个TTL,限制了一个包在网络中的最大跳数,因此这个包有两种命运,要么最后TTL变为0,在网络中消失;要么TTL在变为0之前路由器路径收敛,它凭借剩余的TTL跳数终于到达目的地。

但非常可惜的是TCP通过超时重传机制在早些时候发送了一个跟它一模一样的包,并先于它达到了目的地,因此它的命运也就注定被TCP协议栈抛弃。

另外一个概念叫做incarnation connection(化身连接),指跟上次的socket pair一摸一样的新连接,叫做incarnation of previous connection(前连接的化身)。lost duplicate(丢失的冗余包)加上incarnation connection,则会对我们的传输造成致命的错误。

TCP是流式的所有包到达的顺序是不一致的,依靠序列号(TCP首部的sequnce字段)由TCP协议栈做顺序的拼接;假设一个incarnation connection这时q期待收到的seq=1000, 来了一个lost duplicate为seq=1000,len=1000, 则TCP认为这个lost duplicate合法,并存放入了receive buffer,导致传输出现错误。通过一个2MSL TIME_WAIT状态,确保所有的lost duplicate都会消失掉,避免对新连接造成错误。

该状态为什么设计在主动关闭这一方?

(1)发最后ACK的是主动关闭一方。

(2)只要有一方保持TIME_WAIT状态,就能起到避免incarnation connection在2MSL内的重新建立,不需要两方都有。

如何正确对待2MSL TIME_WAIT?

RFC要求socket pair在处于TIME_WAIT时,不能再起一个incarnation connection。

但绝大部分TCP实现,强加了更为严格的限制。在2MSL等待期间,socket中使用的本地端口在默认情况下不能再被使用。

若A 10.234.5.5 : 1234和B 10.55.55.60 : 6666建立了连接,A主动关闭,那么在A端只要port为1234(注意是在主动端),无论对方的port和ip是什么,都不允许再起服务!

这甚至比RFC限制更为严格,RFC仅仅是要求socket pair不一致,而实现当中只要这个port处于TIME_WAIT,就不允许起连接。这个限制对主动打开方来说是无所谓的,因为一般用的是临时端口;但对于被动打开方,一般是server,就悲剧了,因为server一般是熟知端口。比如http,一般端口是80,不可能允许这个服务在2MSL内不能起来。

**解决方案是给服务器的socket设置SO_REUSEADDR选项(端口复用),这样的话就算熟知端口处于TIME_WAIT状态,在这个端口上依旧可以将服务启动。**当然,虽然有了SO_REUSEADDR选项,但sockt pair这个限制依旧存在。比如上面的例子,A通过SO_REUSEADDR选项依旧在1234端口上起了监听,但这时我们若是从B通过6666端口去连它,TCP协议会告诉我们连接失败,原因为Address already in use.

RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

RFC (Request For Comments),是一系列以编号排定的文件。收集了有关因特网相关资讯,以及UNIX和因特网社群的软件文件。


http://chatgpt.dhexx.cn/article/ILG2NuMR.shtml

相关文章

网络编程知识预备(2) —— 三次握手与四次挥手、半连接状态、2MSL

参考:网络编程知识预备(2) ——三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL_行稳方能走远的博客-CSDN博客 目录 一、三次握手 什么是三次握手? 三次握手图解 三次握手过程解析 (1)第一次握手 &am…

2.5Modelsim

视频链接:https://v.youku.com/v_show/id_XNTkxNDg2MTEwNA.html?x&sharefromandroid&sharekey59e4c264c93de043603d938d05eb7fd10 题目:例2.5.1中2选1数据选择器的仿真步骤 原理与目的: 原理:数据选择是指经过选择&am…

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

一、四次挥手的详述 1、假设Client端发起中断连接请求,也就是发送FIN报文。 2、Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以…

为什么等待2MSL

下面是TCP四次挥手的图 介绍一下上图中的主要关键字 FIN_WAIT1是主动断开连接方发出关闭请求后的状态,表示主动方(主动断开TCP连接的一方)已经没有信息要发送给被动方 CLOSED_WAIT是被动方接收到主动方的关闭请求后返回ACK响应后的状态,此时被动方应该…

释放连接:四次挥手过程?为什么要等待2MSL

储备知识:TCP报文段的首部格式(讲下面提到的): 1.FIN:用来释放一个连接。当FIN1时,表示此报文段的发送方的数据已经发送完毕,并要求释放运输连接。 2. 确认ACK(acknowledgment&#…

SAML2.0使用

最近在工作中和海外一家公司对接单点登录,用到了SAML2.0协议,目前公司的单点登录 还是比较老的CASE3.5版本,不支持SAML2,要支持也要定制优,由于后面肯定是要升级,所 以不在源码上做调整支持,单独…

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

为何要等待2MSL? 1.假如第四次挥手失败了,因为丢失而未到达服务器会怎样呢?这样,服务器会一直收不到客户端的回应,也就无法得知客户端是否收到了即将要断开连接的请求。客户端此刻还蒙在鼓里,还在等待服务器…

为什么TIME_WAIT状态是2MSL?(2个原因)

为什么TIME_WAIT的时间是2MSL? 先来看看上文中TIME_WAIT状态存在的两个理由。 首先看理由1,为了可靠地实现全双工连接的终止,假设图2-5中客户端发送的最后一个ACK丢失,服务端将重传FIN,为了能够收到这个超时重传的FIN…

Time-wait状态(2MSL)

本文转自:https://blog.csdn.net/overstack/article/details/8833894,尊重原创 三次握手四次挥手图: time_wait之后会等2msl。 什么是2MSL: MSL是Maximum Segment Lifetime,译为“报文最大生存时间”,他是任何报文在…

【Linux网络编程】TCP状态转换、半关闭、2MSL时长

------------->【Linux系统编程/网络编程】(学习目录汇总) <-------------- 目录 1. 三次握手、四次挥手过程中的状态变化2. TCP状态转换图3. 半关闭4. 2MSL时长4.1 为什么要2MSL时长&#xff1f;4.2 端口复用 1. 三次握手、四次挥手过程中的状态变化 先结合下图回顾一下…

TIME_WAIT状态(2MSL)的作用

主动关闭的Socket端会进入TIME_WAIT状态&#xff0c;并且持续2MSL时间长度&#xff0c;MSL就是maximum segment lifetime(最大分节生命期&#xff09;&#xff0c;这是一个IP数据包能在互联网上生存的最长时间&#xff0c;超过这个时间将在网络中消失。MSL在RFC 1122上建议是2分…

【CSS】关于CSS的几种移动端布局方式

关于CSS的几种移动端布局方式 一、移动端布局01.meta视口标签设置02.移动布局的分类有哪些&#xff1f;03.为什么需要二倍图&#xff1f;&#xff08;1&#xff09;物理像素和物理像素比&#xff08;2&#xff09;二倍图&#xff08;根据需要确定多倍图&#xff09;&#xff08…

css:居中的几种布局方式

居中布局的方式 初始状态 <!DOCTYPE html> <html lang"en"> <head><style>.outer {width: 100px;height: 100px;border: 1px solid #f00;}.inner {width: 30px;height: 30px;background-color: #000;}</style> </head> <bo…

常见的CSS页面布局方式

详情&#xff1a;CSS页面结构是我们日常生活中最常使用到的&#xff0c;当然目前可能大家用的最多的是elementUI实现布局&#xff0c;简单方柏霓&#xff0c;下面介绍几种常见的原生页面布局的方式 公共的样式部分 <style>* {margin: 0;padding: 0;}.layout {margin-bot…

css的几种布局方式都在这

说道布局方式&#xff0c;是我们经常遇到的问题&#xff0c;下面我们就来讲解css的常见的一些布局方式。 1.双飞翼布局&#xff08;两边定宽&#xff0c;中间自适应&#xff09; 主要是通过浮动与margin实现&#xff0c;代码如下&#xff1a; <!DOCTYPE html PUBLIC &quo…

css横向布局的几种方式

首先我们先看看 html部分 bodyTip 内的三个标签我们需要让他们横向显示并且根据浏览器宽度平均显示 <body> <!--头部--> <div class"head">我是头部 </div> <div class"bodyTip"><!--左边--><div class"lef…

CSS 多种布局方式

​css布局是工作中最常碰到的&#xff0c;同时也是笔试 or 面试中会被问到的问题&#xff0c;故在本文整理了css多种布局方式&#xff0c;以供参考。 此篇较长四千五百字左右&#xff0c;读者可分三部分阅读&#xff0c;水平居中布局&#xff0c;垂直居中布局&#xff0c;水平…

HTML+CSS第十课:常见的3种网页布局方式:表格布局、DIV+CSS布局、框架布局

知识点:网页布局的方式 1、网页布局 常见的页面布局方式:表格布局、DIV+CSS布局、框架布局。 表格布局:用来显示较多的数据,如OA系统、ERP系统或CRM系统。(一般用在局部)DIV+CSS布局:相对来说最灵活的布局方式,完全实现内容和样式的分离。框架布局:通常用在网站后台…

css常见布局方式

css常见布局方式 0、前言1、两栏布局1.1 浮动 margin1.2 浮动 BFC&#xff08;overflow: hidden&#xff09;1.3 定位 margin-left1.4 给父容器设置flex布局&#xff0c;左盒子固定宽度&#xff0c;然后给右子元素设置 flex: 1。1.5 table布局 2、三栏布局2.1 float布局2.2 …

CSS布局的三种方式

绝对定位 绝对定位&#xff1a; ​ 属性&#xff1a;position 值&#xff1a;absolute <style> p.abs{position: absolute;left: 150px;top: 50px; }</style><p >正常文字1</p> <p >正常文字2</p> <p class"abs" >绝对定…