中南大学计算机网络实验报告.docx

上传人:b****3 文档编号:13221081 上传时间:2023-06-12 格式:DOCX 页数:21 大小:50.07KB
下载 相关 举报
中南大学计算机网络实验报告.docx_第1页
第1页 / 共21页
中南大学计算机网络实验报告.docx_第2页
第2页 / 共21页
中南大学计算机网络实验报告.docx_第3页
第3页 / 共21页
中南大学计算机网络实验报告.docx_第4页
第4页 / 共21页
中南大学计算机网络实验报告.docx_第5页
第5页 / 共21页
中南大学计算机网络实验报告.docx_第6页
第6页 / 共21页
中南大学计算机网络实验报告.docx_第7页
第7页 / 共21页
中南大学计算机网络实验报告.docx_第8页
第8页 / 共21页
中南大学计算机网络实验报告.docx_第9页
第9页 / 共21页
中南大学计算机网络实验报告.docx_第10页
第10页 / 共21页
中南大学计算机网络实验报告.docx_第11页
第11页 / 共21页
中南大学计算机网络实验报告.docx_第12页
第12页 / 共21页
中南大学计算机网络实验报告.docx_第13页
第13页 / 共21页
中南大学计算机网络实验报告.docx_第14页
第14页 / 共21页
中南大学计算机网络实验报告.docx_第15页
第15页 / 共21页
中南大学计算机网络实验报告.docx_第16页
第16页 / 共21页
中南大学计算机网络实验报告.docx_第17页
第17页 / 共21页
中南大学计算机网络实验报告.docx_第18页
第18页 / 共21页
中南大学计算机网络实验报告.docx_第19页
第19页 / 共21页
中南大学计算机网络实验报告.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

中南大学计算机网络实验报告.docx

《中南大学计算机网络实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学计算机网络实验报告.docx(21页珍藏版)》请在冰点文库上搜索。

中南大学计算机网络实验报告.docx

中南大学计算机网络实验报告

 

中南大学

 

《计算机网络》实验报告

 

学生姓名

学号

专业班级

指导教师桂劲松

学院信息科学与工程学院

完成时间2011年1月

模拟路由算法的实现

一、实验内容

1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。

2.实现链路状态路由算法中的最短路径算法。

二、实验目的及要求

本实验是计算机网络课程的实践性锻炼环节。

通过实验,帮助学生更好地掌握网络通信协议的实现技术,锻炼学生应用高级编程语言完成通信编程的能力,使学生加深对网络协议本质的理解,巩固课堂所学的理论知识。

要求实验者利用路由选择算法模拟软件提供的通信功能,模拟链路状态路由选择算法的初始化、路由信息扩散过程和路由计算方法;

掌握链路状态算法的路由信息扩散过程;

掌握链路状态算法的路由计算方法。

三、实验原理

编程语言:

JAVA

编程工具:

MyEclipse

实验实现方式:

单机模拟实现

核心方法:

dijkstra算法计算最短路径

分析:

布置好各个模拟路由,以及路由的路程权值如何获取。

接着就是核心算法的实现,如何计算任意两个路由之间的最短路径问题。

用到的是dijkstra算法。

Dijkstra算法按照从给定起点到图中顶点的距离,顺序求出最短的路径,首先,它求出从起点到最接近起点的顶点之间的最短路径,然后求出第二近的,一次类推,推而广之,再第i次迭代开始之前,算法已经确定了i-1条连接起点和离起点最近顶点之间的最短路径。

这些顶点、起点和从起点到顶点的路径上的边,构成了给定图的一颗子树Ti,因为所有边的权值都是非负数,可以从与Ti的顶点相邻的顶点中找到下一个和起点最接近的顶点。

和Ti的顶点相邻的顶点的集合称为“边缘顶点”,以他们为候选对象,Dijkstra算法可以从中选出一个最接近起点的顶点。

