热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3.4.1计算机网络之流量控制(停止等待协议、滑动窗口、后退N帧协议GBN、选择重传协议SR)、滑动窗口、可靠传输机制

文章目录0.思维导图1.什么是流量控制?


文章目录




      • 0.思维导图
      • 1.什么是流量控制?
      • 2.什么是可靠传输机制?
      • 3.什么是滑动窗口机制?
      • 4.可靠传输、流量控制、滑动窗口之间的关系
      • 5.停止-等待协议

        • (1)为什么要有停止-等待协议?
        • (2)研究停止等待协议的前提
        • (3)停止-等待协议有几种应用情况?

          • 1️⃣ 无差错情况
          • 2️⃣ 有差错情况

            • ① 数据帧丢失或检测到帧出错
            • ② ACK确认帧丢失
            • ② ACK确认帧迟到超时
        • (4)停止等待协议性能分析
      • 6.多帧滑动窗口与后退N帧协议(GBN)

        • (1)后退N帧协议(GBN)的滑动窗口
        • (2)GBN发送方响应的三件事

          • 1️⃣ 上层的调用
          • 2️⃣ 收到一个ACK
          • 3️⃣ 超时事件
        • (3)GBN接受方要做的事
        • (4)一张图了解GBN发送方和接受方之间的传输过程
        • (5)GBN滑动窗口的限制
        • (6)GBN重点知识
        • (7)GBN性能分析
      • 7.多帧滑动窗口与选择重传协议(SR)

        • (1)SR的滑动窗口图
        • (2)SR发送方必须响应的三件事

          • 1️⃣ 上层的调用
          • 2️⃣ 收到一个ACK确认帧
          • 3️⃣ 超时处理
        • (3)SR接受方要做的事
        • (4)一张图了解SR发送方和接受方之间的传输过程
        • (5)SR滑动窗口的大小限制
        • (6)SR重点知识



0.思维导图


1.什么是流量控制?


  • 流量控制是数据链路层的一种功能,流量控制对数据链路上的帧的发送速率进行控制,以使接收方有足够的缓冲空间来接受每个帧
  • 流量控制的基本方法是由接收方控制发送方发送数据的速率
  • 常见的流量控制方式有两种:停止-等待协议、滑动窗口协议

2.什么是可靠传输机制?


  • 可靠传输机制是为了使数据可以正确稳定的传输和接收而制定的规则。

  • 数据链路层的可靠传输通常使用确认超时重传两种机制来完成。

  • 确认是一种无数据的控制帧,这种控制帧使得接收方可以让发送方知道哪些内容被正确接收。有些情况下为了提高传输效率,将确认捎带在一个回复帧中,称为捎带确认

  • 超时重传是指发送方在发送某一个数据帧以后就开始一个计时器,在一定时间内如果没有得到发送的数据帧的确认帧,那么就重新发送该数据帧,直到发送成功为止。

  • 自动重传请求(Auto Repeat reQuest,ARQ),通过接收方请求发送方重传出错的数据帧来恢复出错的帧,是通信中用于处理信道所带来差错的方法之一。

  • 传统自动重传请求分为三种,即停等式(Stop-and-Wait)ARQ、后退N帧(Go-Back-N)ARQ以及选择性重传(Selective Repeat)ARQ。后两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大,帧在线路上可以连续地流动,因此又称为连续ARQ协议。


3.什么是滑动窗口机制?


  • 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口
  • 发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。
  • 不同的滑动窗口协议窗口大小一般不同。
  • 发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。


  • 发送端,每收到一个确认帧,发送窗口就向前滑动一个帧的位置,当发送窗口内没有可以发送的帧(即窗口内的帧全部是已发送但未收到确认的帧),发送方就会停止发送,直到收到接受方发送的确认帧使窗口移动,窗口内有可以发送的帧,之后才开始继续发送。

  • 接受端,当收到数据帧后,将窗口向前移一个位置,并发回确认帧,若收到的数据帧落在接受窗口之外则一律丢弃。

  • 滑动窗口有以下重要特性:


  1. 只有接受窗口向前滑动时(同时接受方发送确认帧),发送窗口才有可能(只有发送方收到确认帧才是一定)向前滑动。

  2. 从滑动窗口的概念看,停止-等待协议、后退N帧协议和选择重传协议只有在发送窗口大小和接收窗口大小有所差别。

  3. 停止-等待协议:发送窗口大小=1,接受窗口大小=1;

  4. 后退N帧协议:发送窗口大小>1,接受窗口大小=1;

  5. 选择重传协议:发送窗口大小>1,接受窗口大小>1;

  6. 当接受窗口的大小为1时,可保证帧的有序接受。


