计算机网络距离矢量路由算法实验报告.docx
- 文档编号:30503055
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:17
- 大小:103.50KB
计算机网络距离矢量路由算法实验报告.docx
《计算机网络距离矢量路由算法实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络距离矢量路由算法实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
计算机网络距离矢量路由算法实验报告
计算机网络
实验报告
距离矢量路由算法
一,实验内容:
设计一个算法,实现上面拓扑图的各个结点之间路由表的交换,要求显示出结点路由表的交换过程并显示每次交换结束后的各个结点保存的路由表的内容。
最后显示交换了几次后各个结点路由表开始变得稳定。
二,算法设计:
首先创建一个类。
它有两个成员变量。
一个是二维数组型的x[i][j]用来存放从加点i到结点j的距离,一个是一位数组型的y[i]用来存放从源结点到目标结点i的路径上的第一个途经的结点。
然后为每一个结点实例化一个对象用来存放此节点的路由表。
初始化各个节点的路由表,如果两个节点之间有连线则将其之间的距离赋给x[i][j],y[j]=j.如果没有直接路径则设x[i][j]=1000,y[j]=0.算法开始的时候各个结点交换路由表。
比较如果有类似x[i][j]和x[j][k]的项则设置x[i][k]=MIN(x[i][k],x[i][j]+x[j][k]),为了在结点A的邻居节点执行距离矢量路由更新时,它使用的是A的旧表,可以再设置两个二维数组用来暂时存放各个节点的新路由表,待各个节点一次交换都完毕后在把暂存的新节点依次赋给各个节点的路由表。
各个节点都执行此操作,为了确定供交换了几次可以设置一个标质量k.初始k=0,交换一次K就加一,最后k的值便是交换的次数。
三,遇到的问题及解决方案:
刚开始遇到这个题目是觉得无从下手,觉得这个图这么复杂函数循环又没有规律怎样让各个节点依次交换呢,又怎样判断什么时候各个节点的路由表变稳定呢?
着一些列的问题使自己变得很烦躁。
待到心情平静下来认真的一点一点推敲的时候发现只有七个节点,为每个节点设置一个交换函数也不麻烦而且这样思路便变得非常的清楚,至于怎样知道何时路由表稳定则我在每个结点函数中设置了一个标志量,在主函数中将其初始化为零,在下面的结点函数中都将其变成1,这样只有调用子函数这个标志量便会变成1,检测标质量是否为1来判断路由表是否变的稳定。
四,源代码
packagewangluo;
classJiedian{
inty[]=newint[8];//存放路径上的下一个节点
intx[][]=newint[8][8];//存放节点间的距离
}
publicclassLuyou{
publicstaticvoidmain(String[]args){
Jiediana=newJiedian();
a.x[0][0]=0;//结点0到结点0的距离为0
a.y[0]=0;//a结点(即0结点)到0结点路径上第一个结点为0
a.x[0][1]=2;
a.y[1]=1;
a.x[0][2]=1000;//如果没有直接路径则定义为1000便是无穷远
a.x[0][3]=1000;
a.x[0][4]=1000;
a.x[0][5]=1000;
a.x[0][6]=6;
a.y[6]=6;
a.x[0][7]=1000;
Jiedianb=newJiedian();
b.x[1][0]=2;
b.y[0]=0;
b.x[1][1]=0;
b.y[1]=1;
b.x[1][2]=7;
b.y[2]=2;
b.x[1][3]=1000;
b.x[1][4]=2;
b.y[4]=4;
b.x[1][5]=1000;
b.x[1][6]=1000;
b.x[1][7]=1000;
Jiedianc=newJiedian();
c.x[2][0]=1000;
c.x[2][1]=7;
c.y[1]=1;
c.x[2][2]=0;
c.y[2]=2;
c.x[2][3]=3;
c.y[3]=3;
c.x[2][4]=1000;
c.x[2][5]=3;
c.y[5]=5;
c.x[2][6]=1000;
c.x[2][7]=1000;
Jiediand=newJiedian();
d.x[3][0]=1000;
d.x[3][1]=1000;
d.x[3][2]=3;
d.y[2]=2;
d.x[3][3]=0;
d.y[3]=3;
d.x[3][4]=1000;
d.x[3][5]=1000;
d.x[3][6]=1000;
d.x[3][7]=2;
d.y[7]=7;
Jiediane=newJiedian();
e.x[4][0]=1000;
e.x[4][1]=2;
e.y[1]=1;
e.x[4][2]=1000;
e.x[4][3]=1000;
e.x[4][4]=0;
e.y[4]=4;
e.x[4][5]=2;
e.y[5]=5;
e.x[4][6]=1;
e.y[6]=6;
e.x[4][7]=1000;
Jiedianf=newJiedian();
f.x[5][0]=1000;
f.x[5][1]=1000;
f.x[5][2]=3;
f.y[2]=2;
f.x[5][3]=1000;
f.x[5][4]=2;
f.y[4]=4;
f.x[5][5]=0;
f.y[5]=5;
f.x[5][6]=1000;
f.x[5][7]=2;
f.y[7]=7;
Jiediang=newJiedian();
g.x[6][0]=6;
g.y[0]=0;
g.x[6][1]=1000;
g.x[6][2]=1000;
g.x[6][3]=1000;
g.x[6][4]=1;
g.y[4]=4;
g.x[6][5]=1000;
g.x[6][6]=0;
g.y[6]=6;
g.x[6][7]=4;
g.y[7]=7;
Jiedianh=newJiedian();
h.x[7][0]=1000;
h.x[7][1]=1000;
h.x[7][2]=1000;
h.x[7][3]=2;
h.y[3]=3;
h.x[7][4]=1000;
h.x[7][5]=2;
h.y[5]=5;
h.x[7][6]=4;
h.y[6]=6;
h.x[7][7]=0;
h.y[7]=7;
intm[][]=newint[8][8];//暂时存放各节点新表
intn[][]=newint[8][8];//暂时存放各结点到其他节点的路径上的第一个途经结点
intk=0;
do{
k=0;
//for(intj=0;j<6;j++){
for(inti=0;i<8;i++){
m[0][i]=a.x[0][i];
m[1][i]=b.x[1][i];
m[2][i]=c.x[2][i];
m[3][i]=d.x[3][i];
m[4][i]=e.x[4][i];
m[5][i]=f.x[5][i];
m[6][i]=g.x[6][i];
m[7][i]=h.x[7][i];
n[0][i]=a.y[i];
n[1][i]=b.y[i];
n[2][i]=c.y[i];
n[3][i]=d.y[i];
n[4][i]=e.y[i];
n[5][i]=f.y[i];
n[6][i]=g.y[i];
n[7][i]=h.y[i];
}
for(inti=0;i<8;i++)//将a的邻居结点的表传给a
if(m[0][i]>(a.x[0][1]+b.x[1][i])){//结点b
m[0][i]=a.x[0][1]+b.x[1][i];
n[0][i]=1;
k=1;//标记。
如果标有变动则k=1
}
for(inti=0;i<8;i++)
if(m[0][i]>(a.x[0][6]+g.x[6][i])){//结点g
m[0][i]=a.x[0][6]+g.x[6][i];
n[0][i]=6;
k=1;
}
for(inti=0;i<8;i++)//将b结点的邻居节点的表传给b
if(m[1][i]>(b.x[1][2]+c.x[2][i])){//结点c
m[1][i]=b.x[1][2]+c.x[2][i];
n[1][i]=2;
k=1;
}
for(inti=0;i<8;i++)
if(m[1][i]>(b.x[1][0]+a.x[0][i])){//结点a
m[1][i]=b.x[1][0]+a.x[0][i];
n[1][i]=0;
k=1;
}
for(inti=0;i<8;i++)
if(m[1][i]>(b.x[1][4]+e.x[4][i])){//结点e
m[1][i]=b.x[1][4]+e.x[4][i];
n[1][i]=4;
k=1;
}
for(inti=0;i<8;i++)//将c的邻居结点的表传给c
if(m[2][i]>(c.x[2][1]+b.x[1][i])){//结点b
m[2][i]=c.x[2][1]+b.x[1][i];
n[2][i]=1;
k=1;
}
for(inti=0;i<8;i++)
if(m[2][i]>(c.x[2][3]+d.x[3][i])){//结点d
m[2][i]=c.x[2][3]+d.x[3][i];
n[2][i]=3;
k=1;
}
for(inti=0;i<8;i++)
if(m[2][i]>(c.x[2][5]+f.x[5][i])){//结点f
m[2][i]=c.x[2][5]+f.x[5][i];
n[2][i]=5;
k=1;
}
for(inti=0;i<8;i++)//将d的邻居结点的表传给d
if(m[3][i]>(d.x[3][2]+c.x[2][i])){//结点c
m[3][i]=d.x[3][2]+c.x[2][i];
n[3][i]=2;
k=1;
}
for(inti=0;i<8;i++)
if(m[3][i]>(d.x[3][7]+h.x[7][i])){//结点h
m[3][i]=d.x[3][7]+h.x[7][i];
n[3][i]=7;
k=1;
}
for(inti=0;i<8;i++)//将e的邻居结点的表传给e
if(m[4][i]>(e.x[4][1]+b.x[1][i])){//结点b
m[4][i]=e.x[4][1]+b.x[1][i];
n[4][i]=1;
k=1;
}
for(inti=0;i<8;i++)
if(m[4][i]>(e.x[4][5]+f.x[5][i])){//结点f
m[4][i]=e.x[4][5]+f.x[5][i];
n[4][i]=5;
k=1;
}
for(inti=0;i<8;i++)
if(m[4][i]>(e.x[4][6]+g.x[6][i])){//结点g
m[4][i]=e.x[4][6]+g.x[6][i];
n[4][i]=6;
k=1;
}
for(inti=0;i<8;i++)//将f的邻居结点的表传给f
if(m[5][i]>(f.x[5][2]+c.x[2][i])){//结点c
m[5][i]=f.x[5][2]+c.x[2][i];
n[5][i]=2;
k=1;
}
for(inti=0;i<8;i++)
if(m[5][i]>(f.x[5][4]+e.x[4][i])){//结点e
m[5][i]=f.x[5][4]+e.x[4][i];
n[5][i]=4;
k=1;
}
for(inti=0;i<8;i++)
if(m[5][i]>(f.x[5][7]+h.x[7][i])){//结点f
m[5][i]=f.x[5][7]+h.x[7][i];
n[5][i]=7;
k=1;
}
for(inti=0;i<8;i++)//将g的邻居结点的表传给g
if(m[6][i]>(g.x[6][0]+a.x[0][i])){//结点a
m[6][i]=g.x[6][0]+a.x[0][i];
n[6][i]=0;
k=1;
}
for(inti=0;i<8;i++)
if(m[6][i]>(g.x[6][4]+e.x[4][i])){//结点e
m[6][i]=g.x[6][4]+e.x[4][i];
n[6][i]=4;
k=1;
}
for(inti=0;i<8;i++)
if(m[6][i]>(g.x[6][7]+h.x[7][i])){//结点h
m[6][i]=g.x[6][7]+h.x[7][i];
n[6][i]=7;
k=1;
}
for(inti=0;i<8;i++)//将g的邻居结点的表传给g
if(m[7][i]>(h.x[7][3]+d.x[3][i])){//结点d
m[7][i]=h.x[7][3]+d.x[3][i];
n[7][i]=3;
k=1;
}
for(inti=0;i<8;i++)
if(m[7][i]>(h.x[7][5]+f.x[5][i])){//结点d
m[7][i]=h.x[7][5]+f.x[5][i];
n[7][i]=5;
k=1;
}
for(inti=0;i<8;i++)
if(m[7][i]>(h.x[7][6]+g.x[6][i])){//结点d
m[7][i]=h.x[7][6]+g.x[6][i];
n[7][i]=6;
k=1;
}
for(inti=0;i<8;i++){
a.x[0][i]=m[0][i];
b.x[1][i]=m[1][i];
c.x[2][i]=m[2][i];
d.x[3][i]=m[3][i];
e.x[4][i]=m[4][i];
f.x[5][i]=m[5][i];
g.x[6][i]=m[6][i];
h.x[7][i]=m[7][i];
a.y[i]=n[0][i];
b.y[i]=n[1][i];
c.y[i]=n[2][i];
d.y[i]=n[3][i];
e.y[i]=n[4][i];
f.y[i]=n[5][i];
g.y[i]=n[6][i];
h.y[i]=n[7][i];
}
System.out.println("a的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+a.x[0][i]);
System.out.println("途经"+a.y[i]);
}
System.out.println("b的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+b.x[1][i]);
System.out.println("途经"+b.y[i]);
}
System.out.println("c的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+c.x[2][i]);
System.out.println("途经"+c.y[i]);
}
System.out.println("d的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+d.x[3][i]);
System.out.println("途经"+d.y[i]);
}
System.out.println("e的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+e.x[4][i]);
System.out.println("途经"+e.y[i]);
}
System.out.println("f的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+f.x[5][i]);
System.out.println("途经"+f.y[i]);
}
System.out.println("g的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+g.x[6][i]);
System.out.println("途经"+g.y[i]);
}
System.out.println("h的路由表为:
");
for(inti=0;i<8;i++){
System.out.println("到"+i+"结点的距离:
"+h.x[7][i]);
System.out.println("途经"+h.y[i]);
}
System.out.println("一遍结束");
}while(k==1);
//}
}
}
五,测试结果:
五,实验感悟:
通过本次的距离矢量路由算法是我更深刻的理解了这一算法的运行过程以及细节,也是自己对于网络上的算法编程有了初步的认识与了解,关键是要静下心来自习的想,越是急躁越是容易把问题复杂化而没有思路。
总之,通过这次试验我收获很多,不仅增加了对于网络路由算法的理解更激发了自己对于计算机网络这门课和对于网络编程的兴趣。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 距离 矢量 路由 算法 实验 报告