1.算法描述
无线自组网按需平面距离向量路由协议(Ad hoc On-Demand Distance Vector Routing,AODV)是应用于无线随意网络(也称作无线Ad hoc网络)中进行路由选择的路由协议,它能够实现单播和多播路由。该协议是Ad Hoc网络中按需生成路由方式的典型协议。AODV对在这方面有多种解决方法。还有一种路由协议是动态源路由协议(DSR),这个路由协议充分最优化网络的通信量。另外就是优化的链路状态路由协议(OLSR)也是解决这方面问题。OLSR不断地收集节点之间能相互通信的数据,并对每个节点保持一个最优化的路由表。所以连接可以很快的建立。但是OLSR是一个相对比较大而且复杂,它要求大型复杂的计算机、很大的内存和计算。同时频繁进行网络其他节点的发现过程是一个巨大的负担。对于其他可选择的方法可以参照无线自组网协议列表。
在AODV中,整个网络都是静止的除非有连接建立的需求。这就是说一个网络节点要建立连接时才广播一个连接建立的请求。其他的AODV节点转发这个请求消息,并记录源节点,和回到源节点的临时路由。当接收连接请求的节点知道到达目的节点的路由时,就把这个路由信息按照先前记录的回到源节点的临时路由发回源节点。于是源节点就开始使用这个经由其他节点并且有最短跳数的路由。 当链路断掉,路由错误就被回送给源节点,于是源节点就重新发起路由查找的过程。
大多数协议的复杂性在于为了保证网络性能而减少消息数量。例如,每个路由请求都会有一个序号,节点使用这个序号以避免它们重复转发这个路由请求。路由请求有一个“生存时间”数,这将减少他们被重传的次数。还有就是如果路由请求失败,其他的路由请求将会在先前的路由请求消息超时后的两倍的“生存时间”之后,才被发送。
AODV协议采用与DSR协议类似的广播式路由发现机制。与DSR协议相比,AODV的路由依赖于中间节点建立和维护的动态路由表。AODV的路由发现过程由反向路由的建立和前向路由的建立这两部分组成。
(1)源节点首先发起路由请求过程,在发起的路由请求报文中携带以下信息字段:
<源地址,源序列号,广播ID,目的地址,目的序列号,跳数计数器>
其中,序列对<源地址,广播ID>惟一标识一个路由请求。
(2)中间节点在收到路由请求报文时,比较本节点和目的节点的地址,
①如果自己是目的节点,则回复路由响应报文。否则转步骤②;
②根据<源地址,广播ID>判断是否收到过该请求消息,如果收到过则丢弃该请求消息,否则转向步骤③;
③记录相应的消息,以形成反向路由。记录的消息包括:上游节点地址(即向本节点发送路由请求消息的节点)、目的地址、源地址、广播ID、反向路由超时时长和源序列号等。同时跳数计数器加1,向邻节点转发该路由请求报文。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
fprintf('\n');
figure(1);
clf;
hold on;
title('无线自组网AODV路由机制仿真');
xlabel('空间横坐标 x 单位:m');
ylabel('空间纵坐标 y 单位:m');
for i = 1:nodes_number
plot(X(i), Y(i), '.');
text(X(i), Y(i), num2str(i));
for j = 1:nodes_number
distance = sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2);
if distance <= R
nodes_link(i, j) = 1;
%line([X(i) X(j)], [Y(i) Y(j)], 'LineStyle', '-.');
grid on;
else
nodes_link(i, j) = inf;
end;
end;
end;
fprintf('\n');
if (s<=nodes_number&s>=1)&(d<=nodes_number&d>=1)
[path, hop] = path_discovery(nodes_number, nodes_link, s, d);
l=length(path);
if l==0&s~=d
fprintf('源节点 %d 到目的节点 %d 的路径为:空!\n',s,d);
fprintf('\n');
plot(X(s), Y(s), 'rp','markersize',15);
plot(X(d), Y(d), 'rp','markersize',15);
elseif l==0&s==d
fprintf('源节点 %d 与目的节点 %d 为同一节点。\n',s,d);
fprintf('跳数为 %d 。\n',hop);
fprintf('\n')
plot(X(d), Y(d), 'rp','markersize',15);
else fprintf('源节点 %d 到目的节点 %d 的路径为:',s,d);
i=2;
fprintf('%d', s);
while i~=l+1
fprintf(' -> %d', path(i));
i=i+1;
end;
fprintf('\n');
fprintf('跳数为 %d 。\n',hop);
fprintf('\n');
end;
if l ~= 0
for i = 1:(l-1)
line([X(path(i)) X(path(i+1))], [Y(path(i)) Y(path(i+1))], 'Color','r','LineWidth', 1.50);
end;
end;
hold off;
else fprintf('输入节点有误,请重新运行!\n');
fprintf('\n');
end;