【计算机网络】TCP原理 | 可靠性机制分析(二)

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】【Java系列】
本专栏旨在分享学习网络编程、计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌

TCP协议为了保证数据传输的可靠性,所以发明了几种机制:确认应答、超时重传、连接管理(即三次握手四次挥手)来确保网络通信中进行数据传输的可靠性,本文中我们对连接管理(即三次握手四次挥手)来进行TCP可靠性分析的讲解。

目录

  • 一、三次握手
    • 三次握手的意义
  • 二、四次挥手
  • 三、三次握手四次挥手的丢包问题
  • 四、总结

一、三次握手

在TCP协议中,三次握手是用于建立连接的过程。客户端和服务器通过互相发送特定的控制报文来确认彼此的可达性和同意建立连接。这个过程确保了双方的通信能力,并且在开始数据传输之前建立了可靠的连接。
四次挥手则是用于关闭连接的过程。当一方决定关闭连接时,它会发送一个关闭连接的请求给另一方。对方确认接收后,双方分别关闭自己的数据传输,并最终确认关闭连接。这个过程确保了双方在结束通信后,释放资源并关闭连接。

在现实生活中,握手一般用于和对方打招呼,然后再开启后面的话题。网络通信中也是如此,我们通过“握手”来发送一个打招呼的数据(用于触发某些特定的场景,这些数据并不包含业务信息)。

然而A和B要想完成建立连接的过程,就需要3次这样打招呼的数据交互。我们来画张图来表示A、B双方3次打招呼的过程,请看下图:
在这里插入图片描述
上图中的四次“交互”完毕之后,A和B之间的连接就算是建立好了,注意,重点来了,上图中的交互看起来好像是4次,但实际上只有3次交互(因为中间两次的交互合并在一起了)。如下图:
在这里插入图片描述
中间的两次交互为什么要合并在一起呢,这样做的好处是什么:我们想一下,如果中间的两次交互分开来进行发送的话,那么这两次发送的数据就需要分别来进行封装,这个时候就需要封装两次;但是如果两次交互合并在一起发送的话,此时就只需要封装一次,成本自然是比封装两次低。综上,三次握手本质上是4次数据交互,只不过对中间两次数据交互进行了合并,两次交互合并成一次交互既可以节省了两次封装和分用的过程,也降低了成本,提高了效率
在这里插入图片描述

三次握手的意义

  • 第一点:投石问路

三次握手也是TCP保证数据传输可靠性的一种方式:TCP要想保证数据传输的可靠性,就需要以网络传输、网络路径畅通为前提,还可以验证每个主机的发送能力和接收能力是否正常,简单来说三次握手的意义就是投石问路

  • 第二点:消息协商
    TCP通信过程中,有很多信息需要进行协商,协商这个信息是不是属于本次连接的。为什么这么说呢?是因为网络上传输的信息可能是后发先至的,比如说现在有一个信息迟到了,而此时这个信息所属的连接早就关闭了(服务器与客户端已经断开了上一个连接),此时是一个重新建立的连接,这个时候我们就可以通过消息的信号来明显的识别出这个消息是属于上一个连接的,所以直接将这个连接丢掉即可

综上三次握手主要有两个主要意义:意义1(投石问路):通过投石问路可以验证网络是否发生故障,也可以验证通信双方的发送接受能力是否正常。意义2(消息协商):通过协商必要的参数来使客户端和服务器使用相同的参数进行消息传输。

二、四次挥手

四次挥手即断开服务器和客户端之间的连接。我们只要连接的概念就是通信双方各自在内存中保有通向双方对端的信息,如果我们需要断开连接的话,我们就需要及时释放上面内存中的对端信息。

补充:三次挥手一定是客户端主动向服务器发起的请求;但是四次挥手不一定是谁向谁发起的请求,但绝大多数的情况下都是客户端主动向服务器发起请求建立连接的。

下面是四次挥手
在这里插入图片描述
经过上述的四个步骤之后,连接就彻底断开不再使用了,通信双方会各自释放内存中存储的对端信息。

四次挥手能不能3次来完成呢:这是不可以的,这里我们要明确,有些时候四次挥手确实是可以分为三次来完成的,但是有些时候就不能通过三次即必须通过四次来完成断开连接的任务。最主要的一个原因就是FIN的触发时应用程序的代码来进行控制的:通过调用socket.close()或者线程结束就会触发FIN(对比三次握手中的ACK,ACK(应答报文)并不是通过应用程序的代码来控制的,ACK是通过内核来进行控制的(接收到FIN之后就会立刻返回ACK,是瞬发的))。
如果 socket.close() 执行较慢,也就是客户端和服务器在关闭连接时耗费了一定的时间,即客户端发送FIN包后,服务器需要一定时间才能确认并回复ACK包。在这段时间内,服务器可能还有遗留的数据需要发送给客户端,而合并这两个步骤将无法保证服务器的数据顺利发送给客户端。
因此,为了确保数据的正常传输和保证双方的连接状态同步,四次挥手中间的两个步骤不能合并。它们分别代表了客户端和服务器关闭连接的过程,并且保证了数据的完整性和可靠性。

