MatlabCode

本站所有资源均为高质量资源,各种姿势下载。

您现在的位置是:MatlabCode > 资源下载 > 一般算法 > 选择性重传ARQ协议通信仿真系统

选择性重传ARQ协议通信仿真系统

资 源 简 介

本项目基于MATLAB实现了一个完整的选择性重传(Selective Repeat, SR)自动重传请求(ARQ)协议仿真系统。该系统的核心功能是模拟数据链路层中可靠数据传输的过程,特别是针对有损信道环境下的差错控制。项目代码构建了发送端和接收端的逻辑模型,采用滑动窗口机制来管理数据流。与简单的停等协议或回退N步协议不同,本系统实现了更为高效的重传策略:当某个数据帧丢失或出错时,发送端仅重传该特定的数据帧,而不会重复发送后续已经正确接收的帧。接收端具备缓存能力,能够暂时存储乱序到达的帧,直到缺失的帧被正确接收后再按序交付。主要功能模块包括:数据帧生成、带有随机错误注入的信道模拟(模拟帧丢失或校验错误)、计时器与超时重传管理、ACK确认机制以及发送/接收窗口的动态滑动逻辑。该代码已经过严格的测试和验证,能够准确演示SR-ARQ协议在不同误码率下的吞吐量性能和可靠性。

详 情 说 明

选择性重传 (Selective Repeat) ARQ 协议仿真系统

项目简介

本项目是一个基于 MATLAB 开发的数据链路层协议仿真系统,专注于演示和分析 选择性重传 (Selective Repeat, SR) 自动重传请求 (ARQ) 协议的工作机制。

该系统模拟了在不可靠信道(存在丢包和传输延迟)上进行可靠数据传输的全过程。与停等协议或回退 N 步协议不同,本仿真通过独立的计时器和接收端缓存机制,实现了仅重传出错或超时帧的高效传输策略,并在仿真结束后提供可视化的性能分析报告。

功能特性

  • 完整的 SR-ARQ 逻辑实现:实现了发送窗口和接收窗口的双向滑动机制,支持乱序接收和缓存。
  • 离散事件驱动仿真:采用基于时间步(Ticks)的仿真引擎,精确模拟传输延迟(RTT)、超时判定和事件触发。
  • 参数化信道模型:支持自定义数据帧总数、窗口大小、误帧率(Frame Loss Probability)、ACK 丢失率以及超时阈值。
  • 独立计时器管理:发送端为每个已发送但未确认的帧维护独立的逻辑计时器,精确控制重传。
  • 动态可视化分析:仿真结束后自动生成时序图,展示发送、重传、ACK 确认及丢包的详细过程,并统计每帧的传输次数。
  • 性能统计:自动计算信道利用率(Goodput)和总传输开销。

系统要求

  • MATLAB R2016a 或更高版本(代码不依赖特定工具箱,使用基础 MATLAB 语法)。
  • 标准图形化显示环境(用于绘制结果图表)。

核心算法与实现逻辑

本项目模拟的核心逻辑主要包含以下四个部分,严格对应源码中的处理流程:

1. 发送端逻辑:窗口管理与新帧发送

系统维护一个发送窗口 [send_base, send_base + N - 1]。在每个仿真时间步,程序首先检查窗口是否有空闲空间(即 next_seq_num 是否在窗口范围内)。
  • 若窗口未满且还有待发数据,系统生成新帧,记录当前发送时间作为该帧的计时起点。
  • 通过随机数生成器模拟信道丢包:如果判定为丢包,该帧直接被标记为传输失败(不进入信道队列);否则,将帧加入信道事件队列,设定到达时间为 当前时间 + RTT/2

2. 发送端逻辑:超时检测与重选重传

这是 SR 协议区别于 GBN 的关键之处。代码不使用单一计时器,而是遍历当前窗口内所有已发送但未收到 ACK 的帧:
  • 对每个未确认帧,检查 当前时间 - 发送时间 是否超过 TIMEOUT_TICKS
  • 一旦发现超时,仅重传该特定帧,重置其计时器,并将重传计数加一。
  • 重传过程同样经过信道丢包模拟。

3. 信道模型:事件队列处理

仿真使用一个矩阵作为事件队列,模拟物理传输延迟。
  • 队列存储格式为 [事件类型, 帧序号, 到达时间]
  • 在每个时间步,系统扫描队列,提取出 到达时间 <= 当前时间 的所有事件进行处理。这模拟了数据帧到达接收端或 ACK 到达发送端的过程。

4. 接收端逻辑:缓存与确认

接收端维护接收窗口和缓存状态 rcv_buffer。当收到数据帧时:
  • 窗口内帧:如果帧序号在接收窗口内,将其标记为已缓存(rcv_buffer 对应位置置 True)。无论是否是重复帧,接收端都会发送 ACK。
  • 窗口前帧:如果收到小于当前接收窗口基序号的帧(通常是 ACK 丢失导致的重传),接收端会识别为旧帧,但仍会重新发送 ACK 以同步发送端状态。
  • 窗口滑动:接收端检查窗口基序号(rcv_base)对应的帧是否已缓存。如果是,则连续向上层交付数据,并移动窗口基序号,直到遇到未接收的帧为止。

5. ACK 处理与发送窗口滑动

当发送端收到 ACK 时:
  • 将对应帧标记为已确认(ack_received 置 True)。
  • 检查 ACK 的序号是否等于发送窗口基序号(send_base)。如果是,则发送窗口向前滑动,直到遇到第一个未确认的帧。这释放了窗口空间,允许发送后续新帧。

使用方法

  1. 打开 MATLAB 环境。
  2. 将包含源码的 .m 文件设置为当前工作目录。
  3. 直接运行主函数。
  4. 观察命令行输出的实时日志,了解每一步的发送、接收、丢包和滑动窗口状态。
  5. 仿真结束后,查看自动弹出的分析图表。

仿真结果图表说明

运行结束后,系统会生成一个包含两个子图的分析窗口:

1. 帧传输时序图 (上图)

  • X轴:仿真时间 (Ticks)。
  • Y轴:帧序号。
  • 蓝色茎叶图:表示帧的首次发送。
  • 红色茎叶图:表示帧的超时重传,红色的多寡直观反映了信道质量。
  • 绿色三角形:表示发送端成功收到了 ACK。
  • 红色 X 标记:表示数据帧在传输过程中丢失。
2. 传输统计直方图 (下图)
  • 展示每个数据帧(Frame #1 to #N)实际被传输的次数。
  • 理论最少传输次数为 1。柱状图高度超过 1 的部分代表发生了重传。
  • 红色虚线标示了本次仿真的平均传输次数,用于衡量当前网络环境下的传输效率。

关键参数说明

在代码顶部可以调整以下参数来观察不同环境下的协议表现:

  • TOTAL_FRAMES: 计划传输的总帧数。
  • WINDOW_SIZE: 协议的窗口大小(影响流水线效率)。
  • FRAME/ACK_LOSS_PROB: 模拟信道的丢包率。
  • TIMEOUT_TICKS: 触发重传的等待时间阈值。
  • RTT_TICKS: 模拟的往返时延。
  • SIMULATION_SPEED: 设置日志打印速度(设为 0 可瞬间完成仿真)。