当前位置: 首页 > news >正文

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

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

相关文章:

41、可靠传输——停等ARQ

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

RK3568 cmake编译

一.简介 CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,…...

详细安装配置django

安装配置使用Django。 1,下载安装 django pip install django 2.创建设置项目 先进入要放置项目的文件夹下 2.1, 创建项目 django-admin startproject Api_project 2.2, 创建app命令 cd Api_project dir看一下是否有 manage.py 文件…...

HTTP之cookie基础学习

目录 Cookie 什么是Cookie Cookie分类 Cookie版本 Cookie工作原理 Cookie详解 创建cookie cookie编码 cookie过期时间选项 Cookie流程 Cookie使用 会话管理 个性化信息 记录用户的行为 Cookie属性 domain选项 path选项 secure选项 cookie…...

观察者模式和发布订阅模式

观察者模式与发布订阅模式的区别: 1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心 2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作 发布订阅模式 class …...

利用ViewModel和LiveData进行数据管理

利用ViewModel和LiveData进行数据管理 1. 引言 在当今移动应用开发的世界中,数据管理是一个至关重要的方面。随着应用的复杂性不断增加,需要有效地管理和维护应用中的数据。无论是从服务器获取数据、本地数据库存储还是用户界面的状态,数据…...

前后端分离------后端创建笔记(05)用户列表查询接口(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…...

浅谈GIS和三维GIS的区别?

GIS(地理信息系统)和三维GIS(3D地理信息系统)是地理信息领域的两个重要概念,它们在地理数据的处理和分析方面具有不同的特点和应用。可能很多人分不清二者的区别,本文就带大家简单了解一下二者的区别。 定义…...

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…...

设计列表和超链接

在网页中,大部分信息都是列表结构,如菜单栏、图文列表、分类导航、新闻列表、栏目列表等。HTML5定义了一套列表标签,通过列表结构实现对网页信息的合理排版。另外,网页中还包含大量超链接,通过它实现网页、位置的跳转&…...

rust包跨平台编译,macbook ,linux

在 MacBook 上编译 Rust 项目并生成 Linux 包需要一些步骤。以下是一般的步骤概述: 1. **安装所需工具:** 首先,确保您的 MacBook 上已经安装了所需的工具。您需要 Rust 编程语言的工具链以及一些用于交叉编译到 Linux 的工具。 - 安装 R…...

JAVA集合-List

// 数组的缺点:每次使用都需要指定长度,掉率低,操作麻烦 // // 【java集合体系】:分类:6个接口,1个工具类 // 6个接口: 单列 :Collection,(父接口) // …...

Python|OpenCV-绘制图形和添加文字的方法(2)

前言 本文是该专栏的第2篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 OpenCV作为一个强大的计算机视觉功能库,除了能解决图像处理和计算机视觉任务之外,它还有着非常丰富的图像绘制功能。可以说,不论是在计算机视觉任务中标记目标领域,还是在图像上绘制一些…...

使用GO编译wasm文件并在nodejs中使用

使用GO编译wasm文件并在nodejs中使用 安装Go相关环境 # 安装GO # mac使用homebrew安装 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install go# vi ~/.bashrc, 添加如下内容 e…...

BM22 比较版本号

一.双指针遍历截取 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 比较版本号* param version1 string字符串 * param version2 string字符串 * return int整型*/public …...

【Java】Maven配置文件帮助文档(settings.xml 和 pom.xml)

文章目录 1. settings.xml1.1 localRepository1.2 interactiveMode1.3 offline1.4 pluginGroups1.5 proxies1.6 servers1.7 mirrors1.8 profiles1.9 activeProfiles 2. pom.xml2.1 本项目信息2.2 父项目信息2.3 prerequisites2.4 issueManagement2.5 ciManagement2.6 inception…...

人脸识别技术应用安全管理规定(试行)

近年来,人脸识别技术不断成熟,已大量应用于治安管理、金融支付、门禁考勤等诸多领域,极大便捷了公众生活。然而,人脸识别技术在得到广泛应用的同时,仍存在一些不规范现象。人脸识别因其技术特点,涉及公众敏…...

FPGA应用学习-----FIFO双口ram解决时钟域+asic样机的时钟选通

60m写入异步ram,再用100M从ram中读出 写地址转换为格雷码后,打两拍和读地址判断是否空产生。相反读地址来判断是否满产生。 分割同步模块 asic时钟的门控时钟,fpga是不推荐采用门控时钟的,有很多方法移除fpga的时钟选通。 如果是a…...

zabbix案例--zabbix监控Tomcat

目录 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin开启JMX…...

Electron 应用实现截图并编辑功能

Electron 应用实现截图并编辑功能 Electron 应用如何实现截屏功能,有两种思路,作为一个框架是否可以通过框架实现截屏,另一种就是 javaScript 结合 html 中画布功能实现截屏。 在初步思考之后,本文优先探索使用 Electron 实现截屏…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...