5.8.2、TCP 的连接释放

news2024/11/23 22:20:37

1、释放流程图

释放流程图

image-20230107214446487

2、TCP 使用 “四报文挥手” 释放连接的具体过程

TCP 通过 “四报文挥手” 来释放连接

image-20230107195129635

数据传输结束后,TCP 通信双方都可以释放连接

现在 TCP 客户进程和 TCP 服务器进程都处于 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态


假设 TCP 客户进程的应用进程通知其主动关闭 TCP 连接

TCP 客户进程会发送 TCP 连接释放报文段

  • 并进入 终止等待 1 状态 \color{blue}终止等待1状态 终止等待1状态

该报文段首部中终止位 FIN 和确认位 ACK 的值被设置位 1 1 1

  • 表明这是一个 TCP 连接释放报文段

同时也对收到的报文段进行确认。

假定序号 seq 字段的值设置为 u u u

  • 其等于 TCP 客户进程之前已传送的、数据的最后一个字节的序号 + 1 1 1

注意TCP 规定终止位 FIN 等于 1 1 1 的报文段即使不携带数据,也要消耗掉一个序号

确认字段 ack 值设置为 v v v

  • 它等于 TCP 客户端进程之前已收到的、数据的最后一个字节的序号 + 1 1 1

image-20230107211818074


TCP 服务器进程收到一个 TCP 连接释放报文段后,会发送一个普通的 TCP 确认报文段

  • 并进入 关闭等待状态 \color{blue}关闭等待状态 关闭等待状态

该报文段首部中确认位 ACK 的值被设置位 1 1 1

  • 表明这是一个普通的 TCP 确认报文段

序号 seq 字段的值设置为 v v v

  • 其等于 TCP 服务器按进程之前已传送的数据的最后一个字节的序号 + 1 1 1
  • 这也与之前收到的 TCP 连接释放报文段中的确认号匹配

确认号 ack 的值设置为 u + 1 u+1 u+1

  • 这是对 TCP 连接释放报文段的确认

image-20230107212135879


TCP 服务器进程这时应通知高层应用进程:

  • TCP 客户进程要断开于自己的 TCP 连接

此时从 TCP 客户进程到 TCP 服务器进程这个方向的连接就释放

这时的 TCP 连接属于 半关闭状态 \color{blue}半关闭状态 半关闭状态

  • 也即是 TCP 客户进程已经没有数据要发送了

TCP 服务进程如果还有数据要发送,TCP 客户进程仍要接收

  • 也就是说从 TCP 服务器进程到 TCP 客户进程这个方向的连接并没有关闭

这个状态可能会持续一段时间

image-20230107212725360


TCP 客户进程在收到 TCP 确认报文段后就进入 终止等待 2 状态 \color{blue}终止等待2状态 终止等待2状态

  • 等待 TCP 服务器进程发出的 TCP 连接释放报文段

若使用 TCP 服务器进程的应用进程已经没有数据要发送了

  • 应用进程就通知其 TCP 服务器进程释放连接

由于 TCP 连接释放是由 TCP 客户进程主动发起的

  • 因此 TCP 服务器进程对 TCP 连接的释放称为被动关闭连接

image-20230107213048594


TCP 服务器进程发送 TCP 连接释放报文段

  • 并进入 最后确认状态 \color{blue}最后确认状态 最后确认状态

该报文段首部中终止位 FIN 和确认位 ACK 的值被设置位 1 1 1

  • 表明这是一个 TCP 连接释放报文段

同时也对收到的报文段进行确认。

假定序号 seq 字段的值设置为 w w w

  • 因为这是半关闭状态下,TCP 服务器进程可能又发送了一些数据

确认号 ack 字段的值为 u + 1 u + 1 u+1

  • 这是对之前收到的 TCP 连接释放报文段的重复确认

image-20230107213746249


TCP 客户进程必须针对该报文段发送普通的 TCP 确认报文段

  • 之后进入时间 等待状态 \color{blue}等待状态 等待状态

该报文段首部中的确认位 ACK 的值被设置为 1 1 1

  • 表明这是一个普通的 TCP 确认报文段

序号 seq 字段的值设置为 u + 1 u + 1 u+1

  • 这是因为 TCP 客户进程之前发送的 TCP 连接释放报文段虽然不携带数据,弹药消耗掉一个序号

确认号 ack 字段的值为 w + 1 w + 1 w+1

  • 这是对之前收到的 TCP 连接释放报文段的确认

image-20230107214200266


TCP 服务器进程收到该报文段后就进入 关闭状态 \color{blue}关闭状态 关闭状态

TCP 客户进程还要经过 2 M S L 2MSL 2MSL 后才能进入 关闭状态 \color{blue}关闭状态 关闭状态

MSL(Maximum Segment Lifetime)意思是 最长报文段寿命 \color{red}最长报文段寿命 最长报文段寿命RFC793 建议为 2 2 2 分钟。

  • 就是说 TCP 客户进程进入时间等待状态后,还要经过 4 4 4 分钟才能进入关闭状态
  • 这完全是从工程上考虑

