TCP 三次握手和四次挥手

news2025/1/16 19:00:00

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • TCP 建立连接(三次握手)
    • 为啥不能是 4 次?
    • 为啥不能是 2 次?
    • 三次握手的意义:
  • TCP 断开连接(四次挥手)
    • 为啥是 4 次?
    • 1.CLOSE_WAIT
    • 2.TIME_WAIT

TCP 的建立连接过程(三次握手)和断开连接过程(四次挥手)

TCP 建立连接(三次握手)

通信双方各自要记录对方的信息,彼此之间要相互认同。

举个栗子:

image-20230209174626534

这个过程中的每次通信,都称为是一次"握手"(形象的比喻)

上面的例子中进行了4 次交互,但是其中有 2 次可以合并成 1 次。

image-20230209175035100

总结:所谓的三次握手,本质上是四次交互。通信双方各自向对方发起一个建立连接的请求,然后再各自向对方回应一个 ack。这里其实是有 4 次信息交互,但是其中有 2 次交互是可以合并成 1 次交互的。因此就构成了三次握手。

为啥不能是 4 次?

  • 为啥要把中间这 2 次合并?不合并行嘛?

必须合并!

封装分用 2 次一定比封装分用 1 次,成本更高。

举个栗子:

我想在淘宝上买 3 样东西

假设我是在一个淘宝店铺下单的,通过多个订单来买的,此时店家是通过 3 个快递发给我?还是 1 个快递直接发了?分 3 次发,3 次包装成本,3 次快递费;1 次发了,1 次快递成本,1 次快递费。

为啥不能是 2 次?

  • 如果是 2 次握手,能否完成建立连接的过程?

不行!(无法完全验证双方的发送和接收能力)

除了,通信双方要彼此认同之外,三次握手还有别的作用。

三次握手另外一个重要作用:验证通信双方各自的发送能力和接收能力是否正常。

三次握手也是一定程度的保证了 TCP 传输的可靠性。(起的是辅助作用)

举个例子:

张三和李四打游戏开黑,需要连麦

image-20230210125334842

第一次交互:
当李四听到"听得到嘛",
李四就知道了:
1.张三的麦克风 ok
2.李四的耳机 ok
张三知道了:
(空)
第二次交互:
当张三听到"能听到",
张三就知道了:
1.张三的耳机 ok
2.李四的麦克风 ok
建立在第一次通信的基础上,
3.张三的麦克风 ok
4.李四的耳机 ok

第三次交互:
李四听到"好了"

意味着第二次通信李四说的"能听到"张三已经接收了

李四就知道了:
1.李四的麦克风 ok

2.张三的耳机 ok

此时,双方都知道了彼此的麦克风和耳机都是 ok 的

连接,包含连接的建立,断开和维护,三次握手只是建立这个环节。

“有连接”

1.需要连接先建立好,才能进行通信

2.如果连接断开了,此时就无法进行通信了。

3.连接建立过程中,通信双方要保存好对方的信息。

有没有连接和是否确认应答 没有任何关系。

确认应答体现的是可靠传输,可靠传输和有连接是不相关的。

无连接,也可以可靠传输。eg:飞书/钉钉/企业微信,发个消息不需要建立连接,直接就能发,发个消息有个"已读"状态,这就相当于 ack

三次握手的意义:

1.让通信双方各自建立对对方的"认同"。

2.验证通信双方各自的发送能力和接收能力是否 ok.

3.在握手的过程中,双方来协调一些重要的参数。(比如 TCP 的序号不一定是从 1 开始编号的,双方协商从哪个数字开始编号)

TCP 通信过程中,有些数据通信双方要相互同步,此时就需要有这样的交互过程,恰好可以利用三次握手的机会,来完成数据的同步。

image-20230210134908439

客户端主动给服务器发起"建立连接请求",称为"syn",同步报文段

建立连接阶段,主要认识 2 个状态

1.LISTEN 服务器的状态

表示服务器已经准备就绪,随时可以有客户端来建立连接。(相当于手机开机,信号良好,随时可以有人来打电话)

2.ESTABLISHED 客户端和服务器都有的状态

连接建立完成,接下来可以进行通信了。(相当于电话打过去,对方接通了)

TCP 断开连接(四次挥手)

"挥手"和"握手"都是客户端服务器之间的数据交互。

四次挥手和三次握手非常类似。通信双方给对方发起"断开连接请求",然后再各自给对方一个回应。

image-20230210141849587

为啥是 4 次?

  • 在断开连接过程中,中间两次,通常情况下不能合并(特殊情况下可以)

