【网络原理】面试高频考点!!TCP协议“三次握手,四次挥手”,保姆级详解,建议收藏!

news2024/10/8 18:34:54

  💐个人主页:初晴~

📚相关专栏:计算机网络那些事


通过上篇文章,我们可以得知TCP通过 “确认应答” “超时重传”机制相辅相成,共同构建了 TCP的“可靠传输机制”。而为了保障建立通信和断开通信的可靠性,TCP还提供了“三次握手,四次挥手”的机制,来作为连接管理。

一、什么是“三次握手,四次挥手”

这里的“握手”与“挥手”(handshake),是一种形象的比喻。生活中握手就是一种打招呼的方式,挥手则是象征着“告别”,并没有什么实际的含义。网络中的握手与挥手,指发送不携带业务数据(没有载荷,只有报头)的数据包,起到类似打招呼或告别的效果。

事实上,握手指的就是建立连接的过程,挥手指的是断开连接的过程。

这里的连接并不是指拿个电线拴起来

  • 通信双方保存好对方的信息,就是建立连接的过程
  • 通信双方删除掉对方的信息,就是断开连接的过程

需要注意的是,在连接建立过程中,客户端主动发起连接请求;而在连接终止过程中,任何一方都可以首先提出关闭请求。此外,TCP连接的建立和终止都需要经过双方的确认,这也是“三次握手,四次挥手”的核心机制,让我们接着往下看

二、三次握手

1、三次握手的流程

  1. 第一次握手客户端向服务器发送一个SYN(同步序列号)段(即报头中的标志位“syn”值为1),表示客户端请求建立连接。这个段落包含一个初始序列号x,用于后续的数据确认。

  2. 第二次握手服务器接收到SYN段后,向客户端发送一个SYN+ACK(确认)段作为响应。这表示服务器同意建立连接,并且告知客户端它的序列号y,同时也确认了客户端的序列号。

  3. 第三次握手客户端接收到SYN+ACK后,向服务器发送一个ACK段确认服务器的序列号。至此,TCP连接建立完成,客户端和服务器可以开始数据交换。

完成以上步骤后,连接就建立完毕了。原本应该是四次交互,但是中间两次的执行时机差不多,于是系统内核就将这两次发送合并成了一次,目的是减少通信次数,提高效率。

这里的syn全称为synchronized,意为“同步的,锁”。在之前多线程的学习中是与加锁操作有关的关键字。而在此处,应该更偏向同步的意思,可以理解为客户端希望服务器与其统一步调,来完成后续的通信传输。

2、为什么是三次?

建立连接是一个“双向的操作”

  • A需要给B说,我想和你建立连接(A想保存B的信息)
  • B也需要给A说,我也想和你建立连接(B想保存A的信息)

每次请求,对方都需要做一条反馈,告诉发送方是否可以连接。因此,请求加上反馈至少就需要四次通信,而TCP将第2、3次合并到了一起,使得总共就变成了“三次握手”

举个例子:

现在有两名玩家 A 和 B 要互相连麦:

(1)玩家 A :“听得见吗?”

如果玩家 B能听到这句话,说明 A 的麦克风与 B 的耳机都能够正常使用,即 A 到 B 的通信正常。但 B 还不能确定 B 到A的通信是否正常,此时需要向 A 做出反馈

(2)玩家 B:“听得见,你能听见吗?”

如果 A 玩家能成功听见这句话,前半句“听得见”,回答了我之前的信息,A 就能知道 A 到 B 的通信正常;同时自己能听见这句话,也说明 B 的麦克风与 A 的耳机能够正常使用,即 B 到 A 的通信正常。此时 A 就能知道双方的麦克风与耳机都是正常的,但 B 还不知道,于是就需要再回答后半句 B 的问题,做出反馈:

(3)玩家 A:“听得见,我们可以开始聊天了”

当 B 听到这句话时,也就能确定双方的通信没有问题,接着就可以正常进行聊天了。

这里的麦克风就代表着发送能力耳机代表接收能力。因此“三次握手”的目的可以看做是确认通信双方各自的发送能力接收能力是否正常。 

  • 两次握手是不可行的,因为只有两次是无法完成通信双方各自的发送能力接收能力的验证的
  • 四次握手是可行的。理论上也至少要进行四次通信,只不过TCP将其优化成了三次。不过针对其它协议,握手过程就不一定是三次。