对于现在的网络 MSL 取为 2 2 2 分钟可能太长了,因此 TCP 允许不同的实现可根据具体情况使用更小的 MSL

image-20230107214446487


3、TCP 客户进程进入时间等待状态 2MSL后才进入关闭状态

那么,TCP 客户进程在发送完最后一个确认报文段后,为什么不直接进入关闭状态,而是要进入时间等待状态 2 M S L 2MSL 2MSL 后才进入关闭状态

  • 是否要必要呢?

TCP 服务器进程发送 TCP 连接释放报文段后进入最后确认状态

TCP 客户进程收到该报文段后,发送普通的 TCP 确认报文段

  • 并进入关闭状态而不是时间等待状态

然而,该 TCP 确认报文段丢失了

  • 这必然会造成 TCP 服务器进程对之前所发送的 TCP 连接释放报文段的超时重传
  • 并仍处于最后确认状态

重传的 TCP 连接释放报文段到达 TCP 客户进程

由于 TCP 客户进程属于关闭状态,因此不理睬该报文段

  • 这必然会造成 TCP 服务器进程反复重传 TCP 连接释放报文段
  • 并一致处于最后确认状态而无法进入关闭状态

image-20230107215316090

因此,时间等待状态以及处于该状态 2 M S L 2MSL 2MSL 时长可以确保 TCP 服务进程可以收到最后一个 TCP 确认报文段而进入关闭状态


另外,TCP 客户进程在发送完最后一个 TCP 确认报文段后,在经过 2 M S L 2MSL 2MSL 时长

  • 就可以使本次连接持续时间内所产生的所有报文段都从网络中消失

这样就可以使下一个新的 TCP 连接中,不会出现旧连接中的报文段


4、TCP中保活计时器的作用

如下所示,TCP 双方已经建立了 TCP 连接

突然 TCP 客户进程所在的主机突然出现了故障

  • 显然,TCP 服务器进程就不能再收到 TCP 客户进程发来的数据

image-20230107215901723

因此,应当有措施使 TCP 服务器进程不能再白白等待下去

  • 即:TCP 服务器进程应该如何发现这种情况呢?

方法就是使用 保活计时器 \color{red}保活计时器 保活计时器

TCP 服务器进程每收到一次 TCP 客户进程的数据,就重新设置并启动保活计时器( 2 2 2 小时定时)。

若保活计时器定时周期内未收到 TCP 客户进程发来的数据

  • 则当保活计时器到时后,TCP 服务器进程就向 TCP 客户进程发送一个探测报文段,以后则每隔 75 75 75 秒钟发送一次。

    若一连发送 10 10 10 个探测报文段后仍无 TCP 客户进程的响应,TCP 服务器进程就认为 TCP 客户进程所在主机出了故障,接着就关闭这个连接。


5、小结

image-20230107220132709

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154778.html

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

相关文章

k8s 文件 目录挂载

k8s 文件 目录挂载1.环境说明2.HostPath 挂载至宿主机3.挂载至nfs3.1 第一种3.2 第二种3.3 volumeClaimTemplates 挂载模板4.emptyDir-临时数据卷5.未完待续1.环境说明 k8s 1.24.3 2.HostPath 挂载至宿主机 apiVersion: v1 kind: Pod metadata:name: test-pd spec:container…

【Git 从入门到精通】Git是干什么的?

文章目录一、Git简介1.发展历史2.工作机制分析3.代码托管中心二、理解版本控制1.什么是版本控制?2.版本控制的好处3.版本控制的手段①集中式版本控制工具②分布式版本控制工具一、Git简介 Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处…

Spool Print Fool(CVE-2022-21999 )提权漏洞

Spool Print Fool(CVE-2022-21999 )提权漏洞 文章目录 一、Print Spooler 简介二、漏洞简介三、影响版本四、本地复现五、漏洞修复 一、Print Spooler 简介 Print Spooler是打印后台处理服务,即管理所有本地和⽹络打印队列及控制所有打印⼯作…

Scala 模式匹配

文章目录Scala 模式匹配一、模式匹配1、基本语法2、语法说明3、案例示例二、模式守卫三、模式匹配类型1、匹配常量2、匹配类型3、匹配数组Scala 模式匹配 一、模式匹配 Scala 中的模式匹配类似于Java中的switch语法,但是scala 从语法中补充了更多的功能&#xff0…

Optional更优雅的判空

我们在日常的开发工作最经常碰到的异常就是空指针异常,排查起来非常麻烦影响开发效率。如果想避免这种问题,就要写大量的if(xx ! null){}这样的冗余代码,把自己的逻辑写入到括号内部,这样的代码看起来臃肿繁琐。JDK8中为我们提供了…

IP 分支组网解决方案

