41、可靠传输——停等ARQ

前面两节内容我们学习了传输层的基本概况的一些知识,包括传输层在TCP/IP协议栈中负责的任务、传输层的两大协议,以及端口号、套接字等一些基本的概念。从这一节开始,我们将开启两大协议中TCP协议的学习。

但是,经过之前的学习,我们知道TCP提供可靠传输的机制,也就是TCP具有可靠传输的特性。因此,在正式学习TCP协议之前,我们先要搞清楚一些可靠传输的工作原理,主要就是即将要介绍的ARQ协议。ARQ协议分为停止等待ARQ和连续ARQ,本节我们先学习停止等待ARQ,简称“停等ARQ”。

而我们要知道的一点是,ARQ并不是应用在传输层的(因为传输层保证可靠传输的机制要比ARQ复杂的多)ARQ是为了应对早期通信链路的质量不太可靠的问题,在数据链路层保证可靠传输的。但现在随着光纤等技术的发展,底层通信链路的质量大大提高,因此慢慢的在数据链路层也就不需要这种可靠机制了,不过这种机制的原理是我们需要清楚的,这可以为后面学习传输层TCP协议的可靠传输打下一个比较好的认知基础


停止等待

上面我们说,停止等待是是一种保证数据可靠传输的机制。可靠传输的意思就是,信息的发送方发出去的数据,能够收到对方的回应。也就是接收方收到信息之后,要给发送方回应一个确认收到。

停止等待就是基于可靠传输的这种思想而设计出来的一种机制,具体过程是:发送方每发送完一个报文,就停止发送,然后等待对方的确认,在收到对方发来的确认之后再继续发送下一个报文。如下面的例图所示。

可见,使用这样的确认机制确实能够在一定程度上保证数据的可靠传输。当然,接收方也不总是会发送确认报文。由于网络的不可靠性,在传输过程中,不免有时候会出现一些错误(例如由于噪声的影响),当接收方检测到报文有错误时,也可以发送一个否认报文给发送方,让发送方知道传输的数据出了错,发送方再把这些数据重发一次。但是由于这样做,会让协议的设计与实现变的复杂,所以现在实用的可靠传输协议都不使用这种否认报文了。


自动重传请求(ARQ)

在不使用否认报文这种方法之后,就产生了自动重传请求协议,即“ARQ”协议。自动重传请求的思想在于,接收方收到错误数据之后,只是把它简单地丢弃掉即可,不需要单独请求发送方再重发一次数据,而发送方是否需要重发数据这件事情由发送方自己来负责解决。

像上面第一个例图那样,发送方的每一个报文,接收方都正常收到了,也都依次向发送方回复了确认,发送方也都正常的收到了确认。

但是,数据在传输过程中由于通信线路或者网络设备的故障,仍然会导致数据的传输出现一些问题。比如,在数据传输过程中,因为噪声的影响导致数据某些地方出了错误,接收方收到以后通过校验计算,检测出了这是有错误的数据,因此接收方就会把它丢弃掉;还有就是由于网络设备故障,导致网络出现环路,那么数据包最终将会“TTL=0”,导致接收方根本收不到数据。再有就是,接收方正常收到了数据,但是回复给发送方的“确认”却在传输中丢失了。

这样的几种情况都会导致发送方不知道自己的数据有没有被接收方收到,因为发送方一直在等待着对方“确认”的到来,收不到“确认”就不会继续发送后面数据。所以必须想办法让发送方能够处理这个问题,这个办法就是使用超时重传。

超时重传是在数据的发送方设置一个超时定时器,在每发送完一个报文之后,超时定时器就开始倒计时,如果在时间到之前收到了对方发来的确认,那么定时器就被撤销,接着发送后面的报文,定时器重新开始倒计时;而如果在时间到之前没有收到对方发来的确认,那么发送方就可以认为“接收方没有正常收到我的报文”,所以我要把刚才的报文再重传一遍。利用这种办法就实现了报文的自动重传。

