207贺婷RIP协议的模拟实现Word格式文档下载.docx
- 文档编号:20640123
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:20
- 大小:185.23KB
207贺婷RIP协议的模拟实现Word格式文档下载.docx
《207贺婷RIP协议的模拟实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《207贺婷RIP协议的模拟实现Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
路由选择
地址族
路径标签
子网掩码
下一个站点的IP地址
表2RIP报文Version2
RIP报文中至多可以出现25个AFI、互联网络地址和度量域。
这样允许使用一个RIP报文来更新一个路由器中的多个路由表项。
包含多个路由表项的RIP报文只是简单地重复从AFI到度量域的结构,其中包括所有的零域。
表3具有一个目的地的RIP报文
1字节命令
1字节版本
2字节0域
2字节
AFI
0域
4字节
网络地
址
度量
表4具有两个表项的RIP报文
1字节
版本
0域
两字节
网络地址
网络
地址
地址域可以既包括发送者的地址也包括发送者路由表中的一系列IP地址。
请求报文含有一个表项并包括请求者的地址。
应答报文可以包括至多25个RIP路由表项[1]。
2.2RIP距离向量算法
RIP协议是矢量距离算法在局域网上的直接实现,RIP将协议的参加者分为主动机和被动机两种。
主动机主动地向外广播路径刷新报文,被动机被动地接受路径刷新报文。
一般情况下,网关作主动机,主机作被动机。
RIP规定,网关每30秒向外广播一个报文,报文信息来自本地路由表。
RIP的度量是基于跳数(hopscount)的,每经过一台路由器,路径的跳数加一。
如此一来,跳数越多,路径就越长,RIP算法会优先选择跳数少的路径。
RIP支持的最大跳数是15,跳数为16的网络被认为不可达。
对于相同开销路径的处理是采用先入为主的原则。
在具体的应用中,可能会出现这种情况,去往相同网络有若干条相同距离的路径。
在这种情况下,无论哪个网关的路径广播报文先到,就采用谁的路径。
直到该路径失败或被新的更短的路径来代替。
RIP中路由的更新是通过定时广播实现的。
缺省情况下,路由器每隔30秒向与它相连的网络广播自己的路由表,接到广播的路由器将收到的信息添加至自身的路由表中。
每个路由器都如此广播,最终网络上所有的路由器都会得知全部的路由信息。
正常情况下,每30秒路由器就可以收到一次路由信息确认,如果经过180秒,即6个更新周期,一个路由项都没有得到确认,路由器就认为它已失效了。
如果经过240秒,即8个更新周期,路由项仍没有得到确认,它就被从路由表中删除。
上面的30秒,180秒和240秒的延时都是由计时器控制的,它们分别是更新计时器(UpdateTimer),无效计时器(InvalidTimer)和刷新计时器(FlushTimer)。
距离向量类的算法容易产生路由循环,RIP是距离向量算法的一种,所以它也不例外。
如果网络上有路由循环,信息就会循环传递,永远不能到达目的地。
如果出现环路,直到路径长度达到16,也就是说要经过210秒(30X7秒)来回,路径回路才能被解除,这就是所谓的慢收敛问题。
是RIP的一个很大的缺陷,为了避免这个问题,RIP等距离矢量算法实现了4个机制:
水平分割(splithorizon)
水平分割保证路由器记住每一条路由信息的来源,并且不在收到这条信息的端口上再次发送它。
这是保证不产生路由循环的最基本措施。
毒性逆转(poisonreverse)
当一条路径信息变为无效之后,路由器并不立即将它从路由表中删除,而是用16,即不可达的度量值将它广播出去。
这样虽然增加了路由表的大小,但对消除路由循环很有帮助,它可以立即清除相邻路由器之间的任何环路。
触发更新(triggerupdate)
当路由表发生变化时,更新报文立即广播给相邻的所有路由器,而不是等待30秒更新周期。
同样,当一个路由器刚启动RIP时,它广播请求报文。
收到此广播的相邻路由器立即应答一个更新报文,而不必等到下一个更新周期。
这样,网络拓扑的变化会最快地在网络上传播开,减少了路由循环产生的可能性。
抑制计时(holddowntimer)
一条路由信息无效之后,一段时间内这条路由都处于抑制状态,即在一定时间内不再接收关于同一目的地址的路由更新。
如果,路由器从一个网段上得知一条路径失效,然后,立即在另一个网段上得知这个路由有效。
这个有效的信息往往是不正确的,抑制计时避免了这个问题,而且,当一条链路频繁起停时,抑制计时减少了路由的浮动,增加了网络的稳定性。
即便采用了上面的4种方法,路由循环的问题也不能完全解决,只是得到了最大程度的减少。
一旦路由循环真的出现,路由项的度量值就会出现计数到无穷大(CounttoInfinity)的情况。
这是因为路由信息被循环传递,每传过一个路由器,度量值就加1,一直加到16,路径就成为不可达的了。
RIP选择16作为不可达的度量值是很巧妙的,它既足够的大,保证了多数网络能够正常运行,又足够小,使得计数到无穷大所花费的时间最短。
有些网络是NBMA(Non-BroadcastMultiAccess,非广播多路访问)的,即网络上不允许广播传送数据。
对于这种网络,RIP就不能依赖广播传递路由表了。
解决方法有很多,最简单的是指定邻居(neighbor),即指定将路由表发送给某一台特定的路由器[2]。
2.3主要设计思想
对每一个相邻路由器发送过来的RIP报文,进行以下步骤:
(1)对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:
把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1.每一个项目都有三个关键数据,即:
到目的网络N,距离d,下一跳路由器是X。
(2)对修改后的RIP报文中的每一个项目,进行以下步骤:
若原来的路由表中没有目的网络N,则把该项目添加到路由表中。
否则,若下一跳路由器的地址是X,则把收到的项目替换原路由表中的项目否则若收到的项目中的距离d小于路由表中的距离,则进行更新,否则什么都不做。
(3)若3分钟还没有收到相邻路由器的更新路由表,则把次相邻路由器记为不可达的路由器,即把距离置为16.
(4)返回。
2.4实现步骤
(1)设计一个函数,实现路由表调整算法。
(2)首先通过手动输入路由表的信息
(3)输出初始的路由拓扑信息,包括目的网络,距离,下一跳路由
(4)外循环:
每个节点读取相邻节点的路由表,更新自己的路由表。
(5)内循环:
读取一个相邻节点的路由表,更新一次自己的路由表。
(6)交互式确定,是否继续外循环(连续二次交换路由信息后路由表不在变化[3]。
3设计步骤
3.1RIP距离向量算法程序设计流程图
图3-1RIP模拟距离向量算法流程图
3.2主要函数模块说明
构造了一个名为network的类,其中包括了一系列函数,这些函数构成了RIP模拟向量距离的算法,其中主要包括以下几个函数[4]。
(1)show()函数,该函数主要是用于路由表信息的显示,显示部分包括目的网络,距离下一跳路由。
voidNetwork:
:
show(){
for(inti=0;
i<
n;
i++){
cout<
<
"
"
第"
i+1<
个路由表"
endl;
for(intj=0;
j<
tiao[i];
j++)
{
cout<
rts[i][j].net<
rts[i][j].distance<
rts[i][j].next_route<
}
}
(2)bgroutes()函数,该函数主要是用来输入路由信息。
bgroutes(){
========初始路由拓扑信息如下所示:
==========="
i++){//利用循环语句,将输入的初始路由信息输出
rts[i][0].net=rt[i].net_l;
rts[i][0].distance=1;
rts[i][0].next_route="
直接交付"
;
tiao[i]++;
rts[i][1].net=rt[i].net_r;
rts[i][1].distance=1;
rts[i][1].next_route="
(3)updata()函数,该函数主要是用于更新相邻路由表的信息。
(4)UPDATA()函数,该函数调用updata()函数,来实现所有路由表的更新。
(5)neighber()函数,该函数是用来判断两个路由是否为相邻路由。
boolNetwork:
neighbor(inti,intj){
if(i-j==1)returntrue;
//如果距离为1的话,则是相邻的路由表
if(j-i==1)returntrue;
returnfalse;
3.3程序测试结果
(1)首先输入每个路由拓扑信息,按照顺序依次写入,R1-R6为路由。
N1—R1—N2—R2—N3—R3—N4—R4—N5—R5—N6—R6—N7
(2)根据输入的顺序,将初始的路由表输出。
(3)更新之后的路由表信息。
由此可得出测试即如果正确。
4结束语
这两周的课程设计令我受益匪浅,使我更加深入的理解了RIP报文的格式,RIP协议的原理及其距离向量的算法,使用C++来编写一个算法实现距离向量的算法。
当然,在课程设计的过程中遇到的困难也是很多的,比如,刚开始做的时候不知道如何下手,在设计过程中遇到看不懂的程序,程序错误连连,如何修改程序,修改出来的程序能否达到设计的要求等等。
开始编写的程序是通过将路由表的信息写入到一个TXT文档中,再通过文件函数来进行读取。
不过这样使得所有所有的路由表的信息处于一个固定的状态,不符合设计要求,后面通过修改程序,使用cin来手动输入路由信息,使得每次可以调节不同的路由信息,通过验证,可以得出,设计符合要求。
在编写距离向量算法的时候,也是通过多次修改才得以正确的结果。
这次课程设计最大的缺陷就是,在计算距离的时候,只考虑了所有的路由是串接的情况,设计的算法也是根据这样的接来进行计算,与实际情况有很大的出入。
当路由连接两个以上的网络的时候,会出现无法计算的情况。
所以这次的设计还是有很大的不足。
通过本次计算机网络课程设计,我更加充分的理解了课本上的知识,并能够加以扩展,从而应用于实践当中。
总之,通过不懈的努力,我们积极讨论,在愉快中很好的完成了自己的任务。
在课程设计期间也让自己学会了很多知识掌握的必要性。
选路信息协议RIP使用矢量距离算法来传播路由。
为了解决环路问题,RIP应用了诸如设置最大跳数,水平划分法,路由超时和毒性逆转等技巧。
但即便采用了上面的方法,路由循环的问题也不能完全解决,只是得到了最大程度的减少。
另外RIP协议也存在着一些很重要的缺陷,主要有以下几点:
(1)过于简单,以跳数为依据计算度量值,经常得出非最优路由。
(2)度量值以16为限,不适合大的网络。
(3)安全性差,接受来自任何设备的路由更新。
无密码验证机制,默认接受任何地方任何设备的路由更行。
(4)消耗带宽很大。
完整的复制路由表,把自己的路由表复制给所有邻居,尤其在低速广域网链路上更以显式的全量更新[5]。
参考文献
[1]陈鸣.计算机网络实验教程,从原理到实践.北京:
机械工业出版社,2007:
35-46
[2]谢希仁.计算机网络(第六版).北京:
电子工业出版社,2013:
152-157.
[3]谭浩强.C++面向对象程序设计.北京:
清华大学出版社,2006:
37-48,101.
[5]李峰,谢科.C语言程序设计.上海:
复旦大学出版社,2012:
98-103
[5]陆魁军.计算接网络基础实践教程.北京:
清华大学出版社,2005:
78
附件1:
RIP模拟距离向量算法源程序
#include<
iostream>
fstream>
string>
sstream>
#include<
windows.h>
usingnamespacestd;
classRoute{//定义一个路由的类
public:
stringroute;
//路由器
stringnet_r;
//右边的网络
stringnet_l;
//左边的网络
};
classRoutelists{//定义一个路由标的类,包括:
stringnet;
//要到达的网络地址
intdistance;
//距离
stringnext_route;
//下一跳的路由
classNetwork{//构造一个类
Network();
//构造一个函数,控制输入的路由个数
voidshow();
//显示路由表
voidbgroutes();
//初始化路由表
voidchange(inti);
//相邻路由表
voidchange2(inti);
voidupdate(inti,intj);
//更新相邻的路由表
voidUPDATE();
//更新所有的路由表
boolneighbor(inti,intj);
//判断两个路由是否是相邻的
Routelistsrts[20][10];
//在路由表中定义一个数组
Routert[10];
//路由
private:
intn,n1;
inttiao[20];
ints2[20];
//构造函数
Network:
Network(){
请输入路由的个数:
cin>
>
//输入路由器个数
n1=n;
20;
j++)//将数组初始化为0
tiao[j]=0;
for(inttt=0;
tt<
tt++){//将数组初始化为0
s2[tt]=0;
inti=0;
请按照左边连接的网络路由名右边连接的网络的顺序依次输入"
while(n1--)//输入路由信息
{cout<
请输入第"
个路由拓扑信息"
rt[i].net_l;
rt[i].route;
rt[i].net_r;
i++;
//初始化路由表的输出
========初始路由信息拓扑信息如下所示:
//对相邻路由表,距离加1,下一跳变为该路由名字
change(inti){
rts[19][j].distance=rts[i][j].distance;
rts[19][j].next_route=rts[i][j].next_route;
rts[i][j].distance=rts[i][j].distance+1;
rts[i][j].next_route=rt[i].route;
//将改变后的路由表变回来
change2(inti){
n+1;
rts[i][j].distance=rts[19][j].distance;
rts[i][j].next_route=rts[19][j].next_route;
//对一个路由表进行更新操作
update(inti,intj){
intx,y;
ints1;
boolyou=true;
for(x=0;
x<
x++)
for(y=0;
y<
tiao[j];
y++)
if((rts[i][x].net)!
=(rts[j][y].net))
{
for(intt=0;
t<
t++)
{
if((rts[i][t].net)==(rts[j][y].net))you=false;
}
if(you)
{
rts[i][tiao[i]].net=rts[j][y].net;
rts[i][tiao[i]].distance=rts[j][y].distance;
rts[i][tiao[i]].next_route=rts[j][y].next_route;
s2[i]++;
}
you=true;
tiao[i]-s2[i];
if((rts[i][x].next_route)==(rts[j][y].next_route))
{
rts[i][x].net=rts[j][y].net;
rts[i][x].distance=rts[j][y].distance;
you=true;
if(rts[i][y].net==rts[j][x].net){
if(rts[i][y].distance<
=rts[j][x].distance)
{
you=false;
s1=y;
}
if(you)
rts[i][s1].next_route=rts[j][x].next_route;
rts[i][s1].distance=rts[j][x].distance;
//对所有路由表进行更新
UPDATE(){
for(intt=0;
n-1;
t++){
i++)
if(neighbor(i,j))
change(i);
update(j,i);
change2(i);
//判断两路由是否相邻
//主函数,只需将定义好的函数依次执行即可
intmain(){
NetworkRIP;
RIP.bgroutes();
RIP.show();
=============更新后的路由拓扑信息如下所示:
==============="
RIP.UPDATE();
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 207 贺婷 RIP 协议 模拟 实现