4.可靠传输、流量控制、滑动窗口之间的关系


5.停止-等待协议


  • 停止-等待协议也称为单帧滑动窗口与停止-等待协议
  • 当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。
  • 该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。
  • 由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。
  • 由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。

(1)为什么要有停止-等待协议?


(2)研究停止等待协议的前提


  • 虽然现在常用全双工通信方式,但是为了讨论方便,我们仅考虑一方发送数据(发送方),一方接收数据。

(3)停止-等待协议有几种应用情况?


  • 两种:无差错和有差错

1️⃣ 无差错情况
2️⃣ 有差错情况
① 数据帧丢失或检测到帧出错
② ACK确认帧丢失
② ACK确认帧迟到超时

(4)停止等待协议性能分析


  • 关于信道利用率可参考我之前的:https://blog.csdn.net/weixin_43914604/article/details/104541219
  • 发送方从开始发送数据到收到第一个确认帧ACK为止,这段时间称为一个发送周期
  • 信道利用率=发送时间/发送周期
  • 由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n帧协议(GBN)和选择重传协议(SR)

6.多帧滑动窗口与后退N帧协议(GBN)


  • 后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍未收到确认帧,就要重发相应的数据帧。
  • 如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。
  • 从这里不难看出,后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。
  • 由此可见,若传输信道的传输质量很差因而误码率较大时,连续测协议不一定优于停止等待协议。此协议中的发送窗口的大小为k,接收窗口仍是1。

(1)后退N帧协议(GBN)的滑动窗口


(2)GBN发送方响应的三件事


1️⃣ 上层的调用
  • 上层要发送数据时,发送方先检查发送窗口是否已满,如果未满,则产生一个帧并将其发送;如果窗口己满,发送方只需将数据返回给上层,暗示上层窗口已满。上层等一 会再发送。 ( 实际实现中,发送方可以缓存这些数据,窗口不满时再发送帧)。
  • 配合下图加深理解

2️⃣ 收到一个ACK
  • GBN协议中,对n号帧的确认采用·累积确认·的方式,标明接收方已经收到n号帧和它之前的全部帧。

3️⃣ 超时事件
  • 协议的名字为后退N帧/回退N帧,来源于出现丢失和时延过长帧时发送方的行为。
  • 就像在停等协议中一样,定时器将再次用于恢复数据帧或确认帧的丢失。
  • 如果出现超时,发送方重传所有已发送但未被确认的帧。

(3)GBN接受方要做的事


(4)一张图了解GBN发送方和接受方之间的传输过程


(5)GBN滑动窗口的限制


(6)GBN重点知识


  • 来道题目熟悉一下知识

  • 因为接收端可以累积确认,所以只要看最大的确认帧就行,所以接下来发送方要重发的帧数为4

(7)GBN性能分析


7.多帧滑动窗口与选择重传协议(SR)


  • 在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。由此诞生了SR(SELECTICE REPEAT)。
  • SR工作原理:当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以将已存于缓冲区中的其余帧一并按正确的顺序递交上一层。
  • 显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。

(1)SR的滑动窗口图


(2)SR发送方必须响应的三件事


1️⃣ 上层的调用
  • 从上层收到数据后,SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧;否则就像GBN一样,要么将数据缓存,要么返回给上层之后再传输。

2️⃣ 收到一个ACK确认帧
  • 如果收到ACK,加入该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。如果该帧序号是窗口的下界(最左边第-一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧处。如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧。

  • 图解此过程


3️⃣ 超时处理
  • 每个帧都有自己的定时器,一个超时事件发生后只重传一个帧。

(3)SR接受方要做的事


  • SR接收方将确认-一个正确接收的帧而不管其是否按序。失序的帧将被缓存,并返回给发送方一个该帧的确认帧[收谁确认谁],直到所有帧(即序号更小的帧)皆被收到为止,这时才可以将一-批帧按序交付给 上层,然后向前移动滑动窗口。

  • 图解此过程


(4)一张图了解SR发送方和接受方之间的传输过程


(5)SR滑动窗口的大小限制


(6)SR重点知识


  • 一道小例题加深理解

参考:https://www.bilibili.com/video/av70228743?p=25


推荐阅读
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
author-avatar
手机用户2602931635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有