-----------------------------------------------------------------------
目录
一、理论基础
1.1 DCAR概述
卫星网络中的DCAR(Data-Centric Adaptive Routing)编码感知路由发现是一种以数据为中心的路由协议,其目的是在卫星网络中提供高效的数据传输。DCAR利用编码感知路由发现算法来确定最佳的数据传输路径,以最小化数据传输延迟和最大化网络吞吐量。
DCAR编码感知路由发现的原理可以概括为以下几点:
-
以数据为中心:DCAR以数据为中心,而不是以节点为中心。它关注的是数据传输的效率和可靠性,而不是节点的连接状态。因此,DCAR可以更好地适应卫星网络中的动态变化。
-
路由感知:DCAR通过编码感知技术来确定最佳的路由路径。编码感知技术将数据包编码为多个副本,并将这些副本发送到网络中的不同节点。通过这种方式,DCAR可以在网络中建立多条路由路径,并从中选择最佳的路径进行数据传输。
-
自适应路由:DCAR采用自适应路由算法来动态地选择最佳的路由路径。这种算法可以根据网络的实时状态和数据传输的需求来选择路由路径,从而最大化网络吞吐量和最小化数据传输延迟。
-
邻居节点发现:DCAR通过邻居节点发现机制来发现网络中的相邻节点。这种机制允许节点在不知道网络拓扑结构的情况下,发现并建立直接的连接。通过邻居节点发现,DCAR可以在网络中形成多条路由路径。
DCAR编码感知路由发现的算法可以表示为以下公式:
R(n) = k + Σ[P(i, j) * R(i) * R(j)] (1)
其中,R(n)表示节点n的路由度,即节点n到其他节点的路由路径的数量;k表示节点n的本地路由度,即节点n到其邻居节点的路由路径的数量;P(i, j)表示节点i和节点j之间的连接概率;R(i)和R(j)分别表示节点i和节点j的路由度。
公式(1)的含义是,节点n的路由度等于其本地路由度加上其所有邻居节点的路由度与其到邻居节点的连接概率的乘积之和。这个公式可以帮助DCAR确定最佳的路由路径,从而实现高效的数据传输。
在卫星网络中应用DCAR编码感知路由发现算法,可以有效地解决卫星网络中的数据传输问题,并提高网络性能。由于卫星网络具有空间广域、拓扑动态变化和信道可靠性低等特点,DCAR编码感知路由发现算法可以更好地适应这些特点,并实现高效的数据传输。此外,DCAR还具有简单易实现、可扩展性强等优点,因此具有广泛的应用前景。
1.2 算法具体实施步骤
当一个源节点有数据要向目的节点发送且在当前路由缓存中未发现可用路径时,则启动路由请求过程,下面分步对该过程进行说明:
步骤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