RIP协议实现.docx
- 文档编号:29753727
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:15
- 大小:131.58KB
RIP协议实现.docx
《RIP协议实现.docx》由会员分享,可在线阅读,更多相关《RIP协议实现.docx(15页珍藏版)》请在冰豆网上搜索。
RIP协议实现
目录
1、课程设计目的1
1、课程设计目的
了解RIP协议的原理和应用等相关知识,通过距离矢量算法来实现最短传输路径的路由选择。
通过本次课程设计,可以对路由表的建立和路由信息的更新等有更直观和清晰的认识。
2、课程设计要求
根据所选的课题需求,按如下要求编写寻求最短路径的程序。
1)程序提示用户输入有向图定点数目和源点。
程序根据用户的输入创建类,分配所需空间
2)程序提示用户输入有向图的邻接矩阵。
3)输出源点到其它各点的最短路径。
例如,V0—>V2;V0,V3,V2
3、相关知识
D-V算法实现
距离矢量(DISTANCE-VECTOR,简称D-V)算法(也称BELLMAN-FORD算法)周期性地将路由表信息的拷贝在路由器之间传送。
当网络拓扑变化时,也会将更新信息及时传送给路由器。
每一个路由器只能接收到网络中相邻路由器的路由表,就如图所示,路由器B接收到相邻路由器A的信息,通过增加一个距离矢量数(例如一个跳数)来增大距离矢量,然后将更新的路由表信息传送给相邻路由器C。
这种逐步过程发生在相邻路由器之间。
距离矢量算法的数学模型如下:
我们用D(i,j)来表示从实体i到j的最佳路由的Metric,i、j可以是系统中的任意一对实体,用d(i,j)来表示单个跳数的花费,也就是从i直接到j的花费,如果i与j不是直接相邻的,则d(i,j)为无穷大。
这样任意两个实体间的最佳Metric可以表示如下:
D(i,j)=0对所有的i
D(i,j)=min[D(i,j)+d(i,k)]i不等于k时
由于我们把非相邻两实体间的d(i,j)定义为无穷大,当表达式中k不是i的相邻主机或路由器时,D(i,j)永远不可能为最小,故我们也可以把k限定为与i相邻。
由此我们可以得出一个基于这个数学模型的计算Metric的简单算法:
实体i接收它的邻居们k发送给它的到目标主机j的距离评价,并加上d(i,j),在这里是通过i,k之间网络所需的cost值,接下来i比较来自所需邻居的信息,并选择其中最小的。
可以证明,在拓扑结构不变的情况下该算法在有限时间内收敛于正确的D(i,j)。
距离矢量算法通过上述方法累加网络距离,并维护网络拓扑信息数据库。
使用这种算法,路由器并不能知道整个网络的确切拓扑结构。
1)RIP实现
图1RIP路由表初始化
●RIP启动时的初始路由表仅包含本路由器的一些直连接口路由。
●RIP协议启动后向各接口广播一个Request报文。
●邻居路由器的RIP协议从某接口收到Request报文后,根据自己的路由表,形成Response报文向该接口对应的网络广播。
●RIP接收邻居路由器回复的包含邻居路由器路由表的Response报文,形成自己的路由表。
RIP根据D-V算法的特点,将协议的参加者分为主动机和被动机两种。
主动机主动向外广播路由刷新报文,被动机被动地接收路由刷新报文。
一般情况下,主机作为被动机,路由器则既是主动机又是被动机,即在向外广播路由刷新报文的同时,接收来自其它主动机的D-V报文,并进行路由刷新。
图2RIP路由表更新
RIP协议以30秒为周期用Response报文广播自己的路由表。
收到邻居发送而来的Response报文后,RIP协议计算报文中的路由项的度量值,比较其与本地路由表路由项度量值的差别,更新自己的路由表。
报文中路由项度量值的计算:
metric'=MIN(metric+cost,16),metric为报文中携带的度量值信息,cost为接收报文的网络的度量值开销,缺省为1(1跳),16代表不可达。
4、课程设计分析
1、重要数据结构
用于路由表初始化:
typedefstruct
{
intdis;
intfrom;
}RoutNode;/*路由表结构体,存放路由结点、权值信息*/
2、创建文本文件,用于初始化路由表
voidInitData(FILE*pfile);
这是个文本文档,为了方便初始化路由表,建立一个二维数组矩阵,正数表示两结点之间路径距离(权值),-1表示两结点之间没有路径。
输出所有的路由表
voidOutputRoutData();/*按编排格式输出二维数组矩阵*/
3、结点之间进行信息交换,更新路由表
send点向recv点发送自己的路由表,两结点之间进行信息交换。
voidCommunication(intrecv,intsend)
{
inti;
for(i=0;i { { if(data[recv][i].dis<0)/*如果recv到i号节点无路径*/ if(data[send][i].dis>0)/*如果send节点到i号节点有路线*/ 这里有两种情况: 1)、if(data[send][i].dis>0)/*如果send节点到i号节点有路线*/ { data[recv][i].dis=data[send][i].dis+data[recv][send].dis; data[recv][i].from=send; } 当send点与i点之间有路径,而recv点与i点之间没有路径,这是可以通过send点来建立recv点与i点的连接; 2)、elseif(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].from=send; } 当send点和recv点和i点都有路径,就通过比较两点到i点的距离来确定两结点间的最短路径。 4、算法流程图 N Y N Y 图3D-V算法流程 5、程序清单及注释 /*Routine.cTC2.0WinXp*/ #include #include #defineROUTNUM7 typedefstruct { intdis; intfrom; }RoutNode; RoutNodedata[ROUTNUM][ROUTNUM];/*路由表*/ voidInitData(FILE*pfile);/*从数据文件读取数据,初始化路由表*/ voidOutputRoutData();/*输出所有的路由表*/ voidCommunication(intrecv,intsend);/*send点向recv点发送自己的路由表*/ voidExchange();/*所有节点进行一次数据交换,更新路由表*/ voidmain() { intstart,end; inti; FILE*pfile; pfile=fopen("data.txt","r"); if(pfile==NULL) { printf("datafilefailedtoopen,pressanykeytoquit.\n"); getchar(); return; } else InitData(pfile); fclose(pfile); printf("\nInitialState: \n"); OutputRoutData(); for(i=0;i { Exchange(); } printf("\nStateExchanged: \n"); OutputRoutData(); printf("inputthestartnode(%d-%d): ",0,ROUTNUM-1); scanf("%d",&start); printf("inputtheendnode(%d-%d): ",0,ROUTNUM-1); scanf("%d",&end); if(start==end||start<0||start>6||end<0||end>6) { printf("\nwronginput,pressanykeytoquit.\n"); getchar(); return; } else { intcur=start; inttotal=0; if(data[start][end].dis<0) { printf("Noroutinefind! \n"); getchar(); return; } printf("%c->",cur+65); while(data[cur][end].from>=0) { total+=data[cur][data[cur][end].from].dis; printf("%c->",data[cur][end].from+65); cur=data[cur][end].from; } total+=data[cur][end].dis; printf("%c\ntotaldistance=%d",end+65,total); getchar(); return; } } voidInitData(FILE*pfile) { charnum[10]; inti=0; charc; intm,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].from=-1; i=0; break; } elseif((c>='0'&&c<='9')||c=='-')/*如果读到数字或符号*/ { num[i++]=c; } } } } } voidOutputRoutData() { inti,j; printf(""); for(i=0;i { printf("<%d>",i); } printf("\n"); for(i=0;i { printf("%d",i); for(j=0;j { if(data[i][j].dis<0)/*如果无路径*/ printf("-"); else printf("%-5d",data[i][j].dis); if(data[i][j].from<0)/*如果未经过其它节点*/ printf("-"); else printf("%c",data[i][j].from+65); } printf("\n"); } } voidCommunication(intrecv,intsend) { inti; for(i=0;i { if(data[send][i].dis>0)/*如果send节点到i号节点有路线*/ { if(data[recv][i].dis<0)/*如果recv到i号节点无路径*/ { data[recv][i].dis=data[send][i].dis+data[recv][send].dis; data[recv][i].from=send; } elseif(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].from=send; } } } } voidExchange() { inti,j; for(i=0;i { for(j=0;j { if(data[i][j].dis>0)/*如果两个节点之间有路径*/ { Communication(j,i);/*将i号节点的路由表发送给j号节点*/ } } } } 6、运行结果及分析 图4运行结果图 图5Data.txt文本文档 7、参考文献 [1]宋凯、刘念,《计算机网络》.清华大学出版社,2010 [2]谢希仁,《计算机网络(第五版)》.电子工业出版社,2008 [3]谢希仁.,《计算机网络教程》.人民邮电出版社,2007
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RIP 协议 实现