RIP协议路由表调整算法的实现c++编写.docx

上传人:b****5 文档编号:30235460 上传时间:2023-08-13 格式:DOCX 页数:19 大小:252.96KB
下载 相关 举报
RIP协议路由表调整算法的实现c++编写.docx_第1页
第1页 / 共19页
RIP协议路由表调整算法的实现c++编写.docx_第2页
第2页 / 共19页
RIP协议路由表调整算法的实现c++编写.docx_第3页
第3页 / 共19页
RIP协议路由表调整算法的实现c++编写.docx_第4页
第4页 / 共19页
RIP协议路由表调整算法的实现c++编写.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

RIP协议路由表调整算法的实现c++编写.docx

《RIP协议路由表调整算法的实现c++编写.docx》由会员分享,可在线阅读,更多相关《RIP协议路由表调整算法的实现c++编写.docx(19页珍藏版)》请在冰豆网上搜索。

RIP协议路由表调整算法的实现c++编写.docx

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;i

rts[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;i

cout<<""<<"第"<

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;t

for(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;i

outfile1<

}

outfile1.close();

ofstreamoutfile2("R2.txt");

for(intj=0;j

outfile2<

}

outfile2.close();

ofstreamoutfile3("R3.txt");

for(intk=0;k

outfile3<

}

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1