流量控制和差错控制

流量控制是一种协调发送站和接收站工作步调的技术,其目的是避免由于发送速度过快,使得接收站来不及处理而丢失数据。通常,接收站有一定大小的接收缓冲区,当接收到的数据进入缓冲区后,接收器要进行简单的处理,然后才能清理缓冲区,再开始接收下一批数据。如果发送得过快,缓冲区就会溢出,从而引起数据的丢失。通过流控机制可以避免这种情况的发生。
    首先讨论没有传输错误的流控技术,即传输过程中不会丢失帧,接收到的帧都是正确的,无须重传,并且所有发出的帧都能按顺序到达接收端。
1、停等协议
最简单的流控协议是停等协议。它的工作原理是:发送站发出一帧,然后等待应答信号到达后再发送下一帧;接收站每收到一帧后送回一个应答信号(ACK),表示愿意接收下一帧,如果接收站不送回应答,则发送站必须等待。这样,在源和目标之间的数据流动是由接收站控制的。
2、滑动窗口协议
滑动窗口协议的主要思想是允许连续发送多个帧而无需等待应答。如图所示,假设站s1和s2通过全双工链路连接,s2维持能容纳6个帧的缓冲区。这样,s1就可以连续发送6个帧而不必等待应答信号。为了使s2能够表示哪些帧已被成功地接收,每个帧都给予一个顺序编号。如果帧编号字段为k位,则帧以2^k位模连续编号。s2发出一个应答信号acki,并把窗口滑动到i~W-i+1的位置,表明i之前的帧已正确接收,期望接受后续的w个帧。由于随着数据传输过程的进展窗口向前滑动,因而取名为滑动窗口协议。

        

差错控制:
差错控制使检测和纠正传输错误的机制。前面假定没有传输错误,但实际情况不是这样。在数据传输过程中由的帧可能丢失,有的帧可能包含错误的位,这样的帧经接收器校验后会被拒绝。通常,应付传输差错的办法如下:
1、肯定应答。接收器对收到的帧校验无误后送回肯定应答信号ack,发送器收到肯定应答信号后继续发送后续帧。
2、否定应答重发。接收器收到一个帧后经校验发现错误,则送回一个否定应答信号nak,发送器必须重新发送出错帧。
3、超时重发。发送器从发送一个帧时就开始计时,在一定的时间间隔内若没有收到关于该帧的应答信号,则认为该帧丢失并重新发送。
这种技术的主要思想是利用差错检测技术自动地对丢失帧和错误帧请求重发,因而叫做arq(automatic repeat request)技术。结合前面讲的流控技术,可以组成3种形式的arq协议。
        1)、停等arq协议

        停等arq协议是停等流控技术和自动请求重发技术的结合。根据停等arq协议,发送站发出一帧后必须等待应答信号,收到肯定应答信号ack后继续发送下一帧;收到否定应答信号nak后重发该帧;若在一定时间间隔内没有收到应答信号也必须重发。最后一种情况指的注意,没有收到应答信号的原因可能是帧丢失了,也可能是应答信号丢失了。无论哪一种原因,发送站都必须重新发送原来的帧。发送站必须有一个重发计时器,每发送一帧就开始计时。计时长度不能小于信号在线路上一个来回的时间。另外在停等arq协议种,只要能区分两个相邻的帧是否重复就可以了,因此址用0和1两个编号,即帧编号字段长度为1。


        2)、选择重发arq协议

        下面介绍的协议是滑动窗口技术和自动请求重发技术的结合。由于窗口尺寸开到足够大时,帧在线路上可以连续地流动,因此又称其为连续arq协议。根据出错帧和丢失帧处理上的不同,连续arq协议分为选择重发arq协议和后退N帧arq协议。
