基于MATLAB的DSR移动自组网路由协议仿真系统
项目介绍
本项目是一个在MATLAB环境下开发的移动自组网(MANET)仿真平台,核心致力于复现并分析动态源路由(Dynamic Source Routing, DSR)协议。系统通过构建一个虚拟的二维网络环境,模拟节点的动态移动和通信过程,完整展示了DSR协议的路由发现、路由维护和数据传输机制。
该仿真系统利用离散时间步进机制,模拟了从节点移动、拓扑更新、业务生成到数据包逐跳传输的全过程,并实时收集网络性能数据,旨在评估DSR协议在动态环境下的适应性和稳定性。
功能特性
- 节点移动性模拟:实现了Random Waypoint(随机路点)移动模型,节点在设定区域内随机选择目标点和速度进行移动,模拟真实的MANET环境。
- 动态拓扑构建:基于节点当前的地理位置和通信半径,实时计算并更新全网的邻接矩阵,决定节点间的连通性。
- DSR协议核心机制:
*
路由发现:当源节点没有有效路径时,发起RREQ(路由请求)洪泛广播。
*
源路由机制:数据包头包含完整的源到目路径信息,中间节点仅需根据包头转发。
*
路由缓存:节点维护本地路由缓存(Route Cache),减少重复的路由发现过程。
*
路由应答:目的节点收到RREQ后,通过反转路径构造RREP(路由应答)回传给源节点。
- 数据包处理与转发:模拟了RREQ、RREP、DATA(数据)和RERR(路由错误)四种类型数据包的产生、接收和转发逻辑。
- 链路断裂检测:在单播传输过程中检测下一跳节点是否在通信范围内,若链路断裂则触发维护机制。
- 性能统计与可视化:实时统计发送量、接收量、路由开销、分组投递率(PDR),并动态绘制网络拓扑和数据流向。
系统要求
- MATLAB R2016a及以上版本
- Statistics and Machine Learning Toolbox(用于
pdist2距离计算函数)
使用方法
- 确保所有脚本文件在MATLAB路径中。
- 直接运行
main 函数即可启动仿真。 - 仿真过程中会自动弹出图形窗口展示节点移动和数据传输情况,控制台或最终结果将输出性能指标。
代码实现逻辑详解
main.m 是整个仿真系统的主入口,采用时间步进(Time-Stepping)的方式驱动仿真,具体逻辑流程如下:
1. 初始化阶段
- 参数配置:定义了节点数量(30个)、仿真区域(1000x1000m)、通信半径(250m)、最大最小速度以及DSR协议特有的超时参数。
- 节点结构体构建:为每个节点初始化ID、位置、速度矢量、目的地、路由缓存、序列号、已处理RREQ列表(防止广播风暴)以及发送缓冲区。
- 统计变量重置:初始化用于记录包发送、接收、时延和吞吐量的全局变量。
2. 仿真主循环
循环在
currentTime < SimDuration 的条件下运行,每个时间步长(0.5s)执行以下操作:
- 节点移动更新:调用移动模型函数,根据节点速度和方向更新位置坐标。如果节点到达目的地,则暂停一段时间并随机选择新的目的地和速度。
- 拓扑计算:计算所有节点间的欧几里得距离,基于通信半径生成布尔型的邻接矩阵,确定物理连通性。
- 业务生成:按照设定的发包间隔,随机选择源节点和目的节点。系统首先检查源节点的路由缓存:
*
缓存命中:直接利用缓存中的路径构建DATA包并发送。
*
缓存未命中:将数据存入发送缓冲区,源节点序列号加1,广播RREQ包发起路由发现。
- 数据包处理:遍历当前网络中所有在传的数据包,根据下一跳地址判断是广播还是单播。
* 如果是单播且下一跳在通信范围内,则投递给接收节点处理。
* 如果是单播但下一跳不可达(链路断裂),则触发RERR生成逻辑,通知源节点链路失效。
- 缓存清理:定期检查并删除过期的路由缓存条目(代码中包含调用逻辑)。
- 可视化与统计:计算当前的分组投递率(PDR),并定期更新仿真图形界面。
关键函数与算法分析
该仿真系统通过以下几个核心子函数实现了DSR协议的关键逻辑:
update_mobility (移动模型)
- 逻辑:实现了标准的Random Waypoint模型。检查节点是否处于暂停状态,若非暂停,则沿当前速度矢量移动。
- 边界处理:代码中包含逻辑判断节点是否到达设定目标点,并对越界坐标进行修正,确保节点始终在仿真区域内。
calculate_topology (拓扑感知)
- 算法:利用
pdist2 计算节点位置坐标的距离矩阵。 - 实现:通过比较距离与通信半径(
SIM_PARAMS.ComRange),生成稀疏邻接矩阵。这是网络层进行路由决策的物理基础。
initiate_data_send (路由发起)
- DSR特性体现:这是按需路由的核心入口。它首先调用
find_route_in_cache 查询缓存。 - RREQ构造:若无路由,构造类型为1的RREQ包。包中初始化
path 数组(仅包含源节点),设 hop_dest 为 -1(代表广播),并记录 req_id 防止重复处理。
process_packets (链路层抽象)
- 传输模拟:模拟了数据包在物理信道上的传输。
- 断链机制:在转发数据前检查邻接矩阵
Adj。如果 Adj(curr, next) 为假,则判定为链路断裂(Link Break),此时不再转发数据包,而是生成RERR包或执行相应的错误通知逻辑,体现了DSR的路由维护功能。
handle_receive (协议栈处理)
这是DSR协议逻辑最密集的部分,根据包类型执行不同操作:
*
去重:检查
rreq_seen 列表,丢弃重复收到的具有相同源地址和ID的RREQ。
*
路径积累:将自身ID追加到数据包的
path 列表中。
*
判决:若自身为目的节点,构造RREP包,将收到的路径翻转(
fliplr)作为回传路由;若为中间节点,则继续广播。
* (代码片段体现) 依据包头中的源路由信息,将应答包逐跳回传给源节点。源节点收到RREP后将更新其路由缓存,并提取发送缓冲区中的滞留数据进行传输。
* (基于DSR逻辑) 依据包头中的完整路由数组(Source Route),利用
cur_idx 索引确定下一跳地址并转发。