距离矢量路由算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
路由算法
距离矢量路由算法的具体实现
距离矢量路由算法的原理
距离向量路由算法(Bellman-Ford Routing Algorithm),作为距离向量协议的一个算法,如RIP, (RIP 跳最大跳数16)BGP。
使用这个算法的路由器必须掌握这个距离表,它告诉在网络中每个节点的最远和最近距离。
在距离表中的这个信息是根据临近接点信息的改变而时时更新的。
这个在算法中的度量公式是跳跃的次数,等待时间,流出数据包的数量等等。
概括地说,距离向量算法要求每一个路由器把它的整个路由表发送给与它直接连接的其它路由器。
路由表中的每一条记录都包括目标逻辑地址、相应的网络接口和该条路由的向量距离。
当一个路由器从它的相邻处收到更新信息时,它会将更新信息与本身的路由表相比较。
如果该路由器比较出一条新路由或是找到一条比当前路由更好的路由时,它会对路由表进行更新:将从该路由器到邻居之间的向量距离与更新信息中的向量距离相加作为新路由的向量距离。
在距离向量路由算法中,相邻路由器之间周期性地相互交换各自的路由表备份。
当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。
距离矢量路由算法在理论中可以工作,但在实践中有一个严重的缺陷:虽然它总是能够达到正确的答案,但是它收敛到正确答案的速度非常慢,尤其是,它对于好消息的反应非常快,但是对于坏消息的反应非常迟缓。
程序源代码(c语言)
#include ""
#include "" n");
getch();
return;
}
else
printf("\n路由表初始:\n");
InitData(pfile);
fclose(pfile);
for (i = 0; i<ROUTNUM; i++)
{
printf("%c||", i + 65);
for (j = 0; j < ROUTNUM; j++)
if (data[i][j].dis > 0)
printf("<%c %d> ", j + 65, data[i][j].dis);
printf("\n");
} .] : ", 0, ROUTNUM - 1);
scanf("%d", &start);
printf("输入终点路由节点数字(%d-%d)[0代表A,1代表B...] : ", 0, ROUTNUM - 1); scanf("%d", &end);
if (start == end || start < 0 || start > 6 || end < 0 || end > 6)
{
printf("\n输入错误,请按任意键退出\n");
getch();
return;
}
else
{
int cur = start;
int total = 0;
if (data[start][end].dis < 0)
{
printf("没有路由路径发现!\n");
getch();
return;
}
printf("%c->", cur + 65);
while (data[cur][end].from >= 0) rom].dis; rom + 65);
cur = data[cur][end].from; is;
printf("%c\n总的路由距离= %d", end + 65, total);
getch();
return;
}
}
void InitData(FILE *pfile)
{
char num[10];
int i = 0;
char c;
int m, n;
fseek(pfile, 0, 0); 不是文件尾部且m<7循环.
{
for (n = 0; !feof(pfile) && n < 7; n++)
{
while (!feof(pfile))
{
c = fgetc(pfile); is = atoi(num);is
data[m][n].from = -1; 题路由权值只能0到9*/ {
num[i++] = c;
} /*end of else if*/
} /*end of while*/
} /*end of for (n = 0*/
} /*end of for (m = 0*/
}
void OutputRoutData()
{
int i, j;
printf(" ");
for (i = 0; i < ROUTNUM; i++)
{
printf(" %c ", i + 65);
}
printf("\n");
for (i = 0; i < ROUTNUM; i++)
{
printf("%c ", i + 65);
for (j = 0; j < ROUTNUM; j++)
{
if (data[i][j].dis < 0) is>=10)
printf(" %d", data[i][j].dis);
else
printf(" %d", data[i][j].dis);
if (data[i][j].from < 0) rom + 65); is > 0) is < 0) is = data[send][i].dis + data[recv][send].dis; rom = send; is > data[send][i].dis + data[recv][send].dis)is = data[send][i].dis + data[recv][send].dis; rom
= send; is > 0)
次验证均正确。
本实验的路由表由一个而为数组结构体实现,数组名代表两个相关路由,结构体中存放延时和下一跳。
路由表初始信息从文件读取,根据距离向量路由算法系统自动完成路由表的更新操作,最后任意输入两个路由表接点,则可得出两接点之间的最短路径。
C D
A G
E
F
B 9 3 5 2
4
5 8
1
所有距离矢量路由协议均使用Bellman-Ford(Ford-Fulkerson)算法,容易产生路由环路和计数到无穷大的问题。
因此它们必须结合一些防环机制。
距离矢量路由算法中每一个路由器都存放着整个网络的节点信息,但当一个节点发生变化时,路由不一定能很快的收敛。
导致网络效率下降。
适用于小型网络。