链路状态路由算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
路由算法
一链路状态路由算法的具体实现
(1)链路状态路由算法的原理
链路状态路由协议是目前使用最广的一类域内路由协议。它采用一种“拼图”的设计策略,即每个路由器将它到其周围邻居的链路状态向全网的其他路由器进行广播。这样,一个路由器收到从网络中其他路由器发送过来的路由信息后,它对这些链路状态进行拼装,最终生成一个全网的拓扑视图,近而可以通过最短路径算法来计算它到别的路由器的最短路径。运行链路状态路由协议的路由器, 每台路由器公在其接口的状态发生变化时,才将变化后的状态发送给其他所有路由器,每台路由器都使用收到的信息重新计算前往每个网络的最佳路径,然后将这些信息存储到自己的路由选择表中。
链路状态路由算法背后的思想非常简单,可以用5个基本步骤加以描述。
1、发现他的邻接点,并知道其网络的地址。
2、测量到各邻接点的延迟或开销。
3、构造一个分组,分组中包含所有他刚刚收到的信息。
4、将这个分组发送给其他的路由器。
5、计算出到每一个其他路由器的最短路径。例如,每个路由器运行
Dijkstra算法就可以找从它到每一个其他路由器的最短路径。
(2)程序源代码(c++语言,核心算法为迪杰斯特拉算法)
#include
#include
#define routeTable "routeTable.txt"
using namespace std;
const int MAX_NODES = 1024; //能接受的最大路由数
const int INFINITY = 100000; //权值
int dist[MAX_NODES][MAX_NODES]; //用于存放网络拓扑结构连接矩阵
int static Vnums; //总的节点(路由)数
void initDist(){ //初始化邻接矩阵
for(int i = 0; i < MAX_NODES; i ++)
for(int j = 0; j < MAX_NODES; j ++)
dist[i][j] = 0;
}
void creatRouteMap(int Vnums){ //创建网络拓扑结构的邻接矩阵,1.创建路由表函数
for(int i = 0; i < Vnums; i ++)
{
cout << "输入第" << i << "个节点\n" ;
for(int j = 0; j < Vnums; j ++)
{
cout <<"的第"<< j << "个节点的权值:" ;
cin >> dist[i][j];
}
}
}
void saveRoute(ofstream& routeTables){ //6.保存路由信息routeTables << "路由邻接矩阵为:";
routeTables << "\n";
routeTables << "**********************************"; routeTables << "\n";
for(int i = 0; i < Vnums; i ++)
{
for(int j = 0; j < Vnums; j ++)
{
routeTables< } routeTables << "\n"; } } void dijkstra(int s, int t, int path[]){ //迪杰斯特拉算法 s目的节点 t源节点 struct state{ //存放节点数据 int predecessor; //父节点 int length; //权值,存放最小权值 bool lable; //访问状态 false未被访问过,true访问过 }state[MAX_NODES]; int i,k,min,print; struct state *p; for(p = &state[0]; p < &state[Vnums]; p ++) //初始化节点数据 { p->predecessor = -1;//类似存下一跳 p->length = INFINITY; //=100000 p->lable = false; } state[t].length = 0; //源节点的权值改为0 state[t].lable = true; k = t; cout << "最短路径为:" << endl; do{ //dowhi le 先是把所有最短路径连起来 for(i = 0; i < Vnums; i ++) //找到与永久标定节点直接相连的节点,并改变其权值 { if( (dist[k][i] != 0) && (state[i].lable == false)) { //与源节点直接相连并且不是同一个源节点k源节点 if(state[k].length + dist[k][i] < state[i].length) { state[i].predecessor = k; //记录节点 cout << k << "->"; state[i].length = state[k].length + dist[k][i]; //路径长度总 和 } } } k = 0; min = INFINITY; for( i = 0; i < Vnums; i ++) //找到与永久标定节点相邻的节点,并把与最小权值的相邻点改为永久标点 { if((state[i].lable == false) && (state[i].length < min)) //找到与永久标点相邻的节点 { min = state[i].length; k = i; } } state[k].lable = true; //新的永久标点也变为访问过