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


推荐阅读
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 近期,有同事希望下载网络上的一些有趣视频用于个人用途,但在尝试过程中遇到了下载难题。通过使用Chrome开发者工具检查网络请求后,发现视频并非以常见的MP4格式提供,而是通过多个TS片段进行流式传输。为了高效地批量下载这些TS文件,可以利用FFmpeg这一强大的多媒体处理工具,实现自动化下载和合并,从而轻松获取完整的视频内容。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • PostgreSQL 与 MySQL 的主要差异及应用场景分析
    本文详细探讨了 PostgreSQL 和 MySQL 在架构、性能、功能以及适用场景方面的关键差异。通过对比分析,帮助读者更好地理解两种数据库系统的特性和优势,为实际应用中的选择提供参考。 ... [详细]
  • 在计算机领域,锁机制的作用类似于现实生活中的锁,用于保护共享资源免受并发访问冲突的影响。对于Java开发人员而言,深入了解数据库锁定机制至关重要,因为这不仅能够确保数据的一致性和完整性,还能有效提升系统的性能和稳定性。常见的锁机制包括Java中的`Lock`和`synchronized`关键字,它们在多线程环境中发挥着关键作用,帮助开发人员更好地管理和控制资源访问。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
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社区 版权所有