下图为两种连续arq协议的例子,a图是在全双工线路上应用选择重发arq协议时帧的流动情况。其中第2帧出错,随后的3、4、5帧被缓存。当发送站接收到nak2时,重发第2帧。值得强调的时,虽然在选择重发的情况下接收器可以不按顺序接收,但接收站的链路层像网络层仍是按顺序提交的。
对于选择重发arq协议,窗口的大小有一定的限制。假设帧编号为3为,发送和接收窗口大小都是7,考虑下面的情况:
(1)、发送窗口和接收窗口中的真编号都是0~6。
(2)、发送站发出0~6号帧,但尚未得到肯定应答,窗口不能向前滑动。
(3)、接收站正确地接受了0~6号帧,发出ack7,接收窗口向前滑动,新窗口中的帧编号为7、0、1、2、3、4、5。
(4)、ack7丢失,发送站定时器超时,重发0号帧。
(5)、接收站接收0号帧,看到该帧编号落在接收窗口内,以为是新的0号帧而保存起来,这样协议就出错了。
协议失败的原因是由于发送窗口没有向前滑动,接收窗口向前滑动了最大的距离,而新的接收窗口和原来的发送窗口中仍有相同的帧编号,造成了接收器误把重发的帧当作新到的帧。避免这种错误的办法就是缩小窗口,使得接收窗口向前滑动最大距离后不再于旧的接收窗口重叠。显然,当窗口大小为帧编号数的一半时就可以达到这个效果,所以采用选择重发arq协议时窗口的最大值应为帧编号数的一般,即W发=w收<=2^(k-1)。

        
        3)、后退N帧arq协议

        后退N帧arq协议就是从出错处重发已发出过的N个帧,在图b中,接收窗口的大小为1,因为接收器必须按顺序接收,当第2帧出错时,2、3、4、5号帧都必须重发。
再一次强调在全双工通信中应答信号可以由发方向传送的数据帧“捎带”送回,这种机制进一步减小了通信开销,然而也带来了一定的问题。在很多捎带方案中,反向数据帧中的应答字段总是捎带一个应答信号,这样就可能出现对同一个帧的重复应答。假定帧编号字段为3位长,发送窗口大小位8.当发送器收到第一个ack1后把窗口推进到后延为1、前沿为0的位置,即发送窗口现在包含的帧编号为1、2、3、4、5、6、7、0。如果这时有收到一个捎带回的ack1,发送器如何做呢?后一个ack1可能表示窗口中的所有帧都未曾接收,也可能意味着窗口中的帧都以正确接收,然而,如果规定窗口的大小为7,则可以避免这种二义性。所以在后退N帧协议中必须限制发送窗口大小W<=2^k-1。

        

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

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

相关文章

Flask快速入门

Flask快速入门&#xff08;路由、CBV、请求和响应、session&#xff09; 目录 Flask快速入门&#xff08;路由、CBV、请求和响应、session&#xff09;安装创建页面Debug模式快速使用Werkzeug介绍watchdog介绍快速体验 路由系统源码分析手动配置路由动态路由-转换器 Flask的CBV…

01 Pytorch 基础

1.数据处理 1.取一个数据&#xff0c;以及计算大小 &#xff08;剩下的工作&#xff0c;取batch&#xff0c;pytorch会自动做好了&#xff09; 2.模型相关 如何得到结果 3.模型训练/模型验证: 代码剖析 1.配置文件yaml (字典) #参数配置config {"train_path"…

怎么把pdf格式文件其中几页单独弄出来

在现代办公和学习环境中&#xff0c;pdf格式的文件因其跨平台兼容性和良好的保持原样特性而备受欢迎。然而&#xff0c;有时我们可能只需要pdf文件中的某几页&#xff0c;而不是整个文件。这时&#xff0c;将PDF文件中的特定页面单独提取出来就显得尤为重要。 搜索一下&#xf…

【DevOps】Nginx配置文件详解与实战部署PHP站点

目录 引言 Nginx配置文件概述 基本结构 关键指令 Nginx配置文件实战 全局指令配置 HTTP指令配置 服务器指令配置 位置指令配置 实战部署PHP站点 步骤1&#xff1a;安装Nginx和PHP 步骤2&#xff1a;创建网站目录和文件 步骤3&#xff1a;配置Nginx服务器块 步骤4…

C++学习(18)

#学习自用# 模板 模板解决代码复用 我们看一个简单的例子。 #include<iostream>#include<string>using namespace std;void print(string str){cout << str << endl;}void print(int str){cout << str << endl;}void print(float str){…

【HarmonyOS】鸿蒙入门学习

一、开发前的准备 &#xff08;一&#xff09;HarmonyOS 开发套件介绍 &#xff08;二&#xff09;开发者主要使用的核心套件 主要为代码开发阶段会使用到的 DevEco Studio、ArkTS、ArkUI三个工具。 &#xff08;三&#xff09;熟悉鸿蒙官网 1、网址 https://developer.hua…

第19篇 Intel FPGA Monitor Program的使用<二>

Q&#xff1a;Intel FPGA Monitor Program里集成的Computer System是什么架构的呢&#xff1f; A&#xff1a;我们以DE2-115的DE2-115_Computer System为例介绍&#xff0c;简单说DE2-115_Computer System就是一个Qsys系统&#xff0c;该系统包含Nios II处理器以及DE2-115开发…

