计算机网络 实 验 报 告
学生姓名 学 号 专业班级 指导教师 王建新
学 院 信息科学与工程学院 完成时间 2014年5月
实验一 网络路由层模拟协议
一.实验目的与要求
1.掌握VB、VC++、VS或JAVA等集成开发环境编写路由仿真程序的方法; 2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。
二.实验内容与实现原理
1.实验内容(1,2任选其一实现)
1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。
基本要求(动态生成网络拓扑图,节点间的距离随机生成。从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。观察和讨论多少轮交换后路由表稳定)
2.实现链路状态路由算法的模拟。
基本要求(动态生成网络拓扑图,节点间的距离随机生成。每个节点生成自己的链路状态分组,依据收到的链路状态表得到整体网络结构,在得到的整体网络结构上用最短路径算法,生成每个节点的路由表)
进一步的要求:可以将模拟实验的每个节点程序部署在不同的电脑上,通过socket通信程序完成路由表信息或者链路状态分组的发送(与实验三结合)。请用两台机器虚拟成多个网络节点(一台机器上开启多个通信进程,每个进程虚拟成一个节点),完成每个虚拟节点的路由表生成,进而按照路由表转发数据包。
2.实现原理
链路状态路由协议是目前使用最广的一类域内路由协议。它采用一种“拼图”的设计策略,即每个路由器将它到其周围邻居的链路状态向全网的其他路由器进行广播。这样,一个路由器收到从网络中其他路由器发送过来的路由信息后,它对这些链路状态进行拼装,最终生成一个全网的拓扑视图,近而可以通过最短路径算法来计算它到别的路由器的最短路径。运行链路状态路由协议的路由器, 每台路由器公在其接口的状态发生变化时,才将变化后的状态发送给其他所有路由器,每台路由器都使用收到的信息重新计算前往每个网络的最佳路径,然后将这些信息存储到自己的路由选择表中。
链路状态路由算法背后的思想非常简单,可以用5个基本步骤加以描述。 1、发现他的邻接点,并知道其网络的地址。 2、测量到各邻接点的延迟或开销。
3、构造一个分组,分组中包含所有他刚刚收到的信息。 4、将这个分组发送给其他的路由器。
5、计算出到每一个其他路由器的最短路径。例如,每个路由器运行Dijkstra算法就可以找从它到每一个其他路由器的最短路径。
三.实验具体设计实现及结果
(含流程图及关键代码说明)
B 5 2 6 C A 4 1 2 3 4
D E 上图为实验截图所用的网络图,图中的每个节点代表一个路由器,每条边代表一条通信线路或链路。为了选择一对给定路由器之间的路由,算法只需要在图中找出它们之间的最短路径。 流程图
创建路由表 增加路由 删除路由 修改路由 找两个路由间的最短路径 保存路由表到文件 显示路由表信息 选择功能 退出 写入 增加 删除 修改 dijkstra算法 以流的方式写入文件 展示 矩阵内存储的路由信息 初始化邻接 矩阵 输出界面(内容参见截图) 下为功能展示截图:
dijkstra算法代码:
void dijkstra(int s, int t, int path[]){ //迪杰斯特拉算法 s目的节点 t源节点 struct state{ //存放节点数据 int predecessor; //父节点 int length; //权值,存放最小权值 bool lable; //访问状态 false未被访问过,true访问过 }state[MAX_NODES];
int i,k,min,print; struct state *p; for(p = &state[0]; p < &state[Vnums]; p ++) //初始化节点数据 {
p->predecessor = -1;//类似存下一跳 p->length = INFINITY; //=100000 p->lable = false; } state[t].length = 0; //源节点的权值改为0 state[t].lable = true; k = t; cout << \最短路径为:\ do{ //dowhile 先是把所有最短路径连起来 for(i = 0; i < Vnums; i ++) //找到与永久标定节点直接相连的节点,并改变其权值 { if( (dist[k][i] != 0) && (state[i].lable == false)) { //与源节点直接相连并且不是同一个源节点k源节点 if(state[k].length + dist[k][i] < state[i].length) { state[i].predecessor = k; //记录节点 cout << k << \ state[i].length = state[k].length + dist[k][i]; //路径长度总和 } } } k = 0; min = INFINITY; for( i = 0; i < Vnums; i ++) //找到与永久标定节点相邻的节点,并把与最小权值的相邻点改为永久标点 { if((state[i].lable == false) && (state[i].length < min)) //找到与永久标点相邻的节点 { min = state[i].length; k = i; } } state[k].lable = true; //新的永久标点也变为访问过 }while(k!=s); //新的永久标点是否为目的节点,不是继续循环 cout << s <<\最小距离=\ }