如果服务器始终不进行close会发生什么:
在这里插入图片描述
如果服务器始终不进行关闭的话,此时TCP的状态就会处于CLOSE_WAIT状态(如上图,调用close方法之后TCP的状态就转化为LAST_ACK状态),此时造成如下情况:
情况1:对于服务器来说此时的连接虽然没有关闭,但是此连接实际上是没办法使用的。
情况2:针对socket进行读操作的话,如果数据还没有读完(即缓冲区还有数据),那么数据依然可以正常读到;如果数据已经读完了的话,此时就会读到EOF(对于字节流来说,返回-1;如果是scanner,hashNext就会为false)。
情况3:针对socket进行写操作的话,此时就会直接触发异常。
其它情况:比如说代码忘记调用close方法了,对于客户端来说收不到对方的FIN此时就会等待,但是如果直接等不到的话,那么客户端就会单方面放弃连接,释放对端信息资源(当然理想状态下,我们希望客户端和服务器双方都能够释放对端信息资源,但是如果做不到的话,此时是不影响客户端或者服务器单方面释放对端信息资源的)

三、三次握手四次挥手的丢包问题

三次握手四次挥手过程中,如果出现了丢包的情况,此时依然是会触发重传机制的,即尽可能的进行重传,如果重传多次依然没有重传成功的话,此时就会单方面放弃连接的尝试并释放对端的信息资源。

三次握手的丢包问题:

  • 第一次握手时,客户端发送SYN数据包到服务器,如果发生丢包则无法建立连接,此时TCP协议就会触发超时重传机制,客户端就会再次发送SYN数据包。
  • 第二次握手时,服务器接收到来自客户端超时重传过来的SYN数据包后,会发送SYN-ACK数据包回应给客户端,当然SYN-ACK数据包有可能丢包,此时就会触发超时重传。如果超时重传多次之后客户端依然没有接收到SYN-ACK数据包,则客户端则任务服务器不可达,并放弃建立连接的尝试
  • 第三次握手时,客户端接收到来自服务器的SYN-ACK数据包(当然可能是超时重传过来的SYN-ACK数据包)之后,此时客户端就会向服务器发送ACK数据包(表示客户端已成功收到来自服务器的 SYN-ACK 应答,可以建立连接。)。如果服务器没有接收到ACK数据包,此时依然会发生超时重传机制。如果发生了丢包,那么服务器并不知道客户端接收到了 SYN-ACK 应答,因此连接无法建立。

四次挥手过程中的丢包:

  • 第一次挥手:客户端向服务器发送FIN数据包,表示要关闭连接。如果发生丢包,则服务器会继续等待客户端发送FIN数据包,如果服务器一直没有接收到FIN数据包的话,TCP协议就会触发超时重传。
  • 第二次挥手:服务器接收到FIN数据包之后,就会向客户端发送ACK数据包,如果发生丢包,则会触发超时重传。
  • 第三次挥手:如果客户端没有接收到ACK的话,则触发超时重传,如果超时重传多次后依然没有ACK数据包,客户端可能任务服务器已经关闭连接,并释放对端的资源。
  • 第四次挥手:。极端情况:在四次挥手过程中,如果第四步中 ACK 数据包被丢失,服务器会认为客户端仍然没有确认连接关闭的请求,因此会认为连接没有完全关闭,会继续等待客户端的确认,并尝试不断发送 FIN 数据包,直到达到超时时间为止。如果 FIN 数据包的重传次数达到上限,服务器会认为连接已经关闭,释放资源。

四、总结

我们现在已经知道TCP协议通过确认应答、超时重传、连接管理来进行保证数据传输的可靠性,其中起到决定性作用的是确认应答,连接管理即三次握手四次挥手在一定程度上可以用来检验网络是否可靠,而确认应答可以则保证每次数据传输都是可靠的。

本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!

在这里插入图片描述

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

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

相关文章

Python异步编程|PySimpleGUI界面读取PDF转换Excel

目录 实例要求 原始pdf文件格式 输出xls文件格式 运行界面 完整代码 代码分析 遍历表格 布局界面 控件简介 写入表格 表格排序 事件循环 异步编程 实例要求 使用PySimpleGUI做一个把单位考勤系统导出的pdf文件合并输出Excel的应用,故事出自&#xff1…

CDN的介绍以及加速内容传输原理

目前在公司的开发过程中,发现很多存储在oss的静态资源(图片,安装包)的链接中域名都使用了cdn域名,后面了解到这个cdn域名的主要作用是加速资源的访问,于是抽空了解了一下CDN加速原理。 目前使用得比较多的是…

Python多线程同步

同步条件(Event) 在Python中,多线程同步可以通过threading模块中的Event对象来实现。Event对象允许一个或多个线程等待某个事件的发生,当事件发生时,等待的线程将被唤醒。 event.isSet():返回event的状态值 event.wait()&#x…

PyQt5-小总结

之前学习PyQt5,然后那段时间想做一个桌面小程序,后来由于学习内容较多就做了一小部分,但是可以进行页面跳转。大家如果是初学者对Python感兴趣而且刚学数据库时可以看看代码,可能会有点启发。 效果: 登录进来是这&…