两个数据发送的时机相同才能合并,不同就不能合并。

举个栗子:
我要在淘宝上买 3 样东西。
从同一个店铺买。

如果这 3 个订单是同一时间下的,此时就可以一个包裹发过来,

如果是分开下的呢?

如果是今天买了 A,过了一周买了 B,再过一个月买了 C。此时就只能分成多个包裹发货了。

三次握手的中间 2 次能够合并,是因为他俩是同一时机。具体来说,三次握手 这 3 次交互过程是纯内核完成的(应用程序感知不到,也干预不了)

服务器的系统内核收到 syn 之后,就会立即发送 ack ,也会立即发送 syn

image-20230210160216648

FIN 的发起,不是由内核控制的,而是由应用程序调用 socket 的 close 方法(或者进程退出),才会触发 FIN。

ACK 是由内核控制的,是收到 FIN 之后,立即返回 ACK

所以第 2 步的 ACK 和第 3 步的 FIN ,这两者之间就会隔了一个时间差,这个时间是长是短得看具体代码的实现。

之前写过的 TcpEchoServer 代码:

image-20230210161916246

image-20230210162620873

image-20230210162632015

image-20230210165419376

四次挥手中涉及到的 2 个重要的 TCP 状态

1.CLOSE_WAIT

出现在被动发起断开连接的一方。

建立连接一定是客户端主动发起请求;而断开连接有可能是客户端主动发起,也可能是服务器主动发起。

举个栗子:

谈恋爱追人的时候一般是男生主动。但是分手的时候可以是男生提分手也可以是女生提分手

等待关闭(等待调用 close 方法关闭 socket)

收到 FIN 并立即返回 ACK 之后状态就设置成 CLOSE_WAIT,下一步就应该轮到应用程序调用 close 完成后续的 2 次挥手。

2.TIME_WAIT

出现在主动断开连接的一方。

假设是客户端主动断开连接,当客户端收到 第 3 次 FIN 并 返回第 4 次 ACK 之后 TCP 就进入 TIME_WAIT 状态。

此时相当于 4 次挥手都挥完了。

此时这里的 TIME_WAIT 要保持 当前的 TCP 连接状态不要立刻就释放。

  • 为啥不要立即释放,为啥要以 TIME_WAIT 保留一会儿连接?

最后这个 ACK 才刚发出去,对方还没有收到呢,万一丢包了呢。

在三次握手和四次挥手的过程中也是同样存在"超时重传"的。

如果最后一个 ACK 丢包了,站在服务器的视角来看,服务器不知道是因为 ACK 丢了还是自己发的 FIN 丢了,所以统一视为 FIN 丢了,统一进行重传操作。

既然服务器可能会重传 FIN,客户端就需要针对这个重传的 FIN 进行 ACK 响应。如果刚才把连接彻底释放了这样的话 ACK 就没办法进行了。

因此使用 TIME_WAIT 状态保留一段时间,就是为了能够处理最后一个 ACK 丢包的情况,能够在收到重传的 FIN 进行 ACK 响应。

TIME_WAIT 会等,如果等了一段时间也没有收到这个重传的 FIN,此时就认为 最后一个 ACK 没丢,此时就彻底断开连接了。

  • TIME_WAIT 具体保持多长时间就真正释放呢?

约定一个时间,2 MSL

MSL 指的是互联网上,两个结点之间,数据传输消耗的最大时间。

MSL 具体是几?

通常情况下这个值是 60 s

MSL 相当于是一个经验值。按照一般的经验来说,绝大部分数据报传输的时间都不会超过 MSL

如果经历了 2 MSL 还没有收到重传的 FIN,此时就认为最后一个 ACK 成功到达了(认为对方没有重传 FIN)

image-20230210171759848

  • 是每个状态都等 2 MSL 吗?

TIME_WAIT 才是等这个时间,其他的交互过程都是跟着超时重传的时间阈值走的

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

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

相关文章

前端报表如何实现无预览打印解决方案或静默打印

在前端开发中,除了将数据呈现后,我们往往需要为用户提供,打印,导出等能力,导出是为了存档或是二次分析,而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑, 而前端打印可…

Android Binder机制之一(简介)

目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了,其实每次看都有新的收获&…

Docker搭建本地私有仓库

目录 一、本地私有仓库的优点 二、Docker搭建本地私有仓库 2.1、首先下载 registry 镜像 2.2、在 daemon.json 文件中添加私有镜像仓库地址 2.3、运行 registry 容器 2.4、Docker容器的重启策略 2.5、为镜像打标签 2.6、上传到私有仓库 2.7、私有仓库的 centos 镜像有…

Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中

