RIP路由协议原型系统的实现谢刚.docx
课程设计报告型程名离:计算机网络设计剧目:RlP路由协议原型系统的实现系别:计算机与信息工程学院专业:物联网专业蛆别:第五纨-起止日期:2014年6月8日2014年6月14日一指导老舞:刘进军计算机料学与技术系二CI四年制组长谢刚学号2012211588班级2012级物联网系别计算机与信息工程学院专业物联网专业组员谢刚指导老师老师刘进军课程设计目的D进一步理解动态内部网关协议RIP的工作原理“2)学会将所学学间联合运用,如本次RIP协议原型系统的设计即是将网络与数据结构(图)与C编程语言相结合。3)提高团队合作实力,发挥每一名组员的特长。D体会做一个项目的流程(包括前期的资料收集,系统耍求分析,系统实现的语言选择与实现方法的探讨等)。课程设计所需环境DWindOWS操作系统平台2) VC+6.0编译环境3) CiscoPacketTraCCr仿真软件课程设计任务要求D实现一个RIP路由协议的原型系统2)广播发布本地节点的路由信息3)其它节点接收信息并选择最优路径4)支持最大不超过15跳的特性5)动态支持网络拓扑结构的变更(如增加路由节点)课程设计工作进度安排序号起止日期工作内容分工状况12014年6月8日2014年6月9绽开思路探讨工作并搜集相关资料参考相关资料独立完成媒程设计任务书目录1. 引育2. 系筑开发分析.42.1 系林保求分析2.2 系筑设计原理43. 系端功能描述与软件模块划分54. 系筑设计具体54.1 程序流程图64.2 程序!(代码75. 设计过程关健问题与其解决方法105.1 如何实现广播本地路由与更新动态更新路由表105.2 如何在网络拓扑防构变更后实现动态更新维护路由表.116. 程序设计结果界面演示11,6.1设计绪果演示.117. 课程设计总结与体会157.1 总结.157.2 体会181 .引盲RlP(ROUtinginfOrmatiOnPrOtOCOI,路由信息协议)是应用较早、运用较普遍的内部网关协汉(InteriorGatewayProtocol,IGP),适用于小型同类网络的个自治系统(AS)内的路由信息的传递。RIP协议是基于距离矢最算法(DiStanCeVeCtorAIgOrithmS)的,在默认状况下,RIP运用种特别简洁的度量制度:距离就是通往目的站点所需经过的链路数,取值为1-15,数值16表示无穷大。它运用“跳数”,即metric来衡量到达目标地址的路由距离。这种协议的路由器只关切自己四周的世界,只与自己相邻的路山瑞交换信息,范围限制在15跳(15度)之内,再远,它就不关切了。RIP进程运用UDP的520端口来发送和接收RlP分组。RIP分组每隔30s以广播的形式发送一次,为了防止出现“广播风暴”,其后续的的分蛆将做随机延时后发送。在RlP中,假如一个路由在180s内未被刷,则相应的距离就被设定成无穷大,并从路由表中删除该表项。RlP应用于OSl网络七层模型的网络层。RlP是一个用于路由器和主机间交换路由信息的距离向量协议,目前最新的版本为v4,也就是RIPV4。2 .系统开发分析2.1 系统需求分析1 .实现一个RIP路由协议的原型系统。2 .广播发布本地节点的路由信息。3 .其它节点接收信息并选择最优路径。4 .支持最大不超过15跳的特性。5 .动态支持网络拓扑结构的变更(如增加路由节点)2.2 系统设计原理RlP协议是动态路由协议,其运行至路由器中,而路由器是运行路由协议软件的专用硬件,它的主要功能可以分成两部分:路由选择和分蛆转发。其中路由选择是基础。一个路由器对到来的每一个分组先选择合适的路由,然后才能依据此路由进行正确的转发,本次课程设计就是设计有着广泛的运用范围的动态路由协议RlP协议体统原型。它是距离向t协议中的一种,属于内部网关协议。运行协议的相邻路由器通过彼此之间交换路由信息RlP的距离向属,从而知道网络的连接状况,实现各个网络之间的连通,这也是距离向玷名称的由来。(DiStanCeVeCtOr)运行协议的每个路由器都要维护一张自己的路由RlP表,该路由表是相应于与它干脆相联和通过路由器相连的网络连接状况而动态变更的。因此协议属于动态路由协RIP议。路由器依据路由表对发给它的包进行转发,从而实现IP路由功能,3 .系疑功能描述与系筑模块划分本设计实现的RlP路由协议的原型系统功能主要包括,一:初始化每个路由器的路由表信息。即在运用者输入网络拓扑结构中的路由节点数与处路数后,系统首先会自动生成每个节点到其相邻路由节点的路由信息,具体包括:目的地址、跳数、下一跳,初始设置相邻节点的跳数为U二:当路由器的初始路由表建立后,接卜来就起先进行邻接节点的路由信息广播,即路由节点将自身的路由表信息广播至其相邻的节点,具体的广播信息是将每一条路由的目的地址不变,跳数加一,吓一跳修改为自身路由器接”的名称进行传送,收到广播信息的路由表对收到的每一条路由信息进行推断,分两大状况:若原来的路由表中没有目的网络N,则将该项添加到路山表中,否则(即在该路由表中有到目的网络N的信息,则视察下一条)此时分两种小状况1:若吓跳与原路由表项相同,则无条件进行更新。2:若吓一跳与原路由表项不相同,则若收到的路由信息中距离,d小于路由表中的距离,则进行更新。(还有对于接受的路由信息跳数=16的信息,则将跳数置为16,表明不行达°)三:动态变更网络拓扑结构,即当因为实际须要,需增设路由节点时,系统会依据增设的路由节点数、名称、链路数,首先进行新增设节点的路由表信息初始化,而后将该节点的路由信息想邻接节点进行广播,随后整个网络节点向邻接节点进行路由信息广播,这样经过几轮广播后,每一个节点都接收到了新增路由节点的最小路径信息,从而实现了路由表的动态维护与创建。4 .系统设计具体4.1 程序流程图起先输入要建立网络的拓扑结构所需路由节点数及盖路数建立各节点的初始路由表是节点路由信息更新完毕,询问是否还需添加新的路由节点左朦兴的路由表中无到此网络的倒息.则添加,SMI:九甫一跳与原路由表闻相同,»1无条件进行更新.2:着吓一跳与原路由若IH不相同,则推断距离d若小于路由表中的81离.则更新.(还有对于按殳的路由侑尺跳数”16的伯总.则将跳数置为16)结束4.2 程序源码因为系统的设计涉与到网络拓扑图的存储,所以本设计采纳数据结构中图的存储思想来进行拓扑结构的存储,输出。下面是系统设计的主要代码:首先分别设置了4种类型的结构体,以来表示链路信息、路由表、路由器,网络拓扑图。#include<stdio.h>#include<stdlib.h>#dcfincMAX_VERTEX_NUM15#defineMAX15#include<iostream>typedefstructArCCen存储链路信息intadj;ArcCell,Am(MAX_VERTEX_NUM|(MAX_VERTEX_NUM;typedefStrUCt路由表(chardestinationMX;intdistance;charnextjumpMAX;TNode;typedefStrUCt路由结点charrMAX);存储路由器名称TNodeUMAX;存储路由结点的路由表信息。IVNode;typcdcfstructVNodevexfMAX;Amarcs;intvexnum,arcnum;Graph;用图来存储网络拓扑结构。另外在此设置一个全局变后,用来辨别路由表中信息的结束.TNodeend=f,",O,"");copy(char*strl,char*str2)inti;Char*temp=str2;for(i=0;*temp!='0';i+)(*(strl+i)三*(str2+i);temp+;(strl+i)=''第一步:待设计好须要的结构模型后,接下来起先依据路山优点的个数与链路数进行网络拓扑结构的构造,具体代码如下:GraphCreatedGraphG;inti,j,k,count;charvl(20),v2201;Printf("分别输入网络拓扑结构中的路由数和链路数(中间用逗号隔JF)n");scanf("%d,%d,',G.vexnumG.arcnum);Printfr分别输入路由器名称与路由表n");int1.OCateVeX(GraPh*G,chars);voidinitRoute(Graph*G,inti,intj);for(i=0;iG.vexnum;i+)构造路由结点count=0;Printfr输入第%d个路由器名称:n",i+l);scanf("%s",G,vexi.r);G.vexi.tO)=end;for(i=0;i<G.vexnum;i+)/初始化邻接矩阵for(j=0;j<G.vexnum;j+)G.arcsi11j.adj=10000;for(k=0;k<G.arcnum;k+)构造邻接矩阵Printfr输入第d条链路的两端路由器的名称:n",k+l);scanf("%s%s",v1,v2);/fflSCanf输入多个字符串,中间用空格隔开。i=1.ocateVex(&G,vl);j=1.ocateVex(&G,v2);G.arcsi(j.adj=l;G.arcsj11i.adj=l;/初始化该能路两端路由节点的路由表。initRoute(G,i,j);returnG;intcompare(chara,charb);voidprintG(Graph*G);voidinsertNewRoute(Graph*G);其中的1.ocateVex()函数用来确定S在图中的位置,具体实现如下:ini1.ocateVex(Graph*G,charSD)inti;for(i=0ji<(*G).vexnum;i+)if(compare(s,(*G).vexi.r)=三1)returni;return-1;其次步:构造完网路拓扑图后,接下来进行拓扑结构中路由节点的路由表信息的初始化CvoidinitRoute(Graph*G,inti,i11tj)intm,n;for(m=0;(*G).vex(i.tm.distance!=0;m+);copy(G).vexi.tlm.destination,(*G).vexj.r);(*G).vexi.tm.distance=l;copy(4G).vexi.tm.nextjump,(*G).vexi.r);(*G).vexil.tm+l=end;for(n=0;(*G).vex(j.tn.distance!=0;n+);copy(*G).vexj.tn.destination,(*G).vexi.r);(*G).vexj.t(n).distance=1;copy(*G).vexj.t11l.nextjump,(*G).vexj.r);(*G).vexj.tn+l=end;第三步:起先进行邻接节点的路由信息广播:voidExchangeIGraph*G)inti,j,k,h,count;charc;TNodetemp;for(i=0;i<(*G).vexnum;i+)forG=0;j<(*G).vexnum;j+)if(*G).arcsij.adj=l)找寻路由结点i的邻接结点路由,从而将信息广播发送。/for(k=0;(*G).vex(i.t(k.distance!=0;k+)/扫描路由节点i的路由表中的每一条信息。/copy(temp.destination,(*G).vexi.tk.destination);temp.distance=(*G).vexi.tk.distance+1;if(temp.distance>16)temp.distance=16;copy(temp.nextjump,(*G).vexil.r);count=0;for(h=0;(*G).vexj.th.distance!=0;h+)if(comare(tcm.destination,(*G).vexj).r)=l)/表明该条路由信息的目的地址指向的是路由结点j本身,因而不须要更新与修改Ccount+;break;if(compare(*G).vexj.th.destination,temp.destination)=1)count+;if(compare(*G).vexjl.th.nextjump,temp.nextjump)=1)(*G).vexj.th.distance=temp.distance;elseif(*G).vexj.th.distance>temp.distance)(*G).vexj).th.distance=tcmp.distance;copy(*G).vexj.th.nextjump,temp.nextjump);if(count=0)copy(*G).vexj.th.destination,temp.destination);(*G).vcxj).th).distance=tcmp.distance;copy(*G).vex(j.th.nextjump,temp.nextjump);(*G).vexj.th+l=end;/printf("路由器%s向路由器s发送消息n",(*G).vexi.r,(*G).vexj.r);printG(G);/Printf("若需在原有网络拓扑结构中增加新的节点,请输入#键n");getchar();scanf("%c",c);if(c='r)insertNewRoute(G);/第四步:增加路由表,实现网络拓扑结构的动态变更与路由表信息的动态更新与维护。voidinsertNewRoute(Graph*G)inti,j,nVexNum,nArcNum,k,num;charvl20,v220;Printfr分别输入新增加的路由数和河路数(中间用逗号隔开):n");scanf("%df%d'AnVexNumAnArcNum);Printfr分别输入路由器名称与路由表n");for(num=0;num<nVexNum;num+)Printfr输入新增第d个路山器名称:n",num+l);scanf("%s",(*G).vexnum+(*G).vexnum.r);(*G).vexnum+(*G).vexnum.tO=end;(*G).vexnum+=nVexNum;(*G).arcnum+=nArcNum;for(k=0;knArcNum;k+)/构造邻接矩阵(Printf("输入新增路由节点后第d条链路的两端路由器的名称:n",k+l);SCanf("%s%s",vl,v2);用SCanf输入多个字符串,中间用空格隔开。i=1.ocateVex(G,v1);J=1.ocateVex(G,v2);(*G).arcsi11jl.adj=l;(*G).arcs(j11i).adj=1;initRoute(G,i,j);for(i=0;i<(*G).vexnum;i+)/初始化邻接矩阵for(j=0;j<(*G).vexnum;j+)if(*G).arcsij.adj!=l)(*G).arcs(ij.adj=10000;Exchange(G);下面是系统设计过程中所需的协助自定义函数。intcompare(chara11,charb()intj;for(j-0jaj!",0bj!"'0'y+)if(aj)!=b(j)return0;return1;显示网络拓扑结构:voidprintG(Graph*G)i11ti,j;for(i=0;i<(*G).vexnum;i+)Printf("t路t由t器s:n",(*G).vexi.r);Printf("目的地址tt距离ttF-Mnn");for(j=0;(*G).vex|i.tj.distance!=0;j+)printf("%sttt%dtt%snn",(*G).vexi.tj.destination,(*G).vexi.tj.distance,(*G).vexi.t(j.nextjump);printf("nn");显示指定路由节点V的路由表:voidprintv(VNodeV)inti;printf("t路t由t器sr,v.r);Printf("目的地址tt距离tt下一跳nn");for(i=0;v.ti.distance!=0;i+)printf(,%sttt%dtt%snn"fv.t(i.destination,v.ti.distance,v.ti).nextjump);printf("11n");通过主函数进行函数的调用运行:voidmain()GraphG=CreateO;printG(G);Exchange(G);15.设计过程关健问题与其解决方法5.1 如何实现广播本地路由与更新动态更新路由表。路由器最初启动时只包含了其宜连网络的路由信息,并且其直连网络的metric值为1,然后它向四周的其他路由器发出完整路由表的RlP恳求。路由器依据接收到的RlP应答来更新其路由表,具体方法是添加新的路由表项,并将其metric值加1。假如接收到与已有表项的目的地址相同的路由信息,则分下面四种状况分别对待:第种状况,已有表项的来源端口与新表项的来源端口相同,那么无条件依据最新的路由信息更新其路由表;其次种状况,已有表项与新表项来源于不同的端口,那么比较它们的metric值,将metric值较小的一个最为自己的路由表项;第三种状况,新旧表项的metric值相等,普遍的处理方法是保留旧的表项。笫四种状况,新表项在该路由表中不存在,则将跳数加一,吓一跳改为原发送路由器后添加到表项后。5.2 如何在网络拓扑结构变更后实现动玄更新维护路由表。首先要实现新添加路由表的路由信息初始化,而后再更新与之相邻的路由节点的路由信息,接下来就进行路由信息的邻接节点广播,从而达到全网络的路由信息更新.6.程序设计结果界面演示6.1 设计结果演示程序运行过程演示以与结果如下:1 .分别从健盘输入网络拓扑结构中的路由数和链路数(中间用过号隔开)例如输入3,2表示共有两个路由器和条链路,如图1-1所示拓扑结构:2621XM2621XM2621XMvlv2v3图1-12 .再分别输入各个路由器名称与其链路(中间用空格隔开)例如分别依次输入第一个路由器名称vl,其次个路由器名称v2与两个路由器间的链路Vlv2.程序输入数据界面与按下ENTER键后各路由表的初始路由信息如图1-2cltsr*cmbersl*HNomembersCfe1eCCMcmbl2*。曲!A64.接卜.来变更原始网络拓扑结构,增加新的路由节点,如图1-3中拓扑结构所示:图1-3运行吩咐后输入如下:输入新增第1个路由器名称:v4输入新增路山节点后第1条链路的两端路由器的名称:v2v4增加路由结点输入界面如图1-4所示:VDocuBcatiiandSettmcax72HripProtoclripPDeb11<rip.oxe'号需在原有网络拓十档古构中增加新的节点,请输入,黑刚输入新增力的格由或和糖珞数中间用逗号隔开:-×76、租卷入路臼等名筋段由表tetos,H舒、折幅由节点后第1条联的两端珞由署的名称.卜2M图1-4按FENTER键程序进行v4路由器的路由表信息初始化与路由信息广播:V4路由表初始信息动态生成如图1-7:目的地址更南下一跳-v4图1-5V2向v4广播信息如图1-6所示:图1-6儿轮广播信息结束后,各路山节点路由信息如下图1-7与1-8所示:*C:DocuentsaridSetting*ss622京面ripPrOtocolr目的地址距离下一跳U2三>,"-,-,VUii,"*"""""三三"2u42m2路由器v2:目的地址距离下一跳vl1v2u31u2“1m2Qa图1-8"C:XDocuBcntsandSctt11Es3s622(BfVripProtocolr.目的地址距离下一跳目的地址由器v4:距离.一下一跳.AVlO-,-1>O4V-2。2</2*1v34<.OVJ1.OVGv42v25,若还须要在原有的网络拓扑结构中接着增加新的行点,再输入#键,按以上步骤接着操作,能实现不断增加路由结点以与链路,井将路由表的持续更新。7.课程设计总结与体会7.1 总结本次课程设计是我懂得了RlP适用于小型同类网络的个自治系统(AS)内的路由信息的传递路由实现时,而RIP作为一个系统长驻进程(daemon)而存在于路由器中,负责从网络系统的其它路由器接收路由信息,从而对本地IP层路由表作动态的维护,保证IP层发送报文时选择正确的路由。同时负责广播本路由器的路由信息,通知相邻路由器作相应的修改7.2 体会这次课程设计完成了rip路由协议原型系统的实现,方案中路由节点能够利用广播发布本地节点的路由信息,其它节点接收信息并选择星优路径。本次设计查阅了很多案例,学到很多学问,原先很多不懂的东西,都有了初步的了解。这次课程设计使我觉得收获挺大的。之前的学习仅限于课本,网络的很多东西都只知道其然而不知道其所以然。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论学问是远远不够的,只有把所学的理论学问与实践相结合起来,从理论中得出结论,才能真正做到理解.课程设计是培育我们综合运用所学学问,发觉、提出、分析和解决实际问题,熬炼实践实力的重要环节,使我们实际工作实力的具体训练和考察过程。随着科学技术发展的日新月异,网络已经成为当今计算机发展中空前活跃的领域,在生活中可以说是无处不再,因此作为二十一世纪的计算机专业的高校生来说真正的驾驭网络技术是特别重要的致谢本课程设计是在我们的赵生慈和赵国柱老师的共同指导下完成的。他们肃穆的科学看法,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我们。从课题的选择到设计的最终完成,两位老师都始终赐予我们细心的指导和不懈的支持。在此i览向两位老师致以真诚的谢意和崇高的敬意。我还要感谢在一起开心工作的组员们,正是由于你们的帮助和支持,我们才能一起克服一个乂一个的困难和怀疑,直至本课程设计的顺当完成。在课程设计即将完成之际,我的心情无法安静,从起先进入课题到设计的顺当完成,有多少可敬的师长、同学、挚友给了我们无言的帮助,在这里请接受我真诚的谢意!参考文献(1|谢希仁.计算机网络:电F工业出版社,2011.21严苗敏.数据结构:清华高校出版社,2004.指导老师评语:指导老师签名:年月0成绩教研室审核看法:教研室主任签字:年月H