这种机制,我们描述起来简单,但是实现起来要有多方面的考虑。例如有这样的两个问题:

问题1:如果当前网络并没有什么故障,只是信息比较拥堵而已,发送方发出去的报文正在网络中排队,这时候发送方的定时器时间到,发送方就会再次重传一遍刚才的数据。等发送方刚把重传的数据发出去,第一次发出的报文正好到达了接收方,接收方会回应一个“确认”。等过不了一会儿,接收方又会收到发送方第二次发来的报文。那么问题来了,接收方怎么才能判断第二次收到的这个报文是一个新发送的呢,还是一个重传的报文呢?如果是重传的,那该怎么处理呢?

问题2:发送方的定时器倒计时要设置成多少比较合适呢?时间设置的太短了,会产生不必要的重传,要是设置的太长了,那么整个的传输效率就会很低。

首先第一个问题,比较合理的解决办法是:给每一个报文编号(无论是数据报文还是确认报文,都要有相应的编号),在停等ARQ协议中,使用一个比特位编号就可以了。这样就能区分开哪些是新发来的,哪些是重传的。如果识别出是重传的报文,那就把它丢弃掉就可以了,同时再向发送方回复刚才的“确认”。第二个问题,保证数据能够到达接收方,接收方回复确认,这是一个往返的时间,同时又考虑到网络可能会出现拥塞问题,所以定时器的时间应设置为“比平均往返时间更长一些”比较合理。

最后,还要考虑的一个方面就是,接收方回复给发送方的“确认”,如果在传输过程中出了问题怎么办。“确认”报文也是有可能会丢失的,也是有可能由于当时网络情况的拥堵,“确认”报文在发送方定时器时间到之前没有到达的。就像下面的例图展示的这样:

首先,如果“确认”报文丢失了怎么办?完全不用接收方担心,发送方的定时器会自动超时,所以发送方就会再重传一份,接收方收到这个报文之后,由于有编号的存在,所以接收方能够识别出这是一个重传的报文,然后就会把它丢弃掉,再次发送刚才的“确认”。然后,如果是因为当时网络拥堵,“确认”报文在定时器时间到之前没有到达发送方,所以发送方就会重传报文,接收方收到后把它丢弃掉,重新发送“确认”。等过了一会儿,发送方收到了第一次的“确认”,经过对比编号发现,这是一个“迟到”的确认,直接丢弃即可。


本节关于停止等待ARQ的过程就是这些,关键要理解的是:ARQ是一种可靠传输机制、停止等待的工作过程,以及自动重传是依靠超时定时器来进行的。但是ARQ协议除了有停等ARQ,还有连续ARQ,下一节我们继续学习。

参考教材:谢希仁《计算机网络》第八版

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin语法

整理关键语法列表如下: https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量,优先 var定义可变变量…

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式? 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式,又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符: 大小写字母…

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,ku…

ReBel 论文学习笔记

论文:《Combining Deep Reinforcement Learning and Search for Imperfect-Information Games》 地址:https://arxiv.org/abs/2007.13544v2 代码:https://github.com/facebookresearch/rebel 材料: BV1gt4y1k77C(1小时…

Linux 当fork在for循环中的问题

以下代码会打印几个"A"&#xff1f; 例1.代码如下&#xff1a; int main(int argc, char* argv[],char* envp[]) { for(int i 0;i < 2; i ) { fork(); printf("A\n"); } exit(0); } 代码分析&#xff1a; //父进程for(int i …

算法笔试 java 输入输出练习

在线编程题刷题训练 所有答案 scancer函数的用法 输入输出总结top&#xff01;&#xff01;&#xff01;&#xff01; java如何调用函数&#xff08;方法&#xff09; java刷acm的各种输入输出 vscode配置java环境 子函数的调用&#xff0c;直接定义一个static子函数调用就…

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一个通配符&#xff08;*&#xff09;或一个占位符&#xff08;:&#xff09;来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

编译OpenCV问题解决:已经编译OpenCV成功之后无法运行测试代码

