TCP四次挥手 2MSL TIME_WAIT详解

news2024/11/18 9:48:57

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://www.coloradmin.cn/o/22320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Open vSwitch的传统限速和SDN限速--实验

基于Open vSwitch的传统限速和SDN限速--实验基于Open vSwitch的传统限速和SDN限速--实验1.下载与安装1.1 安装Docker1.2 Open vSwitch的安装2.配置实验环境3.实验步骤3.1启动floodlight控制器3.2创建拓扑3.3网卡限速3.4队列限速3.5 Meter表限速4.三种方式数据对比5.实验分析6.总…

仿大众点评——秒杀系统部分03——RabbitMq措施

RabbitMq保证消息不丢失 RabbitMQ如何保证消息的可靠性: 1.从生产者到消息队列,congfirm模式(与事务相比confirm模式最大的优势是异步)通过消息确认机制来保证,通过给每个指派唯一标志,完成消费后返回ack确…

【LeetCode每日一题】——136.只出现一次的数字

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 简单 三【题目编号】 136.只出现一次的数字 四【题目描述】 给你一个 非…

[附源码]SSM计算机毕业设计风景区管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

再学DataX

一、DataX简介 DataX官网文档:https://github.com/alibaba/DataX/blob/master/introduction.md DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同…

MyBatis基于XML的使用——动态sql

1、动态sql 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它 类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL&#…

14服务-ClearDiagnosticlnformation

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍存储数据传输服务下的14服务ClearDiagnosticlnformation,客户端使用ClearDiagnosticlnformation服务清除一个或多个服务器存储器中的诊断信息。 关联文章:$19服务:DTCStatusMask和s…

CockroachDB-读和写

本文知识点来源于官网地址https://www.cockroachlabs.com/docs/stable/architecture/reads-and-writes-overview.html 查询执行 当CRDB执行查询时,集群将请求路由到包含相关数据的范围的Leaseholder。如果查询涉及多个范围,则请求将发送给多个Leasehol…

求实数的整数次幂(循环版)(高效)(位运算解题)

求实数的整数次幂(循环版)(高效) (10 分) 原理图: 请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂。 函数原型 double Power(double x, int n); 说明:参数 x 为底数,n 为指数。若参数正确,则函数值为…

智能驾驶开启产业新赛道:资本扎堆布局车规级高精定位

2022年被称为高阶智能驾驶元年的背后,新的产业链正在悄然发展。 车规级高精定位便是其中之一。2022年10月,主业聚焦于动力总成测试的上海华依科技集团股份有限公司(以下简称“华依科技”,688071.SH),发布公…

漫画风格迁移神器 AnimeGANv2:快速生成你的漫画形象

生成你的漫画形象! 漫画风格迁移神器 AnimeGANv2 文章目录生成你的漫画形象! 漫画风格迁移神器 AnimeGANv2快速在线生成你的漫画形象AnimeGAN 简要介绍与其他动漫风格迁移模型的效果对比AnimeGANv2 的优点AnimeGANv2 风格多样化AnimeGANv2 网络结构快速生…

基于stm32单片机的水位检测自动抽水系统

资料编号:106 下面是相关功能视频演示: 106-基于stm32单片机的水位检测自动抽水系统Proteus仿真(源码仿真全套资料)功能介绍: 使用滑动变阻器模拟水位监测器,通过改变电压值表示水位的变化。stm32通过ADC…

【前端】从 0 到 1 实现一个网站框架(一、注册 [1] )

Hi~你好呀,等你很久啦~ 我是 LStar,一枚来自北京的初二女生,2020 年年初加入 CSDN。 话不多说,直入主题~(我现在看两年多前我 11 岁那会发的文章,越看越想笑。为了不让四年后 18 岁的我看着这篇文章露出 …

超详细的mysql多表操作教程

目录 外键约束 概念 特点 操作 多表联合查询 概念 操作 多表操作总结 外键约束 概念 特点 定义一个外键时,需要遵守下列规则: 主表必须已经存在于数据库中,或者是当前正在创建的表。 必须为主表定义主键。 主键不能包含空值&#xf…

967亿销售额!博世解码智能汽车新蓝图

随着新一轮科技革命和产业变革的深化,在低碳化、电动化和智能化的推动下,处于变革关键时期的新能源汽车产业,正逐步由“政策驱动”转向“市场驱动”,智能化、网联化成为新趋势。 据中国汽车工业协会统计,今年我国新能…

通过 Traefik Hub 暴露家里的网络服务

Traefik Hub 简介 📚️Reference: 你的云原生网络平台 -- 发布和加固你的容器从未如此简单。 Traefik Hub 为您在 Kubernetes 或其他容器平台上运行的服务提供一个网关。 Traefik Hub 定位: 云原生网络平台 它有 2 大核心功能,我这次体验感…

pytorch深度学习实战lesson23

第二十三课 AlexNet AlexNet是在2012年被发表的一个金典之作,并在当年取得了ImageNet最好成绩,也是在那年之后,更多的更深的神经网路被提出,比如优秀的vgg,GoogleLeNet. 其官方提供的数据模型,准确率达到57.1%,top 1-5…

认识计算机中的简单指令集

我们现在有了一个新的寄存器,叫做指令寄存器。它包含一个字节,不同的内容表示控制部分的不同操作模式。也被称为指令代码。指令寄存器是一个字节,因此可能有多达256条不同的指令。所有指令都涉及在总线上移动字节。指令将导致字节进出RAM&…

【JavaEE】PCB和进程调度的基本过程

文章目录什么是进程PCB的组成PID内存指针文件描述符表并行和并发进程调度相关属性进程的状态优先级上下文进程的记账信息什么是进程 进程是正在运行的程序的实例(an instance of a computer program that is being executed) 进程(process&am…

《爱的四十条法则》

《爱的四十条法则》 [土]艾丽芙沙法克 作者用别样的手法间接向我们阐述了爱的四十条法则,每一条都会触及不同阶段的灵魂,我仅将文中感触较深的摘录如下: 1.尽管有人这样说,但是爱绝对不是来的快,去的也快的甜蜜感觉而…