1、顺序查找路由表实习报告计算机网络实习报告论 文 题 目 顺序查找路由表 学生专业班级 学生姓名(学号) 指 导 教 师 完 成 时 间 2010年05月22日 实 习(设计)地点 信息楼139(112)机房 2010 年 05 月 22 日实 习 报 告 任 务 书学生姓名 指导教师 论文题目 顺 序 查 找 路 由 表 论文内容: 编写计算机程序,用“目的网络、掩码、下一跳”的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳并输出。 资料、数据、技术水平等方面的要求: 要求查阅网络相关书籍与报刊等资料,明确用到的网络拓扑结构、功能及用法,能进行网络连接与设计。能对组成
2、各个功能单元如PC机、路由器进行参数设置,对网络初始化定义及功能的描述。使网络具有实际网络的功能,路由表建立、路由更新、路由查找,最短路由查询功能。 发出任务书日期 2010年05月17日 完成论文日期 2010年05月22日教研室意见(签字) 院长意见(签字) 顺序查找路由表一实验目的1认识路由器及路由建立与更新的原理。2理解、掌握分组转发的概念。3. 能够用距离向量算法建立一个路由表并对“邻居”来的数据进行更新。4所实现的路由器模拟Internet上的IP路由器,它能确定网络的最短路由,并在其上传输分组。二原理概述使用子网划分后,路由表必须包含:目的地址,子网掩码,下一跳地址。路由器分组转
3、发的算法如下: (1)从收到的数据包的首部提取目的IP地址D; (2)对路由器直接相连的网络逐个进行检查:用个网络的掩码和D逐位相“与”看结果是否和相应的网络地址匹配。若匹配,则把分组直接交付,转发任务结束,否则就是间接交付执行(3)。(3)若路由表中有目的地址为D特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器否则执行(4)。(4)对路由表的每一行,用其中的子网掩码和D逐位相“与”,其结果为N。若N与该行的目的网络相匹配,则把数据报送给该行指明的下一跳路由器;否则执行(5)。(5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行(6)。(6)报告转发分
4、组出错,没有查找到路由。三设计方案 利用C+语言编写程序模拟路由器顺序查找路由表。首先建立一个路由表RouteTable:128.96.39.0|255.255.255.128|2 128.96.39.128|255.255.255.128|3 128.96.40.0|255.255.255.128|6 192.4.153.0|255.255.255.192| 输入一个目的地址,将此目的地址与子网掩码进行“与”运算,所得结果与路由表中的某条记录相比较,从而找到目的网络地址,将数据从对应的端口转发出去。期间可能要进行多次匹配,但只要输入的目的地址合理,一般就能查到。注意:多编写的路由表要放在程序
5、所指的位置,否则会显示读取文件失败。四程序编写 #include #include #include #include #include #include #include using namespace std; class Addr/地址类,4个分量 public: Addr(string str);/构造函数 Addr(const Addr &address);/拷贝构造函数 /ostream& operator (ostream& out,const Addr &object);/向默认输出设备输出,暂不提供 /Addr& operator= (const Addr& object);
6、/发现会造成内存泄漏,所以先取消掉他 bool operator= (const Addr& object); /为了效率,相等操作符只比较整型IP地址,不比较bitset型 Addr& operator&= (const Addr& object); void output();/输出IP地址 Addr(); private: int str_to_int(string str); /这个函数进行字符串到整形数的转换,由于它只是私有函数,所以函数实现中只进行了基本 /的错误检测,对很多输入错误没有进行检测 inline void set(string str);/把IP地址存到对象中,因为效
7、率,这个函数声明为inline bitset *bin_addr1, *bin_addr2, *bin_addr3, *bin_addr4; /这里把bitset声明成指针类型是因为标准库中只提供构造时从无符号长整型向二进制转换 /而初始化静态成员只能在类初始化列表中,这时还没获得用于初始化的字符串,所以只能 /采用动态的内存管理,给理解上造成少许不便 int int_addr1, int_addr2, int_addr3, int_addr4;/整数分别存IP地址 ; Addr:Addr(std:string str) set(str); Addr:Addr(const Addr &addr
8、ess) int_addr1 = address.int_addr1; int_addr2 = address.int_addr2; int_addr3 = address.int_addr3; int_addr4 = address.int_addr4; bin_addr1 = new bitset(*(address.bin_addr1); bin_addr2 = new bitset(*(address.bin_addr2); bin_addr3 = new bitset(*(address.bin_addr3); bin_addr4 = new bitset(*(address.bin
9、_addr4); Addr:Addr() delete bin_addr1; delete bin_addr2; delete bin_addr3; delete bin_addr4; struct RouteTable Addr* dest;/目的地 Addr* mask;/掩码 int nextdump;/下一跳 ; inline void Addr:set(string str)/把IP地址存到对象中,因为效率,这个函数声明为inline string strtemp; int count = 1; int size = int(str.size(); for(string:iterat
10、or pos = str.begin(); pos != str.end(); +pos) if(*pos = .| *pos = |) switch(count) case 1: int_addr1 = str_to_int(strtemp); bin_addr1 = new bitset (unsigned long(int_addr1); break; case 2: int_addr2 = str_to_int(strtemp); bin_addr2 = new bitset (unsigned long(int_addr2); break; case 3: int_addr3 = s
11、tr_to_int(strtemp); bin_addr3 = new bitset (unsigned long(int_addr3); break; case 4: int_addr4 = str_to_int(strtemp); bin_addr4 = new bitset (unsigned long(int_addr4); break; +count; strtemp.erase(); else strtemp += *pos; return ; int Addr:str_to_int(string str)/这个函数进行字符串到整形数的转换 string:iterator pos
12、= str.begin(); char chtemp; int temp, result = 0; int size = int(str.size(); if(size = 1 & *pos = 0) return 0; for(int i = 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
13、 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; else if(i = 2) result = temp*10 + result; else if(i = 1) result = temp + result; else return -1;/防止错误发生 +pos;/迭
14、代器后移 return result; void Addr:output() cout int_addr1 . int_addr2 . int_addr3 . int_addr4 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; int loadrt(string filename, list &rt) ifstream infile; infile.open(fil
15、ename.c_str(); if(!infile) cerr 打开文件失败! dest mask nextdump; temprt = new RouteTable; (*temprt).dest = new Addr(dest); (*temprt).mask = new Addr(mask); (*temprt).nextdump = nextdump; rt.push_back(*temprt); return 0; int main() string filename = e:RouteTable.txt; list rt; loadrt(filename, rt);/从文件载入路由
16、表/destAddr - output();/输出路由表内容 cout 当前路由表内容:n endl; list:iterator rtlist = rt.begin(); int count = 1; while(rtlist != rt.end() cout 第 count 条记录:n; cout output(); cout output(); cout 下一跳: (*rtlist).nextdump n endl; +count; +rtlist; cout 开始模拟路由器转发分组过程:; / system(PAUSE); cout n; cout destnation; cout n
17、; Addr* destAddr = new Addr(destnation);/用子网掩码确定子网 Addr* tempAddr = new Addr(*destAddr); count = 1; for (rtlist = rt.begin(); rtlist != rt.end(); +rtlist) *tempAddr &= *(*rtlist).mask); cout output(); cout 与路由表第 count 条记录记录的子网号相比较:n; if(*tempAddr = *(*rtlist).dest) cout output(); cout 将数据从端口 (*rtlis
18、t).nextdump 转发 endl; cout 转发完毕!将结束程序n endl; system(PAUSE); return 0; cout 第 count 次匹配完毕,没有找到目的网络,; system(PAUSE); cout n; +count; cout n查找整个路由表也没找到目的网络,结束。 endl; system(PAUSE); return 0; 五运行结果 输入目的地址:192.4.153.17|,回车。程序将顺序查找路由表。经过一系列的匹配,最终,数据由端口6转发出去了。六实习心得和体会 通过这一个周的实习,我感觉有很大的收获:1. 首先,通过学习使自己对课本上的知
19、识可以应用于实际,使得理论与实际相结合,加深自己对课本知识的更好理解,同时实习也锻炼了我个人的动手能力:能够充分利用图书馆去查阅资料,增加了许多课本以外的知识。2. 了解了路由器的相关知识,划分子网构造超网的概念,路由表的的基本知识,路由表建立及更新,分组转发数据报,等等。通过网络连接,掌握了简单路由元器件配置,对故障的诊断和排除以及对其原理工作有了一般掌握。3.与同学分工合作,加强了团队精神与合作意识,培养严谨的工作作风,养好良好的工作习惯,培养正确的劳动观与人生观,也培养团队集体精神。4. 这次实习,培养我们的实践能力和创新精神。加强了我的动手能力,我对问题的分析能力,以及发现并解决问题的能力5. 我觉得心态问题是很重要的,有好的心态就会努力,做事效果也是事半功倍。还要有扎实的理论知识,在操作时知道自己的目的,使学到的理论知识得到验证。6. 有不懂的要向大家和老师请教。从中我体味到了要不断动手,不断向他人学习,这样才能不断提高自己,在挫折中不断磨练自己,坚持就是胜利。实 习 成 绩 评 定 表学生姓名专业班级通信07级2班论文题目顺序查找路由表指导教师评语及意见:指导教师评阅成绩: 指导教师签字 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1