模拟路由器使用距离向量算法更新路由表
目 录
一、实习题目 2
二、原理概述 2
三、 设计方案 2
四:程序代码: 3
五:程序输出: 6
六:总结 7
附录1: 8
一、实习题目
设计并编写模拟一台路由器使用距离向量算法更新路由表功能的计算机程序。该路由器从其邻居那里接收的路由表作为该程序的输入,更新后的路由表作为输出。
二、原理概述
距离矢量路由算法的基本思想如下:每个路由器维护一个距离矢量(通常是以延时是作变量的)表,然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。每个距离矢量表项包括两部分:到达目的结点的最佳输出线路,和到达目的结点所需时间或距离,通信子网中的其它每个路由器在表中占据一个表项,并作为该表项的索引。每隔一段时间,路由器会向所有邻居结点发送它到每个目的结点的距离表,同时它也接收每个邻居结点发来的距离表。这样以此类推,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,这样各路由器只需要查看这个距离矢量表就可以为不同来源分组找到一条最佳的路由。
三、设计方案
模拟距离向量算法:
第一步:B收到来自C的路由信息
将路由信息作为为新表,新表中“下一跳”字段中的地址都改为C,并把所有的“距离”字段值加1。
第二步:对修改后的RIP报文中的每个项目进行一下步骤:
:没有新信息,不变:相同的下一跳,替换:一条新路由,增加:不同的下一跳,若新跳数相同,不变;若新跳数小,替换;若新跳数大,不变。
四、代码
#include<iostream>
#include<cstdio>
#define max 10
using namespace std;
struct chart{
string net;
int dis;
string next_jump;
}Chart_B_Old[max],Chart_From_C[max],Chart_B_Now[max];
void Output_Chart(chart C[],int N)
{
printf("目的网络 距离 下一跳\n");
for(int i=1;i<=N;++i){
if(C[i].net == "-1") continue;
cout<<" "<<C[i].net<<" ";
cout<<" "<<C[i].dis<<" ";
cout<<" "<<C[i].next_jump<<endl;
}
}
void Dis_Vec(chart BO[],chart C[],int N)
{
for(int i=1;i<=N;++i)
{
if(BO[i].net!="-1"&&C[i].net=="-1"){ //没有新信息则不变
continue;
}
else if(BO[i].net=="-1"&&C[i].net!="-1"){ //B中没有的路由,C中有,则加入
BO[i].net = C[i].net;
BO[i].dis = C[i].dis;
BO[i].next_jump = C[i].next_jump;
}
else if(BO[i].net!="-1"&&C[i].net!="-1"){
if(BO[i].next_jump==C[i].next_jump){ //相同的下一跳,则更新距离
BO[i].dis = C[i].dis;
}
else{ //下一跳不同
if(BO[i].dis == C[i].dis) continue ; //如果距离相同,则不变
else if(BO[i].dis < C[i].dis){ //如果距离长,则不变
continue;
}
else{ //如果 距离短,则更新信息
BO[i].dis = C[i].dis;
BO[i].next_jump = C[i].next_jump;
}
}
}
}
}
int main()
{
int N;
printf("请输入网络总数(3-9): ");
cin>>N;
freopen("in.txt","r",stdin);
for(int i=1;i<=9;i++)
{
cin>>Chart_B_Old[i].net;
cin>>Chart_B_Old[i].dis;
cin>>Chart_B_Old[i].next_jump;
}
cout<<"路由器B的路由表:"<<endl;
Output_Chart(Chart_B_Old,N);
for(int i=1;i<=9;i++) //B收到来自C的路由信息
{
cin>>Chart_From_C[i].net;
cin>>Chart_From_C[i].dis;
Chart_From_C[i].next_jump = " ";
}
cout<<"B收到来自C的信息为:"<<endl;
Output_Chart(Chart_From_C,N);
fclose(stdin);
for(int i=1;i<=9;i++) //更新C的路由信息
{
Chart_From_C[i].dis += 1;
Chart_From_C[i].next_jump = "C";
}
cout<<"更新C后的路由信息:"<<endl;
Output_Chart(Chart_From_C,N);
Dis_Vec(Chart_B_Old,Chart_From_C,N);
cout<<"B更新后的路由表:"<<endl;
Output_Chart(Chart_B_Old,N);
return 0;
}
//B的表
/*
N1 7 A
N2 2 C
-1 -1 -1
-1 -1 -1
-1 -1 -1
N6 8 F
-1 -1 -1
N8 4 E
N9 4 F
*/
//C的信息
/*
-1 -1
N2 4
N3 8
-1 -1
-1 -1
N6 4
-1 -1
N8 3
N9 5
*/
五、结果截图
六:总结
路由表更新方法采用的是距离向量算法。在宏观上,各个路由器路由表更新可类比于多源最短路,进而可以采用弗洛伊德算法或者其他最短路算法进行模拟。但在此题中,为了详细展示距离向量算法,我采用了微观上模拟两个路由器更新路由表的过程而非使用最短路径算法一次更新所有表。
附录1:
in.txt中的内容:前9行为B开始时的路由信息,后9行为收到C发来的信息
N1 7 A
N2 2 C
-1 -1 -1
-1 -1 -1
-1 -1 -1
N6 8 F
-1 -1 -1
N8 4 E
N9 4 F
-1 -1
N2 4
N3 8
-1 -1
-1 -1
N6 4
-1 -1
N8 3
N9 5