距离向量路由算法实验报告
rip实验报告
![rip实验报告](https://img.taocdn.com/s3/m/0630e0c070fe910ef12d2af90242a8956becaaca.png)
rip实验报告实验报告:RIP协议的应用与分析摘要:本实验旨在探究RIP(Routing Information Protocol)协议的应用与分析。
RIP 是一种基于距离向量的路由协议,常用于小型网络中。
本文将从RIP协议的基本原理、应用场景、优缺点以及未来发展等方面进行分析和讨论。
一、RIP协议的基本原理RIP是一种距离向量路由协议,它通过交换路由信息,计算出最佳路径并更新路由表。
RIP协议使用跳数(hop count)作为度量标准,即将到达目的地的跳数作为路径的衡量标准。
RIP协议通过周期性地广播路由信息,实现网络中各个路由器之间的通信和路由表的更新。
二、RIP协议的应用场景1. 小型网络:RIP协议适用于小型网络,特别是那些拓扑结构简单、路由器数量较少的网络。
在这种场景下,RIP协议的优点是配置简单、实现成本低,并且能够快速适应网络拓扑的变化。
2. 低成本要求:RIP协议不需要高端的硬件设备和大量的带宽,因此适用于对成本有较低要求的网络环境。
它可以在有限的资源下提供基本的路由功能,满足一般的通信需求。
3. 学术研究:RIP协议作为一种经典的路由协议,被广泛应用于学术研究中。
研究人员可以通过对RIP协议进行改进和优化,探索更高效的路由算法和协议设计。
三、RIP协议的优缺点1. 优点:(1)简单易用:RIP协议的配置和管理相对简单,适合初学者使用。
(2)适应性强:RIP协议能够快速适应网络拓扑的变化,当网络中某个路由器失效时,能够迅速更新路由表。
2. 缺点:(1)慢速收敛:由于RIP协议是周期性广播路由信息,其收敛速度相对较慢。
在大型网络中,可能会导致路由表更新不及时,影响网络的稳定性。
(2)不适用于复杂网络:RIP协议的距离度量标准只考虑了跳数,没有考虑其他因素如带宽、延迟等。
因此,在复杂网络环境中,RIP协议的性能可能不如其他高级路由协议。
四、RIP协议的未来发展尽管RIP协议存在一些局限性,但它作为一种经典的路由协议仍然具有一定的应用前景。
计算机网络GBN和路由算法实验报告要点
![计算机网络GBN和路由算法实验报告要点](https://img.taocdn.com/s3/m/cea41f31cc7931b765ce15f8.png)
计算机网络实验报告----GBN和路由算法姓名:房皓学号:13410801 教师:尹辉GBN模拟实验1.实验目的运用java编程语言实现基于Go-Back-N的可靠数据传输软件。
2.实验意义通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。
3.实验背景Go-Back-N的有限状态机模型表示如下图所示:(a)(b)图为Go-Back-N的有限状态机模型(a)发送端(b)接受端4.实验步骤(1)选择java编程语言编程实现基于Go-Back-N的可靠数据传输软件。
(2)在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。
5.实验环境(1)实验语言:JAVA(2)实验平台:Eclipse(3)引用库函数:随机(Random)库、计时库(Timer)6.类概览与描述(1)Sender类:继承于Thread(线程)类,模拟发送方的一切功能,主要功能函数有:A.Public void run()——启动函数,标识开始发送数据包B.Sender()——构造函数,分配并初始化窗口值C.Public void getack(in tack)——ACK接收函数,接收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发)D.Public void time()——定时器函数,初始化定时,计时并记录超时与否的状态(2)Receiver类:继承于Thread(线程)类,模拟接收方的一切功能,主要功能函数有:A.Public void run()——启动函数,标识开始等待并接收数据包B.Void Receive(int data,Sender s)——数据包接收函数,功能强大!主要包括:接收数据包,验证数据包,判断与丢弃数据包,发送ack等(3)Timers类:继承于TimerTask(计时器)类,具有自定义定时与超时提醒的功能,主要功能函数有:A.Public void run()——启动函数,标识开始计时(这里预设的是2秒的时间),超时后提醒并且停止计时器B.Public Timers()——构造函数,清0计时器,等待下一次启动(4)GBN类:继承于Thread(线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:A.Static void senddelay(int x) throwsInterruptedExceptionPublic Timers()——随机延迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms, 750ms, 1200ms,3000ms等B.Public static void main(String[] args) throwsIOException, InterruptedException()——主函数,功能强大,主要包含以下几大方面:①开启发送端与接收端(包括计时器)②超时或者ACK不匹配等情况导致的发送方重新发送数据包③(第一次)发送当前窗口内的数据包④随机函数模拟数据包发送过程中的丢包情况⑤实时更新与显示当前窗口内的数据包情况⑥统计每一个数据包被发送过的次数(含重发)并最终显示出来C. static void OutputWindow(Sender s) ——输出当前窗口状态函数。
距离矢量路由算法
![距离矢量路由算法](https://img.taocdn.com/s3/m/f2f3410cb52acfc789ebc944.png)
距离矢量路由算法(Distance Vector Routing,DV)是ARPANET网络上最早使用的路由算法,也称Bellman-Ford路由算法和Ford-Fulkerson算法,主要在RIP(Route Information Protocol)协议中使用。
Cisco的IGRP和EIGRP路由协议也是采用DV这种路由算法的。
“距离矢量路由算法”的基本思想如下:每个路由器维护一个距离矢量(通常是以延时是作变量的)表,然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。
每个距离矢量表项包括两部分:到达目的结点的最佳输出线路,和到达目的结点所需时间或距离,通信子网中的其它每个路由器在表中占据一个表项,并作为该表项的索引。
每隔一段时间,路由器会向所有邻居结点发送它到每个目的结点的距离表,同时它也接收每个邻居结点发来的距离表。
这样以此类推,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,这样各路由器只需要查看这个距离矢量表就可以为不同来源分组找到一条最佳的路由。
现假定用延时作为距离的度量,举一个简单的例子,如图7-37所示。
假设某个时候路由器Y收到其邻居路由器X的距离矢量,其中m是Y估计到达路由器X的延时。
若Y路由器知道它到邻居Z的延时为n,那么它可以得知Z通过Y到达X需要花费时间m+n。
如果Z路由器还有其他相邻路由器,则对于从其他每个邻居那儿收到的距离矢量,该路由器执行同样的计算,最后从中选择费时最小的路由作为Z去往X的最佳路由,然后更新其路由表,并通告给其邻居路由器。
图7-37 距离矢量路由算法简单实例现以一个如图7-38所示的示例介绍距离矢量算法中的路由的确定流程,各段链路的延时均已在图中标注。
A、B、C、D、E代表五个路由器,假设路由表的传递方向为:A → B →C → D → E(这与路由器启动的先后次序有关)。
下面具体的流程。
(1)初始状态下,各路由器都只收集直接相连的链路的延时信息,各路由器结点得出各自的初始矢量表如图7-39所示。
距离矢量路由算法原理实验
![距离矢量路由算法原理实验](https://img.taocdn.com/s3/m/d2610e3c59eef8c75fbfb327.png)
距离矢量路由算法原理实验【实验目的】1、要求实验者利用路由选择算法模拟软件提供的通信功能,模拟距离矢量路由选择算法的初始化、路由信息扩散过程和路由计算方法;2、掌握距离矢量算法的路由信息扩散过程;3、掌握距离矢量算法的路由计算方法。
【预备知识】1、路由选择算法的特征、分类和最优化原则2、路由表的内容、用途和用法3、距离矢量算法的基本原理【实验环境】1、分组实验,每组4~10人。
2、拓扑:虚线表示节点之间的逻辑关系,构成一个逻辑上的网状拓扑结构。
3、设备:小组中每人一台计算机。
4、实验软件:路由选择算法模拟软件(routing.exe )【实验原理】路由选择算法模拟软件根据给定的拓扑结构,为实验者提供基本的本地路由信息,并能发送和接收实验者所组织的路由信息,帮助实验者完成路由选择算法的路由信息扩散过程、路由计算过程和路由测试过程。
1、模拟软件的功能(图2-1)● 在局域网内根据小组名称和成员数量建立一个模拟网络拓扑结构,每个成员模拟拓扑中的一台路由器,路由器上的本地路由信息由实验软件提供。
● 向实验者指定的发送对象发送实验者自行组织的发送内容。
● 提示实验者有数据需要接收,并显示接收内容。
N路由节点2 路由节点N-1 N = 4 ~ 10●为实验者提供记录路由计算结果的窗口——路由表窗口。
●为实验者提供分组逐站转发方法来验证路由选择的结果。
图2-1 路由选择算法模拟软件主界面2、模拟软件的使用方法1)建立小组通过建立小组,每个小组成员可以获得本节点的编号和本地直连链路信息。
a)4~10人一组,在实验前自由组合形成小组。
小组人数尽量多些,每人使用一台计算机。
启动实验软件后点击“建立小组”按钮。
(图2-2)图2-2 选择建立小组b)在建立小组的窗口内填入小组名称和成员数量。
同一小组成员必须填写同样的小组名称和成员数量才能正确建立小组。
(图2-3)图2-3 建立小组窗口图2-4 小组建立过程c)点击“加入”按钮后,实验软件以广播形式将组名广播出去。
距离向量算法更新路由表3
![距离向量算法更新路由表3](https://img.taocdn.com/s3/m/0a3cf46e48d7c1c708a14565.png)
论 文 题 目距离向量算法更新路由表
学生专业班级通信07级2班
学生姓名(学号)
指 导 教 师
完 成 时 间2010年05月22日
实 习(设计)地点信息楼139(112)机房
2010年05月22日
距离向量算法更新路由表
一.实验目的
1.认识并掌握路由器结构组成及路由建立与更新的原理
2.理解、掌握和利用距离向量算法的应用。
4.返回。
三.设计方案
路由表的建立和更新
假设建立七个路由器,其中三个A,B和C。路由器A的两个网络接口E0和S0
分别连接在10.1.0.0和10.2.0.0网段上;路由器B的两个网络接口S0和S1
分别连接在10.2.0.0和10.3.0.0网段上;路由器C的两个网络接口S0和E0
分别连接在10.3.0.0和10.4.0.0网段上;
if (c==',') /*读完一个数字*/
{
num[i] = '\0';
data[m][n].dis = atoi(num);
data[m][n].from = -1;
i = 0;
break;
}
else if ((c>='0' && c<='9') || c=='-') /*如果读到数字或符号*/
{
num[i++] = c;
}
}
}
}
}
void OutputRoutData()
{
int i,j;
printf(" ");
for(i=0; i<ROUTNUM; i++)/*读取路由距离*/
基于距离矢量算法的路由器模拟实验
![基于距离矢量算法的路由器模拟实验](https://img.taocdn.com/s3/m/d48d973a4a35eefdc8d376eeaeaad1f34693112a.png)
基于距离矢量算法的路由器模拟实验一试验目的深入理解分布式路由选择算法理解、掌握和利用距离向量算法所实现的路由器模拟Internet上的IP路由器,它能确定网络的最短路由,并在其上传输分组二算法描述距离向量算法也称为Bellman-Ford shortest path algorithm 它是一种动态路由选择算法每个路由器都定期与其相邻的所有路由器交换路由表,据此更新它们自己的路由表路由表更新规则:1所有结点都监听从其它结点传来的路由表,并在下列情况下更新其路由表1发现了一条到达某目的的新路由,而该路由在原来的路由表中不存在(即发现了一条新路由),则在路由表中增加该路由2发现了一条到达某目的的、距离更短的新路由,则用该路由替换原有的路由3到达某目的的一条路由,其后继结点到达该目的地的距离发生了变化,则需要更新该路由的距离三实验要求编写一个程序利用距离向量算法更新路由表该程序的多个实例(进程或线程)可以以运行在一台机器一个实例代表一个路由器(结点)实例之间利用UDP交换路由假设结点与其邻居结点的都为距离为1。
路由表采用如下结构:目的结点(dest_addr) 路由(route)5 3,4,5… …在路由表中,我们登记路由而不是下一跳,以方便处理。
转发分组时,只考虑第一个下一个结点为了指明实例及其邻居,程序启动时必须能接收以下参数:其中: router ID, myport, port1, port2, port3…–ID:实例的编号,数字0,9–myport:该实例使用的UDP端口,以便发送和接收分组–port1, port2, port 3, …:该实例的邻居所使用的UDP端口程序必须能处理以下命令:1)N,打印活动的邻居列表。
–用空格分开代表各个邻居的数字(在一行) –所谓活动邻居是指直接可达的结点(距离为1) –如果没有邻居,则输出空行–例如:4 72)T,输出路由表。
输出到每个目的结点的路由–每条路由一行––例如:4 37 63)0,1,… 9,发送分组–每个数字代表一个数据分组发送请求–数据分组发送到数字代表的目的地–如果目的结点不是邻居结点,不能直接发送分组,而必须在路由的各个结点上沿路由转发该分组4)0,1,… 9,向目的结点发送分组–收到数据分组的结点必须输出一行,显示该分组的目的–例如:发送分组:5转发分组:显示 F5–如果结点无法转发分组,则丢弃该分组,显示:D目的例如: 显示 D5 –数据分组没有数据,只需要目的地址和TTL TTL:Time to Live分组应该在TTL规定的时间或步数内到达目的结点,否则丢弃之分组经过每个中间结点时,将其TTL减1。
路由选择算法模拟实验
![路由选择算法模拟实验](https://img.taocdn.com/s3/m/5a59538f680203d8ce2f24c1.png)
实验二路由选择算法模拟实验一、实验目的1.理解路由选择算法实现原理,加深对网络层功能的理解;2.掌握距离向量路由选择算法中路由表形成过程及其对路由选择的影响;二、实验内容1.熟悉模拟软件的运行环境及操作方法;2.调整参数,分析路由表变化情况,理解路由算法。
三、实验原理1.距离向量路由选择算法基本原理如下:(1)初始化,对于每节点G,对所有它直接连接的目的地N,路由表中的项用三元组(N,G,0)表示,即从节点G到目的节点N无需经过转发。
(2)节点G定期发送它的路由表给相邻节点,更新信息中对应着每一个目的地N,用一个三元组来表示(N,V,D),即到目的地N的路由上的下一节点为V,G到N的距离为D。
(3)节点G收到G’送来的路由信息,对于更新信息中给出的每个目的地,在G的路由表中查找相对应的表项,设它为(N,V,D),而更新信息中的三元组为(N,V’,D’),C为节点G和G’之间的距离。
如果找不到相应的表项,则在G的路由表中增加一项(N,G’,D’+C);(4)如果V=G’,则G中路由表对应的表项更新为(N,G’,D’+C);否则,比较D’+C和D:如果D’+C<D,则G中表项更新为(N,G’,D’+C)否则G中表项保持原状,仍为(N,V,D)。
2.网络拓扑结构图3.信息格式:目的IP地址`目的端口号`源IP地址`源端口号`控制`数据控制:"M"-数据帧;"GetR"-请求邻居路由器回送距离表,无数据域;"R"-数据内容为距离表。
四、实验仪器计算机45台、集线器4台、网卡45块、网线条、软盘若干。
五、实验步骤1.将模拟软件拷贝到计算机硬盘,熟悉模拟软件的运行环境及界面,察看帮助文件。
2.运行配置好的模拟环境,分析路由表情况,并与算法相比较,得出结论。
3.调整距离值,重新计算路由表,分析路由表情况,得出结论。
六、实验数据与分析1、普通路径分析1)、选取模拟路由器0分析:路由0到其本身的距离为0,到1和5的距离分别是1和3,由于除R0与R1、R5之间建立了通信外,其他路由都为没连接的。
距离矢量路由算法原理实验教案
![距离矢量路由算法原理实验教案](https://img.taocdn.com/s3/m/25fc70595022aaea998f0fd4.png)
实验3:距离矢量路由算法原理 实验
路由算法原理性实验
目标
要求实验者根据路由选择算法模拟软件提供的功 能,模拟分布式路由选择算法的初始化、路由信 息扩散过程和路由计算方法;
掌握D-V算法的路由信息扩散过程; 掌握D-V算法的路由计算方法。
实验前的准备
填写实验报告中实验原理部分 分组
2
实 验 软 件 主 界 面
3
建立小组
4~10人一组,互相配合,多多益善。 建立小组过程:设置组名和小组人数
4
建立小组:设置组名和成员数
同一小组成员设置的成员数量应一致 设置完成后选择加入,可观察到其他成员加
入的情况
5
小组建立
当成员到达预定数量后,可选择确定完成小 组建立
6
本地信息Biblioteka 小组通过路由更新信息的交互,形成新的路由
15
注意
实验各步骤都需 要进行记录
请翔实、忠实地 记录实验数据
如果路由发生错 误,将小组的记 录数据汇总后, 分析并发现错误 产生的原因。
16
思考题
1、一个路由节点如何判断所使用的路由算法已经收 敛?
2、一个路由节点在路由形成过程中(即路由算法没 有收敛时),应该如何处理收到的数据?为什么? 假设这些数据的目的都不是这个路由节点。
3、请根据实验记录中的距离矢量路由信息,画出对 应的拓扑图。
4、在距离矢量算法算法的路由测试实验中,被测路 由是否正确?是否都是最短路径?如果不是,原因 是什么?
17
再将更新后的路由表发送给相邻结点 经过多次来回,各结点算出到其它结点的最
短路由
11
测试路由
点击“测试路径”按钮,继续点击“已发送X 份数据按钮”
计算机网络距离矢量路由算法实验报告
![计算机网络距离矢量路由算法实验报告](https://img.taocdn.com/s3/m/4bd111ec551810a6f52486e0.png)
计算机网络实验报告距离矢量路由算法一,实验内容: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来判断路由表是否变的稳定。
计算机网络实验报告
![计算机网络实验报告](https://img.taocdn.com/s3/m/744045918762caaedd33d4e5.png)
实验二网络路由层协议模拟实验报告(1)实验目的和要求1.掌握VB、VC++、VS或JA V A等集成开发环境编写路由仿真程序的方法;2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。
(2)实验内容2.实现链路状态路由算法的模拟。
基本要求(动态生成网络拓扑图,节点间的距离随机生成。
每个节点生成自己的链路状态分组,依据收到的链路状态表得到整体网络结构,在得到的整体网络结构上用最短路径算法,生成每个节点的路由表)(3)实验原理距离向量路由算法(Bellman-Ford Routing Algorithm),作为距离向量协议的一个算法,如RIP, (RIP 跳最大跳数16)BGP。
使用这个算法的路由器必须掌握这个距离表,它告诉在网络中每个节点的最远和最近距离。
在距离表中的这个信息是根据临近接点信息的改变而时时更新的。
这个在算法中的度量公式是跳跃的次数,等待时间,流出数据包的数量等等。
概括地说,距离向量算法要求每一个路由器把它的整个路由表发送给与它直接连接的其它路由器。
路由表中的每一条记录都包括目标逻辑地址、相应的网络接口和该条路由的向量距离。
当一个路由器从它的相邻处收到更新信息时,它会将更新信息与本身的路由表相比较。
如果该路由器比较出一条新路由或是找到一条比当前路由更好的路由时,它会对路由表进行更新:将从该路由器到邻居之间的向量距离与更新信息中的向量距离相加作为新路由的向量距离。
在距离向量路由算法中,相邻路由器之间周期性地相互交换各自的路由表备份。
当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。
距离矢量路由算法在理论中可以工作,但在实践中有一个严重的缺陷:虽然它总是能够达到正确的答案,但是它收敛到正确答案的速度非常慢,尤其是,它对于好消息的反应非常快,但是对于坏消息的反应非常迟缓。
(4)编程语言和环境1.编程语言C++;2.编程环境Windows;(5)程序源代码#include <iostream>#include <cstdlib>using namespace std;#define ROUTNUM 7 //定义路由的个数为7个typedef struct{int dis; //存延迟大小int from; //存下一跳的路由}RoutNode;RoutNode data[ROUTNUM][ROUTNUM]; /*路由表,能存7行7列数据,数据为权值*/void InitData(FILE* pfile); /*从数据文件读取数据,初始化路由表*/void OutputRoutData(); /*输出所有的路由表*/void Communication(int recv, int send);/*send点向recv点发送自己的路由表*/void Exchange(); /*所有节点进行一次数据交换, 更新路由表*/int main(){int start, end, i, j;FILE *pfile;pfile = fopen("1.txt", "r");if (pfile == NULL){printf("文件打开错误,按任意键退出.\n");return 0;}elsecout<<"路由表初始"<<endl;InitData(pfile);fclose(pfile);for (i = 0; i<ROUTNUM; i++){printf("%c||", i + 65);for (j = 0; j < ROUTNUM; j++)if (data[i][j].dis > 0)printf("<%c %d> ", j + 65, data[i][j].dis);cout<<endl;} //显示各路由的路由表for (i = 0; i < ROUTNUM; i++) //循环7次(好像多余,改成一次得到同样结果){Exchange();}printf("\n路由表交换:\n");OutputRoutData();printf("输入起始路由节点数字(%d-%d)[0代表A,1代表B...] : ", 0, ROUTNUM - 1);cin>>start;printf("输入终点路由节点数字(%d-%d)[0代表A,1代表B...] : ", 0, ROUTNUM - 1);cin>>end;if (start == end || start < 0 || start > 6 || end < 0 || end > 6){cout<<"输入错误,请按任意键退出"<<endl;return 0;}else{int cur = start;int total = 0;if (data[start][end].dis < 0){cout<<"没有路由路径发现!"<<endl;return 0;}printf("%c->", cur + 65);while (data[cur][end].from >= 0) //起始点与终点不相连。
【协议分析】【距离矢量算法计算过程分析】
![【协议分析】【距离矢量算法计算过程分析】](https://img.taocdn.com/s3/m/3dcc6b0316fc700abb68fcfd.png)
实验二十距离矢量算法计算过程分析【实验目的】1. 通过分析距离矢量算法的计算过程,理解距离矢量路由协议的工作原理。
【实验学时】2学时【实验环境】在本实验中需要4台路由、1台交换机、1台RG-PATS网络协议分析仪。
四台路由器运行RIP路由协议,使用协议分析仪采集数据包,对采集到的数据进行分析。
将所有的路由器都接入到交换机上,并在交换机上配置端口映像功能,具体IP分配如下表:表6-2 设备IP地址分配表设备接口IP地址连接到交换机192.168.1.1/24FA0/8 RSR-A FA0/0RSR-A LO0 192.168.10.1/24 --FA0/6 RSR-A FA0/1192.168.3.1/24RSR-B FA0/0 192.168.1.2/24 FA0/9RSR-B FA0/1FA0/10192.168.2.1/24-- RSR-B LO0192.168.20.1/24RSR-C FA0/0 192.168.2.2/24 FA0/7192.168.30.1/24-- RSR-C LO0RSR-D FA0/0 192.168.3.2/24 FA0/6192.168.400.1/24-- RSR-D LO0RG-PATS网络协议分析Eth 0 172.16.1.4 FA0/24仪设备连接如下图所示:249图6-43 实验拓扑图【实验内容】1、使用协议分析仪采集网络中的RIP选路数据包,分析距离矢量算法的计算过程。
【实验流程】图 6-44 实验流程图【实验原理】距离矢量算法是以R.EBellman、L.R.Ford和D.R.Fulkerson所做的工作为基础的,由于这个原因,所以有时距离矢量算法又称为Bellman-Ford或Ford-Fulkerson算法。
250在所有的动态路由协议中,最简单的就是距离矢量路由协议(D-V)。
它使用的是最简单的距离矢量(Distance-Vector,简称D-V)路由算法。
计算机网络实验报告(路由算法、Socket编程)[修改版]
![计算机网络实验报告(路由算法、Socket编程)[修改版]](https://img.taocdn.com/s3/m/7b123c0717fc700abb68a98271fe910ef12dae7f.png)
第一篇:计算机网络实验报告(路由算法、Socket编程)计算机网络实验报告班级:姓名:学号:实验一一.实验目的及要求编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。
二.实验原理距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。
通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。
举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。
假设一个路由器接收到来自邻居x的一个列表,其中x(i)表示x估计的到达路由器i所需要的时间。
如果该路由器知道他到x的延时为m毫秒,那么他也知道在x(i)+m毫秒之间内经过x可以到达路由器i。
一个路由器针对每个邻居都执行这样的计算,就可以发现最佳的估计值,然后在新的路由器表中使用这个最佳的估计值以及对应的输出路线。
三.源程序:#include "stdio.h" #include "stdlib.h" #include "malloc.h" #include "graphics.h" #include "dos.h" #define VERNUM 7typedef struct {int dis;int flag;int flag2; }RoutNode;char tmp[10]; RoutNode data[VERNUM][VERNUM];void welcome();void InitRoutData(FILE* pfile);void PrintRoutData();void SendInf(int recv, int send);void Exchange();int main() {int start, end, i, j, m, n;FILE *pfile;welcome();pfile = fopen("1.txt", "r");if (pfile == NULL){printf("the file wrong,press any key to come back.\n"); getch();return;}elseInitRoutData(pfile);fclose(pfile);printf("\nthe original route table:\n");for (i = 0; i{printf("%c||", i + 65);for (j = 0; j < VERNUM; j++)if (data[i][j].dis > 0)printf("<%c %d> ", j + 65, data[i][j].dis);}PrintRoutData();getch();for (i = 0; i < VERNUM; i++){for (m = 0; m < VERNUM; m++)for (n = 0; n < VERNUM; n++)data[m][n].flag = 0;Exchange();PrintRoutData();getch();}printf("\nexchange the route table:\n"); return 0; }void welcome() {int gdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver); initgraph( &gdriver, &gmode,"C:\Win-TC"); cleardevice();setbkcolor(CYAN);setviewport(0,0,639,479,1); clearviewport();setbkcolor(BLUE);rectangle(200,200,440,280);setfillstyle(1,5);floodfill(300,240,14);settextstyle(0,0,2);outtextxy(50,30,"Distance Vector Routing Algorithm"); setcolor(15);settextstyle(1,0,4);outtextxy(260,214,"Welcome to use!");line(0,80,640,80);getch();delay(300);cleardevice(); } void InitRoutData(FILE* pfile) {char num[10];int i = 0;char c;int m, n;fseek(pfile, 0, 0);for (m = 0; !feof(pfile) && m < 7; m++){for (n = 0; !feof(pfile) && n < 7; n++){while (!feof(pfile)){c = fgetc(pfile);if (c == ','){num[i] = '\0';data[m][n].dis = atoi(num); data[m][n].flag = 0;data[m][n].flag = 0;i = 0;break;} /*end of if*/else if ((c >= '0' && c{num[i++] = c;} /*end of else if*/} /*end of while*/} /*end of for (n = 0*/} /*end of for (m = 0*/ } void PrintRoutData() {int i, j;for (i = 0; i < VERNUM; i++) {settextstyle(1,0,3);sprintf(tmp," %c",i + 65); outtextxy(i*80+50,130,tmp);outtextxy(10,160+i*40,tmp);}for (j = 0; j< VERNUM; j++){for (i = 0; i < VERNUM; i++){if (data[i][j].dis{if(data[i][j].flag2 ==1){setfillstyle(SOLID_FILL,5);bar(80*i+50,40*j+155,80*i+120,40*j+185); delay(50000);data[i][j].flag2 =0;}setfillstyle(SOLID_FILL,3);bar(80*i+50,40*j+155,80*i+120,40*j+185); settextstyle(1,0,2);sprintf(tmp,"-");outtextxy(80*i+65,40*j+165,tmp);}elseif(data[i][j].dis >=0){{setfillstyle(SOLID_FILL,5);bar(80*i+50,40*j+155,80*i+120,40*j+185);delay(50000);data[i][j].flag2 =0;}setfillstyle(SOLID_FILL,3);bar(80*i+50,40*j+155,80*i+120,40*j+185); settextstyle(1,0,2);sprintf(tmp,"%d",data[i][j].dis);outtextxy(80*i+65,40*j+165,tmp);}} /*end of for (j = 0*/} /*end of for (i = 0*/ }void SendInf(int recv, int send) {int i;for (i = 0; i < VERNUM; i++){if (data[send][i].dis > 0&& data[send][i].flag!=1){if (data[recv][i].dis{data[recv][i].dis = data[send][i].dis + data[recv][send].dis;data[recv][i].flag2 =1;}else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis) {data[recv][i].dis = data[send][i].dis + data[recv][send].dis;data[recv][i].flag =1;data[recv][i].flag2 =1;}} /*end of if*/} /*end of for*/ }void Exchange() {int i, j;for (i = 0; i < VERNUM; i++){for (j = 0; j < VERNUM; j++){if (data[i][j].dis > 0&& data[i][j].flag!=1){SendInf(i, j);} /*end of if*/} /*end of for (j = 0*/} /*end of for (i = 0*/ }四、实验心得体会通过本次实验训练,我了解了距离矢量路由算法的基本原理,复习了C语言编程的内容,通过对路由算法的实现,加深了对路由表交换的理解。
距离矢量_DV_算法分析实验
![距离矢量_DV_算法分析实验](https://img.taocdn.com/s3/m/b80ef951561252d381eb6e27.png)
目的地址 202.112.130.0
下一跳 B
路由器A的路由表
跳数 1
北航计算机网络实验
路由器收到一条Rip选路信息后的计算过程
每个当路由器收到相邻路由器R发来的一个跳数为 M、目的地址为D的更新消息时,会将收到的路由信息 与自己的路由表进行比较,如果
1. 没有到D这个网段的路由表项存在,则生成路由表项(D、 M+1,R),其中跳数为M+1;
5
北航计算机网络实验
DV算法分析实验组网图
E0:192.168.2.2/24 R1 E1:192.168.3.1/24
E0/13
Vlan1:192.168.2.1/24
Loop1:
192.168.1.1/24
S1
E0/1 E0/2
Vlan1:192.168.3.2/24 E0/13
S2
E0/1
E0/2
PCA
PCB
PCC
PCD
Ip:192.168.2.10/24 Ip:192.168.2.11/24 Gw:192.168.2.1 Gw:192.168.2.1 Ip:192.168.3.10/24
Gw:192.168.3.2 注:交换机S1和S2各端口都在vlan1 中。
Ip:192.168.3.11/24 Gw:192.168.3.2
6
北航计算机网络实验
DV算法分析实验关键实验步骤说明
1. 按组网图连接好各设备,配置各设备的IP地址, 配置计算机的IP地址和默认网关。各路由器 和交换机分别配置RIP协议。
2. 在各台计算机上运行Wireshark,观察截取 到的报文。
3. 按照指导书上的步骤对截取的报文进行分析, 理解距离矢量算法的计算过程。
距离向量路由算法
![距离向量路由算法](https://img.taocdn.com/s3/m/f41260e2b1717fd5360cba1aa8114431b80d8e61.png)
距离向量路由算法距离向量路由算法是一种网络路由算法,它通过在网络中的各个节点之间交换距离向量信息来确定最佳的路由路径。
在距离向量路由算法中,每个节点都会维护一张距离表,其中包含到达其他节点的最短距离。
每个节点通过不断地交换距离向量信息来更新自己的距离表,并根据最短距离选择下一跳节点,从而实现数据的有效传输。
距离向量路由算法的核心思想是每个节点只知道直接连接的邻居节点的距离,而不知道整个网络的拓扑结构。
节点通过交换距离信息来逐步建立网络的全局视图,并根据这个全局视图来选择路由路径。
以下是距离向量路由算法的基本步骤:1.初始化:每个节点将自己与邻居节点的直接连接距离添加到距离表中。
2.更新距离表:每个节点周期性地向邻居节点发送自己的距离表,并接收邻居节点的距离表。
通过比较收到的距离表和当前的距离表,节点可以更新自己的距离表。
3.计算最短路径:根据距离表中的最小距离以及邻居节点的信息,计算到达每个目标节点的最佳下一跳节点。
4.更新路由信息:如果节点的距离表发生了变化,它将通知相邻节点,并将新的距离表发送给它们。
这样,整个网络中的所有节点将逐步更新自己的距离表和路由信息。
1.算法简单:距离向量路由算法的实现较为简单,计算量较小,适用于中小型网络。
2.分布式计算:每个节点只需要知道它的邻居节点的距离信息,不需要了解整个网络的拓扑结构,因此算法具有较好的可扩展性。
3.容错性:由于每个节点只知道邻居节点的信息,因此算法对网络中的部分节点故障具有一定的容错能力。
然而,距离向量路由算法也存在一些缺点,包括:1.收敛速度慢:由于节点只知道邻居节点的信息,并且信息需要通过多个节点传播,因此算法的收敛速度较慢,可能存在路由环路和震荡的问题。
2.算法复杂度高:在大规模网络中,距离向量路由算法需要不断地交换距离向量信息,导致算法的复杂度较高,可能会对网络性能产生负面影响。
3.不适用于复杂网络:距离向量路由算法对于具有复杂拓扑结构的网络,如有多个入口和出口的网络,可能无法获得最佳的路由路径。
网络原理路由算法
![网络原理路由算法](https://img.taocdn.com/s3/m/061f731414791711cc79170a.png)
《计算机网络原理》试验报告学号XXXXX XXX姓名xxxxxxxxxxx专业班级XXXXXxxxxx完成时间2011-4-25实验一路由算法一.实验目的计算机网络通常使用动态的路由算法,其中距离矢量路由算法和链路状态路由算法最为常见。
本章实验的目的是模拟距离矢量路由算法及链路状态路由算法,使读者熟悉路由算法的基本原理。
二.实验内容在C/C++环境下,编程模拟距离矢量路由选择算法和链路状态路由选择算法中,具体要求如下:(1)距离矢量路由选择算法根据给出或自行设计的网络拓扑结构,初始化每个路由器的初始路由表,模拟并演示距离矢量路由选择算法过程中每个路由器在接收相邻节点发送的信息之后更新路由表的过程。
①根据给出的网络拓扑结构初始化每个路由器的路由选择表。
②每个路由器将其路由选择信息的列表发送给邻居路由器。
③路由器根据接收到的信息列表,修改自己的路由选择表。
④重复(b)(c)过程直到网络中所有路由器的路由选择表均不再发生改变。
在模拟上述过程中,要求显示每个路由器在执行步骤(c)之后路由选择表的内容。
(2)链路状态路由选择算法根据给出的网络拓扑结构和链路状态,模拟链路状态路由算法中路由器进行工作的过程。
①路由器发现其邻居节点,并测量到邻居节点的距离。
②根据邻居节点信息构造分组。
③将分组发送给邻居路由器。
对接收到的分组信息,将其发送给除发送节点外的其他邻节点,并向发送节点返回确认信息;若接收到的信息序号比现有序号小,则停止发送,向发送节点返回确认信息。
④当路由器获得所有节点的分组信息后,利用Dijkstra算法计算到达每个节点的最短路径。
三.实验步骤①距离矢量路由选择算法程序主流程图原理分析当路由器a接收到邻居路由器b的路由选择信息表后,对信息表中的信息进行比较,若发现有新的路径比当前路由表中的路径长度小,或者发现当前路由表中的路径长度发生了变化,则将路由表中的信息进行更新。
每一个路由表发生更新的路由器将新的路由选择信息发送给其邻节点,开始下一轮的更新过程,直到所有路由器的路由表均不发生更新操作,运行结束。
rip路由配置实验报告
![rip路由配置实验报告](https://img.taocdn.com/s3/m/31ba6d6a4a73f242336c1eb91a37f111f0850d58.png)
rip路由配置实验报告RIP路由配置实验报告引言:在计算机网络中,路由协议是实现网络互联和数据传输的重要组成部分。
其中,RIP(Routing Information Protocol)是一种基于距离向量的内部网关协议,用于在局域网中实现路由选择和转发。
本实验旨在通过配置RIP路由协议,实现网络设备之间的通信,并评估其性能和可靠性。
一、实验目的本实验的主要目的是通过配置RIP路由协议,实现网络设备之间的通信。
具体目标包括:1. 学习和理解RIP协议的基本原理和工作机制。
2. 配置RIP协议,使得网络设备能够相互发现和交换路由信息。
3. 评估RIP协议的性能和可靠性,包括路由选择速度、网络拓扑变化时的适应能力等。
二、实验环境本实验使用了一组实验设备,包括路由器、交换机和主机。
其中,路由器用于实现RIP协议的配置和路由转发,交换机用于连接各个设备,主机用于模拟实际的数据传输。
三、实验步骤1. 配置网络拓扑:根据实验需求,搭建一个包含多个路由器和主机的网络拓扑。
确保每个设备都能够正常通信。
2. 配置RIP协议:在每个路由器上配置RIP协议,并设置相应的参数,如路由器ID、路由更新时间间隔等。
确保RIP协议能够正常运行。
3. 路由信息交换:观察并记录RIP协议在各个路由器之间的路由信息交换情况。
注意观察路由表的变化和更新速度。
4. 网络拓扑变化测试:在网络拓扑中引入一定的变化,如断开某个链路或添加新的设备。
观察RIP协议在网络拓扑变化时的适应能力和路由表的更新情况。
5. 性能评估:通过测试和记录数据包的传输时间、丢包率等指标,评估RIP协议在不同条件下的性能和可靠性。
四、实验结果与讨论在实验过程中,我们成功配置了RIP协议,并实现了设备之间的通信。
观察到RIP协议能够及时发现和更新路由信息,确保数据能够正确传输。
在网络拓扑变化测试中,RIP协议也表现出了较好的适应能力,能够快速更新路由表,保证数据的正常传输。
实验三距离矢量路由算法原理实验报告
![实验三距离矢量路由算法原理实验报告](https://img.taocdn.com/s3/m/aad560b11eb91a37f0115c71.png)
电子科技大学通信学院《计算机通信网实验报告》距离矢量路由算法原理实验班级通信11班学生李楚鸣学号 20教师徐世中实验2:距离矢量路由算法原理实验报告【实验目的】1、要求实验者利用路由选择算法模拟软件提供的通信功能,模拟距离矢量路由选择算法的初始化、路由信息扩散过程和路由计算方法;2、掌握距离矢量算法的路由信息扩散过程;3、掌握距离矢量算法的路由计算方法。
【实验环境】1、分组实验,每组4~10人。
2、拓扑:虚线表示节点之间的逻辑关系,构成一个逻辑上的网状拓扑结构。
3、设备:小组中每人一台计算机。
4、实验软件:路由选择算法模拟软件(routing.exe——最新版本为5.0)【实验原理】(请根据实验指导书的相关内容及课程相关知识填写,距离矢量路由算法基本原理,实验软件的基本功能等)【实验步骤】1、建立实验小组。
2、按照距离矢量算法完成路由信息扩散和路由计算过程。
3、距离矢量算法收敛后,向路由表中列出的每个非直连节点发送路由测试数据,完成路由测试过程。
4、汇总实验小组的实验记录信息,检查路由是否正确。
如果有错误,分析并发现错误产生的原因。
5、将实验从头多做几次,观察如果各节点发送信息和接收处理信息的过程不一样,是否会影响路由表的正确形成。
如在第一次实验时,节点接收一份路由信息后,处理,再发送出新的路由信息,而第二次实验时,节点将当前所有的路由信息处理完后,才发送新的路由信息。
6、小组讨论将拓扑中的一条链路断掉,然后通过实验观察路由协议是如何适应这个变化的。
*7、小组讨论无穷计数问题如何在现有拓扑中产生,然后通过实验将无穷计数问题展现出来。
(选作)【实验记录】按照实验记录内容格式要求记录以下内容(不够请另附纸张):1、实验小组的建立要求记录:小组名称、成员数量、本节点编号、本地直连链路表和据此形成的路由表。
2、距离矢量算法的路由扩散和路由计算过程要求记录:每次发送、接收的路由信息和根据接收信息所形成的路由表。
基于DV算法的路由器模拟设计与实现实验报告 精品
![基于DV算法的路由器模拟设计与实现实验报告 精品](https://img.taocdn.com/s3/m/a9988404c5da50e2524d7fec.png)
基于DV算法的路由器设计与实现实验报告学院:姓名:日期:一.实验目的1.深入理解分布式路由选择算法,以最简单的DV算法来增强对路由算法的认识2.理解、掌握和利用距离向量算法3.所实现的路由器模拟Internet上的IP路由器。
它能确定网络的最短路由,并在这些利用上传输分组二.DV算法描述距离矢量算法,也称为Bellman-Ford shortest path algorithm,每个路由器都定期或拓扑结构突发变化时与其相邻的所有路由器交换路由表,据此更新它们自己的路由表。
DV算法工作方式:每个路由器维护一张路由表,表中分为三个表项:目的地址,列出了当前可达的目的网络地址;到达目的地址下一跳,列出了下一跳的IP地址;到达目的地址的代价,以距离或跳数为表征。
路由表更新规则:1.发现了一条到达某目的的新路由,而该路由在原来的路由表中不存在(即发现了一条新路由),则在路由表中增加该路由。
2.发现了一条到达某目的的、距离更短的新路由,则用该路由替换原有的路由。
3.到达某目的的一条路由,其后继结点到达该目的地的距离发生了变化,则需要更新该路由的距离。
在此实验当中,为了实现和模拟的方便,刚开始初始化生成一个网络连接图的二维数组(见mainManager/RoutersInit.java,初始化的二维数组是entity/NetMap.java);每个路由器类包括了路由器ID,端口,routerTable对象,还有两个HashMap(一个存储为每一个相邻路由器的计时器,一个存储每一个相邻路由器的上一次交流时间);路由表采用了两个数组来实现,一个数组存储到各个网络的下一跳,一个数组存储到各个网络的跳数,如下结构,以路由器一为例,(路由表的默认数组和两个真是数组的显示信息,其中下一跳是0表示不可达的下一跳,不是0如2004表示下一跳是2004,在距离数组里,如果是16表示不可达,如果是0,表示到本身路由,不是0或16表示可达且跳数为该数值),如下图路由表左边方框中的信息所示:在路由表中,只登记下一跳而不是完整路由,以真实模拟路由器的DV算法处理。
中南大学计算机网络实验报告
![中南大学计算机网络实验报告](https://img.taocdn.com/s3/m/32cac39b524de518964b7d8f.png)
中南大学《计算机网络》实验报告学生姓名学号专业班级指导教师桂劲松学院信息科学与工程学院完成时间2011年1月模拟路由算法的实现一、实验内容1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。
2.实现链路状态路由算法中的最短路径算法。
二、实验目的及要求本实验是计算机网络课程的实践性锻炼环节。
通过实验,帮助学生更好地掌握网络通信协议的实现技术,锻炼学生应用高级编程语言完成通信编程的能力,使学生加深对网络协议本质的理解,巩固课堂所学的理论知识。
要求实验者利用路由选择算法模拟软件提供的通信功能,模拟链路状态路由选择算法的初始化、路由信息扩散过程和路由计算方法;掌握链路状态算法的路由信息扩散过程;掌握链路状态算法的路由计算方法。
三、实验原理编程语言:JAVA编程工具:MyEclipse实验实现方式:单机模拟实现核心方法:dijkstra算法计算最短路径分析:布置好各个模拟路由,以及路由的路程权值如何获取。
接着就是核心算法的实现,如何计算任意两个路由之间的最短路径问题。
用到的是dijkstra算法。
Dijkstra算法按照从给定起点到图中顶点的距离,顺序求出最短的路径,首先,它求出从起点到最接近起点的顶点之间的最短路径,然后求出第二近的,一次类推,推而广之,再第i次迭代开始之前,算法已经确定了i-1条连接起点和离起点最近顶点之间的最短路径。
这些顶点、起点和从起点到顶点的路径上的边,构成了给定图的一颗子树Ti,因为所有边的权值都是非负数,可以从与Ti的顶点相邻的顶点中找到下一个和起点最接近的顶点。
和Ti的顶点相邻的顶点的集合称为“边缘顶点”,以他们为候选对象,Dijkstra算法可以从中选出一个最接近起点的顶点。
为了确定第I 个最接近的顶点,对于每一个边缘顶点u,该算法求出它到最近的树中顶点v的距离以及从起点到v得最短路径长度dv的和,再从中选出具有最小和的顶点。
此次实验主要是运用路由算法来处理路由当中的一些问题,利用Dijkstra算流程图:核心算法代码如下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息安全_专业 1002_班 2012年12月20日姓名吴文珊学号_0909102525一.实验题目模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化,动态生成网络拓扑图,从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。
观察和讨论多少轮交换后路由表稳定。
二.需求分析本程序用C编写,完成距离向量路由算法的模拟。
(1)输入的形式与输出值的范围:输入时要求输入节点个数、初始网络拓扑图中边的条数(即:邻居节点的对数),节点名称、每条边的弧头、弧尾节点、边权值。
名字定义为字符串形式,节点个数、边条数、边权值为整形变量;(2)输出的形式:输入信息后,程序输出每轮交换之后新的的路由表(3)程序所能达到的功能:完成节点信息的输入、随机选取节点交换向量,并更新路由表,显示经过多少轮交换路由表稳定,并停止交换。
(4)测试数据:节点个数:4边条数:4节点名称:a b c d弧头弧尾权值a b 3b d 6c a 2d a 6最终距离向量矩阵如下:a b c da 0 3 2 6b 3 0 5 6c 2 5 0 8d 6 6 8 0三.概要设计(1)为了实现上述功能,须定义结构体的抽象数据类型(2)本程序包含了个函数:void visit(VertexType ver)//访问顶点的函数void input(VertexType &ver) //输入顶点信息的函数int LocateVex(MGraph G,VertexType u)//查找顶点u,并返回void CreateDN(MGraph &G)//构造有向网GGetVex(MGraph G,int v)//得到图中顶点Vvoid Display(MGraph G)//显示路由表void ShortestPath_Floyd()文档由风行播放器/ 暴风影音2014:/ 整理各函数间关系如下:CreateDN() LocateVex()visit() Main() Display()GetVex()ShortestPath_Floyd()四.详细设计实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。
对主程序和其他模块也都需要写出伪码算法。
(1)节点类型struct VertexType//最简单的顶点信息类型(只有顶点名称){char name[MAX_NAME];//顶点名称char routers[MAX_VERTEX_NUM][MAX_NAME];//定义最短路径中到目的节点的上一跳} ;struct MGraph//图的结构{VertexType vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs;//邻接矩阵(二维数组)int vexnum,arcnum;//图的当前顶点数和弧数GraphKind kind; //图的种类标志} ;typedef struct //边(弧)信息结构{VRType adj;//顶点关系类型,对带权图,表示权值}struct VertexType//最简单的顶点信息类型(只有顶点名称){char name[MAX_NAME];//顶点名称char routers[MAX_VERTEX_NUM][MAX_NAME];//定义最短路径中到目的节点的上一跳} ;struct MGraph//图的结构{VertexType vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs;//邻接矩阵(二维数组)int vexnum,arcnum;//图的当前顶点数和弧数GraphKind kind; //图的种类标志} ;(2)各功能函数伪码算法main(){CreateDN(g);//构造有向网gfor(i=0;i<g.vexnum;i++)g.arcs[i][i].adj=0;//顶点到自身距离为0Display(g);//输出有向网gShortestPath_Floyd(g,p,d);//求每对顶点的最短路径return 1;}void CreateDN(MGraph &G)//构造有向网G{scanf("%d %d",&G.vexnum,&G.arcnum);for(i=0;i<G.vexnum;i++)//构造顶点向量input(G.vexs[i]); //输入节点名称for(i=0;i<G.vexnum;i++)//初始化二维邻接矩阵for(j=0;j<G.vexnum;j++){G.arcs[i][j].adj=INFINITY;}for(k=0;k<G.arcnum;k++){scanf("%s %s %d",,,&w);存入图中;}}void Display(MGraph G){for(i=0;i<G.vexnum;i++)visit(GetVex(G,i));for(i=0;i<G.vexnum;i++)printf("%-8s",G.vexs[i].name);for(j=0;j<G.vexnum;j++){ printf("%20s",G.vexs[j].name);for(k=0;k<G.vexnum;k++)printf(" %-5d",G.arcs[j][k].adj);printf("\n");}}void ShortestPath_Floyd(){//用Floyd算法随机更新两顶点间最短路径、顶点路由表,若P[v][w][u]为true,则u是从v到w当前求得最短路径上的顶点for(v=0;v<G.vexnum;v++)for(w=0;w<G.vexnum;w++){D[v][w]=G.arcs[v][w].adj;//顶点v到w的直接距离for(u=0;u<G.vexnum;u++)P[v][w][u]=FALSE;if(D[v][w]<INFINITY)//从V到W有直接路径{strcpy(G.vexs[v].routers[w],G.vexs[v].name);P[v][w][v]=P[v][w][w]=TRUE; //由v到w的路径经过v和w两点}elsestrcpy(G.vexs[v].routers[w],"-");}srand((unsigned)time(NULL));//产生随机数种子,防止伪随机数while(change==1){for(;bad<20;)//连续20次随机交换无更新,为坏的交换,则停止随机交换{v=rand()%G.vexnum;w=rand()%G.vexnum;if(D[v][w]<INFINITY&&v!=w){change=0;for(u=0;u<G.vexnum;u++){if(D[w][u]<INFINITY&&D[v][w]+D[w][u]<D[v][u])//从v经u到w的一条路径更短{D[v][u]=D[v][w]+D[w][u];//更新最短距离change=1;bad=0; //一有更新,则不是坏的交换if(w!=u)strcpy(G.vexs[v].routers[u],G.vexs[w].name);//记录上一跳节点名称for(i=0;i<G.vexnum;i++)P[v][w][i]=P[v][u][i]||P[u][w][i];//从v到w的路径经过从v到u和从u到w 的所有路径}//if}//for uif(change==1){stable++;for(j=0;j<G.vexnum;j++)printf(" %8s %8d %8s\n",G.vexs[j].name,D[v][j],G.vexs[v]. routers[j]);}// if changeelse{bad++;}}//if}//for}//whilefor(i=0;i<G.vexnum;i++)printf("%-8s",G.vexs[i].name);for(j=0;j<G.vexnum;j++){ printf("%20s",G.vexs[j].name);for(k=0;k<G.vexnum;k++)printf(" %-5d",D[j][k]);}for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++)printf(" %8s %8d %8s\n",G.vexs[j].name,D[i][j],G.vexs[i].r outers[j]);}}五.设计过程中遇到的问题:①开始时,设计思路一直停留在弗洛伊德算法中,这是我们数据结构课程中介绍的求最短距离算法,输入节点信息后,由程序自动加入n个节点进行试探(对任意两个节点,它们之间的最短距离必然经过n个中间节点,0<n<N),一有更短距离则进行更新并记录,这也是动态规划的思想。
②但是实验要求动态生成网络拓扑图,在老师的提醒下,我做了改进。
随机生成顶点序号,若两节点是邻居节点,则让两节点进行交换路由向量,再进行更新。
③但是又出现了另一个问题:无穷交换,因为在设置循环交换条件时出现了问题,于是记录是否交换,若到达一定次数的交换都未成功更新路由表,则认为路由表已稳定,停止交换。
但是通过多次试验,发现经常在路由表还未稳定时,循环就结束。
究其原因,发现是“未更新的次数”这个标记变量有随机性,因为定义这个变量时,是“从开始交换,到交换到某个时刻,未更新的次数累加”。
于是将这个变量改为“若连续n次随机选取节点进行交换时,路由表都未更新,则视为bad交换,认为路由表已稳定,一旦有更新,则bad清0”。
虽然采取这种方法,有时候也会出现提前结束,但是也是在极少情况下,比如随机选取节点时一直选择重复节点,为避免这个问题,使用srand()函数产生随机数种子,防止伪随机数。
问题得到极大改善六.源程序清单#include<stdio.h>#include<ctype.h>#include<malloc.h>#include<limits.h>#include<string.h>#include<stdlib.h>#include<io.h>#include<math.h>#include<sys/timeb.h>#include<stdarg.h>#include<time.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define MAX_NAME 9//顶点名称字符串最大长度+1#define INFINITY 1000//用1000代替∞#define MAX_VERTEX_NUM 26 //最大顶点个数typedef int Status;typedef int Boolean;typedef int VRType;//定义顶点关系类型为整型,与INFINITY的类型一致typedef char PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NU M];//三维数组typedef VRType DistancMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//二维数组typedef struct //边(弧)信息结构{VRType adj;//顶点关系类型,对带权图,表示权值} ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//二维数组enum GraphKind{DG,DN,UDG,UDN} ;//{有向图、无向网、无向图、无向网} struct VertexType//最简单的顶点信息类型(只有顶点名称){char name[MAX_NAME];//顶点名称char routers[MAX_VERTEX_NUM][MAX_NAME];//定义最短路径中到目的节点的上一跳} ;struct MGraph//图的结构VertexType vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs;//邻接矩阵(二维数组)int vexnum,arcnum;//图的当前顶点数和弧数GraphKind kind; //图的种类标志} ;int stable=0;//到达稳定前路由表交换次数void visit(VertexType ver)//访问顶点的函数{printf("%s",);}void input(VertexType &ver) //输入顶点信息的函数{scanf("%s",);}int LocateVex(MGraph G,VertexType u){//查找顶点u,并返回其位置int i;for(i=0;i<G.vexnum;++i)if(strcmp(,G.vexs[i].name)==0)return i;}void CreateDN(MGraph &G)//构造有向网G{int i,j,k;VRType w;//顶点关系类型VertexType v1,v2;printf(" 请输入网络拓扑结构中的节点数、弧数");scanf("%d %d",&G.vexnum,&G.arcnum);printf(" 请输入%d个顶点的值(名称小于%d个字符):",G.vexnum,MAX_NAME);for(i=0;i<G.vexnum;i++)//构造顶点向量input(G.vexs[i]); //输入节点名称for(i=0;i<G.vexnum;i++)//初始化二维邻接矩阵for(j=0;j<G.vexnum;j++){G.arcs[i][j].adj=INFINITY;}printf(" 请输入%d条弧的弧尾弧头权值:\n",G.arcnum); for(k=0;k<G.arcnum;k++)scanf("%s %s %d",,,&w);i=LocateVex(G,v1);j=LocateVex(G,v2);G.arcs[i][j].adj=w;G.arcs[j][i].adj=w;}}VertexType GetVex(MGraph G,int v){if(v>=G.vexnum||v<0)exit(OVERFLOW);return G.vexs[v];}void Display(MGraph G){int i,j,k;printf(" %d个顶点%d条弧的无向网。