基于matlab的卫星网络DCAR编码感知路由发现仿真
一、理论基础
当一个源节点有数据要向目的节点发送且在当前路由缓存中未发现可用路径时,则启动路由请求过程,下面分步对该过程进行说明:
步骤1:路由建立初期,源节点需要向所有邻居节点发送路由请求信息REQ,转向步骤2;
步骤2:中间节点收到REQ后将依次进行如下处理:
(1)检查本节点的地址是否出现在REQ所保存的路由记录中,如果是,为避免出现环路,则丢弃该RREQ不再处理;
(2)检查本节点地址是否与RREQ中记录的目的地址吻合,如果是,那么此时该节点为目的节点,将进入路由反馈阶段;否则临时存储该RREQ,然后把当前节点信息及其邻居节点信息分别添加到REQ的NodeID和Neighbors中,广播更新后的REQ。重复步骤2直至其到达目的节点。
目的节点按照如下步骤进行路由反馈:
步骤1:目的节点为其所收到若干路由请求信息生成对应的路由反馈信息REP,此时每个REP包含从源节点到目的节点的路径信息以及这条路径上的所有节点的相关信息。目的节点将根据此信息,沿REQ的反向路径单播传输REP。
步骤2:中间节点收到该REP后将依次执行以下操作:
(1)检查本节点地址是否与REP中记录的目的地址吻合,如果是,那么此时当前节点为源节点,转向步骤3;
(2)计算获取当前节点的缓存队列长度并将其写入REP中;
(3)检查是否有其他数据流的流经信息及相应节点的监听信息存储在该节点的流表中,如果节点流表不为空,则进入编码感知阶段。编码感知阶段主要是根据编码条件获得可与REP中的路由在当前节点处进行编码的数据流集合,并利用此结果对REP中的编码相关信息进行更新,然后按照REP中记录的路径将其传送至下一跳节点。重复步骤2直至其到达源节点。
步骤3:源节点接收到REPs后,分别计算每个路由反馈信息所记录路径的CARM值,选择CARM值最小的路径进行数据传输并将该条路径的信息记录到其路由表中,完成路由表的更新。至此完成整个编码感知路由发现过程。
算法流程图:
二、核心程序
%数据流个数
data_num = [4:4:40];
%初始化卫星网络模型
Throughput = zeros(size(data_num));%延迟变量
times = 400;%模拟卫星运行的时间
Ndata = 8;%数据流数量
%产生格子矩阵坐标数据点
STEP = 10;
X0 = 0:STEP:100;
Y0 = 0:STEP:100;
Xset = [];
Yset = [];
for i = 1:length(X0)
for j=1:length(Y0)
Xset = [Xset,X0(i)];
Yset = [Yset,Y0(j)];
end
end
figure;
plot(Xset,Yset,'b.');
REPs=[];
for iii = 1:length(data_num);
iii
Throughput0 = [];
for jjj = 1:times
rng(jjj);
%初始位置
%定义格子网格
Nnode = 25;
SCALE = 100;
%初始节点能量
E0 = 1;
%通信半径
Radius= 20;%
%发送率
Trans = 15e6;%15Mbps
packet= 512; %512byte
Slen = 3e4;
%在格子网里面随时分布
sels = randperm(Nnode);
X = Xset(sels);
Y = Yset(sels);
% end
%模拟发送数据
data_frame = 2*(rand(1,1024)>=0)-1;
Qmatrix = zeros(Nnode,Nnode);%平均包长矩阵
gmatrix = zeros(Nnode,Nnode);%增益矩阵
rmatrix = zeros(Nnode,Nnode);%丢包率矩阵
dmatrix = zeros(Nnode,Nnode);
ETX = zeros(Nnode,Nnode);
for i = 1:Nnode
for j = 1:Nnode
Dist = sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2);
%a link;
if Dist <= Radius & Dist > 0
%距离因素
dmatrix(i,j) = Dist;
ETX(i,j) = 1/Dist;
gmatrix(i,j) = 1/Dist;
rmatrix(i,j) = Dist/2/SCALE/10;
Qmatrix(i,j) = length(data_frame)*rand;
else
%距离因素
dmatrix(i,j) = inf;
ETX(i,j) = 0;
gmatrix(i,j) = 0;
rmatrix(i,j) = inf;
Qmatrix(i,j) = inf;
end;
end;
end;
%归一化处理
dmatrix = dmatrix;
%路由优化算法的改进
Tmatrix = dmatrix;
for i = 1:Nnode
distA(i) = sqrt((X(i)+SCALE)^2 + (Y(i)+SCALE)^2);
distB(i) = sqrt((X(i)-SCALE)^2 + (Y(i)+SCALE)^2);
end
[Va,Ia] = sort(distA,'descend');
[Vb,Ib] = sort(distB,'descend');
%DCAR-DCAR-DCAR-DCAR-DCAR-DCAR
NX=0;
Sn1 = Ia(1);
En1 = Ib(1);
%备选转发节点集合的选择
flag = 0;
while flag == 0%重复步骤2直至其到达目的节点。
%源节点需要向所有邻居节点发送路由请求信息REQ
sendreq = zeros(1,Nnode);
for i = 1:Nnode
sendreq(i)=1;
end
%中间节点收到REQ后将依次进行如下处理:
for i = 1:Nnode
p = rand;
if p>=0.5%假设50%概率进行丢弃
sendreq(i) = 0;%丢弃该RREQ不再处理
end
end
%检查本节点地址是否与RREQ中记录的目的地址吻合
idx1 = find(sendreq==1);
idx2 = find(idx1==En1);%检测是否和目标节点吻合
if isempty(idx2) == 0%该节点为目的节点,将进入路由反馈阶段
flag = 1;
else
flag = 0;
end
end
%注意,这个地方并不是用dijkstra这个算法,而是模拟出我们发送的路径,你也可以自己设置这个路径
[r_path, r_cost] = func_dijkstra(Sn1, En1, dmatrix);
startnew = r_path(1);
if flag == 1%路由反馈
%产生REP
REP = [r_path];
%吻合概率
p = rand;
if p>=0.75
%CARM值最小的路径进行数据传输并将该条路径的信息记录到其路由表中,完成路由表的更新
[pathss,LQMsum] = func_CARMnew(Sn1,En1,gmatrix,rmatrix,Qmatrix);
LL = length(pathss);
path_distance = 0;
ds = 0;
for d=2:length(pathss)
path_distance= path_distance + (Slen/(Trans/packet))*dmatrix(pathss(d-1),pathss(d));
ds(d)=dmatrix(pathss(d-1),pathss(d));
end
LQMsum_=LQMsum/1e3;
else
%计算获取当前节点的缓存队列长度并将其写入REP中;
L = length(REP);
REPs = [REPs,r_path];%获取当前节点的缓存队列长度并将其写入REP中
idxs = find(REPs == startnew);%找到原节点
if isempty(idxs) == 0;
flag = 1;
end
NX = 1;
LQMsum_= 1;
path_distance=10;
end
end
if NX == 0;
Kreduce = 1/LQMsum_;
else
Kreduce = 1;
end
%吞吐量
r = randperm(Nnode);%定义一个随机因子,模拟随机某一个卫星发送
%总包数量
packet_size = 1e5*512*8/1024;%bit
total_packet = data_num(iii);
total_time = Kreduce*times;
totaldata = length(data_frame);%数据流总数
th = func_throughput(total_packet,total_time,path_distance,r,Nnode,packet_size,totaldata);
Throughput0 = [Throughput0,mean(th)^2];
end
Throughput(iii) = mean(Throughput0);
end
三、测试结果
A01-178