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

news2025/5/18 3:48:54

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】【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.coloradmin.cn/o/1370455.html

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

相关文章

Kettle Local引擎使用记录(一)(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web 📚第一章 前言📚第二章 demo源码📗pom.xml引入Kettle引擎核心文件📗java源码📕 controller📕 service📕 其它📕 maven settings.xml 📗测试📕 测试…

C语言中关于函数递归的理解

递归的概念:如果一个对象部分包含它自己,或者利用自己定义自己,则称这个对象是递归的;如果 一个过程直接或间接调用自己,则称这个过程是一个递归过程。递归的主要思考方式在于:将大事化小 我们先看一个例子 题目:输入一个无符号数&#xff0…

蜗牛目标检测数据集VOC格式480张

蜗牛,一种缓慢而坚韧的软体动物,以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形,有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异,有的光滑如玻璃,有的则布满细纹。蜗牛的头部有两对触角…

U-Boot学习(1):简介及命令行指令详解

Bootloader的主要任务是引导加载并运行应用程序,对于MCU中的BootLoader,我之前写过一篇详细的文章单片机中BootLoader的严谨实现详解介绍它实现的整体流程。对于Linux来说,在运行Linux内核之前也需要BootLoader进行引导,这个BootL…

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具,10MB 身材的小工具,能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的,非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些? (1)String(字符串) (2)Hash(哈希) (3)List(列表) (4)Se…

zookeeper 与eureka区别

CAP定理 在分布式系统的发展中,影响最大的莫过于CAP定理了,是分布式系统发展的理论基石。 2000年,加州大学的计算机科学家 Eric Brewer提出了CAP猜想 2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP 猜…

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化(Service) 和 事件驱动(Event EventHandler)。服务化 和 事件驱动 软件设计思想的引入,使得 YARN 具有低耦合、高内聚的特点,各个模块只需完成各自功能,而模…

静态关键字:static

static的作用 static是静态的意思,可以修饰成员变量和成员方法。 static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。 成员变量 分为2类 静态成员变量(有static修饰,属于类,内存中加载…

【QML COOK】- 005-粒子系统(ParticleSystem)

1. 编辑main.qml import QtQuick import QtQuick.ParticlesWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")color: "#000000"MouseArea {id: mouseAreaanchors.fill: parentonClicked: {hahaEmitter.pulse(2000)}}ParticleSystem {…

大众汽车宣布将ChatGPT,批量集成在多种汽车中!

1月9日,大众汽车在官网宣布,将ChatGPT批量集成到电动、内燃机汽车中。 大众表示,将ChatGPT与其IDA语音助手相结合,用户通过自然语言就能与ChatGPT进行互动,例如,帮我看看最近的三星米其林饭店在哪里&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店,多门店的管理模式下,去做一个上门洗衣洗鞋小程序,需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一,加盟店…

Android BUG 之 Error: Activity class {} does not exist

项目场景: 更换包名,运行报错 问题描述 原因分析: 在替换包名的时候要确认,配置文件跟build中的保持一致,在更换后还要将旧包的缓存数据清理掉 解决方案: 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

openEuler22.0.3安装oracle11.2.0.4报错总结

openEuler是CentOS8系列魔改来的 1.xstart无法打开报错x11拒绝转义 yum install *x11* vi /etc/ssh/sshd_config X11Forwarding yes systemctl restart sshd 2.执行runinstaller报错,无论是直接无法打开界面报错: when installed in the jdk 1.2 Linux 还是打开界面报错: no o…

20、Kubernetes核心技术 - 基于Prometheus和Grafana搭建集群监控平台

目录 一、概述 二、监控平台架构图​编辑 三、部署 Prometheus 3.1、Prometheus简介 3.2、部署守护进程node-exporter 3.3、部署rbac 3.4、ConfigMap 3.5、Deployment 3.6、Service 3.7、验证Prometheus 四、部署Grafana 4.1、Deployment 4.2、Service 4.3、Ing…

每天刷两道题——第十一天

1.1滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出&…

Spark与Cassandra的集成与数据存储

Apache Spark和Apache Cassandra是大数据领域中两个重要的工具,用于数据处理和分布式数据存储。本文将深入探讨如何在Spark中集成Cassandra,并演示如何将Spark数据存储到Cassandra中。将提供丰富的示例代码,以帮助大家更好地理解这一集成过程…

pycharm的使用技巧

1.新建文件时,自动生成代码 settings->editor->file and code templates,选择python script ${NAME} 文件名 ${DATE} 日期 2.自动补齐自定义段落 settings->editor->live templates,在右侧点击+号,添加自定义的内容 完成之后,在下方勾选python 3.修改注释的…

服务器日常维护要素,应该如何做好维护

维护服务器的目的是为了让服务器的性能保持最佳状态,发现问题及时解决,没有问题也可以对相关的应用和配置进行调优。但也有很多用户疑问,服务器具体会有哪些方面需要维护的,今天就一起来看看吧。 服务器日常维护,主要包…

融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」

(👆点击获取《社交泛娱乐出海作战地图》) 1 月 5 日,由知名 IT 技术媒体 51CTO 主办的第十八届“中国企业年终评选”正式揭晓榜单,融云 CEO 董晗荣获“2023 年度科技影响力人物奖”。关注【融云全球互联网通信云】了解…