计算机网络——数据链路层-可靠传输的实现机制:回退N帧协议GBN(无差错情况、累积确认、有差错情况、发送窗口尺寸)

目录

回退N帧协议GBN

介绍

无差错情况

累积确认

有差错情况

发送窗口尺寸

小结

练习

解析 

示意图


上篇中所介绍的停止-等待协议的信道利用率很低;若出现超时重传,则信道利用率更低。

如果发送方在收到接收方的确认分组之前可以连续发送多个数据分组,则可大大提高信道利用率,也就是一种流水线式的传输。


回退N帧协议GBN

介绍

本篇我们介绍回退N帧协议,该协议在流水线传输的基础上,利用发送窗口来限制发送方可连续发送分组的个数。

举例说明:

假设采用3个比特给分组编序号,因此序号的取值范围是0-7,如上图所示,那是收发双方各自的分组序号,当序号增加到7时,下一个序号又从0开始。

发送方要维持一个发送窗口,序号落在发送窗口内的数据分组可被连续发送;而不必等收到接收方的相应确认分组后再发送,发送窗口的尺寸即为W_T

对于本例,其取值范围是1\leqslant W_T\leqslant 2^3-1,其中的3是构成分组序号的比特数量,本例取W_T的值为5。

  • 如果WT的值取为1,则是停止-等待协议
  • 如果WT的值超过取值范围的上限,则会造成严重的错误

如下图所示,序号落在发送窗口内的这5个数据分组可以连续发送;而序号落在发送窗口外的数据分组不允许发送。

接收窗口的尺寸即为W_R,对于回退N帧协议,其取值只能为1,这一点与停止等待协议是相同的。

如下图所示,序号落在接收窗口内的这个数据分组允许接收;而序号落在接收窗口外的数据分组不允许接收。

无差错情况

我们首先来看最简单的情况,也就是无差错的情况。

发送方将序号落在发送窗口内的0-4号数据分组依次连续发送出去,他们经过互联网的传输正确到达了接收方,也就是没有出现乱序和误码。

接收方按序接收,他们每接收一个接收窗口就向前滑动一个位置,并给发送方发送针对所接收分组的确认分组,0-4号确认分组经过互联网的传输,正确到达了发送方

发送方每接收一个发送窗口,就向前滑动一个位置;这样就有新的序号落入了发送窗口,发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组交付上层处理。

累积确认

接下来我们来看累积确认的概念。

使用回退N帧协议的接收方可以采用累积确认的方式,也就是说,接收方不一定要对收到的数据分组逐个发送确认,而是可以在收到几个数据分组后(由具体实现决定),对按序到达的最后一个数据分组发送确认ACKn表示序号为n及以前的所有数据分组都已正确接收了。

举例说明:

发送方将序号落在发送窗口内的0-4号数据分组依次连续发送出去,他们经过互联网的传输正确到达了接收方,接收方按序接收他们。

当接收完0号和1号数据分组后,给发送方发送了一个累积确认ACK1;

当接收完2-4号数据分组后,又给发送方发送了一个累积确认ACK4;

假设ACK1在传输过程中丢失了,而ACK4正确到达了发送方发送方接收ACK4后就知道了序号为4,即之前的数据分组已被接收方正确接收了;于是将发送窗口向前滑动5个位置,这样就有新的序号落入了发送窗口,发送方可以将收到确认的数据分组从缓存中删除了;而接收方可以择机将已接收的数据分组交付上层处理。

从本例可以看出,使用累积确认的其中一个优点就是:即使确认分组丢失,发送方也可能不必重传,例如本例中ACK1丢失了,但并没有造成1号数据分组的超时重传。

使用累积确认还有其他好处,例如可以减少接收方的开销,减少对网络资源的占用等

当然,使用累积确认也有缺点,那就是不能向发送方及时反映出接收方已经正确接收的数据分组的信息。

有差错情况

接下来我们来看出现差错的情况,

发送方将序号落在发送窗口内的这5个数据分组依次连续发送出去,他们经过互联网的传输到达了接收方;

假设他们在传输过程中受到了干扰,其中5号数据分组出现了误码,接收方通过数据分组中的检错码发现了错误,于是丢弃该数据分组;

而后续到达的这4个数据分组的序号与接收窗口中的序号不匹配:

接收方同样也不能接受它们,将它们丢弃,并对之前按序接收的最后一个数据分组进行确认,也就是发送ACK4。每丢弃一个数据分组就发送一个ACK4,这四个ACK4经过互联网的传输到达了接收方。(数据分组5在差错检测里就被丢弃了,而其他四个是在接收端因为窗口不匹配丢弃的,所以发四个,而不是五个)

发送方之前就接收过ACK4,当收到这些重复的ACK4时,就知道了之前所发送的数据分组出现了差错,于是可以不等超时计时器超时就立刻开始重传。

至于收到几个重复确认就立刻重传,由具体实现来决定。

在本例中,假设收到这4个重复的确认并不会触发发送方立刻重传;

一段时间后,超时计时器出现超时,发送方将发送窗口内已发送过的这些数据分组,全部重传;

在本例中,尽管序号为6、7、0、1的数据分组之前已经正确的到达接收方,但由于5号数据分组误码不被接受,他们也受到牵连而不被接受;发送方还要重传这些数据分组,这就是所谓的Go-back-N,也就是回退n帧。

可见当通信线路质量不好时,回退N帧协议的信道利用率并不比停止-等待协议高。

发送窗口尺寸

接下来我们来看看如果发送窗口的尺寸W_T超过其取值范围的上限会出现什么情况。

对于本例,我们故意超过该上限,将W_T取值为8;

发送方将序号落在发送窗口内的0-7号这8个数据分组依次连续发送出去,他们经过互联网的传输
正确到达了接收方,接收方按序正确接收他们后,给发送方发回累积确认ACK7,假设ACK7在传输过程中丢失了,这将导致发送方的超时重传,重传的0-7号数据分组到达接收方;

现在问题来了:接收方根据当前接收窗口内的序号,会对这8个数据分组按序接收,但是接收方之前已经接收过这8个数据分组了,现在是在重复接收,也就是说接收方无法分辨新旧分组,进而会产生分组重复这种传输差错。(简单来说,无法进行按序接受,接收窗口的序号会不匹配)

因此,发送窗口的尺寸不能超过其上限。

小结

练习

接下来我们来做一个有关回退N帧协议的练习,

这是计算机专业考研全国统考计算机网络部分2009年的题 35:


答案选择C。


解析 

题目所给发送方只收到0、2、3号帧的确认,这就表明接收方正确接收了0-3号帧;

并针对它们中的每一个发送了确认帧,只不过针对1号帧的确认帧丢失了。(这是题目中的陷阱,但又没有相应的选项,所以迷惑性并不是很大)

截止到计时器超时,发送方只收到了针对0、2、3号帧的确认,而发送方之前已经发送了0-7号帧,因此应该从4号帧开始重传,即重传之前已经发送过的4、5、6、7号帧,共计重传4个帧。

示意图

我们再来画个示意图,以便更容易理解该题,

假设这是帧可用的序号,这是发送窗口:

发送方将序号落在发送窗口内的0-7号数据帧依次发送出去。

当收到针对0号数据帧的确认帧ACK0时,发送窗口向前移动一个位置:

若收到针对1号数据帧的确认帧ACK1时,发送窗口也会向前移动一个位置,只不过ACK1在传输过程中丢失了:

当收到针对2号数据帧的确认帧ACK2时,发送窗口向前移动两个位置,将序号1和2全部移出发送窗口:

当收到针对3号数据帧的确认帧ACK3时,发送窗口向前移动一个位置:

之后发送方出现了超时,将发送窗口内已发送但未收到确认的4、5、6、7号数据帧依次重传:


END 


学习自:湖科大——计算机网络微课堂

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

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

相关文章

Leetcode—2413.最小偶倍数【简单】

2023每日刷题(六十) Leetcode—2413.最小偶倍数 class Solution { public:int smallestEvenMultiple(int n) {return (n % 2 1) * n;} };运行结果 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏…

局域网环境下的ntp对时

服务端: 此处为v4-sp4服务器 安装ntp,apt-get install ntp -y ,若为离线环境,则安装ntp和libopts25两个包。 配置: 在/etc/ntp.conf的配置文件里 加入 restrict default nomodify notrap noquery restrict 127.0.0.1 rest…

libxlsxwriter - 编译

文章目录 libxlsxwriter - 编译概述笔记编译环境编译思路编译安装组件写个测试程序, 看看编译的组件是否好使END libxlsxwriter - 编译 概述 想换一个新版的libxlsxwriter, 自己编译一个出来. libxlsxwriter依赖zlib, 前面已经成功编译了zlib(zlib - 编译). 笔记 libxlsxwr…

大模型Transformer 推理 :kvCache原理浅析

大模型Transformer 推理 :kvCache原理浅析 kvCache 原理 在采样时,Transformer模型会以给定的提示/上下文作为初始输入进行推理(可以并行处理),然后逐一生成额外的标记来继续完善生成的序列(体现了模型的自回归性质)。在采样过程中,Transformer会执行自注意力操作,为…

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码

目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分(Vue3)2.1. 新增依赖 cryp…

C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用

目录 1.STL的诞生 2. STL的基本概念 3. STL六大组件 4. STL容器,算法,迭代器 容器:存放数据的地方 算法:解决问题的方法 迭代器:容器和算法之间的桥梁 5. STL初始:打印0 ~ 9 的数字 这篇文章是一篇…

day34算法训练|贪心算法

1005.K次取反后最大化的数组和 两次贪心算法思路 1. 数组中有负数时,把绝对值最大的负数取反 2. 数组全为非负数时,一直取反最小的那个数 步骤: 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小…

云仓酒庄为您甄选西班牙葡萄酒

西班牙是一个拥有悠久葡萄酒酿造与饮用历史的国家,其葡萄酒产量位居世界第三位。云仓酒庄的品牌雷盛红酒分享翻开西班产区地图,不少葡萄酒刚入门的朋友会感到头疼,众多产区、分级制度、陈年标准,想要短时间内搞懂实在不容易。不用…

案例069:基于微信小程序的计算机实验室排课与查询系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

设计模式-状态(State)模式

目录 开发过程中的一些场景 状态模式的简单介绍 状态模式UML类图 类图讲解 适用场景 Java中的例子 案例讲解 什么是状态机 如何实现状态机 SpringBoot状态自动机 优点 缺点 与其他模式的区别 小结 开发过程中的一些场景 我们在平时的开发过程中,经常会…

【C语言(十五)】

动态内存管理 一、为什么要有动态内存分配? 我们已经掌握的内存开辟方式有: int val 20 ; // 在栈空间上开辟四个字节 char arr[ 10 ] { 0 }; // 在栈空间上开辟 10 个字节的连续空间 但是上述的开辟空间的方式有两个特点: • 空间开辟大小是固…

leetcode LCR 173. 点名

代码&#xff1a; class Solution {public int takeAttendance(int[] records) {int left0,rightrecords.length-1;while (left<right){int midleft(right-left)/2;if(midrecords[mid]){leftmid1;}else {rightmid;}}if(leftrecords[left]){return left1;}else {return left…

北斗三号短报文+4G的低功耗太阳能船载报位监控方案

国内海洋船舶群体长期在海上航行&#xff0c;多数海员由于海面无信号覆盖、个人卫星通信费用昂贵、无法自由使用船载公用卫星通信设备等原因&#xff0c;无法与家人和朋友保持联系&#xff0c;甚至在遇到危险的时候也无法及时向外界发出求救信号&#xff0c;管理单位难以掌握船…

新钛云服助力爱达邮轮·魔都号首航,保驾护航,共创辉煌

随着2024年1月1日的临近&#xff0c;中国首艘国产大型邮轮——爱达邮轮魔都号即将迎来激动人心的首航时刻。作为爱达邮轮的IT系统运维和安全服务伙伴&#xff0c;新钛云服有幸提前登船体验&#xff0c;并为魔都号即将到来的航行提供全面的技术支持与保障。 爱达魔都号&#xff…

微积分-三角函数2

三角函数 在上一节中&#xff0c;讨论了如何在直角三角形中定义三角函数&#xff0c;限制让我们扩展三角函数的定义域。 事实上我们可以取任意角的正弦和余弦&#xff0c;而不只是局限于 0 0 0~ π 2 \frac{\pi}{2} 2π​当中。 当然需要注意的是&#xff0c;正切函数对不是对…

Git使用rebase和merge区别

Git使用rebase和merge区别 模拟环境使用merge合并使用rebase 模拟环境 本地dev分支中DevTest增加addRole() 远程dev被同事提交增加了createResource() 使用merge合并 使用idea中merge解决冲突后, 推送远程dev后,日志图显示 使用rebase idea中使用功能rebase 解决冲突…

论文解读 | NeurIPS2023:「解释一切」图像概念解释器

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 讲者简介 孙奥&#xff1a; 香港科技大学软件安全实验室在读博士&#xff0c;研究兴趣为可解释性人工智能和可信机器学习&#xff0c;主要是从Post-hoc&#xff0c;逻辑和概念的角度分析神经网络的机理 Title 「…

IntelliJ IDEA 自带的 HTTP Client接口调用插件,替代 Postman

文章目录 引言建议目录结构新建请求不同环境的变量配置添加环境http-client.env.jsonhttp-client.private.env.json引用变量 请求示例Get请求示例Post请求示例鉴权示例断言示例Websocket请求示例 内置对象和动态变量内置对象&#xff1a;内置变量&#xff1a; 引言 在日常的 W…

Eslint 要被 Oxlint替换了吗

什么是 Oxlint 由于最近的rust在前端领域的崛起,基于rust的前端生态链遭到rust底层重构,最近又爆出OxLint,是一款基于Rust的linter工具。Oxlint在国外前端圈引起热烈讨论,很多大佬给出了高度评价。 事实上,Oxlint 是 Oxc 项目旗下的一款产品,专为 JavaScript 和 TypeSc…

Python轴承故障诊断 (七)基于EMD-CNN-LSTM的故障分类

目录 前言 1 经验模态分解EMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 2.3 故障数据的EMD分解可视化 2.4 故障数据的EMD分解预处理 3 基于EMD-CNN-LSTM的轴承故障诊断分类 3.1 训练数据、测试数据分组&#xff0c;数据分batch 3.…