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

本文主要是介绍计算机网络——数据链路层-可靠传输的实现机制:回退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 


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

这篇关于计算机网络——数据链路层-可靠传输的实现机制:回退N帧协议GBN(无差错情况、累积确认、有差错情况、发送窗口尺寸)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499973

相关文章

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求