三句话介绍清楚滑动窗口协议/GBN/SR

滑动窗口协议、GBN、SR之间不得不说的故事

首先我们来介绍什么是滑动窗口协议

滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。关于TCP协议的介绍,可以查看我的另外一条博文《计算机网络自顶向下》知识体系梳理

如果许多客户向主机以很快的速度发送大量的数据包,但是接收方却没有如此高的接收数据的能力,这个时候,我们就要控制发送方的发送速度,控制它不要过快,要求发送方限制它已经发出但未经确认的帧的数目,使得网络传输效率得以提高,滑动窗口协议就是这么来的。
在任何基于自动重发请求进行错误控制的通信协议中,接收方必须确认收到的数据包。
如果发送方在合理的时间内没有收到确认,则重发数据。没有听到确认的发送方不知道接收方是否实际接收到分组(数据可能在传输中丢失或损坏)。 如果错误检测显示损坏,则数据包将被接收方忽略,并且不会发送确认。 因为网络传输的时延,将有大量时间被用于等待确认,导致传输效率低下。

定义

传输的每个部分被分配唯一的连续序列号,接收方使用数字并以正确的顺序放置接收到的数据包,丢弃重复的数据包并识别丢失的数据。

工作原理

简单来说:第一个和第二个包发送过去后,收到第一个确认包就把第三个包发送过去,图示如下(图片来源于网络):

在这张图里我们可以看到,灰色1,2,3号包已经发送完毕,并且已经收到了ACK,4,5,6,7号包是黄色的,表示已经发送的,没收到ACK的意思就是也不知道对方接收到了没有,但还没有收到ACK,8,9,10号包是绿色的,表示还未发送,白色部分表示还未读入内存,要等到4-10号包收到ACK后才会有所动作。

发生丢包时

这种情况可能是我们包发过去,对方的ACK丢了;或者是我们的包并没有发生过去,对方没有收到ACK。
此时的情况:一直在等ACK,如果一直等不到ACK发过来,我们就会把读进缓存的ACK包也一起发送过去,但这个时候窗口已经发满了,说一并不能读取12号包,而是在一直等待5号包的ACK。

当ACK包一直发送不过来的情况时

解决方法:超时重传
ACK是要按照顺序发送的,也就是说,必须等到5的ACK收到,才会把6-11的ACK发送过去,这样做的目的是为了保持滑动窗口的顺序。

上图可以看出5号包已经接受ACK,后面的6,7,8号包也发送过去,窗口便继续向后移动。

GBN协议

后退N帧ARQ协议对传统的自动重传请求(ARQ,Automatic Repeat reQues)进行了改进,从而实现了在接收到ACK之前能够连续发送多个数据包。

工作过程

GBN协议中,发送方在发完一个数据帧后,连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍未收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧

确认过程

接受帧只允许按顺序接受帧。为了减少开销,累计确认允许接收端在连续收到好几个正确的确认帧后,只对最后一个数据帧发确认信息,或者可以在自己有数据要发送时才将对以前正确收到的帧加以捎带确认。这就是说,对某一数据帧的确认就表明该数据帧和这以前所有的数据帧均已正确无误地收到了。

SR协议工作原理

SR协议是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。显然,SR减少了浪费,但要求接收方有足够大的缓冲区空间

举例说明


答案是C
在这里有读者肯定就要问了,为什么1不重发?
答案很简单:因为GBN采用的是累积确认机制,收到编号为2的帧时,便不会再去管前面编号为1的帧是否收到。
所以重发的帧编号是在3后面的,编号为4,5,6,7的帧。

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

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

相关文章

《计算机网络自顶向下》之重头戏迪杰斯特拉算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略&…

新闻发布系统java ee_Java EE 7发布–反馈和新闻报道

新闻发布系统java eeJava EE 7已经存在了几天。 我们所有人都有机会观看直播活动或可用的重播 。 最后的MR版本完成了将其工作推向JCP的工作,基本上是一个总结。 是时候反思发生的事情和我对此的想法了。 启动活动中的社区参与 它不是一个大秘密。 即使Oracle的Jav…

在即将发布的Camel 2.21版本中改进了使用Apache Camel和ActiveMQ Artemis处理大型消息的功能...

从历史上看, Apache ActiveMQ消息代理最初是在大型消息以MB为单位而不是GB的情况下创建的,就像您今天所做的那样。 下一代代理Apache ActiveMQ Artemis(或仅是Artemis)则不是这种情况,后者对大消息有更好的支持。 因…

深入浅出组合逻辑电路(1)

定义:电路在任意时刻的输出仅由该时刻的输入信号决定,与之前的输入信号无关。 组合电路通常有一些逻辑门构成,许多具有典型功能的组合电路已经集成为商品电路。(加法器,译码器等) 分析步骤: …

深入浅出逻辑组合电路(2)

