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,下一节我们继续学习。

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

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

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

相关文章

安装elasticsearch

一、docker安装elasticsearch 1、下载镜像 docker pull elasticsearch:6.5.4 2、启动容器 docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \ -e "discovery.typesingle-node" \ -e "cluster.nameelasticsearch" \ -e "ES_JAVA_OPTS-Xm…

Mac 新手10个小窍门

即便你是 Mac 新手,也会发现它易学好用。你可以点按程序坞上的访达,快速查看到所有文件;把你喜爱的文件夹拖入边栏;你可以自定义查看文件的方式,甚至可以按下空格键,就能一键预览文档;还能在多台…

AKStream+ZLM简单配置

下载AKStream源代码 下载AKStream源代码 git clone https://gitee.com/chatop2020/AKStreamVS2022打开AKStream,低于.net6的版本无法编译通过 打开 .sln 解决方案 如下配置AKStreamWeb 数据库配置: MySQL AKStreamWeb.json中配置 port 是MySQL的端口…

人工智能能够通过所有[创造力测试]

沃顿商学院教授Ethan Mollick emollick 分享了三篇新的实验性论文,证明了AI在实际情境中的创造力。 https://www.oneusefulthing.org/p/automating-creativity “GPT-4 现在在替代用途测试中击败了 91% 的人类,在托伦斯创造性思维测试中击败了 99% 的人类…

“深入解析Maven:安装、创建项目和依赖管理的完全指南“

目录 引言Maven的安装创建Maven项目之前的装备工作Eclipse创建新的Maven项目项目依赖管理 总结 引言 Maven是一个流行的项目管理工具,被广泛用于Java项目的构建、依赖管理和部署。它提供了一种简单而强大的方式来管理项目的各个方面,使开发人员能够更专…

考公-判断推理-逻辑判断

且和或 只能有一个人是我老婆,要么小红,要么小丽,不可能都是我老婆,虽然有些人心里是这么想的 虽然,但是,且 虽然我很丑,但是我很温柔 或的翻译,否一推一 例题 例题 德摩根 例题…

RestTemplate 请求转发异常 ERR_CONTENT_DECODING_FAILED 200 (OK)

#1 问题描述 在基于Spring Boot的项目中实现了请求转发(使用 RestTemplate 的 exchange 方法)的功能,忽然在前端报net::ERR_CONTENT_DECODING_FAILED 200 (OK)的错误,后端及上游系统日志均显示请求已完成。 #2 原因探寻 上述错…

基于ChatGLM的Deepin文档问答Bot

一、背景介绍 题目来源:2023全国大学生计算机系统能力大赛操作系统设计赛-功能挑战赛题目地址:proj225-document-question-answering-bot题目描述:https://wiki.deepin.org 上有900多条deepin系统相关的中文教程和词条,请编写能根…

后院失火、持续亏损!Mobileye半年报「不回避」竞争压力

"客户在2023年上半年非常谨慎,导致增长率低于正常水平,但我们已经看到下半年回暖趋势,预计下半年交付将比去年同期增长16%,远高于上半年。"这是Mobileye在近日公司半年报发布会上的预判。 公开数据显示,今年…

Mac Neo4j图数据库安装与使用

1. Neo4j简介 图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。 Neo4j 是一个知名的图数据库,提供Cypher 查询语言。 2. 安装与启动 安装前要确保Mac 系统中…

jmeter获取mysql数据

JDBC Connection Configuration Database URL: jdbc:mysql:// 数据库地址 /库名 JDBC Driver class:com.mysql.jdbc.Driver Username:账号 Password:密码 JDBC Request 字段含义 字段含义 Variable Name Bound to Pool 数据库连接池配置…

逗号操作符

逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 运用: