RIP协议路由表调整算法的实现c++编写.docx
《RIP协议路由表调整算法的实现c++编写.docx》由会员分享,可在线阅读,更多相关《RIP协议路由表调整算法的实现c++编写.docx(19页珍藏版)》请在冰豆网上搜索。
RIP协议路由表调整算法的实现c++编写
计算机网络
课程设计说明书
RIP协议路由表调整算法的实现
起止日期:
2012年06月18日至2012年06月22日
学生姓名
班级
通信
学号
成绩
指导教师(签字)
计算机与通信学院
2012年6月22日
RIP协议路由表调整算法的实现
一、设计目的
Ø理解RIP协议的工作原理;
Ø掌握RIP的收敛实现;
Ø根据相邻路由器传来的路由信息修改本站路由表。
二、设计内容
【主要要求】
1.熟悉RIP协议机制。
2.完成路由表的更新。
【方法提示】
1.用一个二维数组存储路由表。
2.用一个文件存储一个路由器的路由表,初始化为只含相邻网的路由(1跳)。
3.设计一个函数,实现路由表调整算法。
4.外循环:
每个节点读取相邻节点的路由表,更新自己的路由表。
5.内循环:
读取一个相邻节点的路由表,更新一次自己的路由表。
6.交互式确定,是否继续外循环(连续二次交换路由信息后路由表不在变化)。
【程序输出】
1.接收的相邻站的路由表。
2.本站调整前的路由表。
3.本站调整后的路由表。
【调试数据】一个小网络的路由收敛过程
如图,四个网络N、三个路由器R的小网
N1――R1――N2-―R2――N3――R3――N4
用四个文件存储四个路由器的路由表,初始化为只含相邻网的路由(1跳)。
(观察结果,多少次交换路由信息后路由表收敛,即路由表不在变化)
【选作】
1.增加一个网络和一个路由器,相邻节点交换路由表,直至路由表收敛(不在变化)。
2.删除一个网络和一个路由器,相邻节点交换路由表,直至路由表收敛(不在变化)。
三、实验基本原理
距离向量算法
对每一个相邻路由器发送过来的RIP报文,进行以下步骤:
(1)对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:
把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1.每一个项目都有三个关键数据,即:
到目的网络N,距离d,下一跳路由器是X。
(2)对修改后的RIP报文中的每一个项目,进行以下步骤:
若原来的路由表中没有目的网络N,则把该项目添加到路由表中。
否则,
若下一跳路由器的地址是X,则把收到的项目替换原路由表中的项目
否则
若收到的项目中的距离d小于路由表中的距离,则进行更新,
否则什么都不做。
(3)若3分钟还没有收到相邻路由器的更新路由表,则把次相邻路由器记为不可达的路由器,即把距离置为16.
(4)返回。
四、总体设计
RIP协议路由表调整算法的实现最重要的是距离向量算法的实现:
1.对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:
把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1.每一个项目都有三个关键数据,即:
到目的网络N,距离d,下一跳路由器是X。
voidNetwork:
:
change(inti){
for(intj=0;j{
rts[i][j].distance=rts[i][j].distance+1;
rts[i][j].next_route=rt[i].route;
}
}
2.若原来的路由表中没有目的网络N,则把该项目添加到路由表中。
intx,y;
ints1;
boolyou=true;
for(x=0;x{
for(y=0;y{
if((rts[i][x].net)!
=(rts[j][y].net))
{
for(intt=0;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;
tiao[i]++;
s2[i]++;
}
}
you=true;
}
}
3.若下一跳路由器的地址是X,则把收到的项目替换原路由表中的项目
for(x=0;x{
for(y=0;y{
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;
}
}
}
4.若收到的项目中的距离d小于路由表中的距离,则进行更新
you=true;
for(x=0;x{
for(y=0;y{
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;
}
you=true;
}
}
}
五、源程序
在源程序文件夹下的初始化data.txt
//中间是路由器,自己添加
N1R1N2
N2R2N3
N3R3N4
N4R4N5
N5R5N6
N6R6N7
#include
#include
#include
#include
#include
usingnamespacestd;
classRoute{
public:
stringroute;
stringnet_r;
stringnet_l;
};
classRoutelists{
public:
stringnet;
intdistance;
stringnext_route;
};
classNetwork{
public:
Network();
voidshow();
voidbgroutes();
voidchange(inti);
voidchange2(inti);
voidupdate(inti,intj);
voidUPDATE();
boolneighbor(inti,intj);
Routelistsrts[20][12];
Routert[20];
voidsave();
private:
intn,n1;
inttiao[20];
ints2[20];
};
//构造函数
Network:
:
Network(){
cin>>n;//输入路由器个数
n1=n;
for(intj=0;j<20;j++)
{
tiao[j]=0;
}
for(inttt=0;tt<20;tt++){
s2[tt]=0;
}
ifstreaminfile("data.txt",ios:
:
in);
if(!
infile)
{
cerr<<"openerror!
"<exit
(1);
}
inti=0;
while(n1--)
{
infile>>rt[i].net_l>>rt[i].route>>rt[i].net_r;
i++;
}
infile.close();
}
//初始化路由表
voidNetwork:
:
bgroutes(){
ofstreamoutfile("R.txt");
if(!
outfile)
{
cerr<<"openerr.txterror!
"<exit
(1);
}
for(inti=0;irts[i][0].net=rt[i].net_l;
rts[i][0].distance=1;
rts[i][0].next_route="直接交付";
outfile<tiao[i]++;
rts[i][1].net=rt[i].net_r;
rts[i][1].distance=1;
rts[i][1].next_route="直接交付";
outfile<tiao[i]++;
}
outfile.close();
}
//显示所有路由表
voidNetwork:
:
show(){
for(inti=0;icout<<""<<"第"<
for(intj=0;j{
cout<<""<}
cout<}
cout<cout<cout<}
//对相邻路由表,距离加1,下一跳变为该路由名字
voidNetwork:
:
change(inti){
for(intj=0;j{
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;
}
}
//将改变后的路由表变回来
voidNetwork:
:
change2(inti){
for(intj=0;j{
rts[i][j].distance=rts[19][j].distance;
rts[i][j].next_route=rts[19][j].next_route;
}
}
//对一个路由表进行更新操作
voidNetwork:
:
update(inti,intj){
intx,y;
ints1;
boolyou=true;
for(x=0;x{
for(y=0;y{
if((rts[i][x].net)!
=(rts[j][y].net))
{
for(intt=0;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;
tiao[i]++;
s2[i]++;
}
}
you=true;
}
}
for(x=0;x{
for(y=0;y{
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;
for(x=0;x{
for(y=0;y{
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;
}
you=true;
}
}
}
}
//对所有路由表进行更新
voidNetwork:
:
UPDATE(){
charstop;
for(intt=0;tfor(intj=0;j{
for(inti=0;i{
if(neighbor(i,j))
{
change(i);
update(j,i);
change2(i);
//Sleep(1000);
stop=getchar();
cout<<"================================================="<cout<<"根据第"<
cout<<"================================================="<for(intx=0;x{
cout<<""<<"第"<for(inty=0;y{
cout<<""<}
cout<}
cout<cout<cout<}
}
}
}
}
//判断两路由是否相邻
boolNetwork:
:
neighbor(inti,intj){
if(i-j==1)returntrue;
if(j-i==1)returntrue;
returnfalse;
}
//保存
voidNetwork:
:
save(){
ofstreamoutfile1("R1.txt");
for(inti=0;ioutfile1<}
outfile1.close();
ofstreamoutfile2("R2.txt");
for(intj=0;joutfile2<}
outfile2.close();
ofstreamoutfile3("R3.txt");
for(intk=0;koutfile3<}
outfile3.close();
}
intmain(){
Networkgfw;
gfw.bgroutes();
gfw.show();
gfw.UPDATE();
gfw.show();
gfw.save();
return0;
}
六、程序运行情况
1.初始化的路由表
2.更新中的路由表
3.更新完后的路由表
七、实验总结
通过本次课程设计,我RIP协议的理解更深了,最重要的是,在编写距离路由算法时,经过多次的修改完善,对于距离向量算法的理解更加透彻,其实这次课程设计的难度就是距离路由算法的实现,在这一次的课程设计后,对因特网的路由选择协议的理解由略懂到完全理解,感觉学到了很多。
当然,自己对计算机网络其他方面的问题还有很多不懂,还需更加努力的学习。
最后,谢谢金老师这几天的细心指导。
参考文献
【1】陆魁军等编著计算机网络基础实践教程.北京:
清华大学出版社,2005.11
【2】谭浩强编著C++程序设计.北京:
清华大学出版社,2004,6
【3】谭浩强编著C程序设计.北京:
清华大学出版社,2005,7
【4】王洪涛编著深入剖析VisualC++.北京:
人民邮电出版社,2003,3
【5】陈良伦编著网络工程概论.北京:
机械工业出版社,2007,4