FreeRTOS学习——任务通知

一、什么是任务通知 FreeRTOS 从版本 V8.2.0 开始提供任务通知这个功能,每个任务都有一个 32 位的通知值。按照 FreeRTOS 官方的说法,使用消息通知比通过二进制信号量方式解除阻塞任务快 45%, 并且更加省内存(无需创建队 列&#…

解析游戏开发中的ECS设计模式:实体、组件、系统的完美协同

ECS(Entity-Component-System)是一种设计模式,通常用于构建和管理具有大量实体和复杂交互的系统,尤其在游戏开发中得到广泛应用。这个模式的核心思想是将系统中的组件、实体和系统进行分离,以提高代码的可维护性、可扩…

鸿蒙原生应用/元服务开发-长时任务

概述 功能介绍 应用退至后台后,对于在后台需要长时间运行用户可感知的任务,例如播放音乐、导航等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。申请长时任务后,系统…

Linux调试------gdb的使用

目录 前言 一、gdb打开可执行程序 二、查看代码与操作断点 1.l 查看代码 2.b 打断点 3.info b 查看断点信息 4.d 删除断点 5.disable 和 enable 断点的禁用与启用 三、调试 1.r 启动调试 2. n 逐过程 3. s 逐语句 4.display显示变量 5.undisplay 取消显…

e2studio开发磁力计LIS2MDL(1)----轮询获取磁力计数据

e2studio开发磁力计LIS2MDL.1--轮询获取磁力计数据 概述视频教学样品申请源码下载速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()prin…

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类,以及相应CRUD操作 本文是一个自动生成实体类的工具,用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm,框架(.net framework 4.5), 添加对System.Configuration的…

高效构建Java应用:Maven入门和进阶(三)

高效构建Java应用:Maven入门和进阶(三) 三. Maven的核心功能和构建管理3.1 依赖管理和配置3.2 依赖传递和冲突3.3 依赖导入失败场景和解决方案3.4 扩展构建管理和插件配置 三. Maven的核心功能和构建管理 3.1 依赖管理和配置 Maven 依赖管理…

CentOS安装Docker(超详细)

CentOS安装Docker 1 知识小课堂2 CentOS安装Docker2.1 1.1.卸载(可选)1.2.安装docker1.3.启动docker1.4.配置镜像加速 3 CentOS安装DockerCompose3.1.下载3.2.修改文件权限3.3.Base自动补全命令: 4 Docker镜像仓库4.1.简化版镜像仓库4.2.带有…

数据分析求职-知识脑图

今天和大家聊聊数据分析求职常见面试题,这是这个系列的第一篇文章,但是我不想开始就直接罗列题目,因为这样的文章实在太多了,同学们的兴趣程度肯定一般。所以,我想先和大家聊聊在准备面试题时候通常遇到的困扰&#xf…

GFP-CERTIFIED®FLUOFORTE®钙离子检测试剂盒

Enzo Life Sciences的GFP-CERTIFIED FLUOFORTE Calcium assay kit提供了一种荧光分析方法,用于检测广泛生物靶标的细胞内钙动员情况。相对于其他商业化的染料,GFP-CERTIFIED FLUOFORTE染料是最亮和最灵敏的荧光钙指示剂。该试剂盒为贴壁和非贴壁细胞系提…

生物信息学中的可重复性研究

科学就其本质而言,是累积渐进的。无论你是使用基于网络的还是基于命令行的工具,在进行研究时都应保证该研究可被其他研究人员重复。这有利于你的工作的累积与进展。在生物信息学领域,这意味着如下内容。 工作流应该有据可查。这可能包括在电脑…

linux 压力测试 AB ApacheBench

ab的简介 ab是apachebench命令的缩写。 ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等 ab的原理 ab的原理:ab命令会创建多…

ros架构

ROS(Robot Operating System)是一个灵活的、分布式的系统架构,用于构建机器人软件。它由一系列工具、库和约定组成,提供了一套通用的功能和通信机制,以支持机器人系统的开发、部署和运行。 ROS架构主要包括以下几个核心…

C++面试宝典第17题:找规律填数

题目 仔细观察下面的数字序列,找到规律,并填写空白处的数字。 (1)1, 2, 4, 7, 11, 16, __ (2)-1, 2, 7, 28, __, 126 (3)6, 10, 18, 32, 57, __ (4)19, 6, 1, 2, 11, __ (5)2, 3, 5, 7, 11, __ (6)1, 8, 9, 4, __, 1/6 (7)1, 2, 3, 7, 16, __, 321 (8)1, 2, …

linux异常情况,排查处理中

登录客户环境后,发现一个奇怪情况如下图,之前也遇到过,直接fuser -ck /backup操作的话,主机将会重启,因数据库运行中,等待停机维护时间,同时也在想办法不重启的情况下解决该问题 [rootdb ~]# f…

git撤销提交到本地的commit

有些时候,当我们提交代码到本地后,突然发现因为某些原因需要撤销提交本地的代码。 就比如我,因为代码写错了分支,已经提交到本地了,而我需要取消,并且还要把代码搞得另外的分支上。 提交前: …