资源描述
<p><span id="_baidu_bookmark_start_0" style="display: none; line-height: 0px;"></span>课程设计报告
课程名称: 计算机网络
设计题目: RIP路由协议原型系统的实现
系 别: 计算机与信息工程学院
专 业: 物联网专业
组 别: 第五组 --
起止日期: 2023年6月8日~2023年6月14日--
指导教师: 刘进军
计算机科学与技术系二○一四年制
组长
谢刚
学号
班级
2023级物联网
系别
计算机与信息工程学院
专业
物联网专业
成员
谢刚
指导教师
老师 刘进军
课程设计目的
1) 进一步理解动态内部网关协议RIP的工作原理。
2) 学会将所学知识联合运用,如本次RIP协议原型系统的设计即是将网络与数据结构(图)及C编程语言相结合。
3) 提高团队合作能力,发挥每一名成员的长处。
4) 体会做一个项目的流程(涉及前期的资料收集,系统规定分析,系统实现的语言选择及实现方法的讨论等)。
课程设计所需环境
1) Windows操作系统平台
2) VC++6.0编译环境
3) Cisco Packet Tracer仿真软件
课程设计任务规定
1) 实现一个RIP路由协议的原型系统
2) 广播发布本地节点的路由信息
3) 其它节点接受信息并选择最优途径
4) 支持最大不超过15跳的特性
5) 动态支持网络拓扑结构的变化(如增长路由节点)
课程设计工作进度计划
序号
起止日期
工 作 内 容
分工情况
1
2023年6月8日~2023年6月9日
展开思绪讨论工作并搜集相关资料
参考相关资料独立完毕
2
2023年6月9日~2023年6月10日
分析课程设计规定,拟定目的
参考相关资料独立完毕
3
2023年6月10日~2023年6月11日
设计软件功能模块
参考相关资料独立完毕
4
2023年6月11日~2023年6月12日
编写代码、实现功能模块
参考相关资料独立完毕
5
2023年6月12日~2023年6月13日
系统整合以及测试
参考相关资料独立完毕
6
2023年6月13日~2023年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(Routing information Protocol,路由信息协议)是应用较早、使用较普遍的内部网关协议(Interior Gateway Protocol,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的距离向量,从而知道网络的连接情况,实现各个网络之间的连通,这也是距离向量名称的由来。(Distance Vector)运营协议的每个路由器都要维护一张自己的路由RIP表,该路由表是相应于与它直接相联和通过路由器相连的网络连接情况而动态变化的。因此协议属于动态路由协RIP议。路由器根据路由表对发给它的包进行转发,从而实现IP路由功能。
3.系统功能描述与系统模块划分
本设计实现的RIP路由协议的原型系统功能重要涉及,一:初始化每个路由器的路由表信息。即在使用者输入网络拓扑结构中的路由节点数及链路数后,系统一方面会自动生成每个节点到其相邻路由节点的路由信息,具体涉及:目的地址、跳数、下一跳,初始设立相邻节点的跳数为1。 二:当路由器的初始路由表建立后,接下来就开始进行邻接节点的路由信息广播,即路由节点将自身的路由表信息广播至其相邻的节点,具体的广播信息是将每一条路由的目的地址不变,跳数加一,吓一跳修改为自身路由器接口的名称进行传送,收到广播信息的路由表对收到的每一条路由信息进行判断,分两大情况::若本来的路由表中没有目的网络N,则将该项添加到路由表中,否则(即在该路由表中有到目的网络N的信息,则观测下一条)此时分两种小情况1:若吓一跳与原路由表项相同,则无条件进行更新。2:若吓一跳与原路由表项不相同,则若收到的路由信息中距离d小于路由表中的距离,则进行更新。(尚有对于接受的路由信息跳数>=16的信息,则将跳数置为16,表白不可达。)三:动态改变网络拓扑结构,即当由于实际需要,需增设路由节点时,系统会根据增设的路由节点数、名称、链路数,一方面进行新增设节点的路由表信息初始化,而后将该节点的路由信息想邻接节点进行广播,随后整个网络节点向邻接节点进行路由信息广播,这样通过几轮广播后,每一个节点都接受到了新增路由节点的最小途径信息,从而实现了路由表的动态维护与创建。
4.系统设计具体
4,1程序流程图
开始
输入要建立网络的拓扑结构所需路由节点数及链路数
各路由节点向邻接节点广播路由信息
各节点接受信息便进行路由表的更新
建立各节点的初始路由表
广播信息内容:
目的地址:不变
跳数:加1
吓一跳:修改为广播该路由信息的路由节点名称
若本来的路由表中无到此网络的信息,则添加,否则1:若吓一跳与原路由表项相同,则无条件进行更新。2:若吓一跳与原路由表项不相同,则判断距离d若小于路由表中的距离,则更新。(尚有对于接受的路由信息跳数>=16的信息,则将跳数置为16)
节点路由信息更新完毕,询问是否还需添加新的路由节点
否
结束
是
初始化新增路由节点路由表
4.2程序源码
由于系统的设计涉及到网络拓扑图的存储,所以本设计采用数据结构中图的存储思想来进行拓扑结构的存储,输出。下面是系统设计的重要代码:
一方面分别设立了4种类型的结构体,以来表达链路信息、路由表、路由器,网络拓扑图。
#include</p><stdio.h>#include<stdlib.h>#define MAX_VERTEX_NUM 15
#define MAX 15
#include<iostream>typedef struct ArcCell//存储链路信息
{
int adj;
}ArcCell,Am[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct//路由表
{
char destination[MAX];
int distance;
char nextjump[MAX];
}TNode;
typedef struct//路由结点
{
char r[MAX];//存储路由器名称
TNode t[MAX];//存储路由结点的路由表信息。
}VNode;
typedef struct{
VNode vex[MAX];
Am arcs;
int vexnum,arcnum;
}Graph;//用图来存储网络拓扑结构。
//此外在此设立一个全局变量,用来辨别路由表中信息的结束。
TNode end={"",0,""};
copy(char *str1,char *str2)
{
int i;
char *temp = str2;
for(i=0;*temp!='\0';i++)
{
*(str1+i)=*(str2+i);
temp++;
}
*(str1+i)='\0';
}
//第一步:待设计好需要的结构模型后,接下来开始根据路由节点的个数及链路数进行网络拓扑结构的构造,具体代码如下:
Graph Create()
{
Graph G;
int i,j,k,count;
char v1[20],v2[20];
printf("分别输入网络拓扑结构中的路由数和链路数(中间用逗号隔开):\n");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("分别输入路由器名称及路由表\n");
int LocateVex(Graph *G,char s[]);
void initRoute(Graph *G,int i,int j);
for(i=0;i<G.vexnum;i++)//构造路由结点
{
count=0;
printf("输入第%d个路由器名称:\n",i+1);
scanf("%s",G.vex[i].r);
G.vex[i].t[0]=end;
}
for(i=0;i<G.vexnum;i++)//初始化邻接矩阵
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=10000;
for(k=0;k<G.arcnum;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);
}
return G;
}
int compare(char a[],char b[]);
void printG(Graph *G);
void insertNewRoute(Graph *G);
//其中的LocateVex()函数用来拟定s在图中的位置,具体实现如下:
int LocateVex(Graph *G,char s[])
{
int i;
for(i=0;i<(*G).vexnum;i++)
{
if(compare(s,(*G).vex[i].r)==1)
return i;
}
return -1;
}
//第二步:构造完网路拓扑图后,接下来进行拓扑结构中路由节点的路由表信息的初始化。
void initRoute(Graph *G,int i,int j)
{
int m,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;
}
//第三步:开始进行邻接节点的路由信息广播:
void Exchange(Graph *G)
{
int i,j,k,h,count;
char c;
TNode temp;
for(i=0;i<(*G).vexnum;i++)
for(j=0;j<(*g).vexnum;j++) .adj="=1)//找寻路由结点i的邻接结点路由,从而将信息广播发送。" k="0;(*G).vex[i].t[k].distance!=0;k++)//扫描路由节点i的路由表中的每一条信息。" 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;
else if((*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);
}
}
//第四步:增长路由表,实现网络拓扑结构的动态变化及路由表信息的动态更新与维护。
void insertNewRoute(Graph *G)
{
int i,j,nVexNum,nArcNum,k,num;
char v1[20],v2[20];
printf("分别输入新增长的路由数和链路数(中间用逗号隔开):\n");
scanf("%d,%d",&nVexNum,&nArcNum);
printf("分别输入路由器名称及路由表\n");
for(num=0;num<nVexNum;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<nArcNum;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);
}
//下面是系统设计过程中所需的辅助自定义函数。
int compare(char a[],char b[])
{
int j;
for(j=0;a[j]!='\0'&&b[j]!='\0';j++)
if(a[j]!=b[j])
return 0;
return 1;
}
//显示网络拓扑结构:
void printG(Graph *G)
{
int i,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的路由表:
void printv(VNode v)
{
int i;
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");
}
//通过主函数进行函数的调用运营:
void main()
{
Graph G=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 及两个路由器间的链路v1 v2.
程序输入数据界面与按下ENTER键后各路由表的初始路由信息如图1-2
4.接下来改变原始网络拓扑结构,增长新的路由节点,如图1-3中拓扑结构所示:
图1-3
运营命令后输入如下:
输入新增第1个路由器名称:v4
输入新增路由节点后第1条链路的两端路由器的名称:v2 v4
增长路由结点输入界面如图1-4所示:
图1-4
按下ENTER键程序进行v4路由器的路由表信息初始化及路由信息广播:
V4路由表初始信息动态生成如图1-7:
图1-5
V2向v4广播信息如图1-6所示:
图1-6
几轮广播信息结束后,各路由节点路由信息如下图1-7与1-8所示:
图1-8
图1-9
5.若还需要在原有的网络拓扑结构中继续增长新的节点,再输入#键,按以上环节继续操作,能实现不断增长路由结点以及链路,并将路由表的连续更新。
7.课程设计总结与体会
7.1 总结
本次课程设计是我懂得了RIP合用于小型同类网络的一个自治系统(AS)内的路由信息的传递路由实现时,而RIP作为一个系统长驻进程(daemon)而存在于路由器中,负责从网络系统的其它路由器接受路由信息,从而对本地IP层路由表作动态的维护,保证IP层发送报文时选择对的的路由。同时负责广播本路由器的路由信息,告知相邻路由器作相应的修改
7.1 体会
这次课程设计完毕了rip路由协议原型系统的实现,方案中路由节点可以运用广播发布本地节点的路由信息,其它节点接受信息并选择最优途径。
本次设计查阅了许多案例,学到许多知识,原先很多不懂的东西,都有了初步的了解。这次课程设计使我觉得收获挺大的。之前的学习仅限于课本,网络的很多东西都只知道其然而不知道其所以然。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才干真正做到理解。
课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,使我们实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,网络已经成为当今计算机发展中空前活跃的领域,在生活中可以说是无处不再,因此作为二十一世纪的计算机专业的大学生来说真正的掌握网络技术是十分重要的
致谢
本课程设计是在我们的赵生慧和赵国柱老师的共同指导下完毕的。他们严厉的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我们。从课题的选择到设计的最终完毕,两位老师都始终给予我们细心的指导和不懈的支持。在此谨向两位老师致以真挚的谢意和崇高的敬意。我还要感谢在一起快乐工作的成员们,正是由于你们的帮助和支持,我们才干一起克服一个又一个的困难和疑惑,直至本课程设计的顺利完毕。
在课程设计即将完毕之际,我的心情无法安静,从开始进入课题到设计的顺利完毕,有多少可敬的师长、同学、朋友给了我们无言的帮助,在这里请接受我真挚的谢意!
参考文献
[1] 谢希仁.计算机网络:电子工业出版社, 2023.
[2] 严蔚敏.数据结构:清华大学出版社, 2023.
指导教师评语:
指导教师署名: 年 月 日
成 绩
教研室审核意见:
教研室主任签字: 年 月 日
<!--(*g).vexnum;j++)--></iostream></stdlib.h></stdio.h>
展开阅读全文