选择性重传 (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)。如果是,则发送窗口向前滑动,直到遇到第一个未确认的帧。这释放了窗口空间,允许发送后续新帧。
使用方法
- 打开 MATLAB 环境。
- 将包含源码的
.m 文件设置为当前工作目录。 - 直接运行主函数。
- 观察命令行输出的实时日志,了解每一步的发送、接收、丢包和滑动窗口状态。
- 仿真结束后,查看自动弹出的分析图表。
仿真结果图表说明
运行结束后,系统会生成一个包含两个子图的分析窗口:
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 可瞬间完成仿真)。