RIP路由算法实现.docx
- 文档编号:7093191
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:15
- 大小:114.66KB
RIP路由算法实现.docx
《RIP路由算法实现.docx》由会员分享,可在线阅读,更多相关《RIP路由算法实现.docx(15页珍藏版)》请在冰豆网上搜索。
RIP路由算法实现
RIP路由算法实现
【摘要】RIP协议作为一种最简单的内部网关协议,已经非常广泛的应用在网络的传输中。
并且在未来的IPV6也是占据很重要的位置。
RIP协议未来的发展与变化及其与其他内部网关协议的配合是很重要的事。
关键词RIP协议OSPF
一、RIP协议介绍
RIP(Routing informatiom Protocol)是应用较早、使用较普遍的内部网关协议( Interior Gateway Protocol ,简称IGP),适用于小型同类网络,是典型的距离向量(distance-vector)协议。
RIP协议是内部网关协议IGP中最广泛使用的协议,它是一种分布式的基于距离向量的路由选择协议,它最大的优点就是简单。
在国家性网络中如当前的因特网,拥有很多用于整个网络的路由选择协议。
作为形成网络的每一个自治系统,都有属于自己的路由选择技术,不同的 AS 系统,路由选择技术也不同。
作为一种内部网关协议或 IGP(普通内部网关协议),路由选择协议应用于 AS 系统。
连接 AS 系统有专门的协议,其中最早的这样的协议是“EGP”(外部网关协议),目前仍然应用于因特网,这样的协议通常被视为内部 AS 路由选择协议。
RIP 主要设计来利用同类技术与大小适度的网络一起工作。
因此通过速度变化不大的接线连接,RIP 比较适用于简单的校园网和区域网,但并不适用于复杂网络的情况。
二、RIP工作流程
Rip的工作流程图如下:
三、RIP的距离向量算法分析
矢量距离算法是路由器确定传播选路信息的一个经典算法,其思路是:
路由器在其路由表中列出了所有已知的路由,路由器启动时,对路由选择表进行初始化,每个与自己相连的目的网络生成一个表项,并给出相应的距离,距离通常用跳(Hop)数来表示。
每个路由器周期性地向与其直接相连的其他路由器发送自己的路由选择表,如路由器A收到路由器B发来的路由选择表后,A检查该路由选择表列出的每个目的站点以及到该目的站点的距离,如果B知道去目的站点更短的路由,或B列出了A不知道的目的站点,或A目前到某个目的站点的路由经过B,而B到该目的站点的距离有所改变,A就修改自己的路由选择表中相应的项目。
矢量距离的内容用一个序偶(V,D)来表示,V为目的站点,D为到该目的站点距离。
矢量距离算法的优点是易于实现,在构成路由表的过程中不消耗CPU资源。
但如果网络中路由变化迅速时,算法就难以稳定。
如果收到相邻路由器的一个RIP报文:
(1)先修改此RIP报文中的所有项目:
把“下一跳”字段中的地址都改成X,并把所有距离字段的值加1。
(2)对修改后的RIP报文中的每一个项目重复以下步骤:
若项目中的目的网络不在路由表中,则把该项目添加到路由表中。
否则
若下一条字段给出的路由器地址是同样的,则把收到的项目替换源路由表中的项目。
否则 若收到的项目镇南关的距离小于路由表中的距离,则进行更新。
否则什么也不做。
(3)若3分钟还没有收到相邻路语气的更新路由表,则把此相邻路由器记为不可达的路由器,即将距离置位16(距离为16表示不可达)。
(4)返回。
其实,这种算法的要点就是这样的:
设X是结点A到B的最短路劲上的一个结点。
若将路径A到B拆成两段路径A到X和X到B,则将每一段路径A到X和X到B也都分别是节点A到X和节点X到B的最短路径。
四、RIP算法处理流程图
三、测试结果与结果分析
1、先构建一个简易的网络,如下所示:
11–
32c
41–
51--
C
21–
31–
51--
D
B
21–
11--
A
2、在调试窗口输入以上路由信息,在输入距离大于16的时候会提示重新输入。
如下所示:
3、输入完成后回车得到如下路由器路由表
4、路由器更新后的结果
四、程序源代码
#include
#include
#include
voidmain()
{
structrouting
{
chardst[100];
inthopcount;
charnext_station[3];
};
structroutinga[50];
structroutingb[50];
structroutingc[50];
inti,j,r,k,x,y;
intp,q,n,s;
charm[3],l[3];
charstr[50]="目的网络距离下一跳路由器";
printf("请输入路由器R1的路由表:
\n");
for(i=0;i<=49;i++)
{
printf("目的网络:
");
scanf("%s",&a[i].dst);
printf("距离:
");
scanf("%d",&a[i].hopcount);
printf("下一跳:
");
scanf("%s",&a[i].next_station);
if(a[i].hopcount>=17)
{
printf("路由不可到达请重新输入距离:
\n");
printf("请输入路由器R1的路由表:
\n");
for(i=0;i<=49;i++)
{
printf("目的网络:
");
scanf("%s",&a[i].dst);
printf("距离:
");
scanf("%d",&a[i].hopcount);
printf("下一跳:
");
scanf("%s",&a[i].next_station);
break;
}
}
printf("是否继续输入(1==y2==n)\n");
scanf("%d",&p);
if(p==2)
break;
}
printf("请输入相邻路由器:
");
scanf("%s",m);
printf("请输入相邻路由器%s发来的更新信息:
\n",m);
for(j=0;j<=49;j++)
{
printf("目的网络:
");
scanf("%s",&b[j].dst);
printf("距离:
");
scanf("%d",&b[j].hopcount);
printf("下一跳:
");
scanf("%s",&b[j].next_station);
if(b[j].hopcount>=17)
{
printf("路由不可到达请重新输入距离:
\n");
printf("请输入相邻路由器%s的路由表:
\n",m);
for(j=0;j<=49;j++)
{
printf("目的网络:
");
scanf("%s",&b[j].dst);
printf("距离:
");
scanf("%d",&b[j].hopcount);
printf("下一跳:
");
scanf("%s",&b[j].next_station);
break;
}
}
printf("是否继续输入(1==y2==n)\n");
scanf("%d",&p);
if(p==2)
break;
}
printf("是否继续输入相邻路由器?
(1==y2==n)\n");
scanf("%d",&q);
if(q==1)
{
printf("请再次输入相邻路由器:
");
scanf("%s",l);
printf("请输入相邻路由器%s发来的更新信息:
\n",l);
for(r=0;r<=49;r++)
{
printf("目的网络:
");
scanf("%s",&c[r].dst);
printf("距离:
");
scanf("%d",&c[r].hopcount);
printf("下一跳:
");
scanf("%s",&c[r].next_station);
if(c[r].hopcount>=17)
{
printf("路由不可到达请重新输入距离:
\n");
printf("请输入相邻路由器%s路由表:
\n",l);
for(r=0;r<=49;r++)
{
printf("目的网络:
");
scanf("%s",&c[r].dst);
printf("距离:
");
scanf("%d",&c[r].hopcount);
printf("下一跳:
");
scanf("%s",&c[r].next_station);
break;
}
}
printf("是否继续输入(1==y2==n)\n");
scanf("%d",&p);
if(p==2)
break;
}
}
printf("路由器R1的路由表:
\n");
printf("----------------------------\n");
puts(str);
for(x=0;x<=i;x++)
printf("%s%d%s\n",a[x].dst,a[x].hopcount,a[x].next_station);
printf("----------------------------\n");
printf("\n");
printf("路由器%s的路由表:
\n",m);
printf("----------------------------\n");
puts(str);
for(x=0;x<=j;x++)
printf("%s%d%s\n",b[x].dst,b[x].hopcount,b[x].next_station);
printf("----------------------------\n");
printf("\n");
if(q==1)
{
printf("路由器%s的路由表:
\n",l);
printf("----------------------------\n");
puts(str);
for(x=0;x<=r;x++)
printf("%s%d%s\n",c[x].dst,c[x].hopcount,c[x].next_station);
printf("----------------------------\n");
printf("\n");
}
for(x=0;x<=j;x++)
{
b[x].hopcount++;//所有距离都加1
strcpy(b[x].next_station,m);//把下一跳的地址都改为X
}
if(q==1)
{
for(x=0;x<=r;x++)
{
c[x].hopcount++;//所有距离都加1
strcpy(c[x].next_station,l);//把下一跳的地址都改为X
}
}
printf("相邻路由器%s修改后信息:
\n",m);
printf("----------------------------\n");
puts(str);
for(x=0;x<=j;x++)
printf("%s%d%s\n",b[x].dst,b[x].hopcount,b[x].next_station);
printf("----------------------------\n");
printf("\n");
if(q==1)
{
printf("相邻路由器%s修改后信息:
\n",l);
printf("----------------------------\n");
puts(str);
for(x=0;x<=r;x++)
printf("%s%d%s\n",c[x].dst,c[x].hopcount,c[x].next_station);
printf("----------------------------\n");
printf("\n");
}
if(q==1)
{
k=i+1;
for(x=0;x<=j;x++)
{
n=0;
for(y=0;y<=i;y++)
{
if(strcmp(b[x].dst,a[y].dst)==0)//如果目的网络相同
{
if(strcmp(b[x].next_station,a[y].next_station)==0)//如果下一跳路由地址相同
a[y].hopcount=b[x].hopcount;//将收到的项目替换原路由表中项目
elseif(a[y].hopcount>b[x].hopcount)//否则若收到项目的路离小于路由表中的距离,则进行更新
{
a[y].hopcount=b[x].hopcount;//更新距离
strcpy(a[y].next_station,b[x].next_station);//更新下一跳路由的地址
}
}
else
{
n++;
}
}
if(n==i+1)//若项目中的目的网络不在路由表中,则将该项目加到路由表中
{
strcpy(a[k].dst,b[x].dst);
a[k].hopcount=b[x].hopcount;
strcpy(a[k].next_station,b[x].next_station);
k++;
}
}
k=k;
for(x=0;x<=r;x++)
{
s=0;
for(y=0;y<=k-1;y++)
{
if(strcmp(c[x].dst,a[y].dst)==0)//如果目的网络相同
{
if(strcmp(c[x].next_station,a[y].next_station)==0)//如果下一跳路由地址相同
a[y].hopcount=c[x].hopcount;//将收到的项目替换原路由表中项目
elseif(a[y].hopcount>c[x].hopcount)//否则若收到项目的路离小于路由表中的距离,则进行更新
{
a[y].hopcount=c[x].hopcount;//更新距离
strcpy(a[y].next_station,c[x].next_station);//更新下一跳路由的地址
}
}
else
{
s++;
}
}
if(s==k)//若项目中的目的网络不在路由表中,则将该项目加到路由表中
{
strcpy(a[k].dst,c[x].dst);
a[k].hopcount=c[x].hopcount;
strcpy(a[k].next_station,c[x].next_station);
k++;
}
}
}
else
{
k=i+1;
for(x=0;x<=j;x++)
{
n=0;
for(y=0;y<=i;y++)
{
if(strcmp(b[x].dst,a[y].dst)==0)//如果目的网络相同
{
if(strcmp(b[x].next_station,a[y].next_station)==0)//如果下一跳路由地址相同
a[y].hopcount=b[x].hopcount;//将收到的项目替换原路由表中项目
elseif(a[y].hopcount>b[x].hopcount)//否则若收到项目的路离小于路由表中的距离,则进行更新
{
a[y].hopcount=b[x].hopcount;//更新距离
strcpy(a[y].next_station,b[x].next_station);//更新下一跳路由的地址
}
}
else
{
n++;
}
}
if(n==i+1)//若项目中的目的网络不在路由表中,则将该项目加到路由表中
{
strcpy(a[k].dst,b[x].dst);
a[k].hopcount=b[x].hopcount;
strcpy(a[k].next_station,b[x].next_station);
k++;
}
}
}
printf("路由器R1更新后的路由表:
\n");
printf("----------------------------\n");
puts(str);
if(q!
=1)
{
if(k==i+1)//如果路由表中没有加入新的目的地址时的输出
{
for(x=0;x<=i;x++)
printf("%s%d%s\n",a[x].dst,a[x].hopcount,a[x].next_station);
printf("----------------------------\n");
printf("\n");
}
else
{
for(x=0;x<=k-1;x++)//加入了新目的地址时的输出
printf("%s%d%s\n",a[x].dst,a[x].hopcount,a[x].next_station);
printf("----------------------------\n");
printf("\n");
}
}
else
{
if(k==i+1)//如果路由表中没有加入新的目的地址时的输出
{
for(x=0;x<=i;x++)
printf("%s%d%s\n",a[x].dst,a[x].hopcount,a[x].next_station);
printf("----------------------------\n");
printf("\n");
}
else
{
for(x=0;x<=k-1;x++)//加入了新目的地址时的输出
printf("%s%d%s\n",a[x].dst,a[x].hopcount,a[x].next_station);
printf("----------------------------\n");
printf("\n");
}
}
system("Pause");
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RIP 路由 算法 实现