摘要
本文主要讲述ECMP算法,Equal-CostMultipathRouting,即最大限度地使用最短路径,各条最短路径之间均分流量。比如,如下图所示,节点3到节点8之间的最短路有两条,分别是3,4,8;和3,10,8;那么,3到8之间的流量就均分1/2到相应的子链路上面去。即,均分总流量到各条最短路上(记住!拓扑图上两点之间的最短路(当然是等长且最短的了)一般有很多条)。
1. 背景
底层的拓扑结构如图所示,这里的所有相关拓扑数据全部来源于TOTEM工具箱,相关拓扑,请求数据本人已经上传,感兴趣的读者点击下载即可下载相关数据
2. 算法
%% ECMP链路(Multi-shortst path)使用率作图 ————ECMP路由算法
bwAvl = bw;
[path, cost]=kShortestPath(dist,1,7,5); % 计算两点之间前5跳的最短路
[path, cost]=kShortestPath(dist,1,7,dijkstraSingle(dist,1,7)); % 节点1和节点7之间的所有的最短路径
% 任意请求(两点之间)最短路径的条数
spNumofReq = [];
maxRound = 30;
for i = 1:length(bw)
for j = 1:length(bw)
if req(i,j) ~= 0
[path, cost]=kShortestPath(dist,i,j,maxRound);
spNumofReq(i,j) = length(find(cost==dijkstraSingle(dist,i,j)))
end
end
end
% 映射上ECMP链路请求req
for i = 1:length(bw)
for j = 1:length(bw)
if req(i,j) ~= 0
pathij = kShortestPath(dist,i,j,spNumofReq(i,j));
for k = 1:spNumofReq(i,j) % 一个req中的每一条最短路
% 第k条最短路pathij{k}
tempRoute = pathij{k};
for t = 1:(length(tempRoute)-1)
bwAvl(tempRoute(t),tempRoute(t+1)) = bwAvl(tempRoute(t),tempRoute(t+1))-req(i,j)/spNumofReq(i,j);
end
end
end
end
end
%% 链路(ECMP路由)使用率
temp = bw - bwAvl;
ecmp = zeros(12,12);
res=[];
for i = 1:length(bw)
for j = 1:length(bw)
if bw(i,j) ~= 0
ecmp(i,j) = temp(i,j)/bw(i,j);
if ecmp(i,j) ~= 0
res = [res, ecmp(i,j)];
end
end
end
end
figure('name','ECMP链路使用率');
bar(res,0.2);
title('ECMP链路使用率');
xlabel('链路');
ylabel('链路带宽使用率');
其中,ECMP路由算法比传统的SPF算法要好,链路负载均衡性更好,网络传输性能更强。