计算机网络实验报告距离矢量路由算法一,实验内容:A D设计一个算法,实现上面拓扑图的各个结点之间路由表的交换,要求显示出结点路由表的交换过程并显示每次交换结束后的各个结点保存的路由表的内容。
最后显示交换了几次后各个结点路由表开始变得稳定。
二,算法设计:首先创建一个类。
它有两个成员变量。
一个是二维数组型的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来判断路由表是否变的稳定。
四,源代码package wangluo;class Jiedian {int y[]=new int[8]; //存放路径上的下一个节点int x[][]=new int[8][8]; //存放节点间的距离}public class Luyou {public static void main(String[] args) {Jiedian a=new Jiedian();a.x[0][0]=0; //结点0到结点0的距离为0a.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;Jiedian b=new Jiedian();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;Jiedian c=new Jiedian();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;Jiedian d=new Jiedian();d.x[3][0]=1000;d.x[3][1]=1000;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;Jiedian e=new Jiedian();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;Jiedian f=new Jiedian();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;Jiedian g=new Jiedian();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.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;Jiedian h=new Jiedian();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;int m[][]=new int[8][8]; //暂时存放各节点新表int n[][]=new int[8][8]; //暂时存放各结点到其他节点的路径上的第一个途经结点int k=0;do{k=0;//for(int j=0;j<6;j++){for(int i=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(int i=0;i<8;i++) //将a的邻居结点的表传给aif(m[0][i]>(a.x[0][1]+b.x[1][i])){ //结点bm[0][i]=a.x[0][1]+b.x[1][i];n[0][i]=1;k=1; //标记。
如果标有变动则k=1 }for(int i=0;i<8;i++)if(m[0][i]>(a.x[0][6]+g.x[6][i])){ //结点gm[0][i]=a.x[0][6]+g.x[6][i];n[0][i]=6;k=1;}for(int i=0;i<8;i++) //将b结点的邻居节点的表传给b if(m[1][i]>(b.x[1][2]+c.x[2][i])){ //结点cm[1][i]=b.x[1][2]+c.x[2][i];n[1][i]=2;k=1;}for(int i=0;i<8;i++)if(m[1][i]>(b.x[1][0]+a.x[0][i])){ //结点am[1][i]=b.x[1][0]+a.x[0][i];n[1][i]=0;k=1;}for(int i=0;i<8;i++)if(m[1][i]>(b.x[1][4]+e.x[4][i])){ //结点em[1][i]=b.x[1][4]+e.x[4][i];n[1][i]=4;k=1;}for(int i=0;i<8;i++) //将c的邻居结点的表传给c if(m[2][i]>(c.x[2][1]+b.x[1][i])){ //结点bm[2][i]=c.x[2][1]+b.x[1][i];n[2][i]=1;k=1;}for(int i=0;i<8;i++)if(m[2][i]>(c.x[2][3]+d.x[3][i])){ //结点dm[2][i]=c.x[2][3]+d.x[3][i];n[2][i]=3;k=1;}for(int i=0;i<8;i++)if(m[2][i]>(c.x[2][5]+f.x[5][i])){ //结点fm[2][i]=c.x[2][5]+f.x[5][i];n[2][i]=5;k=1;}for(int i=0;i<8;i++) //将d的邻居结点的表传给dif(m[3][i]>(d.x[3][2]+c.x[2][i])){ //结点cm[3][i]=d.x[3][2]+c.x[2][i];n[3][i]=2;k=1;}for(int i=0;i<8;i++)if(m[3][i]>(d.x[3][7]+h.x[7][i])){ //结点hm[3][i]=d.x[3][7]+h.x[7][i];n[3][i]=7;k=1;}for(int i=0;i<8;i++) //将e的邻居结点的表传给eif(m[4][i]>(e.x[4][1]+b.x[1][i])){ //结点bm[4][i]=e.x[4][1]+b.x[1][i];n[4][i]=1;k=1;}for(int i=0;i<8;i++)if(m[4][i]>(e.x[4][5]+f.x[5][i])){ //结点fm[4][i]=e.x[4][5]+f.x[5][i];n[4][i]=5;k=1;}for(int i=0;i<8;i++)if(m[4][i]>(e.x[4][6]+g.x[6][i])){ //结点gm[4][i]=e.x[4][6]+g.x[6][i];n[4][i]=6;k=1;}for(int i=0;i<8;i++) //将f的邻居结点的表传给fif(m[5][i]>(f.x[5][2]+c.x[2][i])){ //结点cm[5][i]=f.x[5][2]+c.x[2][i];n[5][i]=2;k=1;}for(int i=0;i<8;i++)if(m[5][i]>(f.x[5][4]+e.x[4][i])){ //结点em[5][i]=f.x[5][4]+e.x[4][i];n[5][i]=4;k=1;}for(int i=0;i<8;i++)if(m[5][i]>(f.x[5][7]+h.x[7][i])){ //结点fm[5][i]=f.x[5][7]+h.x[7][i];n[5][i]=7;k=1;}for(int i=0;i<8;i++) //将g的邻居结点的表传给gif(m[6][i]>(g.x[6][0]+a.x[0][i])){ //结点am[6][i]=g.x[6][0]+a.x[0][i];n[6][i]=0;k=1;}for(int i=0;i<8;i++)if(m[6][i]>(g.x[6][4]+e.x[4][i])){ //结点em[6][i]=g.x[6][4]+e.x[4][i];n[6][i]=4;k=1;}for(int i=0;i<8;i++)if(m[6][i]>(g.x[6][7]+h.x[7][i])){ //结点hm[6][i]=g.x[6][7]+h.x[7][i];n[6][i]=7;k=1;}for(int i=0;i<8;i++) //将g的邻居结点的表传给gif(m[7][i]>(h.x[7][3]+d.x[3][i])){ //结点dm[7][i]=h.x[7][3]+d.x[3][i];n[7][i]=3;k=1;}for(int i=0;i<8;i++)if(m[7][i]>(h.x[7][5]+f.x[5][i])){ //结点dm[7][i]=h.x[7][5]+f.x[5][i];n[7][i]=5;k=1;}for(int i=0;i<8;i++)if(m[7][i]>(h.x[7][6]+g.x[6][i])){ //结点dm[7][i]=h.x[7][6]+g.x[6][i];n[7][i]=6;k=1;}for(int i=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(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+a.x[0][i]); System.out.println("途经"+a.y[i]);}System.out.println("b的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+b.x[1][i]);System.out.println("途经"+b.y[i]);}System.out.println("c的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+c.x[2][i]);System.out.println("途经"+c.y[i]);}System.out.println("d的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+d.x[3][i]);System.out.println("途经"+d.y[i]);}System.out.println("e的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+e.x[4][i]);System.out.println("途经"+e.y[i]);}System.out.println("f的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+f.x[5][i]);System.out.println("途经"+f.y[i]);}System.out.println("g的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+g.x[6][i]);System.out.println("途经"+g.y[i]);}System.out.println("h的路由表为:");for(int i=0;i<8;i++){System.out.println("到"+i+"结点的距离: "+h.x[7][i]);System.out.println("途经"+h.y[i]);}System.out.println("一遍结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");}while(k==1);// }}}五,测试结果:一,实验感悟:通过本次的距离矢量路由算法是我更深刻的理解了这一算法的运行过程以及细节,也是自己对于网络上的算法编程有了初步的认识与了解,关键是要静下心来自习的想,越是急躁越是容易把问题复杂化而没有思路。