windows 下 docker 入门

这里只是具体过程&#xff0c;有不清楚的欢迎随时讨论 1、安装docker &#xff0c;除了下一步&#xff0c;好像也没有其他操作了 2、安装好docker后&#xff0c;默认是运行在linux 下的&#xff0c;这时我们需要切换到windows 环境下&#xff0c; 操作&#xff1a;在右下角d…

C#——方法函数详情

方法(函数) C#是面向对象的,所以C#中的方法也是相对于对象来说的,是指某个对象的行为,比如,有一个动物的类,兔子是这个动物类里的一个对象,那么跳这个行为就是兔子这个对象的方法了.其实也就是C中的函数(C是面向过程的,叫函数). 方法: 就是把一系列相关的代码组织到一块 用于…

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 &#x1f349;人工智能在制造业中的应用 &#x1f348; 应用场景及便利 &#x1f34d;生产线自动化 &#x1f34d;质量控制 &#x1f34d;预测性维护 &#x1f34d;供应链优化 &#x1f348; 技术实现及核心 &#x1f34d;机器学习和…

CSS入门到精通——表格样式

目录 表格边框 任务描述 相关知识 表格边框 折叠边框 编程要求 表格颜色、文字与大小 任务描述 相关知识 表格颜色 表格文字对齐与文字粗细 表格宽度和高度 任务要求 表格边框 任务描述 本关任务&#xff1a;在本关中&#xff0c;我们将学习如何使用CSS设置表格样…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考

结合最近几年的活动安排&#xff0c;预计2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地准备汉字小达人比赛呢&#xff1f; 我的建议是充分利用即将到来的暑假&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0…

【吊打面试官系列-Mysql面试题】MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

大家好&#xff0c;我是锋哥。今天分享关于 【MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量…

【Python】Python 2 测试网络连通性脚本

文章目录 前言1. 命令行传参2. 代码 前言 最近在只有python2的服务器上部署服务&#xff0c;不能用三方类库&#xff0c;这里出于好奇心学习下python。这里简单做个脚本&#xff0c;实现了检验网络连通性的功能&#xff08;类似于curl&#xff09;。 1. 命令行传参 使用命令…

Apple ID已成历史,在ios18中正式更名为Apple Account

随着iOS18的首个开发者预览版成功推送&#xff0c;众多热衷于尝鲜的用户已纷纷升级并开启全新体验。在这个版本中&#xff0c;备受瞩目的Apple ID正式迎来了它的进化——更名为Apple Account&#xff0c;并且拥有了中文名称“Apple账户”或简称“苹果账户”。 不过目前官网还称…

桌面应用开发框架比较:Electron、Flutter、Tauri、React Native 与 Qt

在当今快速发展的技术环境中&#xff0c;对跨平台桌面应用程序的需求正在不断激增。 开发人员面临着选择正确框架之挑战&#xff0c;以便可以高效构建可在 Windows、macOS 和 Linux 上无缝运行的应用程序。 在本文中&#xff0c;我们将比较五种流行的桌面应用程序开发框架&…

高效数据架构:分表流程实践

前言 ​ 随着业务的不断扩展&#xff0c;数据量激增成为不可避免的现象。当数据量达到某一临界点时&#xff0c;单一的数据表可能无法承载如此庞大的数据量&#xff0c;此时就需要考虑进行分库分表的策略。尽管业界普遍认为数据量达到1000万时就应考虑分表&#xff0c;但实际上…

HALCON-从入门到入门-阈值分割定位算子综合运用

1.废话 之前我的一个师兄告诉我&#xff0c;针对图像上想要定位的内容&#xff0c;机器视觉中定位的方式有很多种&#xff0c;但是如果用阈值分割定位可以做的&#xff0c;就不要用模板匹配了。因为基于形状的模板匹配始终会存在匹配不到的风险&#xff0c;那如果打光效果可以…

【DevOps】Ubuntu基本使用教程

目录 引言 Ubuntu简介 安装Ubuntu 准备工作 创建启动盘 安装过程 桌面环境 基本操作 定制桌面 文件管理 文件操作 文件权限 软件管理 安装软件 更新软件 系统设置 用户账户 网络设置 电源管理 命令行操作 常用命令 管理权限 安全与维护 系统更新 备份…

C++ 12 之 指针引用

c12指针引用.cpp #include <iostream>using namespace std;struct students12 {int age; };int main() {students12 stu;students12* p &stu; // 结构体指针students12* &pp p; // 结构体指针起别名pp->age 20;// (*pp).age 22;cout << "…