当前位置: 首页 > news >正文

【3-3】流量控制与差错控制

前言

前面提到了广域网的链路层协议——HDLC协议,它里面提到了四类监控帧,分别是:RR(Receive Ready)、RNR(Receive Not Ready)、REJ(Reject)、SREJ(Selective Reject)。可是它们大体上是如何工作的呢?本文就来简要介绍一下。

文章目录

  • 前言
  • 1. 流量控制
    • 1.1. 停等协议
  • 2. 差错控制
    • 2.1. 后退N帧ARQ协议
    • 2.2. 选择重发ARQ协议
  • 后记
  • 修改记录

1. 流量控制

我们知道,串口通讯时,双方可以商定好波特率,使用一样的波特率来发送和接收比特流。可是这是对于简单的发送和接收,如果双方的处理能力不一致呢?就比如发送方是超算实验室而接收方是家用机顶盒。这就需要协调发送和接收的速度了。

在数据传输中,数据流量控制是一个能管理两个节点之间数据传输速度的机制,由于数据发送方的发送速度和数据接收方的处理速度并不一致,数据流量控制为数据接收方提供了一种控制发送方传输速度的机制,使数据接收方节点不会被数据发送方节点发来的数据所淹没。

1.1. 停等协议

所谓停等协议(Stop-and-Wait Protocol),顾名思义,就是接收方每收到一帧就回送一个确认信号,表示愿意接收下一帧,如果接收方不应答,发送方必须停下来等待。

其流程大致如下图所示:

发送方接收方Package1Acknowledge1Package2Stop and Wait发送方接收方

此协议的诞生是有一定的原因的,因为设备间通讯最早很多依赖于总线型协议,也就是同一时刻只有一个设备(一般称之为主机、主站)在广播发送请求,然后等待被动的设备(一般称之为从机、从站)响应回传应答。
正常情况下,一个主机会对应很多从机。停等协议不外乎一种“总线型思维”,一收一发,发了就等,收到应答了就继续发送后续的帧。

这种思想,对应 HDLC 中的 S帧 的 RR、RNR

2. 差错控制

当接收方出现处理错误后,可以要求发送方重传。

2.1. 后退N帧ARQ协议

于是,我们有了 后退N帧ARQ协议 Go-Back-N Automatic Repeat reQuest ,它的核心思路为:接收方接收到正确无误的数据包后,会发送一个确认(ACK),确认所有已正确接收该数据包。如果需要发送方重传,接收方就返回否认(NACK),发送方就要返回出错的帧的位置来重新传输,如下图所示:

ABP1P2ACK 1P3ACK 2P4NACK 3P3P4P5AB

这部分思想,对应 HDLC S帧的 REJ

2.2. 选择重发ARQ协议

随着设备存储、计算能力的发展,人们逐渐有了“缓冲区”的概念。人们发现设备接收到数据后,不应该急着处理,而是放到 “缓冲区” 中,逐步去处理。这就启发了人类去创造 《选择重发ARQ协议》,也就是 Selective Repeat ARQ

它的核心思想是:接收方可以接收并缓冲窗口内的任何帧,即使它们不是按顺序到达的。如果某个帧丢失或损坏,接收方可以告诉发送方重传单个帧。

其过程大致如下图所示:

ABP1P2ACK 1P3ACK 2P4P5NACK 3P3P6AB

这部分思想,对应 HDLC S帧的 SREJ

后记

文中有任何错误、遗漏,烦请各位老铁在评论区指出,共同学习进步。

修改记录

更新日期修改内容
2025年8月19日完成初稿
2025年8月20日去除滑动窗口的部分,此处引入该概念并不合适,应从TCP处开始讲解
http://www.lryc.cn/news/626006.html

相关文章:

  • Linux资源管理
  • JUC之CompletableFuture【上】
  • Orbbec---setBoolProperty 快捷配置设备行为
  • 设备树下的LED驱动实验
  • 从数据表到退磁:Ansys Maxwell中N48磁体磁化指南
  • 谷歌为什么要将Android的页面大小(Page Size)从传统的4KB升级至16KB
  • Go 进阶学习路线
  • 测试 Next.js 应用:工具与策略
  • 仲裁器设计(三)-- Weighted Round Robin 权重轮询调度
  • ASP4644稳压器的特性分析与系统测试方法研究
  • GPT-4.1旗舰模型:复杂任务的最佳选择及API集成实践
  • 【RustFS干货】RustFS的智能路由算法与其他分布式存储系统(如Ceph)的路由方案相比有哪些独特优势?
  • 2025杭电多校第九场 乘法逆元、阿斯蒂芬、计算几何 个人题解
  • 宿主获取插件View流程原理 - fetchViewByLayoutName
  • LWIP协议栈实现ARP协议
  • Python脚本每天爬取微博热搜-终版
  • Spring Cloud 微服务架构:Eureka 与 ZooKeeper 服务发现原理与实战指南 NO.1
  • Stream API-怎么理解流
  • Day13_【DataFrame数据组合merge连接】【案例】
  • Redis(11)如何通过命令行操作Redis?
  • 反向代理实现服务器联网
  • 人工神经网络MATLAB工具箱指南
  • Selenium自动化测试入门:cookie处理
  • electron进程间通信- 渲染进程与主进程双向通信
  • 如何用给各种IDE配置R语言环境
  • UGUI源码剖析(10):总结——基于源码分析的UGUI设计原则与性能优化策略
  • Ubuntu 和麒麟系统创建新用户 webapp、配置密码、赋予 sudo 权限并禁用 root 的 SSH 登录的详细
  • Python os 模块与路径操作:从基础到实战应用
  • 《AI 与人类创造力:是替代者还是 “超级协作者”?》​
  • 读《精益数据分析》:营收(Revenue)—— 设计可持续盈利模式