热门标签 | 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


推荐阅读
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了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社区 版权所有