为了确定第I个最接近的顶点,对于每一个边缘顶点u,该算法求出它到最近的树中顶点v的距离以及从起点到v得最短路径长度dv的和,再从中选出具有最小和的顶点。

此次实验主要是运用路由算法来处理路由当中的一些问题,利用Dijkstra算法处理最短路径的问题,在实验中这点已经得到了充分地体现。

下面是该算法的流程图:

 

核心算法代码如下。

其中每个顶点用一个类来封装含有两个属性,一个是路由编号,一个是到某个路由的最短路径初始值为无限大。

voidDijkstra(int*arcs[],int*R[],intRL[],intvexnum){

//迪杰斯特拉算法

intv0;//定义源节点

bool*visit=newbool[vexnum];//已经确定最短路径的节点的集合

cout<<"请输入起始节点:

";

cin>>v0;

cout<

for(intcnt=0;cnt

visit[cnt]=FALSE;

RL[cnt]=arcs[v0][cnt];

if(RL[cnt]

R[cnt][0]=v0;

R[cnt][1]=cnt;

}

}//for

RL[v0]=0;//源节点的标志

visit[v0]=TRUE;//初始化已经找到最短路径的点集合

for(inti=1;i

intmin=INFINITY;

intv=v0;

for(intj=0;j

if(!

visit[j])

if(RL[j]

v=j;

min=RL[j];

}

visit[v]=TRUE;//离v0顶点最近的v加入到s集

for(intk=0;k

if(!

visit[k]&&(min+arcs[v][k]

//modifyshortestr[j]andRL[j]

RL[k]=min+arcs[v][k];

updateRouteLen(R[k],R[v],k,vexnum);

}//if

}//for

delete[]visit;

visit=NULL;

}//Dijkstra

完成核心算法后,对于每个路由器运行一次Dijkstra算法就可以计算出该路由到其他各个路由的最短路径。

四、实验过程及结果

本实验用6个节点进行模拟,首先输入节点个数,再依次输入节点的标识符和到邻居节点的标识符和距离。

以end为结束符。

运行结果如下:

请输入路由节点总个数:

6

请输入路由节点标识符:

a

请输入节点:

a的邻居节点的标识符及其到邻居节点的距离:

b

8

请输入节点:

a的邻居节点的标识符及其到邻居节点的距离:

f

3

请输入节点:

a的邻居节点的标识符及其到邻居节点的距离:

end

请输入路由节点标识符:

b

请输入节点:

b的邻居节点的标识符及其到邻居节点的距离:

a

8

请输入节点:

b的邻居节点的标识符及其到邻居节点的距离:

c

3

请输入节点:

b的邻居节点的标识符及其到邻居节点的距离:

f

5

请输入节点:

b的邻居节点的标识符及其到邻居节点的距离:

d

2

请输入节点:

b的邻居节点的标识符及其到邻居节点的距离:

e

4

请输入节点:

b的邻居节点的标识符及其到邻居节点的距离:

end

请输入路由节点标识符:

c

请输入节点:

c的邻居节点的标识符及其到邻居节点的距离:

b

3

请输入节点:

c的邻居节点的标识符及其到邻居节点的距离:

d

10

请输入节点:

c的邻居节点的标识符及其到邻居节点的距离:

end

请输入路由节点标识符:

d

请输入节点:

d的邻居节点的标识符及其到邻居节点的距离:

c

10

请输入节点:

d的邻居节点的标识符及其到邻居节点的距离:

b

2

请输入节点:

d的邻居节点的标识符及其到邻居节点的距离:

e

6

请输入节点:

d的邻居节点的标识符及其到邻居节点的距离:

end

请输入路由节点标识符:

e

请输入节点:

e的邻居节点的标识符及其到邻居节点的距离:

b

4

请输入节点:

e的邻居节点的标识符及其到邻居节点的距离:

d

6

请输入节点:

e的邻居节点的标识符及其到邻居节点的距离:

f

4

请输入节点:

e的邻居节点的标识符及其到邻居节点的距离:

end

请输入路由节点标识符:

f

请输入节点:

f的邻居节点的标识符及其到邻居节点的距离:

a

3

请输入节点:

f的邻居节点的标识符及其到邻居节点的距离:

b

5

请输入节点:

f的邻居节点的标识符及其到邻居节点的距离:

e

4

请输入节点:

f的邻居节点的标识符及其到邻居节点的距离:

End

路由表结果

五、实验心得

本次实验,主要的就是一个著名算法的运用,当然通过本次实验我对链路路由算法也有了进一步的认识与了解。

从这次的实验中我不但学会了一个新的算法,进一步锻炼了我的编程能力而且我也对路由相关内容有了更深刻的了解。

六、附录:

源代码

packagedstverctor;

/**

*描述两个路由节点之间关系的类

*

*/

publicclassDistanceNode{

//publicRouteNodesrc;//源节点

//publicDistanceNode(RouteNodesrc){

//this.src=src;

//}

publicStringdst;//目标节点

publicintdistance;//两者之间的距离

publicStringpath;//经过的第一个路径节点,即线路

publicDistanceNodenext;//下一个节点

publicDistanceNode(){

}

publicDistanceNode(Stringdst,intdistance,Stringpath){

this.dst=dst;

this.distance=distance;

this.path=path;

}

/**

*根据节点标识符,得到路由节点到指定节点的距离

*@paramkey指定节点标识符

*@return如果找到,则返回这个关系类节点,否则返回null。

*int

*/

publicDistanceNodefindNode(Stringkey){

DistanceNodedn=this;

while(dn!

=null){

if(dn.dst.equals(key)){

returndn;

}

dn=dn.next;

}

returnnull;

}

/**

*根据key向链表中修改或增加一个节点,如果存在dst.equal(key)的点并且他的distance大于要插入的distance,则更改其distance,否则向链表末尾插入新节点

*@paramkey

*@paramdistance

*@parampath

*void

*/

publicvoidaddNode(Stringkey,intdistance,Stringpath){

DistanceNodedn=findNode(key);

if(null!

=dn){//如果找到了节点

if(dn.distance>distance)

dn.distance=distance;

}else{

DistanceNodedn1=this;

while(dn1.next!

=null){

dn1=dn1.next;

}

DistanceNodenode=newDistanceNode();

node.distance=distance;

node.dst=key;

node.path=path;

dn1.next=node;

node.next=null;

}

}

publicvoidprint(){

DistanceNodedn=this;

System.out.println("目地节点:

"+dn.dst+"距离:

"+dn.distance+"线路:

"+dn.path);

while(dn.next!

=null){

dn=dn.next;

System.out.println("目地节点:

"+dn.dst+"距离:

"+dn.distance+"线路:

"+dn.path);

}

}

}

packagedstverctor;

/**

*描述两个路由节点之间关系的类

*

*/

publicclassDistanceNode{

//publicRouteNodesrc;//源节点

//publicDistanceNode(RouteNodesrc){

//this.src=src;

//}

publicStringdst;//目标节点

publicintdistance;//两者之间的距离

publicStringpath;//经过的第一个路径节点,即线路

publicDistanceNodenext;//下一个节点

publicDistanceNode(){

}

publicDistanceNode(Stringdst,intdistance,Stringpath){

this.dst=dst;

this.distance=distance;

this.path=path;

}

/**

*根据节点标识符,得到路由节点到指定节点的距离

*@paramkey指定节点标识符

*@return如果找到,则返回这个关系类节点,否则返回null。

*int

*/

publicDistanceNodefindNode(Stringkey){

DistanceNodedn=this;

while(dn!

=null){

if(dn.dst.equals(key)){

returndn;

}

dn=dn.next;

}

returnnull;

}

/**

*根据key向链表中修改或增加一个节点,如果存在dst.equal(key)的点并且他的distance大于要插入的distance,则更改其distance,否则向链表末尾插入新节点

*@paramkey

*@paramdistance

*@parampath

*void

*/

publicvoidaddNode(Stringkey,intdistance,Stringpath){

DistanceNodedn=findNode(key);

if(null!

=dn){//如果找到了节点

if(dn.distance>distance)

dn.distance=distance;

}else{

DistanceNodedn1=this;

while(dn1.next!

=null){

dn1=dn1.next;

}

DistanceNodenode=newDistanceNode();

node.distance=distance;

node.dst=key;

node.path=path;

dn1.next=node;

node.next=null;

}

}

publicvoidprint(){

DistanceNodedn=this;

System.out.println("目地节点:

"+dn.dst+"距离:

"+dn.distance+"线路:

"+dn.path);

while(dn.next!

=null){

dn=dn.next;

System.out.println("目地节点:

"+dn.dst+"距离:

"+dn.distance+"线路:

"+dn.path);

}

}

}

packagedstverctor;

/**

*路由的唯一标识符类

*

*/

publicclassRouteKey{

Stringkey;//路由节点的唯一标识符

RouteKeynext;//路由表中的下一个路由节点

publicRouteKey(){

}

publicRouteKey(Stringkey){

this.key=key;

}

publicvoidprint(){

RouteKeyrk=this;

System.out.print(rk.key+"||");

while(rk.next!

=null){

rk=rk.next;

System.out.print(rk.key+"||");

}

}

}

packagedstverctor;

/**

*路由节点

*/

publicclassRouteNode{

DistanceNodeold;//老路由表

DistanceNodecurrent;//新路由表

RouteKeyneighbour;//存储邻居节点的链表头结点

Stringkey;

//跟新路由表

publicvoidupdateCurrent(){

saveCurrent();//路由表变化前保存当前的路由表

RouteNodenb;//邻居节点

RouteKeyrk=neighbour;

while(null!

=rk){

//System.out.println("------------"+rk.key+"-------");

nb=DistVerctor.map.get(rk.key);//由节点标记符得到路由节点

//System.out.println("------------"+nb.key+"-------");

DistanceNodedn=nb.old;//得到邻居节点的老路由表

//排除自己在内,避免重新计算自己到邻居节点

if(dn.dst.equals(key)){

System.out.println("------------"+dn.dst+"------------");

dn=dn.next;

}

intdistTonb=0;

if(dn!

=null)

distTonb=current.findNode(nb.key).distance;//到邻居节点的距离

while(null!

=dn){

//排除自己在内,避免重新计算自己到邻居节点

if(dn.dst.equals(key)){

System.out.println("------------"+dn.dst+"------------");

dn=dn.next;

}else{

//修改新路由表,

//如果当前节点到dn的距离小于当前节点到邻居节点nb+nb到dn的距离,则修改路由表

//如果不存在当前节点到dn的路径,则在路由表最后新添加该路径

current.addNode(dn.dst,dn.distance+distTonb,nb.key);

dn=dn.next;

}

}

rk=rk.next;//指向下一个邻居节点

}

}

/**

*将当前表保存为旧表

*

*void

*/

publicvoidsaveCurrent(){

DistanceNodecnode=current;

DistanceNodeonode=newDistanceNode();

copy(cnode,onode);//得到cnode的备份

old=onode;

while(cnode.next!

=null){

onode.next=newDistanceNode();

copy(cnode.next,onode.next);

cnode=cnode.next;

onode=onode.next;

}

}

publicvoidcopy(DistanceNodesrc,DistanceNodedst){

dst.distance=src.distance;

dst.dst=src.dst;

dst.path=src.path;

}

publicvoidprint(){

System.out.println(key+"的邻居节点:

");

neighbour.print();

System.out.println("老路由表:

");

old.print();

System.out.println("新路由表:

");

current.print();

}

}

 

WelcomeTo

Download!

!

!

 

欢迎您的下载,资料仅供参考!

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2