【TCP】连接管理:三次握手和四次挥手

news2024/12/23 5:38:26

连接管理

  • 建立连接:三次握手
  • 断开连接:四次挥手
    网络中的握手/挥手,就是发送不携带业务数据(没有载荷,只有报头)的数据包,但是能起到“打招呼”这样的效果。次数就是指网络通信的次数。

建立连接:三次握手

image.png

此处建立连接发送的 SYN 是同步的意思,可以延伸成:客户端希望服务器和它统一步调,来完成手续的传输
建立连接是一个“双向的操作”,连接是“抽象的连接”,代表通信双方各自保存对方的信息

  • A 需要给 B 说:我想和你建立连接(A 想保存 B 的信息),之后返回应答(ACK
  • B 也需要给 A 说:我也想和你建立连接(B 想保存 A 的信息),之后返回应答(ACK
    本来是四次握手,但是中间两次合并了,就成了三次握手,合并是很重要、很有意义的,要是分两次发送,效率就会打折扣,因为每个数据包都需要进行一系列封装分用
    image.png|421
  • 收到 ACK/SYN 都会使报头中的对应值由 0 变为 1

三次握手的意义

三次握手要解决什么问题?为什么要三次握手?意义何在?

三个方面:

  1. 投石问路的效果,初步验证通信的链路是否畅通
    先通过一些没什么业务意义的报文,来验证一下这个路是不是通的,这是进行可靠传输的“前提条件

例如:地铁需要在每天开始第一班车之前,空跑一趟,进行“链路畅通的验证”

  1. 可以确认通信双方的发送能力和接受能力是否都正常
    除了关注中间的路线,还要关注两头的双方的接法能力是否正常

例如:你要和朋友一起玩游戏,事先你们先要确保双方的耳机和麦克风都是正常的image.png|286

  1. 第一次挥手:
    • 你这边仍然都不了解双方的能力
    • 朋友那边听到“嘿”,意味着他知道了你的麦克风正常他的耳机正常。但他不知道我的耳机和他的麦克风是否正常
  2. 第二次挥手:
    • 朋友说“喵喵”,他仍不确定他自己的麦克风和我的耳机是否正常
    • 你听到了“嘿嘿”,你就知道了你的耳机正常朋友的麦克风正常。由于你们事先约定好了,他一定要在听到你说“嘿”之后再回复,所以你也就知道了你的麦克风正常他的耳机正常。此时,你就知道了双方的耳机和麦克风都是正常的
    • 你的验证完成
  3. 第三次挥手:
    • 我再说“嘿嘿嘿”,把我掌握的信息同步给他
    • 朋友听到“嘿嘿嘿”,由于我们实现约定好我一定是在听到他说 "嘿嘿"之后我再回复。因此,他听到了“嘿嘿嘿”,意味着他刚才说的“嘿嘿”被我收到了,他也就知道了他的麦克风正常你的耳机正常
    • 朋友的验证完成
  • 针对 TCP 来说,必须要通过三次握手来验证双方的发送和接收能力。但其他协议就不一定是三次了
  1. 让通信双方在进行通信之前,对通信过程中需要用到的一些关键参数进行协商

TCP 通信时,起始数据的序号,就是通过三次握手协商确定的(换而言之,TCP 序号并不是从 1 开始的)

  • 每次建立连接,TCP 的起始序号都不同,而且故意差别很大
  • 避免出现“前朝的剑,斩本朝的官image.png|494
    • A 和 B 后来又建立连接,虽然还是 A B 两个主机之间的连接,但可能变成不同的应用程序了
    • 在传输业务数据的过程中,可能有某个数据包“迷路”了,饶了一大圈,最终才到达对端。当他到达的时候,已经“改朝换代了”,已经不是原来那个连接了
      • 针对这样的“迟到”的数据包,就要将其丢弃掉,不能按照正常的流程处理这里的数据了,避免其在新的程序中产生负面的影响
      • 对于 B 来说,就要区分当前收到的数据是“本朝”还是“前朝”的
        这样,就可以给每个连接都协商不同的起始序号,如果发现收到的数据和起始序号以及和最近收到的数据序号差别都很大的话,就视为这个数据就是“前朝”的数据

网上有些资料说“TCP 的可靠性是通过三次握手体现的”,这句话是有些问题的

  • 三次握手对于可靠性,是有一定的支持的
  • 但是不能说可靠性就是三次握手体现的
    • 因为三次握手只是建立连接的时候进行的,一旦连接建立好了之后,数据开始传输了,就和三次握手没关系了
    • 传输数据过程中的可靠性是通过“确认应答”和“超时重传”来体现的

断开连接:四次挥手

优雅地断开连接,双方各自删除掉保存的对方的信息
断开连接不一定是“客户端主动”,服务器也可以主动断开

image.png|408

  • 通信双方各自给对方发送 FIN,各自给对方返回 ACK
    • A:“B 兄,我要把你删了“==> FIN
    • B:“好的“==> ACK
    • B:“A 兄,那我也把你给删了哦”==> FIN
    • A:“好的”==> ACK

三次握手和四次挥手的执行区别

三次握手,只有三次是因为中间两次的交互合并在一起了。但对于四次握手来说,中间两次却不一定能合并(大概率是不能)

  • 因为对于三次握手来说,中间的两次(ACK+SYN)都是在内核中由操作系统负责进行的,时间都是在收到 SYN 之后,此时同一时机,就可以合并了
  • 对于四次挥手来说,ACK 是由内核控制的(就是说系统只要收到 FIN 就会立刻返回一个 ACK),但是 FIN 的触发则是通过应用层程序调用 close / 进程退出 来触发的
    • 代码中:socket.close() ==>系统内部:发送 FIN
    • 如果代码没有执行 close(),系统内部就不会发送 FIN,所以中间发送 ACKFIN 之间是有时间间隔

image.png

TCP的状态

  • LISTEN:服务器进入的状态,服务器把端口绑定好,就相当于进入了 LISTEN 状态,此时服务器就已经初始化完毕,准备好随时迎接客户端了(手机开机,信号良好,随时可以有人打电话
  • ESTABLISHEDTCP 连接建立完成(保存好了对方的信息了),接下来就可以进行业务数据的通信了(电话接通,可以说话
  • CLOSE_WAIT:被动断开连接的一方会进入的状态,先收到 FIN 的一方。等待代码执行 close 方法。
    • 如果发现服务器这边存在大量的 CLOSE_WAIT 状态的 TCP 连接,说明了什么?
    • 说明此时服务器代码可能有 bug,排查 close 是否写了或者是否执行到了
  • TIME_WAIT:主动断开连接的一方会进入的状态,此处的 TIME_WAIT 按照时间来等待,达到一定时间后,连接也就释放了
    • 为什么不直接释放呢?
      • TCP 传输过程中,任何一个数据都会丢包,但丢包重传就好了,只要此处的连接还在,就能很好的处理这里的重传操作。保留 TIME_WAIT 状态就是为防止最后一个 ACK 丢包,这样即使丢包了也能进行重传 image.png|295
      • 如果最后一个 ACK 丢包了,此时 B 这边就会重传一次 FIN,需要 A 这边再发一次 ACK,但能够再发一次 ACK 的前提是 A 这边的连接还没有释放(如果连接释放了,就不知道对方的信息,无法返回任何数据了)
      • 如果 TIME_WAIT 状态保留了一段时间后,也没有收到重传的 FIN,就说明刚才的 ACK 应该就是到了,就可以释放这里的连接了
    • TIME_WAIT 存在的时间称为 2MSLMXL ==>数据包在网络传输中消耗的最大时间))

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

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

相关文章

【数学分析笔记】第2章第2节数列极限(3)

2. 数列极限 2.2 数列极限 2.2.5 数列极限的性质 保序性&#xff1a;【定理2.2.3】 { x n } , { y n } , lim ⁡ n → ∞ x n a , lim ⁡ n → ∞ y n b , a < b \{x_{n}\},\{y_{n}\},\lim\limits_{n\to\infty}x_{n}a,\lim\limits_{n\to\infty}y_{n}b,a<b {xn​},{yn…

Android强大的滚动控件RecyclerView

文章目录 Android强大的滚动控件RecyclerViewRecyclerView的基本用法RecyclerView实现横向滚动RecyclerView实现瀑布流布局RecyclerView**的点击事件 Android强大的滚动控件RecyclerView ListView由于其强大的功能&#xff0c;在过去的Android开发当中可以说是贡献卓越&#x…

C语言 | Leetcode C语言题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; int cmp(const void* _a, const void* _b) {int *a _a, *b (int*)_b;return *a *b ? 0 : *a > *b ? 1 : -1; }int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size,int* returnSize) {qsort(nums1, nums1Size, s…

你还在手动刷公众号吗?‌试试 RSS 订阅,‌让信息自动汇聚

微信对于反爬的限制非常严格&#xff0c;之前有很多的方案&#xff0c;最后都是被封杀了。我这里列出一些我知道的、实践过的方案。 ‍ RSSHub 在路由“社交媒体”以及路由“新媒体”上都有很多方案&#xff0c;我基本都试过&#xff0c;但这些平台要么是收费的&#xff0c;…

图像数据处理17

四、形态学图像处理 4.3 开运算与闭运算 4.3.1开运算与闭运算的定义&#xff1a; 开运算&#xff1a;先腐蚀&#xff0c;再膨胀 闭运算&#xff1a;先膨胀&#xff0c;再腐蚀 记忆方法&#xff1a;膨胀&#xff08;胀开&#xff09;所以开运算最后对应的结果是膨胀&#x…

学习GitHub:注册与Linux环境对工作内容进行库分支上传

在这个数字化时代&#xff0c;GitHub已成为开发者们不可或缺的宝藏库。无论你是编程新手还是资深开发者&#xff0c;GitHub都能为你打开一扇通往无限创意与协作的大门。今天&#xff0c;就让我们一起踏上这段探索之旅&#xff0c;从GitHub的注册开始&#xff0c;再到如何在Linu…

blender内置树木的UV

之前听说用这个内置插件可以创建树木 我这边的默认配置出来的树木长这样&#xff0c;不得不想一下&#xff0c;他的uv怎么展&#xff0c;看起来好多树 我尝试看了一眼默认的UV 结果如下 好像每个树枝都已经是平铺的样子了&#xff0c;那么如果需要改的话&#xff0c;就根据…

SpringBoot 整合 Excel 轻松实现数据自由导入导出

01、背景介绍 在实际的业务系统开发过程中&#xff0c;操作 Excel 实现数据的导入导出基本上是个非常常见的需求。 之前&#xff0c;我们有介绍一款非常好用的工具&#xff1a;EasyPoi&#xff0c;有读者提出在数据量大的情况下&#xff0c;EasyPoi 会占用内存大&#xff0c;…

DMS:直接可微的网络搜索方法,最快仅需单卡10分钟 | ICML 2024

Differentiable Model Scaling&#xff08;DMS&#xff09;以直接、完全可微的方式对宽度和深度进行建模&#xff0c;是一种高效且多功能的模型缩放方法。与先前的NAS方法相比具有三个优点&#xff1a;1&#xff09;DMS在搜索方面效率高&#xff0c;易于使用。2&#xff09;DMS…

Javascript嵌套函数的调用

这里其实还是讲讲我对javascript闭包的认识。js中闭包就是以嵌套函数的外表出现的。内容是我自己琢磨的&#xff0c;我估计如果这个问题了解很清楚的话&#xff0c;javascript的闭包就没有问题了。其实这里探讨的是一个非常司空见惯&#xff0c;但是可能很多人没有注意的细节。…

SQL-函数篇

在SQL中&#xff0c;函数是用于执行特定操作的预定义代码块。它们可以帮助我们处理字符串、数值、日期等数据类型。下面是一些常用的SQL函数及其用法。 下面是一些常用的函数&#xff1a; 字符串函数 字符串函数用于操作和处理字符串数据。 -- 将两个字符串连接起来 select c…

爱心动画代码HTML5

这段代码是一个HTML5 Canvas动画&#xff0c;它通过JavaScript创建了一个动态的爱心效果。页面初始化时&#xff0c;首先定义了一些基本设置&#xff0c;如粒子数量、持续时间、速度等。然后&#xff0c;定义了Point和Particle类&#xff0c;用于处理粒子的位置和运动。接着&am…

部署Nginx负载均衡+动静分离的群集

目录 一、Nginx应用 二、正向代理与反向代理 1.1正向代理 1.2反向代理 三、负载均衡 1.轮询&#xff08;Round Robin&#xff09; 2.最小连接数 3.IP hash: 4.加权轮询 5.最少事件算法 6.一致性hash 一、Nginx应用 Nginx是一款非常优秀的HTTP服务器软件 支持高达50 …

【生日视频制作】洪崖洞高大楼AE模板修改文字软件生成器教程特效素材【AE模板】

洪崖洞企业高大楼生日视频制作教程AE模板改文字特效生成器素材 怎么如何做的【生日视频制作】洪崖洞企业高大楼AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

【JAVA八股文】持续更新中...

【-------------数据类型------------】 一、基本类型、包装类型 基本类型&#xff1a;整型&#xff08;byte short int long &#xff09;浮点型&#xff08;float double&#xff09;布尔型&#xff08;boolean&#xff09; 字符型&#xff…

【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏

项目场景&#xff1a; 作为一个嵌入式软件开发者&#xff0c;有两个外接屏幕&#xff0c;不足为奇。 但是在今天的使用电脑过程中&#xff0c;出现了接了一个拓展坞上面有HDMI接口&#xff0c;但是HDMI接口接上外接显示屏的时候电脑无法识别到&#xff0c;导致只有电脑直连的HD…

安装Pentaho Data Integration并启动

“pdi-ce-9.3.0.0-428.zip”包在 “/opt/software/”目录下。 步骤详情 1. 解压zip包2. 启动 Pentaho Data Integration PDI&#xff08;Kettle&#xff09; GUI 界面 1. 解压zip包 因为 Kettle 是绿色软件工具&#xff0c;开箱即用&#xff0c;无须安装。首先进入“/opt/soft…

ansible 中剧本的书写与运行

1.更改配置文件vim /etc/ansible/hosts 2.测试m0主机与s0、s1、s2&#xff0c;之间可以ping通 [rootm0 ansible]# ansible group02 -m ping 3.书写脚本文件 [rootm0 ~]# vim test0001.yml ​ --- - hosts: group02remote_user: roottasks: ​- name:…

【Qt】常用控件QLabel

常用控件QLabel QLabel可以用来显示文本和图片。 QLabel的属性 其核心属性如下&#xff1a; 属性说明 text QLabel 中的⽂本 textFormat ⽂本的格式. Qt::PlainText 纯⽂本Qt::RichText 富⽂本(⽀持 html 标签)Qt::MarkdownText markdown 格式Qt::AutoText 根据⽂本内容…

uniapp 页面跳转传参:父页面监听子页面传过来的数据

父页面 监听events事件 uni.navigateTo({url: "/components/watermark-camera",events: { // 重点重点重点重点重点重点重点重点getImages(data) { // 接收子页面抛出的 getImages 事件console.log("水印相机的照片&#xff1a;", data)}}})子页面 const …