RIP路由协议原型系统的实现.docx
- 文档编号:7017335
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:20
- 大小:171.85KB
RIP路由协议原型系统的实现.docx
《RIP路由协议原型系统的实现.docx》由会员分享,可在线阅读,更多相关《RIP路由协议原型系统的实现.docx(20页珍藏版)》请在冰豆网上搜索。
RIP路由协议原型系统的实现
课程设计报告
课程名称:
计算机网络
设计题目:
RIP路由协议原型系统的实现
系别:
计算机与信息工程学院
专业:
物联网专业
组别:
第五组--
起止日期:
2014年6月8日~2014年6月14日--
指导教师:
刘进军
计算机科学与技术系二○一四年制
组长
谢刚
学号
2012211588
班级
2012级物联网
系别
计算机与信息工程学院
专业
物联网专业
组员
谢刚
指导教师
老师刘进军
课程设计目的
1)进一步理解动态内部网关协议RIP的工作原理。
2)学会将所学知识联合运用,如本次RIP协议原型系统的设计即是将网络与数据结构(图)及C编程语言相结合。
3)提高团队合作能力,发挥每一名组员的长处。
4)体会做一个项目的流程(包括前期的资料收集,系统要求分析,系统实现的语言选择及实现方法的讨论等)。
课程设计所需环境
1)Windows操作系统平台
2)VC++6.0编译环境
3)CiscoPacketTracer仿真软件
课程设计任务要求
1)实现一个RIP路由协议的原型系统
2)广播发布本地节点的路由信息
3)其它节点接收信息并选择最优路径
4)支持最大不超过15跳的特性
5)动态支持网络拓扑结构的变化(如增加路由节点)
课程设计工作进度计划
序号
起止日期
工作内容
分工情况
1
2014年6月8日~2014年6月9日
展开思路讨论工作并搜集相关资料
参考相关资料独立完成
2
2014年6月9日~2014年6月10日
分析课程设计要求,确定目标
参考相关资料独立完成
3
2014年6月10日~2014年6月11日
设计软件功能模块
参考相关资料独立完成
4
2014年6月11日~2014年6月12日
编写代码、实现功能模块
参考相关资料独立完成
5
2014年6月12日~2014年6月13日
系统整合以及测试
参考相关资料独立完成
6
2014年6月13日~2014年6月14日
完成课程设计文档
参考相关资料独立完成
教研室审核意见:
教研室主任签字:
年月日
课程设计任务书
1.引言……………………………………………………………………………………….4
2.系统开发分析…………………………………………………………………………….4
2.1系统需求分析……………………………………………………………………...4
2.2系统设计原理………………………………………………………………………4
3.系统功能描述与软件模块划分…………………………………………………………..5
4.系统设计详细…………………………………………………………………………….5
4.1程序流程图……………………………………………………………………6
4.2程序源代码…………………………………………………………………………7
5.设计过程关键问题及其解决方法……………………………………………………….10
5.1如何实现广播本地路由及更新动态更新路由表………………………………….10
5.2如何在网络拓扑结构改变后实现动态更新维护路由表…………………………..11
6.程序设计结果界面演示……………………………………………………………………11
6.1设计结果演示………………………………………………………………………..11
7.课程设计总结与体会………………………………………………………………………15
7.1总结…………………………………………………………………………………..15
7.2体会…………………………………………………………………………………..17
致谢………………………………………………………………………………………………17
参考文献…………………………………………………………………………………………18
1.引言
RIP(RoutinginformationProtocol,路由信息协议)是应用较早、使用较普遍的内部网关协议(InteriorGatewayProtocol,IGP),适用于小型同类网络的一个自治系统(AS)内的路由信息的传递。
RIP协议是基于距离矢量算法(DistanceVectorAlgorithms)的,在默认情况下,RIP使用一种非常简单的度量制度:
距离就是通往目的站点所需经过的链路数,取值为1~15,数值16表示无穷大。
它使用“跳数”,即metric来衡量到达目标地址的路由距离。
这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息,范围限制在15跳(15度)之内,再远,它就不关心了。
RIP进程使用UDP的520端口来发送和接收RIP分组。
RIP分组每隔30s以广播的形式发送一次,为了防止出现“广播风暴”,其后续的的分组将做随机延时后发送。
在RIP中,如果一个路由在180s内未被刷,则相应的距离就被设定成无穷大,并从路由表中删除该表项。
RIP应用于OSI网络七层模型的网络层。
RIP是一个用于路由器和主机间交换路由信息的距离向量协议,目前最新的版本为v4,也就是RIPv4。
2.系统开发分析
2.1系统需求分析
1.实现一个RIP路由协议的原型系统。
2.广播发布本地节点的路由信息。
3.其它节点接收信息并选择最优路径。
4.支持最大不超过15跳的特性。
5.动态支持网络拓扑结构的变化(如增加路由节点)
2.2系统设计原理
RIP协议是动态路由协议,其运行至路由器中,而路由器是运行路由协议软件的专用硬件,它的主要功能可以分成两部分:
路由选择和分组转发。
其中路由选择是基础。
一个路由器对到来的每一个分组先选择合适的路由,然后才能依据此路由进行正确的转发,本次课程设计就是设计有着广泛的使用范围的动态路由协议RIP协议体统原型。
它是距离向量协议中的一种,属于内部网关协议。
运行协议的相邻路由器通过彼此之间交换路由信息RIP的距离向量,从而知道网络的连接情况,实现各个网络之间的连通,这也是距离向量名称的由来。
(DistanceVector)运行协议的每个路由器都要维护一张自己的路由RIP表,该路由表是相应于与它直接相联和通过路由器相连的网络连接情况而动态变化的。
因此协议属于动态路由协RIP议。
路由器根据路由表对发给它的包进行转发,从而实现IP路由功能。
3.系统功能描述与系统模块划分
本设计实现的RIP路由协议的原型系统功能主要包括,一:
初始化每个路由器的路由表信息。
即在使用者输入网络拓扑结构中的路由节点数及链路数后,系统首先会自动生成每个节点到其相邻路由节点的路由信息,具体包括:
目的地址、跳数、下一跳,初始设置相邻节点的跳数为1。
二:
当路由器的初始路由表建立后,接下来就开始进行邻接节点的路由信息广播,即路由节点将自身的路由表信息广播至其相邻的节点,具体的广播信息是将每一条路由的目的地址不变,跳数加一,吓一跳修改为自身路由器接口的名称进行传送,收到广播信息的路由表对收到的每一条路由信息进行判断,分两大情况:
:
若原来的路由表中没有目的网络N,则将该项添加到路由表中,否则(即在该路由表中有到目的网络N的信息,则观察下一条)此时分两种小情况1:
若吓一跳与原路由表项相同,则无条件进行更新。
2:
若吓一跳与原路由表项不相同,则若收到的路由信息中距离d小于路由表中的距离,则进行更新。
(还有对于接受的路由信息跳数>=16的信息,则将跳数置为16,表明不可达。
)三:
动态改变网络拓扑结构,即当因为实际需要,需增设路由节点时,系统会根据增设的路由节点数、名称、链路数,首先进行新增设节点的路由表信息初始化,而后将该节点的路由信息想邻接节点进行广播,随后整个网络节点向邻接节点进行路由信息广播,这样经过几轮广播后,每一个节点都接收到了新增路由节点的最小路径信息,从而实现了路由表的动态维护与创建。
4.系统设计详细
4,1程序流程图
4.2程序源码
因为系统的设计涉及到网络拓扑图的存储,所以本设计采用数据结构中图的存储思想来进行拓扑结构的存储,输出。
下面是系统设计的主要代码:
首先分别设置了4种类型的结构体,以来表示链路信息、路由表、路由器,网络拓扑图。
#include
#include
#defineMAX_VERTEX_NUM15
#defineMAX15
#include
typedefstructArcCell//存储链路信息
{
intadj;
}ArcCell,Am[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct//路由表
{
chardestination[MAX];
intdistance;
charnextjump[MAX];
}TNode;
typedefstruct//路由结点
{
charr[MAX];//存储路由器名称
TNodet[MAX];//存储路由结点的路由表信息。
}VNode;
typedefstruct{
VNodevex[MAX];
Amarcs;
intvexnum,arcnum;
}Graph;//用图来存储网络拓扑结构。
//另外在此设置一个全局变量,用来辨别路由表中信息的结束。
TNodeend={"",0,""};
copy(char*str1,char*str2)
{
inti;
char*temp=str2;
for(i=0;*temp!
='\0';i++)
{
*(str1+i)=*(str2+i);
temp++;
}
*(str1+i)='\0';
}
//第一步:
待设计好需要的结构模型后,接下来开始根据路由节点的个数及链路数进行网络拓扑结构的构造,详细代码如下:
GraphCreate()
{
GraphG;
inti,j,k,count;
charv1[20],v2[20];
printf("分别输入网络拓扑结构中的路由数和链路数(中间用逗号隔开):
\n");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("分别输入路由器名称及路由表\n");
intLocateVex(Graph*G,chars[]);
voidinitRoute(Graph*G,inti,intj);
for(i=0;i { count=0; printf("输入第%d个路由器名称: \n",i+1); scanf("%s",G.vex[i].r); G.vex[i].t[0]=end; } for(i=0;i for(j=0;j G.arcs[i][j].adj=10000; for(k=0;k { printf("输入第%d条链路的两端路由器的名称: \n",k+1); scanf("%s%s",v1,v2);//用scanf输入多个字符串,中间用空格隔开。 i=LocateVex(&G,v1); j=LocateVex(&G,v2); G.arcs[i][j].adj=1; G.arcs[j][i].adj=1; //初始化该链路两端路由节点的路由表。 initRoute(&G,i,j); } returnG; } intcompare(chara[],charb[]); voidprintG(Graph*G); voidinsertNewRoute(Graph*G); //其中的LocateVex()函数用来确定s在图中的位置,具体实现如下: intLocateVex(Graph*G,chars[]) { inti; for(i=0;i<(*G).vexnum;i++) { if(compare(s,(*G).vex[i].r)==1) returni; } return-1; } //第二步: 构造完网路拓扑图后,接下来进行拓扑结构中路由节点的路由表信息的初始化。 voidinitRoute(Graph*G,inti,intj) { intm,n; for(m=0;(*G).vex[i].t[m].distance! =0;m++); copy((*G).vex[i].t[m].destination,(*G).vex[j].r); (*G).vex[i].t[m].distance=1; copy((*G).vex[i].t[m].nextjump,(*G).vex[i].r); (*G).vex[i].t[m+1]=end; for(n=0;(*G).vex[j].t[n].distance! =0;n++); copy((*G).vex[j].t[n].destination,(*G).vex[i].r); (*G).vex[j].t[n].distance=1; copy((*G).vex[j].t[n].nextjump,(*G).vex[j].r); (*G).vex[j].t[n+1]=end; } //第三步: 开始进行邻接节点的路由信息广播: voidExchange(Graph*G) { inti,j,k,h,count; charc; TNodetemp; for(i=0;i<(*G).vexnum;i++) for(j=0;j<(*G).vexnum;j++) { if((*G).arcs[i][j].adj==1)//找寻路由结点i的邻接结点路由,从而将信息广播发送。 {//// for(k=0;(*G).vex[i].t[k].distance! =0;k++)//扫描路由节点i的路由表中的每一条信息。 {/// copy(temp.destination,(*G).vex[i].t[k].destination); temp.distance=(*G).vex[i].t[k].distance+1; if(temp.distance>16)temp.distance=16; copy(temp.nextjump,(*G).vex[i].r); count=0; for(h=0;(*G).vex[j].t[h].distance! =0;h++) { if(compare(temp.destination,(*G).vex[j].r)==1)//表明该条路由信息的目的地址指向的是路由结点j本身,因而不需要更新及修改。 { count++; break; } if(compare((*G).vex[j].t[h].destination,temp.destination)==1) { count++; if(compare((*G).vex[j].t[h].nextjump,temp.nextjump)==1) (*G).vex[j].t[h].distance=temp.distance; elseif((*G).vex[j].t[h].distance>temp.distance) { (*G).vex[j].t[h].distance=temp.distance; copy((*G).vex[j].t[h].nextjump,temp.nextjump); } } } if(count==0) { copy((*G).vex[j].t[h].destination,temp.destination); (*G).vex[j].t[h].distance=temp.distance; copy((*G).vex[j].t[h].nextjump,temp.nextjump); (*G).vex[j].t[h+1]=end; } }/// printf("路由器%s向路由器%s发送消息\n",(*G).vex[i].r,(*G).vex[j].r); printG(G); }//// } printf("若需在原有网络拓扑结构中增加新的节点,请输入#键\n"); getchar(); scanf("%c",&c); if(c=='#') { insertNewRoute(G); } } //第四步: 增加路由表,实现网络拓扑结构的动态变化及路由表信息的动态更新与维护。 voidinsertNewRoute(Graph*G) { inti,j,nVexNum,nArcNum,k,num; charv1[20],v2[20]; printf("分别输入新增加的路由数和链路数(中间用逗号隔开): \n"); scanf("%d,%d",&nVexNum,&nArcNum); printf("分别输入路由器名称及路由表\n"); for(num=0;num { printf("输入新增第%d个路由器名称: \n",num+1); scanf("%s",(*G).vex[num+(*G).vexnum].r); (*G).vex[num+(*G).vexnum].t[0]=end; } (*G).vexnum+=nVexNum; (*G).arcnum+=nArcNum; for(k=0;k { printf("输入新增路由节点后第%d条链路的两端路由器的名称: \n",k+1); scanf("%s%s",v1,v2);//用scanf输入多个字符串,中间用空格隔开。 i=LocateVex(G,v1); j=LocateVex(G,v2); (*G).arcs[i][j].adj=1; (*G).arcs[j][i].adj=1; initRoute(G,i,j); } for(i=0;i<(*G).vexnum;i++)//初始化邻接矩阵 for(j=0;j<(*G).vexnum;j++) { if((*G).arcs[i][j].adj! =1) (*G).arcs[i][j].adj=10000; } Exchange(G); } //下面是系统设计过程中所需的辅助自定义函数。 intcompare(chara[],charb[]) { intj; for(j=0;a[j]! ='\0'&&b[j]! ='\0';j++) if(a[j]! =b[j]) return0; return1; } //显示网络拓扑结构: voidprintG(Graph*G) { inti,j; for(i=0;i<(*G).vexnum;i++) { printf("\t路\t由\t器%s: \n",(*G).vex[i].r); printf("目的地址\t\t距离\t\t下一跳\n\n"); for(j=0;(*G).vex[i].t[j].distance! =0;j++) printf("%s\t\t\t%d\t\t%s\n\n",(*G).vex[i].t[j].destination,(*G).vex[i].t[j].distance,(*G).vex[i].t[j].nextjump); printf("\n\n"); } } //显示指定路由节点v的路由表: voidprintv(VNodev) { inti; printf("\t路\t由\t器%s\n",v.r); printf("目的地址\t\t距离\t\t下一跳\n\n"); for(i=0;v.t[i].distance! =0;i++) printf("%s\t\t\t%d\t\t%s\n\n",v.t[i].destination,v.t[i].distance,v.t[i].nextjump); printf("\n\n"); } //通过主函数进行函数的调用运行: voidmain() { GraphG=Create(); printG(&G); Exchange(&G); }5.设计过程关键问题及其解决办法 5.1如何实现广播本地路由及更新动态更新路由表。 路由器最初启动时只包含了其直连网络的路由信息,并且其直连网络的metric值为1,然后它向周围的其他路由器发出完整路由表的RIP请求。 路由器根据接收到的RIP应答来更新其路由表,具体方法是添加新的路由表项,并将其metric值加1。 如果接收到与已有表项的目的地址相同的路由信息,则分下面四种情况分别对待: 第一种情况,已有表项的来源端口与新表项的来源端口相同,那么无条件根据最新的路由信息更新其路由表;第二种情况,已有表项与新表项来源于不同的端口,那么比较它们的metric值,将metric值较小的一个最为自己的路由表项;第三种情况,新旧表项的metric值相等,普遍的处理方法是保留旧的表项。 第四种情况,新表项在该路由表中不存在,则将跳数加一,吓一跳改为原发送路由器后添加到表项后。 5.2如何在网络拓扑结构改变后实现动态更新维护路由表。 首先要实现新添加路由表的路由信息初始化,而后再更新与之相邻的路由节点的路由信息,接下来就进行路由信息的邻接节点广播,从而达到全网络的路由信息更新。 6.程序设计结果界面演示 6.1设计结果演示 程序运行过程演示以及结果如下: 1.分别从键盘输入网络拓扑结构中的路由数和链路数(中间用逗号隔开) 例如输入3,2表示共有两个路由器和一条链路,如图1-1所示拓扑结构: 图1-1 2.再分别输入各个路由器名称及其链路(中间用空格隔开) 例如分别依次输入第一个路由器名称v1,第二个路由器名称v2及两个路由器间的链路v1v2. 程序输入数据界面与按下ENTER键后各路由表的初始路由信息如图1-2 4.接下来改变原始网络拓扑结构,增加新的路由节点,如图1-3中拓扑结构所示: 图1-3 运行命令后输入如下: 输入新增第1个路由器名称: v4 输入新增路
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RIP 路由 协议 原型 系统 实现