3、三次握手的意义

(1)如上文所述,验证双方的发送能力接收能力

(2)投石问路,初步验证通信链路是否通畅

比如我们日常乘坐的地铁,其实在第一班车发车之前,会先空跑一趟

目的是为了验证线路是否通畅,可以提前排查一些潜在的故障。如果在载客的情况下才发现线路故障的话,处理起来就会比较麻烦了,而相比之下空车做调整可就灵活多了。这里的空车就起到了“投石问路”的作用。

三次握手也是如此。相当于在正式通信前,先发了几个空载的报文“探路”,来“验证链路是否通畅”,相比于直接发送携带数据的报文来说,这种方式的代价就会比较小了。

(3)让通信双方在通信前,协商一些关键的参数

TCP通信时,起始数据的序号,就是通过三次握手来协商确定的。使得每次建立连接,TCP的起始序号都是不同的。其主要目的是避免“前朝的剑,斩本朝的官”

 该过程就是,A 和 B 正常连接的时候A发送了一个数据包,不过这个数据包传输的速度有些慢,在它传输的过程中,A 和 B 断开了连接,又重新建立起了连接。但此时虽然连接的还是 A 和 B 两个主机,但是可能已经是不同的应用程序了,相当于是“改朝换代”

而这个数据包就像是“旧朝遗老”,等它终于传输成功时,俨然已不是当年摸样。如果还去正常读取这个数据包,就会引起一系列问题。此时就需斩钉截铁,直接丢弃这个数据包。

为了达到这点,对于 B 来说,就需要区分,当前收到的数据时“本朝”还是“前朝”的。

于是,在每次连接时,都会尽量协商不同的起始序号,如果发现收到的数据,与起始序号差距非常大的话,就认为该数据是“前朝”的,会直接将其丢弃

三、四次挥手

1、四次挥手的流程

  1. 第一次挥手某一端(通常是从没有数据要发送的一端开始)决定关闭连接,并向另一端发送一个FIN(终止)段(标志位FIN值为1),表示它已经完成了数据发送任务。

  2. 第二次挥手接收FIN段的一端(服务器)会发送一个ACK确认段,确认接收到FIN段。此时,连接还没有完全关闭,因为这一端可能还有数据需要发送。

  3. 第三次挥手:当接收FIN段的一端完成数据发送后,它会发送自己的FIN段给最初发送FIN的一端。

  4. 第四次挥手最初发送FIN段的一端接收到对方的FIN段后,会发送ACK确认段,表明所有数据已接收完毕,连接可以关闭。此时,TCP连接正式关闭

这里的标志位“FIN”意为“Finnish”,可以理解为通信连接的终止。即双方各自把对端的信息删掉

  • 为什么流程看起来差不多,握手能优化成三次,而挥手则必须要四次?
  • 对于三次握手来说,中间的两次,ACK+SYN都是在内核中,由操作系统负责进行的。并且执行时机都是在收到发送方的 SYN 之后,同一时机,于是就直接将它们合并了
  • 对于四次挥手来说,ACK内核控制的,但是 FIN 则是通过应用程序调用 close/进程退出,来触发的,在实际执行中,这两个操作的执行时机大概率是不同的,由于执行到close前可能还要完成一系列操作,所以一般 FIN 执行都会晚于 ACK,而且很可能相差会很大。因此大部分情况下,都不会把这两个操作合并

比如在代码中调用socket.close() 时,系统内部就会发送 FIN


四、TCP的状态转换

TCP连接状态反映了TCP连接的不同阶段。这些状态可以帮助理解连接的生命周期,让我们更好地理解“三次握手,四次挥手”的流程:

 大多数状态上图中都有体现,博主接下来就主要介绍几个比较特殊的状态吧

LISTEN

  • 服务器监听客户端的连接请求。服务器把端口绑定号,就相当于进入 LISTEN 状态了。此时服务器已经初始化完毕,准备好随时迎接客户端

ESTABLISHED

  • TCP连接建立完成,可以进行业务数据的通信了。客户端和服务端都会进入的状态

 CLOSE_WAIT

  • 被动断开连接的一方,会进入这个状态。先接收到“FIN”的一方,会等待代码执行“close()”方法

如果发现,服务器端存在大量的 CLOSE_WAIT 状态的TCP连接,就说明服务器代码可能出现bug了。这时需要排查服务端代码,看看是否写了 close() ,以及是否能够及时执行。

