顺序查找路由表实习报告.docx
《顺序查找路由表实习报告.docx》由会员分享,可在线阅读,更多相关《顺序查找路由表实习报告.docx(13页珍藏版)》请在冰豆网上搜索。
![顺序查找路由表实习报告.docx](https://file1.bdocx.com/fileroot1/2023-3/18/4b517fce-883c-4cf0-9a24-17b3161592aa/4b517fce-883c-4cf0-9a24-17b3161592aa1.gif)
顺序查找路由表实习报告
计算机网络实习报告
论文题目顺序查找路由表
学生专业班级
学生姓名(学号)
指导教师
完成时间2010年05月22日
实习(设计)地点信息楼139(112)机房
2010年05月22日
实习报告任务书
学生姓名指导教师
论文题目顺序查找路由表
论文内容:
编写计算机程序,用“目的网络、掩码、下一跳”的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳并输出。
资料、数据、技术水平等方面的要求:
要求查阅网络相关书籍与报刊等资料,明确用到的网络拓扑结构、功能及用法,能进行网络连接与设计。
能对组成各个功能单元如PC机、路由器进行参数设置,对网络初始化定义及功能的描述。
使网络具有实际网络的功能,路由表建立、路由更新、路由查找,最短路由查询功能。
发出任务书日期2010年05月17日完成论文日期2010年05月22日
教研室意见(签字)
院长意见(签字)
顺序查找路由表
一.实验目的
1.认识路由器及路由建立与更新的原理。
2.理解、掌握分组转发的概念。
3.能够用距离向量算法建立一个路由表并对“邻居”来的数据进行更新。
4.所实现的路由器模拟Internet上的IP路由器,它能确定网络的最短路由,并在其上传输分组。
二.原理概述
使用子网划分后,路由表必须包含:
目的地址,子网掩码,下一跳地址。
路由器分组转发的算法如下:
(1)从收到的数据包的首部提取目的IP地址D;
(2)对路由器直接相连的网络逐个进行检查:
用个网络的掩码和D逐位相“与”
看结果是否和相应的网络地址匹配。
若匹配,则把分组直接交付,转发任务结束,否则就是间接交付执行(3)。
(3)若路由表中有目的地址为D特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器否则执行(4)。
(4)对路由表的每一行,用其中的子网掩码和D逐位相“与”,其结果为N。
若N与该行的目的网络相匹配,则把数据报送给该行指明的下一跳路由器;否则执行(5)。
(5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行(6)。
(6)报告转发分组出错,没有查找到路由。
三.设计方案
利用C++语言编写程序模拟路由器顺序查找路由表。
首先建立一个路由表RouteTable:
128.96.39.0|
255.255.255.128|
2128.96.39.128|
255.255.255.128|
3128.96.40.0|
255.255.255.128|
6192.4.153.0|
255.255.255.192|
输入一个目的地址,将此目的地址与子网掩码进行“与”运算,所得结果与路由表中的某条记录相比较,从而找到目的网络地址,将数据从对应的端口转发出去。
期间可能要进行多次匹配,但只要输入的目的地址合理,一般就能查到。
注意:
多编写的路由表要放在程序所指的位置,否则会显示读取文件失败。
四.程序编写
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
classAddr//地址类,4个分量
{
public:
Addr(stringstr);//构造函数
Addr(constAddr&address);//拷贝构造函数
//ostream&operator<<(ostream&out,constAddr&object);//向默认输出设备输出,暂不提供
//Addr&operator=(constAddr&object);//发现会造成内存泄漏,所以先取消掉他
booloperator==(constAddr&object);
//为了效率,相等操作符只比较整型IP地址,不比较bitset型
Addr&operator&=(constAddr&object);
voidoutput();//输出IP地址
~Addr();
private:
intstr_to_int(stringstr);//这个函数进行字符串到整形数的转换,由于它只是私有函数,所以函数实现中只进行了基本
///的错误检测,对很多输入错误没有进行检测
inlinevoidset(stringstr);//把IP地址存到对象中,因为效率,这个函数声明为inline
bitset<8>*bin_addr1,*bin_addr2,*bin_addr3,*bin_addr4;
//这里把bitset声明成指针类型是因为标准库中只提供构造时从无符号长整型向二进制转换
///而初始化静态成员只能在类初始化列表中,这时还没获得用于初始化的字符串,所以只能
///采用动态的内存管理,给理解上造成少许不便
intint_addr1,int_addr2,int_addr3,int_addr4;//整数分别存IP地址
};
Addr:
:
Addr(std:
:
stringstr){set(str);}
Addr:
:
Addr(constAddr&address)
{
int_addr1=address.int_addr1;
int_addr2=address.int_addr2;
int_addr3=address.int_addr3;
int_addr4=address.int_addr4;
bin_addr1=newbitset<8>(*(address.bin_addr1));
bin_addr2=newbitset<8>(*(address.bin_addr2));
bin_addr3=newbitset<8>(*(address.bin_addr3));
bin_addr4=newbitset<8>(*(address.bin_addr4));
}
Addr:
:
~Addr()
{
deletebin_addr1;
deletebin_addr2;
deletebin_addr3;
deletebin_addr4;
}
structRouteTable
{Addr*dest;//目的地
Addr*mask;//掩码
intnextdump;//下一跳
};
inlinevoidAddr:
:
set(stringstr)//把IP地址存到对象中,因为效率,这个函数声明为inline
{
stringstrtemp;
intcount=1;
intsize=int(str.size());
for(string:
:
iteratorpos=str.begin();pos!
=str.end();++pos)
{
if(*pos=='.'||*pos=='|')
{
switch(count){
case1:
int_addr1=str_to_int(strtemp);
bin_addr1=newbitset<8>(unsignedlong(int_addr1));
break;
case2:
int_addr2=str_to_int(strtemp);
bin_addr2=newbitset<8>(unsignedlong(int_addr2));
break;
case3:
int_addr3=str_to_int(strtemp);
bin_addr3=newbitset<8>(unsignedlong(int_addr3));
break;
case4:
int_addr4=str_to_int(strtemp);
bin_addr4=newbitset<8>(unsignedlong(int_addr4));
break;
}
++count;
strtemp.erase();
}
else
{strtemp+=*pos;}
}
return;
}
intAddr:
:
str_to_int(stringstr)//这个函数进行字符串到整形数的转换
{
string:
:
iteratorpos=str.begin();
charchtemp;
inttemp,result=0;
intsize=int(str.size());
if(size==1&&*pos=='0')
return0;
for(inti=size;i>=1;--i)
{
chtemp=*pos;
switch(chtemp){
case'0':
temp=0;
break;
case'1':
temp=1;
break;
case'2':
temp=2;
break;
case'3':
temp=3;
break;
case'4':
temp=4;
break;
case'5':
temp=5;
break;
case'6':
temp=6;
break;
case'7':
temp=7;
break;
case'8':
temp=8;
break;
case'9':
temp=9;
break;
default:
return-1;//不是数字字符,出错
}
if(i==3)
result=temp*100+result;
elseif(i==2)
result=temp*10+result;
elseif(i==1)
result=temp+result;
else
return-1;//防止错误发生
++pos;//迭代器后移
}
returnresult;
}
voidAddr:
:
output()
{
cout<<return;
}
boolAddr:
:
operator==(constAddr&object)
{return(object.int_addr1==int_addr1&&object.int_addr2==int_addr2
&&object.int_addr3==int_addr3&&object.int_addr4==int_addr4);
}
Addr&Addr:
:
operator&=(constAddr&object)
{
*bin_addr1&=*object.bin_addr1;
*bin_addr2&=*object.bin_addr2;
*bin_addr3&=*object.bin_addr3;
*bin_addr4&=*object.bin_addr4;
int_addr1=int(bin_addr1->to_ulong());
int_addr2=int(bin_addr2->to_ulong());
int_addr3=int(bin_addr3->to_ulong());
int_addr4=int(bin_addr4->to_ulong());
return*this;
}
intloadrt(stringfilename,list&rt)
{
ifstreaminfile;
infile.open(filename.c_str());
if(!
infile){
cerr<<"打开文件失败!
"<system("PAUSE");
return-1;
}
stringdest,mask;
intnextdump;
RouteTable*temprt;
while(!
infile.eof())
{
infile>>dest>>mask>>nextdump;
temprt=newRouteTable;
(*temprt).dest=newAddr(dest);
(*temprt).mask=newAddr(mask);
(*temprt).nextdump=nextdump;
rt.push_back(*temprt);
}
return0;
}
intmain()
{
stringfilename="e:
\\RouteTable.txt";
listrt;
loadrt(filename,rt);//从文件载入路由表//destAddr->output();//输出路由表内容
cout<<"当前路由表内容:
\n"<list:
:
iteratorrtlist=rt.begin();
intcount=1;
while(rtlist!
=rt.end())
{
cout<<"第"<\n";
cout<<"目的地址:
";
(*rtlist).dest->output();
cout<<"子网掩码:
";
(*rtlist).mask->output();
cout<<"下一跳:
"<<(*rtlist).nextdump<<"\n"<++count;
++rtlist;
}
cout<<"开始模拟路由器转发分组过程:
";
//system("PAUSE");
cout<<"\n";
cout<<"输入要送达的目的地址,程序将模拟路由器查找路由表的过程,用‘|’结束:
\n";
stringdestnation;
cin>>destnation;
cout<<"\n";
Addr*destAddr=newAddr(destnation);//用子网掩码确定子网
Addr*tempAddr=newAddr(*destAddr);
count=1;
for(rtlist=rt.begin();rtlist!
=rt.end();++rtlist)
{
*tempAddr&=*((*rtlist).mask);
cout<<"与子网掩码与运算后的结果:
";
tempAddr->output();
cout<<"与路由表第"<\n";
if(*tempAddr==*((*rtlist).dest)){
cout<<"找到目的网络地址:
";
(*rtlist).dest->output();
cout<<"将数据从端口"<<(*rtlist).nextdump<<"转发"<cout<<"转发完毕!
将结束程序\n"<system("PAUSE");
return0;
}
cout<<"第"<system("PAUSE");
cout<<"\n";
++count;}
cout<<"\n查找整个路由表也没找到目的网络,结束。
"<system("PAUSE");
return0;
}
五.运行结果
输入目的地址:
192.4.153.17|,回车。
程序将顺序查找路由表。
经过一系列的匹配,最终,数据由端口6转发出去了。
六.实习心得和体会
通过这一个周的实习,我感觉有很大的收获:
1.首先,通过学习使自己对课本上的知识可以应用于实际,使得理论与实际相结合,加深自己对课本知识的更好理解,同时实习也锻炼了我个人的动手能力:
能够充分利用图书馆去查阅资料,增加了许多课本以外的知识。
2.了解了路由器的相关知识,划分子网构造超网的概念,路由表的的基本知识,路由表建立及更新,分组转发数据报,等等。
通过网络连接,掌握了简单路由元器件配置,对故障的诊断和排除以及对其原理工作有了一般掌握。
3.与同学分工合作,加强了团队精神与合作意识,培养严谨的工作作风,养好良好的工作习惯,培养正确的劳动观与人生观,也培养团队集体精神。
4.这次实习,培养我们的实践能力和创新精神。
加强了我的动手能力,我对问题的分析能力,以及发现并解决问题的能力
5.我觉得心态问题是很重要的,有好的心态就会努力,做事效果也是事半功倍。
还要有扎实的理论知识,在操作时知道自己的目的,使学到的理论知识得到验证。
6.有不懂的要向大家和老师请教。
从中我体味到了要不断动手,不断向他人学习,这样才能不断提高自己,在挫折中不断磨练自己,坚持就是胜利。
实习成绩评定表
学生姓名
专业班级
通信07级2班
论文题目
顺序查找路由表
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字
年月日