目录
1.程序功能描述
2.测试软件版本以及运行结果展示
3.核心程序
4.本算法原理
4.1 ADOV路由(Ad hoc On-demand Distance Vector Routing)
4.2 DSR路由(Dynamic Source Routing)
5.完整程序
ADOV路由和DSR路由的仿真,仿真输出网络的路由路径,跳数,路由长度,并对比ADOV和DSR的性能。
MATLAB2022a版本运行
......................................................
Nodes = 30;
Radius = 10; %节点通信距离
Sp = 10; %开始点
Ep = 6; %目标点
X = 20*rand(1,Nodes);
Y = 20*rand(1,Nodes);
Z = 1*rand(1,Nodes);%节点的信任值
figure(1);
clf;
hold on;
%画拓扑结构
for i = 1:Nodes
plot(X(i), Y(i), '.');
text(X(i), Y(i), num2str(i));
for j = 1:Nodes
dist = sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2);
if dist <= Radius
Fmat(i,j) = 1;
Tmat(i,j) = 1-((Z(i)+Z(j))/2);
dmat(i,j) = dist;
else
Fmat(i,j) = inf;
Tmat(i,j) = inf;
dmat(i,j) = inf;
end
end
end
%路由
[path, cost] = func_dijkstra(Sp,Ep,Tmat);
dist_all=0;
for j=2:length(path)
dist_all= dist_all + dmat(path(j-1),path(j));
end
for p =1:(length(path)-1)
line([X(Sp) X(path(1))],[Y(Sp) Y(path(1))],'Color','r','LineWidth', 1, 'LineStyle', '-')
line([X(path(p)) X(path(p+1))], [Y(path(p)) Y(path(p+1))], 'Color','r','LineWidth', 2, 'LineStyle','-')
end
grid
disp('路由:');
path
disp('跳数:');
length(path)-1
disp('路由长度:');
dist_all
save R1.mat
18
ADOV是一种反应式的路由协议,它仅在需要时才建立路由。这种路由协议主要包括三个过程:路由发现、路由维护和路由表更新。
路由发现:
当源节点需要向目的节点发送数据,但路由表中没有有效路由时,源节点会发起路由发现过程。它广播一个路由请求(RREQ)消息,该消息包含源节点和目的节点的地址、请求的序列号等信息。
路由维护:
每个节点都维护一个路由表,其中包含到达已知目的地的下一跳地址和跳数。当节点的路由表发生变化时(例如,链路中断),它会更新其路由表,并可能向邻居节点发送路由错误(RERR)消息。
路由表更新:
当节点收到RREQ或RERR消息时,它会根据这些消息更新其路由表。如果RREQ消息提供了一个更好的路由(即跳数更少),则节点会更新其路由表,并可能将RREQ消息转发给其邻居节点。
在ADOV路由中,一个重要的概念是路由度量。路由度量通常基于跳数,但也可以考虑其他因素,如链路质量。假设(d(i, j))表示从节点(i)到节点(j)的距离(以跳数计),则路由发现过程可以表示为寻找从源节点(s)到目的节点(d)的最短路径,即最小化(d(s, d))。
DSR是一种源路由协议,意味着路由是由源节点确定的,并且路由信息包含在数据包头中。DSR同样是反应式的,它使用路由缓存来存储先前发现的路由。
路由发现:
与ADOV类似,当源节点需要向目的节点发送数据但没有有效路由时,它会发起路由发现过程。不同的是,DSR会在RREQ消息中包含一个路由记录,该记录用于记录从源节点到目的节点的路径。
路由维护:
DSR使用路由缓存来存储先前发现的路由。当节点收到数据包时,它会检查数据包头中的路由信息,并根据该信息转发数据包。如果路由缓存中的路由不再有效(例如,由于节点移动导致链路中断),则节点会丢弃数据包,并可能向源节点发送路由错误消息。
在DSR中,路由发现过程可以表示为寻找从源节点(s)到目的节点(d)的有效路径(P)。路径(P)可以表示为一系列节点的序列:(P = \langle s, n_1, n_2, ..., n_k, d \rangle),其中(n_1, n_2, ..., n_k)是路径上的中间节点。源节点将路径(P)包含在数据包头中,以便中间节点能够根据该路径转发数据包。
VVV