TIME_WAIT

  • 主动断开连接的一方,会进入这个状态。一旦接收到对端的FIN段并回复了ACK,它就会进入TIME_WAIT状态。在此状态下,TCP连接保持打开一段时间。(通常是2MSL,即两倍的最大段生存时间),以确保对方的ACK段能够到达,从而确保连接正确关闭。

这时有人可能会问了,为啥不直接释放,还有等一段时间呢?

主要是为了防止最后的ACK丢包。如果最后一个ACK丢包了,此时 B 就会重传一次FIN。如果A立刻断开了连接,也就无法收到重传的FIN,更无法重新发送一次 ACK。这样 B 端就会进入死循环,迟迟无法真正断开连接

于是就让 A 先等待一段时间,如果这段时间内都没有收到 B 重发的 FIN,就可以认为之前发的 ACK成功送达了,这时才真正释放掉连接

注意:

这里的等待时间一般设置为 2MSL,其中MSL为数据报在网络传输中消耗的最大时间,不同的系统会有所差别,比如 Linux 默认为60s。这样就能确保ACK一定能够送达了


那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

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

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

相关文章

【Orange Pi 5嵌入式应用编程】-用户空间BH1750环境光传感器驱动

BH1750环境光传感器驱动 文章目录 BH1750环境光传感器驱动1、BH1750传感器介绍2、BH1750测量流程及寄存器2.1 BH1750功能结构2.2 BH1750流量流程2.3 BH1750的控制指令2.4 BH1750通信时序2.4.1 连续高分辨模式2.4.2 单次低分辨模式2.4.3 传感器灵敏度调整3、BH1750FVI驱动实现3.…

JavaEE: 深入解析HTTP协议的奥秘(3)

文章目录 HTTP认识 "报头"(Header)认识 "状态码"(status code) HTTP JavaEE: 深入解析HTTP协议的奥秘(2) 书接上文~ 认识 “报头”(Header) Header 的整体的格式是"键值对"结构. 每个键值对占一行,键和值之间使用分号分隔. Host 表示服务器主…

JVM实现跨平台的关键因素:class文件和“翻译器”

文章目录 前言关键因素:class文件class文件格式说明Java 源代码在class文件中的体现涉及到的知识点(面试题) 关键因素:“翻译器”解释器即时编译器(JIT) 总结 前言 当你通过上文对JVM有了初步的认识后&…

【电路】1.3 电功率和能量

1.3 电功率和能量 电是一种能量存在形式。 1.3.1 电压的定义 将单位正电荷由A点移动至B点,电场力所做的功是 w w w,则 u A B d w d q u_{AB}\frac{dw}{dq} uAB​dqdw​, w w w是功, q q q是电荷量从A到B,沿着任意路…

Squid + Stunnel 配置

环境: 亚马逊服务器一台:3.26.80.132 华为云服务器一台:122.59.52.68 客户机一台: Win11 实现的需求:客户机通过设置华为云代理,实现透过亚马逊服务器上网 一、亚马逊服务器 1、安装Squid https://bl…

刚转Mac的新手如何卸载不需要的应用程序

最开始转Mac系统的时候很是苦恼,到底该怎么卸载App啊,App直接拖到废纸篓真的能卸载干净吗,卸载App时会不会留下一些文件残留,慢慢的会不会占满内存,于是我找到了一个免费的卸载工具——XApp。 这是一款Mac应用程序卸载…

《贪吃蛇小游戏 1.0》源码

好久不见&#xff01; 终于搞好了简易版贪吃蛇小游戏&#xff08;C语言版&#xff09;&#xff0c;邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…

某国有资本运营中心人才选拔项目纪实

某国有资本运营中心人才选拔项目纪实 【客户行业】 政府与事业单位 【问题类型】 人才招聘选拔 【客户背景】 在三年国企改革过程中&#xff0c;南方某省政府为响应国家政策&#xff0c;提出组建专业化国有资本投资运营公司&#xff0c;大力开展专业化资本运营&#xff0c;…

016 规格参数

文章目录 新增AttrController.javaAttrVo.javaAttrServiceImpl.javaAttrAttrgroupRelationEntity.javaAttrEntity.javaAttrGroupEntity.java 查询AttrController.javaAttrServiceImpl.javaAttrRespVo.java 修改回显AttrController.javaAttrServiceImpl.java 修改提交AttrContro…

