顺序查找路由表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
表3-1路由表
目的网络地址
子网掩码
下一跳
128.30.33.0
128.30.33.128
128.30.36.0
255.255.255.128
255.255.255.128
255.255.255.0
接口0
接口1
R2
然后可以任意输入一个目的地址IP,在示范运行时用到的目的地址IP是:128.30.33.138和128.3.2.136。目的地址IP与路由表中的第一组子网掩码逐位相与,如果相与结果与其对应的目的网络地址匹配,则它的下一跳是该子网掩码对应的下一跳;不匹配,则目的地址IP与第二组子网掩码进行逐位相与,看其结果。就这样,目的地址IP顺序与路由表中的子网掩码进行相与,直到找到下一跳为止,若是找不到,则输出“转发分组出错”。
青 岛 农 业 大 学
理学与信息科学学院
计算机网络综合实习报告
题目
专 业
学 号
姓 名
指导教师
日 期
一、
1.了解路由器更新的原理。
2.了解表示路由器的结构。
3.掌握路由器转发分组的算法。
二、
编写计算机程序,用(目的网络,掩码,下一跳)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出。
五、
这次课程设计我又一次复习了计算机网络方面的知识,学会了动态建立数组,多次运用了方法调用,提高效率。
这次课程设计不止让我学到了很多,还让我知道了许多自己的不足之处。通过这次顺序查找路由器程序的设计,我充分认识到应该将理论付诸于实践的重要性。
这次我做的题目要求是编写计算机程序,用(目的网络,掩码,下一跳)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出。在当初学习计算机网络时,顺序查找路由器的这个知识点非常明白,自己思路和计算也很简单,就是当来一个数据报时,抓出IP地址,与子网掩码相与得出网络号,再与路由表中数据相对比,查询下一跳,思路简单、清晰、明了。但是简单的人工计算转化成计算机语言真的很不简单。做这个程序花费了我很大的精力,有时候想到了一些功能,但就是不能用语言去实现它,这暴露了我将计算机语言等方面的理论知识和应用实践相结合的能力有所欠缺的弱点,使我充分认识到自己编程能力方面的不足。希望通过后期的努力,能让我这方面的能力有所提高。
(2).int subnet[3][4]:子网掩码。
(3).string next[3]:下一跳。
编译链接后,开始运行,循环输入路由器(目的网络,子网掩码,下一跳)的三组数据,如图3-1所示:
图3-1输入数据显示路由表
显示出路由表之后,再任意输入一个目的地址IP,比如:128.30.33.138。如图3-2所示:
附录:
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
int M[10],N[10],K[10];
int A,I,flag;
int IP[4];
int pur_net[3][4];
{
cin>>IP[i];
}
cout<<"您输入的目的地址是:";
for (i=0;i<3;i++)//显示目的地址
{
cout<<IP[i]<<".";
}
cout <<IP [3]<<endl;
cout<<endl;
}
int zore_one(int n)//将十进制数除2取余,结果先正排
{
A=0;
ofstream outfile("1.txt");//定义文件输出对象,打开1.txt
{
input1();
cout<<"路由器建立的路由表如下:"<<endl;
cout<<endl;
cout<<"目的网络"<<"\t"<<"子网掩码"<<"\t"<<"下一跳"<<endl;
output2();
cout <<"请输入一个目的地址:"<<endl;
int i;
for (i=0;i<4;i++)//输入目的地址
}
cout <<pur_Βιβλιοθήκη Baiduet[i][3];
cout<<"\t\t";
for (k=0;k<3;k++)
{
cout<<subnet[i][k]<<".";
}
cout <<subnet[i][3];
cout<<"\t\t"<<next[i]<<endl;
}
}
void output1()//循环显示整个路由表
{
a1=L[i];
sum=pow(2,a2)*a1+sum;
a2++;
}
and_result[I]=sum;
cout<<sum<<".";
}
int main()
{
output1();
int k,i;
for(k=0;k<3;k++)//计算网络地址IP与子网掩码相与的结果,查找下一跳
{
cout<<"IP与第"<<k+1<<"组子网掩码相与的结果是:";
{
int i,B,C;
zore_one(a);
B=A;
ifstream infile("1.txt");//定义文件输入流对象
for(i=0;i<B;i++)
{
infile>>M[i];//从磁盘文件顺序读入B个数据
}
zore_one(b);
C=A;
ifstream ifile("1.txt");
for(i=0;i<A;i++)
{
ifile>>N[i];//从磁盘文件顺序读入A个数据
}
if(C>B){C=B;}//取二者最小值
for(i=0;i<C;i++)//二者逐位相与
{
if(M[i]==1&&N[i]==1)
K[i]=1;
else
K[i]=0;
}
int y=C;
while(K[y]==0)//从最后一位开始寻找第一个不为0的数的位置
int subnet[3][4];
string next[3];
int and_result[4];
void input1()//循环输入路由器(目的网络,子网掩码,下一跳)
{int i,k;
for (i=0;i<3;i++)
{
cout<<"请输入第"<<i+1<<"组目的网络地址:"<<endl;
I=0;
flag=0;
for(i=0;i<4;i++)
{
AND(IP[i],subnet[k][i]);
I++;
if(pur_net[k][i]==and_result[i])
{
flag++;
}
else flag=0;
}
cout<<endl;
switch(flag)
{
case 0: cout<<"IP与第"<<k+1<<"组子网掩码相与结果与其网络地址不匹配。"<<endl;break;
case 1: cout<<"IP与第"<<k+1<<"组子网掩码相与结果与其网络地址不匹配。"<<endl;break;
int a[10],b,i=0;
while(n>0)
{
b=n%2;
if(b!=0)
{n=(n-1)/2;}
else
{n=n/2;}
a[i]=b;
outfile<<a[i]<<" ";//向文件1.txt中输出二进制数
i++;
}
A=i;
return 0;
}
void AND(int a,int b)//a,b逐位相与,结果倒排,二进制转换为十进制
(3)若路由表中有目的地址为D特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器否则执行(4)。
(4)对路由表的每一行,用其中的子网掩码和D逐位相“与”,其结果为N。若N与该行的目的网络相匹配,则把数据报送给该行指明的下一跳路由器;否则执行(5)。
(5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行(6)。
{
y--;
}
y=y+1;
int q=0;
int *L=new int[y];//动态定义数组
for(i=y-1;i>=0;i--)//将相与的结果二进制进行倒排
{
L[q]=K[i];
q++;
}
int sum=0;
int a1;
int a2=0;
for(i=q-1;i>=0;i--)//将二进制转换为十进制
在这次课程设计中,我遇到了许多的问题。有不会的时候我就去翻看以前的C语言、C++等专业课资料去解决,有时直接上网查找答案,但是当看书和上网查找都不能找到我要的答案以后,请教周围的同学就是一种比较简便的方法。
六、
[1]谢希仁.计算机网络.电子工业出版社,2008.1.
[2]谭浩强.C++面向对象程序设计.清华大学出版社,2006.1.
(6)报告转发分组出错,没有查找到路由。
简单来说,就是当来一个数据报时,抓
出IP地址,与子网掩码相与得出网络号。再与路由表相对比,查询下一跳。
3
此程序是编写了一些方法,然后在主程序中进行调用,还定义了一些数组,有的用到了动态定义数组。
在这个程序中定义路由器的一个路由表中有三组数据,任意输入三组数据。在此程序示范运行时,用到的三组数据如表3-1所示:
{
cout<<"请输入第"<<i+1<<"组下一跳地址:"<<endl;
cin>>next[i];
}
}
void output2()//循环显示目的地址和子网掩码
{
int i,k;
for (i=0;i<3;i++)
{
for (k=0;k<3;k++)
{
cout<<pur_net[i][k]<<".";
for (k=0;k<4;k++)//输入目的网络
{
cin>>pur_net[i][k];
}
}
for (i=0;i<3;i++)
{
cout<<"请输入第"<<i+1<<"组子网掩码:"<<endl;
for (k=0;k<4;k++)//输入子网掩码
{
cin>>subnet[i][k];
}
}
for (i=0;i<3;i++)//输入下一跳
图3-2输入目的地址IP
然后按任意键继续,将网络地址IP与子网掩码进行逐位相与,寻找下一跳,如图3-3所示:
图3-3寻找下一跳
若输入的目的地址IP是:128.3.2.136,顺序查找路由表,没有找到它的下一跳,则输出“转发分组出错”。如图3-4所示:
图3-4转发分组出错
四、
这个顺序查找路由表的下一跳的程序设计不是很完美,有一些我认为应该有的功能都没有实现,比如从文本中读取路由表,这样方便一些,省的还要每次输入那么多的数据,若是在文本中读取路由表,直接更改文本中路由表的数据,就可以实现多个路由表的计算,在这儿所说的从文本中读取路由表,并不是简单地从磁盘文件中读取数据,并简单地将数据显示在显示器上,而是将从磁盘文件中读取的数据作为程序的输入数据进行运算。这个程序另外一个不完美的地方是输入一组目的地址IP,运行程序得出结论后,再一次输入另一组的目的地址IP进行计算的功能没有实现,意思就是说应该能够循环输入多组目的地址IP,使它们可以顺序查找同一个路由表,我做的这个顺序查找路由表程序若是还想输入另一组目的地址IP进行计算下一跳时,就必须再次重新运行程序,重新输入各组数据,这样太麻烦了。
在此程序中定义的主要方法有:
(1).voidzore_one(int n):表示将十进制参数n除2取余,得出的二进制序列正排。
(2).voidand(int a,int b):表示将参数a,b转换成二进制进行逐位相与得出二进制数,再将这个二进制数倒序,然后转换成十进制数。
定义的主要数组有:
(1).int pur_net[3][4]:目的网络地址。
三、
3.1
使用子网划分后,路由表必须包含:目的地址,子网掩码,下一跳地址。路由器分组转发的算法如下:
(1)从收到的数据包的首部提取目的IP地址D;
(2)对路由器直接相连的网络逐个进行检查:用个网络的掩码和D逐位相“与”,看结果是否和相应的网络地址匹配。若匹配,则把分组直接交付,转发任务结束,否则就是间接交付执行(3)。
相关文档
最新文档