IP 分支机构组网解决方案在总部部署高性能设备作为中心网关,在各地分支机构分别部署一台产品作为分支机构接入网关,与总部网关进行加密的连接。融合多种产品特性,可有效、快速、安全的实现分支机构的远程接入。同时,采用集中管控平…

对象,类与面向对象编程 上

目录 前言 理解对象 属性的类型 数据属性【Data Properties】 访问器属性【Accessor Properties】 合并对象 对象标识及相等判定 增强的对象语法 1. 属性值简写 2.可计算属性 3.简写方法名 4.对象解构 5.嵌套解构 创建对象 工厂模式 构造函数模式 原型模式 原型…

【敲敲云】零代码平台快速入门指南—上篇

本文通过快速搭建一个《客户管理》应用,帮您快速掌握搭建敲敲云应用的基本思路和操作。 一、敲敲云简介 敲敲云是一个APaaS平台,零代码的应用搭建平台,无需编程简单易学,可以帮助业务人员在不写代码的情况下搭建个性化的CRM、ERP、OA等。敲敲云支持自动化工作流还可…

GIOU 附图说明

在目标检测中,常用IOU评价检测框和ground truth框的相似程度, IOU intersection / union. IOU的取值范围是[0,1]. 但是看下面这两种情况,两个目标框的距离是不一样的,这时它们的IOU都是0,反映不出来。 这时就可以用到…

【JavaGuide面试总结】Linux篇

【JavaGuide面试总结】Linux篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型1.介绍一下inode 硬盘的最小存储单位是扇区(Sector),块(block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是 4kb,约为 8 个连续的扇区…

Linux系统编程——共享内存映射(进程间通信)

目录mmap函数1.函数原型2.建立映射区3.注意事项4.父子进程间mmap通信4.无血缘关系进程间mmap通信写进程:读进程:附:文件用于进程间通信mmap函数 1.函数原型 void *mmap(void *addr,size_t length, int prot,int flags&#xff0…

代码随想录训练营第五十六天

1.两个字符串的删除操作 题583 ①dp数组含义 由于有两个数组比较,所以用二维数组dp。dp[i] [j]表示以i-1为结尾的word1和以j-1为结尾的word2达到相等需要删除的元素的个数。 ②递推公式 两种情况,当word[i-1] word2[j-1]时,有没有i-1为结…

【Linux】gcc编译器的使用(程序的翻译过程)

目  录1 程序的翻译1.1预处理(进行宏替换)1.2 编译(生成汇编代码)1.3 汇编(生成机器可识别代码)1.4 链接(生成可执行文件或者库文件)1.5 gcc常用选项总结程序的翻译过程包括&#…

Diffie-Hellman密钥协商算法探究

作者 | 魔王赵二狗 导读 隐私计算(Privacy-preserving computation)是指在保证数据提供方不泄露原始数据的前提下,对数据进行分析计算的一系列信息技术,保障数据在流通与融合过程中的可用不可见。而Diffie–Hellman密钥协商是一种…

2023-01-10 mysql列存储引擎-聚合多线程并行扫表-VCPackGuardian策略LOCK_ALL-概要设计

摘要: 当前的pack淘汰策略为LOCK_ONE, 在多线程切换时导致pack地址丢失。 新设计LOCK_ALL策略以保证多线程聚合正常工作。 设计思想: 多线程聚合运算期间, 对持有的pack不做淘汰业务中对pack的读取和释放保持原有逻辑架构设计: 静态结构: 动态结构: 上层业务通过VirtualCol…

【学习笔记之Linux】工具之vim基本介绍

vim基本认识 vim是一种多模式的编辑器,它是vi的升级版本,它兼容vi所有的指令并加入了一些新的特性在里面。vi是一个老式的文本编辑器,功能相当齐全,vim则是在vi之上更进了一步,拥有代码补全、编译及错误跳转等功能&…

pytorch OutOfMemoryError

torch.cuda.OutOfMemoryError before: self.memory deque(maxlen50000) after: self.memory deque(maxlen500) ok.... pytorch模型提示超出内存cuda runtime error(2): out of memory - pytorch中文网 看到这个提示,表示您的GPU内存不足。由于我们经常在PyTo…

做外贸有没有好的软件?

在外贸电商行业中,邮件营销是非常重要的一种营销方式之一。除了性价比高,他还能对目标客户进行精准营销。但是,对于刚开始做的公司来讲,不注意方法和细节也难收获到理想的营销效果。 一、问题 1)不管理邮箱联系人 只…

13.Isaac教程--模型制作

模型制作 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 该软件包演示了具有软件定义装配工作流程的工厂场景。 在模拟工厂环境中,多个 AMR 在装配站之间运输材料,而每个装配站的机械臂拾取所需材料并将其放置在对接的 …

自定义el-pagination分页

项目场景: 提示:这里简述项目相关背景: vue项目使用el-ui库,由于原本的el-pagination显示字段和样式无法满足其他项目的设计要求,需要进行改动 el-ui官网: 改动后: 解决方案: 1…