京东云主机和云服务器有啥区别?轻量云主机就是轻量应用服务器吗?

京东云主机和云服务器有啥区别&#xff1f;轻量云主机就是轻量应用服务器吗&#xff1f;云主机就是云服务器的意思&#xff0c;是京东云给自家云服务器取的名字&#xff0c;阿里云叫云服务器ECS&#xff0c;腾讯云叫云服务器CVM&#xff0c;京东云服务器叫云主机&#xff0c;京…

C++ osgEarth 多窗口 同步绘制geometry

开发环境&#xff1a; win10 64bit、Qt5.15.2、C 、MSVC2019 、osg3.5.6、 osgEarth3.1 接触osgEarth不久&#xff0c;贴出来&#xff0c;希望大家指正。 注意osgEarth版本。 采用观察者设计模式&#xff0c;设置 master 和 slave 窗口&#xff0c;通过管理类和信号槽维护窗…

_c++11

嗨喽大家好呀&#xff0c;今天阿鑫给大家带来的是c进阶——c11的内容&#xff0c;好久不见啦&#xff0c;下面让我们进入本节博客的内容吧&#xff01; _c11 统一的列表初始化右值引用可变模板参数(了解&#xff0c;不常接触)lambda表达式function和bind包装器 1. 统一的列表…

JavaWeb 15.详解Servlet及其源码

所有受过的委屈&#xff0c;都在提醒你 要好好争气。 —— 24.10.7 一、Servlet简介 1.动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源&#xff0c;在程序运行之前就写好的资源&#xff0c;例如&#xff1a;html、css、js、img、音频文件和视频文件 …

职场秘籍:面试加薪,竟然拥有不同的技巧!

假如你是一位测试主管&#xff0c;去评价一名测试工程师是否优秀&#xff0c;那么你将如何去判断呢&#xff1f;你最看重的是哪方面的能力呢&#xff1f; 对于这个问题&#xff0c;是不能一概而论的&#xff0c;要分为两种情况&#xff0c;情况不同&#xff0c;答案一定是不同…

高校新生报道管理系统使用SpringBootSSM框架开发

&#xff01;&#xff01;&#xff01;页面底部,文章结尾,加我好友,获取计算机毕设开发资料 目录 一、引言 二、相关技术介绍 三、系统需求分析 四、系统设计 五、关键技术实现 六、测试与优化 七、总结与展望 一、引言 当前高校新生报到过程中存在许多问题&#xff0c;…

从0到1:用Python构建你人生中的第一个人工智能AI模型

文章目录 摘要引言数据预处理&#xff1a;为模型打下坚实基础数据预处理的步骤Python示例代码说明&#xff1a;注意事项&#xff1a; 模型建立&#xff1a;选择合适的模型神经网络示例代码说明&#xff1a; 模型训练与测试训练示例代码说明&#xff1a; 解读模型结果性能指标 深…

原生小程序开发|小程序卡片(Widget) 开发指南

开发 Widget 代表应用的一个小程序卡片&#xff0c;负责小程序卡片的展示和交互。 小程序卡片(Widget) 的开发在智能小程序的基础上增加一个目录即可&#xff0c;用于存放小程序卡片(Widget)的代码。并在 project.tuya.json 中增加一个声明。 创建小程序卡片(Widget)项目 在 …

九、Drf序列化器

九、序列化器 9.1序列化 从数据库取QuerySet或数据对象转换成JSON 9.1.1序列化器的简易使用 #新建一张部门表 class Depart(models.Model):title=models.CharField(verbose_name=部门,max_length=32)order=models.IntegerField(verbose_name=顺序)count=models.IntegerFiel…

vscode中安装python的包

首先需要调出命令行。然后运行代码&#xff0c;找到你所需要的环境。 PS C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-env> conda env list # conda environments: #C:\ProgramData\Anaconda3 base * C:\Users\Administrator\.con…

【无人机设计与控制】无人机三维路径规划,对比蚁群算法,ACO_Astar_RRT算法

摘要 本文探讨了三种不同的无人机三维路径规划算法&#xff0c;即蚁群算法&#xff08;ACO&#xff09;、A算法&#xff08;Astar&#xff09;以及快速随机树算法&#xff08;RRT&#xff09;。通过仿真实验对比了各算法在不同环境下的性能&#xff0c;包括路径长度、计算效率…