Cubox是什么应用? Cubox 是一款跨平台的网络收藏工具,通过浏览器扩展、客户端、手机应用、微信转发等方式,将网页、文字、图片、语音、视频、文件等内容保存起来,再经过自动整理、标签、分类之后,就可以随时阅读、搜索…

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

windeployqt实现一键打包

每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…

前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码

前端与数据展示 前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此前端最重要的能力是需要将数据呈现给用户后,与终端用户进行交互。 在前端拿到数…

【Linux】宝塔面板 SSL 证书安装部署

宝塔面板 SSL 证书安装部署前言证书下载宝塔配置SSL注意事项前言 前期有讲过Tomcat和Nginx分别部署SSL证书,但也有好多小伙伴们私信我说,帮忙出一期宝塔面板部署SSL证书的教程,毕竟宝塔的用户体量也是蛮大的,于是宠粉的博主&…

基于地基激光雷达数据和深度学习的Faster R-CNN的橡胶树个体分割

Paper题目:Individual Rubber T ree Segmentation Based on Ground-Based LiDAR Data and Faster R-CNN of Deep Learning Abstract 中国南方的橡胶树经常受到可能导致树体倾斜的自然干扰的影响。从扫描点云中对单个橡胶树进行准确的树冠分割是准确检索树参数的必…

前端 ES6 之 Promise 实践应用与控制反转

Promise 主要是为解决程序异步处理而生的,在现在的前端应用中无处不在,已然成为前端开发中最重要的技能点之一。它不仅解决了以前回调函数地狱嵌套的痛点,更重要的是它提供了更完整、更强大的异步解决方案。 同时 Promise 也是前端面试中必不…

玩转系统|初遇ChatGPT,我和TA的第一次约会

最近互联网圈子有一个非常火爆的话题ChatGPT,短短一周的时间就有上百万的用户,如果你不是程序员,也许会问这到底是个什么玩意?ChatGPT是什么?ChatGPT,美国“开放人工智能研究中心”研发的聊天机器人程序 [1…

CAPL(vTESTStudio) - DoIP - TCP接收_04

TCP接收 函数介绍 TcpOpen函数

LeetCode刷题系列 -- 59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n 3输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n 1输出&#xff1…

以后更新功能,再也不用App发版了!智能小程序将为开发者最大化减负

在 IoT 时代,越来越多的企业意识到打造自有 App 对于品牌的重要性。作为智能设备不可或缺的控制终端,App 具备连接用户、完善服务、精细化运营用户的独特优势,可帮助企业大大提升品牌竞争力。 为了帮助品牌企业打造更具个性化、差异化的智能…

MoveIT Rviz和Gazebo联合仿真

文章目录环境安装概述ros_control框架ros_control数据流文件配置附加工具故障问题解决参考接前两篇:ROS MoveIT1(Noetic)安装总结 Solidworks导出为URDF用于MoveIT总结(带prismatic) MoveIT1 Assistant 总结 环境 Ubu…

网络安全协议(3)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.当前流行操作系统的安全等级 1.Windows的安全等级 什么是EAL…

不花钱体验最近火出圈的 ChatGPT 是真的

OpenAI 发布的 ChatGPT,一经发布在科技圈就火得不行了! ChatGPT 是什么呢? 它是一款由 OpenAl 开发的语言模型产品,它能够模拟人类的语言行为,与用户进行自然的交互。ChatGPT 基于GPT-3.5(Generative Pre…

linux基本功系列之lsof命令实战

文章目录前言一. lsof命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示系统打开的文件3.2 查找某个文件相关的进程3.3 列出某个用户打开的文件信息3.4 列出某个程序进程所打开的文件信息3.5 查看某个进程号打开的文件3.6 列出所有的网络连接3.7 列出谁在使用某个端口3.8 恢…

OSS(Object Storage Service)进行上传图片,下载图片(详细看文档可以完成操作)

文章目录1.单体前后端项目上传1.上传流程2. BuckName 和EndPoint3. AccessKey 和Access Secret(创建RAM(Resource Access Manage)的子账号,然后可以获得Accesskey和Acess Secret)3.根据创建的子账号分配OSS的所有权限(可以对文件进行上传&…

【年度总结】回望大学四年坎坷的2022

【年度总结】回望大学四年&坎坷的2022 2022年,我毕业了! 满心欢喜的离开,到现在看来,却甚是想念大学的时光。 这一年,绝对是我此生过的最难的一年。考研失利、工作不顺、投资失败、“财政”赤字...... 现在的我…