深入浅出逻辑组合电路(2) 门电路中的冒险现象 通常讨论逻辑电路时,只从抽象的逻辑角度进行描述,不考虑实际电路中必然存在的信 号传输时延和信号电平变化时刻对逻辑功能的影响。逻辑门的传输时延以及多个输入信号变 化时刻不同步…

学习数字电路必须知道的几种编码

2-10进制编码(BCD编码) BCD码:使用一个四位二进制代码表示一位十进制数字的编码方法。 一、8421码 选取0000~1001表示十位二进制数 0到9 按自然顺序的二进制数表示所对应的十进制数字,是有权码,从高位到地位的权依…

Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9 High Performance

您好极客! 今天,我们为您带来一些激动人心的消息! Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 本周,我们提供Java相关书籍的折扣,以帮助您理解和掌握Java。 他们全都打折到每本书5美元 !…

深入浅出组合逻辑电路(3)常见的几种编码器

编码器是啥? 下面介绍几种常见的编码器 答:编码器是实现编码的数字电路,对于每个有效的输入信号,编码器输出与之对应的一组二进制代码。 2^n-n线编码器 是最基本的编码器 图示为8-3线译码器 输入为8个代编码信号,…

深入浅出逻辑电路(4)介绍几种常见的译码器

译码器是啥? 输入一组二进制编码,输出一个有效的信号 译码器输入的 n 位二进制代码有2n种取值,称为2n种不同的编码值。若将每种编码分别译出,则译码器有2n个译码输出端,这种译码器称为全译码器。 若译码器的输入编码…

几道题帮你搞定数据选择器

这里不写答案,只讲思路 这个逻辑表达式比较短,咱们首先就考虑到先将F写成最小项表达式 从三个自变量中选择两个作为选择器的地址变量,本题为A1A0AB 然后把C处理一下,化简式子,使得式子的每一项都有AB,每一…

深入浅出时序逻辑电路(1)

我们一提到时序逻辑电路,就会想到触发器 先讲讲时序逻辑电路:时序逻辑电路(常简称为时序电路)内部包含存储器,用于记忆电路的工作状态和输入变化情况,其输出由当前的输入和存储信息共同确定的一种电路。 再…

云幸福–如何在几分钟内安装新的OpenShift Container Platform 3.7

此安装需要安装Red Hat Middleware产品流(预先配置的容器选项)以及所有其他功能,例如源容器,映像容器和.Net Core容器。自OpenShift容器平台发布以来,我一直希望提供一个简单的方法。 ,完全配置且易于使用的…

从分析一个简单的时序电路入手

这道题怎么搞呢 先看图 看到了一个JK触发器,左边那个是J触发器转化为D触发器 右边那个就是JK触发器 写出两个次态方程:还有一个输出表达式:将激励函数带入表达式,求出两个次态方程 然后画出状态表: 再画出状态图&a…

组合逻辑电路运算法则

逻辑电路计算性质 与非门:有0出1,全1才0 & 或非门:有1出0,全0才1 >1 异或门:相同出0,不同出1 ⊕ 常用公式 ABAB‾\overline{B}BA AABA AAB‾\overline{B}BAB A00 A1A A*A‾\overline{A}A0 …

jmeter实现翻页功能_JMeter定制功能实现

jmeter实现翻页功能JMeter提供了可在采样器中使用的功能。 在编写复杂的测试计划时,您会觉得JMeter缺少某些方法。 您使用Beanshell脚本定义自己的自定义方法。 JMeter调用Beanshell解释器来运行脚本。 只要您不产生高负载(大量线程)&#xf…

常见的集成逻辑门(CMOS\TTL\ECL)

CMOS系列 TTL系列 ECL系列 集成逻辑门的主要性能指标 关于噪声容限UN 输出负载能力 总结一下:不管那么多,先把两个算出来,取最小的就完事了 答案:ECL,CMOS,ECL,CMOS

git如何快速提交代码(大学生适用)

众所周知,git是一个强大的版本控制工具 git的学习成本比较高,但大学生常用的功能也就那么几个 首先你需要下载一个git,生成一个密钥 生成方法:打开git(bash) $ ssh-keygen -t rsa -C “你的邮箱地址”&a…

mongodb副本集_设置MongoDB副本集分为4个步骤

mongodb副本集介绍 在详细介绍配置MongoDB副本集之前,让我简要介绍一下它们: 副本集是Mongodb数据库提供的功能,可实现高可用性和自动故障转移。 它是一种传统的主从配置,但具有自动故障转移功能。 基本上,它是mong…

Spring Boot:使用Thymeleaf布局方言的Thymeleaf模板装饰器

介绍 在所有Thymeleaf模板上重用页眉和页脚的问题经常在StackOverflow上提出。 在本文中,我将向您展示如何使用Thymeleaf布局方言来结构化模板,以在Spring Boot应用程序中实现更高的代码可重用性。 创建一个Spring Boot应用程序 让我们使用Spring Initi…

猫、狗与Java的多态

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后&#…