报错问题如下&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2001 无法解析的外部符号 "void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class c…

【校招VIP】测试计划之黑盒测试白盒测试

考点介绍&#xff1a; 黑盒测试&白盒测试是大厂和三四线公司校招的必考点。黑盒是以结果说话&#xff0c;白盒往往需要理解实现逻辑。现在商业项目的接口测试往往以白盒为主&#xff0c;也就是需要测试同学自己观察和修改数据库的值进行用例的测试。 但是无论采用哪种测试方…

自然语言处理: 第七章GPT的搭建

自然语言处理: 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后&#xff0c;大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构&#xff0c;其中以BERT系列为代表encoder-decoder架构&#xff0c;标准的tr…

关于Java中synchronized的实现原理

并发编程的三个理念 原子性&#xff1a;一个操作要么全部完成&#xff0c;要么全部失败。可见性&#xff1a;当一个线程对共享变量进行修改后&#xff0c;其他线程也应立刻看到。有序性&#xff1a;程序按照顺序执行 synchronized基本使用 修饰静态方法&#xff0c;锁的是类…

时序预测 | Matlab实现基于RF随机森林的电力负荷预测模型

文章目录 效果一览基本介绍模型描述源码设计学习小结参考资料效果一览 基本介绍 时序预测 | Matlab实现基于RF随机森林的电力负荷预测模型 电力负荷预测是指通过对历史电力负荷数据分析,来预测未来某个时间段内的电力负荷需求。这项预测对于电力系统的运行和调度至关重要,可以…

【Echart地图】jQuery+html5基于echarts.js中国地图点击弹出下级城市地图(附完整源码下载)

文章目录 写在前面涉及知识点实现效果1、实现中国地图板块1.1创建dom元素1.2实现地图渲染1.3点击地图进入城市及返回 2、源码分享2.1 百度网盘2.2 123云盘2.3 邮箱留言 总结 写在前面 这篇文章其实我主要是之前留下的一个心结&#xff0c;依稀记得之前做了一个大屏项目的时候&…

【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于决策树算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理1.1 模型原理1.2 数学模型 2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 决策树是一种基于树状结构的分类和回归模型&#xff0c;它通过一系列…

C++ QT(一)

目录 初识QtQt 是什么Qt 能做什么Qt/C与QML 如何选择Qt 版本Windows 下安装QtLinux 下安装Qt安装Qt配置Qt Creator 输入中文配置Ubuntu 中文环境配置中文输入法 Qt Creator 简单使用Qt Creator 界面组成Qt Creator 设置 第一个Qt 程序新建一个项目项目文件介绍项目文件*.pro样式…

【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 现在是传输层&#xff0c;在应用层中的报文(报头 有效载荷)就不能被叫做报文了&#xff0c;而是叫做数…

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于最中心分类器算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 最近中心分类器&#xff08;Nearest Centroid Classifier&#xff09;也被称为近似最近邻…

若依框架浅浅介绍

由若依官网所给介绍可知 1、文件结构介绍 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模块&#xff0c;在ruoyi-framework的pom.xml文件中引入了ruoyi-system模块。 2、技术栈介绍 前端&#xff1a;Vue、Element UI后端&#xff1a…

xxljob搭建(内网穿透)

调度中心搭建 先从码云或者github上将项目拷贝到本地&#xff0c;选择最新的release分支拷贝下来的xxl-job-admin模块就是调度中心&#xff0c;我们需要做的有两点&#xff0c;第一点将doc/db/tables_xxl_job.sql执行&#xff0c;第二点修改xxl-job-admin的application.proper…

SAP Fiori 将GUI中的自开发报表添加到Fiori 工作台

1. 首先我们在workbench 中开发一个GUI report 这里我们开发的是一个简单的物料清单报表 2. 分配一个事务代码。 注意这里的SAP GUI for HTML 要打上勾 3. 创建语义对象&#xff08; Create Semantic Object&#xff09; 事物代码&#xff1a; path: SAP NetWeaver ->…