Dynamips设计与分析-Dynamips及相关教学软件研究与设计目录摘 要 1Abstract 2前言 3第一章 Dynamips介绍 41.1 路由器简介 41.1.1 路由器的概念 41.1.2 路由器基本功能介绍 41.1.3 路由器的发展趋势 51.2 虚拟路由器技术 51.3 选择Dynamips的理由 71.3.1 模拟器的种类 71.3.2 模拟器的现状 71.3.3 模拟器的不可替代性探讨 81.4 Dynamips简介 81.5 Dynamips的功能 91.6 Dynamips分析流程 9第二章 需要仿真的CISCO设备的分析 .112.1 思科7200路由器 112.1.1 7200路由器介绍 112.1.2 7200路由器主要引擎 122.1.3 7200路由器的模块 132.1.4 7200路由器的启动过程 152.1.5 模拟7200路由器的实现 152.2 其它型号路由器 25第三章 需要仿真的通信层协议 263.1 物理层 263.1.1 物理层简介 263.1.2 用UDP报文模拟传输 293.2 数据链路层 293.2.1 数据链路层简介 293.2.2 虚拟帧中继交换机 293.2.3 虚拟以太网交换机 313.3 应用层 323.3.1 应用层简介 323.3.2 虚拟机 333.3.3 虚拟设备 333.3.4 虚拟输入输出 34第四章 各层实现方法 354.1 物理层的实现 354.2 数据链路层的实现 374.2.1 虚拟帧中继交换机的实现 374.2.2 虚拟以太网交换机的实现 404.3 应用层的实现 434.3.1 虚拟机的实现 434.3.2 虚拟设备的实现 474.3.3 虚拟输入输出的实现 51第五章 结论 56第六章 总结与体会 57谢辞 58参考文献 59附录 60翻译部分 342
Dynamips设计与分析-Dynamips及相关教学软件研究与设计毕业设计(论文)任务书 信息工程与自动化学 院 计算机科学与技术 专业 学生姓名: 毕业设计(论文)题目:DYNAMIPS及相关教学软件研究与设计 子题目:DYNAMIPS分析与设计 毕业设计(论文)内容:本课题题目是DYNAMIPS及相关教学软件研究与设计。该课题将在Dynamips的基础上,构造Cisco路由的仿真平台,该平台可以真实运行CISCO IOS软件,实现一个真实的网络教学环境。本设计将在Dynamips的基础上,进一步分析理解Dynamips原理,分析Dynamips如何实现Cisco路由的模拟。为了完成本次毕业设计,需要完成以下工作: 1. 通读DYNAMIPS除有关CPU,MIPS之外的所有源程序代码。2. 分析需要仿真的思科设备。3. 分析需要仿真的通信层协议。4. 分析各层的实现。目录
指导教师选题报告 1
教师毕业设计指导书 2
学生开题报告 5
指导教师指导记录表 9
指导教师评分表 10
评阅人评分表 11
答辩委员会评分表 12
综合评分表 12
答辩委员会评定 12
答辩记录 13
毕业设计选题报告一、 题目: DYNAMIPS及相关教学软件研究与设计二、 选题依据: 网络实验是网络教学中的重要环节,但学校能够提供的真实网络环境非常有限,本设计将在Dynamips的基础上,进一步分析理解Dynamips原理,掌握MIPS 指令集在X86体系上的仿真实现,并在此基础上,构造Cisco 7200高档路由,3600系列中档路由,2691低档路由的仿真平台,平台可以真实运行CISCO IOS软件,以上实现一个真实的网络教学环境,同时,同步开发网络拓朴设计、路由模块仿真等相关配套系统。三、 目的: 设计并实现一套基于Dynamips的网络教学实验平台。四、 要求: 参加本课题的学生应具有相应的软件开发的基础,对C语言有深入的理解,对汇编有较好的掌握。五、 主要内容: 课题将主要集中在如下方面:MIPS CPU仿真技术研究(一人)、DYNAMIPS分析与设计(一人)、基于DYNAMIPS的网络实验平台设计(一人)、网络拓扑图设计系统(一人)、硬件模块的仿真模拟(一人)等多个方面。六、 进行方式:课题采用教师辅导与学生开发的模式进行。整个设计过程可分为三个阶段:第一阶段为知识准备阶段,由老师对课题进行介绍,让学生了解系统的基本需求,并让学生熟悉所使用的开发工具。第二阶段为设计与编码阶段,主要有学生通读Dynamips代码,完成具体模块的代码实现,老师定期检查和辅导学生的工作。第三阶段为论文写作阶段,学生的主要编码工作基本结束,进行论文的编写阶段,老师定期检查学生的论文,并对论文的写作予以指导。七、 工作量大小: 该项目可充分满足学生的工作量;八、 准备程度、现有技术前期准备工作较为充分,对系统的需求已有了初步的设计和分析。九、 物质条件:可提供学生辅导场所,系统开发所需的软件,相关计算机参考书籍与文档。
毕业设计指导书主 题 目 DYNAMIPS及相关教学软件研究与设计 子题目 DYNAMIPS分析与设计 一. 系统设计的内容毕业设计(论文)的主要内容:本次毕业设计的题目是DYNAMIPS及相关教学软件研究与设计。本设计将在Dynamips的基础上,进一步分析理解Dynamips原理,并在此基础上,构造Cisco 7200高档路由,3600系列中档路由,2691低档路由的仿真平台,平台可以真实运行CISCO IOS软件,以上实现一个真实的网络教学环境,同时,同步开发网络拓朴设计、路由模块仿真等相关配套系统。本系统主要集中在如下方面:MIPS CPU仿真技术研究(一人)、DYNAMIPS分析与设计(一人)、基于DYNAMIPS的网络实验平台设计(一人)、网络拓扑图设计系统(一人)、硬件模块的仿真模拟(一人)。本人负责DYNAMIPS分析与设计。1. 通读DYNAMIPS除有关CPU,MIPS之外的所有源程序代码。2. 分析需要仿真的思科设备。3. 分析需要仿真的通信层协议。4. 分析各层的实现。
二.技术指导
C语言简洁紧凑,灵活方便,运算符丰富。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。因此本毕业设计采用C语言来开发。本设计通过阅读DYNAMIPS的源程序代码,分析需要仿真的思科设备,分析需要仿真的通信层协议及其实现过程。通过本次设计更好的掌握C语言,在PC机上完成思科路由器的模拟,让DYNAMIPS模拟出真实的路由器。
主要参考文献 [1] 谭浩强. C程序设计.第二版. 北京:清华大学出版社,2004.[2] 陈向群. 操作系统教程.第二版. 北京:北京大学出版社,2006.[3] 王锡江、潘金贵. C程序开发技术及工具库. 南京:南京大学出版社,1993.[4] 梁广民、王隆杰. 思科网络实验室路由、交换实验指南. 北京:电子工业出版社,2007.[5] 张庸. 计算机组成原理实验及课程设计指导. 重庆: 重庆大学出版社,2001.[6] 谢希仁. 计算机网络. 第四版. 北京: 电子工业出版社,2006.[7] Carl Hamacher. 计算机组成. 北京: 机械工业出版社,2004.[8] 石硕. 交换机/路由器及其配置. 北京: 电子工业出版社,2006.[9] 魏亮. 路由器原理与应用. 北京:人民邮电出版社,2005.[10] 石硕. 路由器原理与设计. 北京:电子工业出版社,2006.[11] 陆魁军. 网络实践指南——基于Cisco路由器和交换机. 北京:清华大学出版社,2007.[12] 雷震甲. 网络工程师教程. 第二版. 北京:清华大学出版社,2006.[13] 魏大新、李育龙、强振海. Cisco网络工程案例精粹. 北京: 电子工业出版社,2007.[14] 王群. 非常网管:网络基础. 北京:人民邮电出版社,2006.[15] Dynamips源代码
三、设计步骤
周次 主要内容第1周 按照要求开展相应工作第2周 按要求查阅相关资料第3周 按要求完成开题报告第4周 与同组其他成员讨论,明确分工第5周 阅读源代码第6周 仔细阅读源代码并与组成员讨论第7周 了解思科路由器第8周 分析需要仿真的思科路由器第9周 分析需要仿真的通信层协议第10周 继续分析需要仿真的通信层协议第11周 分析各层协议如何实现第12周 写论文第13周 按指导老师的要求继续修改论文第14周 完成论文及相关资料的打印第15周 准备答辩和相关事宜
四、提交成果1、毕业论文:八千字以上,正文用小四号打印。(电子版和打印稿)2、外文资料翻译:英文原稿(三千字)、中文翻译稿。(打印稿)3、毕业设计软件(电子稿)4、其他:表格
毕业设计(论文)开题报告
开 题 报 告题 目: DYNAMIPS及相关教学软件研究与设计 DYNAMIPS分析与设计 毕业设计(论文)的主要内容:本次毕业设计的题目是DYNAMIPS及相关教学软件研究与设计。本设计将在Dynamips的基础上,进一步分析理解Dynamips原理,优化设计DYNAMIPS,并在此基础上,构造Cisco 7200高档路由,3600系列中档路由,2691低档路由的仿真平台,平台可以真实运行CISCO IOS软件,以上实现一个真实的网络教学环境,同时,同步开发网络拓朴设计、路由模块仿真等相关配套系统。本系统主要集中在如下方面:MIPS CPU仿真技术研究(一人)、DYNAMIPS分析与设计(一人)、基于DYNAMIPS的网络实验平台设计(一人)、网络拓扑图设计系统(一人)、硬件模块的仿真模拟(一人)。本人负责DYNAMIPS分析与设计。5. 通读DYNAMIPS除有关CPU,MIPS之外的所有源程序代码。6. 分析需要仿真的思科设备。7. 分析需要仿真的通信层协议。8. 分析各层的实现。
设计(论文)的技术路线及预期目标:C语言简洁紧凑,灵活方便,运算符丰富。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。因此本毕业设计采用C语言来开发。本设计通过阅读DYNAMIPS的源程序代码,分析设计DYNAMIPS的工作流程,了解DYNAMIPS如何实现思科路由器的模拟。通过本次设计更好的掌握C语言,在PC机上完成思科路由器的模拟,让DYNAMIPS模拟出真实的路由器。课题进度计划毕业设计从3月1日开始,计划到6月1日结束. 具体进度计划如下:第一阶段 :第1——6周:通读DYNAMIPS的源代码第二阶段:第6——11周:其中第6——7周:分析需要仿真的思科设备第8——9周:分析需要仿真的通信层协议。第10——11周:分析各层的实现第三阶段:第12——15周:完成毕业论文的撰写. 完成课题所需条件及落实措施:根据所使用的开发平台和工具:硬件要求: CPU:1.8G 内存:512MB 硬盘:2.5G。软件要求:Windows XP、Dynaimps、Source Insight、Microsoft Visual C++ 6.0技术资料:通过互联网查询,图书馆借阅。课题所需条件均已落实。参考文献、资料:[1] 谭浩强. C程序设计.第二版. 北京:清华大学出版社,2004.[2] 陈向群. 操作系统教程.第二版. 北京:北京大学出版社,2006.[3] 王锡江、潘金贵. C程序开发技术及工具库. 南京:南京大学出版社,1993.[4] 梁广民、王隆杰. 思科网络实验室路由、交换实验指南. 北京:电子工业出版社,2007.[5] 张庸. 计算机组成原理实验及课程设计指导. 重庆: 重庆大学出版社,2001.[6] 谢希仁. 计算机网络. 第四版. 北京: 电子工业出版社,2006.[7] Carl Hamacher. 计算机组成. 北京: 机械工业出版社,2004.[8] 石硕. 交换机/路由器及其配置. 北京: 电子工业出版社,2006.[9] 魏亮. 路由器原理与应用. 北京:人民邮电出版社,2005.[10] 石硕. 路由器原理与设计. 北京:电子工业出版社,2006.[11] 陆魁军. 网络实践指南——基于Cisco路由器和交换机. 北京:清华大学出版社,2007.[12] 雷震甲. 网络工程师教程. 第二版. 北京:清华大学出版社,2006.[13] 魏大新、李育龙、强振海. Cisco网络工程案例精粹. 北京: 电子工业出版社,2007.[14] 王群. 非常网管:网络基础. 北京:人民邮电出版社,2006.[15] Dynamips源代码
毕业设计(论文)指导教师指导记录表学院: 信息工程与自动化 专业: 计算机科学与技术 班级: 计科2003级4班 学生姓名 欧阳毅霖 学 号 030405176 指导教师 王锋毕业设计(论文)题目 Dynamips及相关教学软件研究与设计——Dynamips分析与设计毕业设计(论文)起止日期 2007 年3 月 5 日 至 2007 年 6 月19 日日期 指 导 内 容 存在问题及改进意见 学生签字07-01-08 了解学生情况,布置选题事宜 仔细斟酌,选出合适论文题目 07-01-15 根据选题内容,布置假期学习内容 用假期时间学习相关内容 07-03-05 讲解毕业设计的要求和注意事项 按照要求开展相应工作 07-03-08 明确毕业设计所要完成的具体内容 按要求查阅相关资料 07-03-15 讲解开题报告的要求和注意事项 按要求完成开题报告 07-03-22 明确所负责的内容 与同组其他成员讨论,明确分工 07-03-29 所负责的内容的研究 通读源代码 07-04-05 分析源代码 分析源代码查找资料 07-04-19 老师帮助解决代码分析中遇到的问题 与老师组员讨论 07-04-26 指导老师帮助解决分析中的问题 继续分析 07-05-17 检查分析结果 继续分析 07-05-24 深入检查分析结果 继续深入分析 07-06-01 给出论文要求 撰写论文 07-06-05 检查论文初稿并提出修改意见 按论文要求格式进行认真修改 07-06-11 检查论第二稿并给出修改建议 修改论文 07-06-14 讲述答辩事宜 答辩准备
Dynamips及相关教学软件研究与设计摘 要本课题是Dynamips及相关教学软件研究与设计。本设计将在Dynamips的基础上,进一步分析理解Dynamips原理,优化设计Dynamips,并在此基础上,构造Cisco 7200高档路由,3600系列中档路由,2691低档路由的仿真平台,平台可以真实运行CISCO IOS软件,实现一个真实的网络教学环境,同时,同步开发网络拓朴设计、路由模块仿真等相关配套系统。Dynamips分析与设计主要是通过分析Dynamips源代码,来分析Dynamips如何实现模拟思科路由器。本次设计对Dynamips如何实现思科7200路由器主要引擎,模块进行分析,描述了实现方法,并对需要仿真的通信层协议进行了分析,描述了各层的实现方法。本文通过对Dynamips源代码的研究,从Dynamips介绍、需要仿真的思科设备的分析,需要仿真的通信层协议的分析以及各层的实现方法这四部分着手,详细讲解了Dynamips是如何完成整个思科路由器的模拟过程。通过对Dynamips的分析,通过对Dynamips的分析,了解了Dynamips的原理,也更好的了解了思科路由器。关键词:DYNAMIPS;访真AbstractThis program is about Dynamips and related teaching software research and design.It will be on the foundation of Dynamips , analyze understanding Dynamips principle further, optimize Dynamips,And on this foundation construct Cisco7200 High-scale router's, Cisco3600 Center-scale router's, Cisco2691 Low-scale router's emulation platform;This platform can be true to run the software of CISCO IOS,above realization a actual network teaching environment.At the same time develop the related supplemental systems such as network topology design,router module emulation and so on.Dynamips analyses and designs analysis Dynamips how to realize to imitate Cisco router major by reading and making an analysis of Dynamips source code.Paper has analysed how to realize for Dynamips to Cisco7200 router major engines and modular,has described the communication layer protocol which is need toemulate,has described the realization method of each layer.This paper particularly represent the whole processof how do Dynamips emulate the Cisco router firstly by reading Dynamips source code and then by Dynamips introduction ,the analysis of Cisco equipments which are need to emulate, the analysis of the communication layer protocol that needs emulation and the realization method of each layer.Through the analysis for Dynamips ,graspping Dynamips how to realize to imitate Cisco router, is also better to know the principle of Dynamips , I have got deeper knowledge for Cisco router.Keywords: Dynamips; simulation
Dynamips设计与分析-Dynamips及相关教学软件研究与设计前言网络实验是网络教学中的重要环节,但学校能够提供的真实网络环境非常有限。思科的设备是当前比较理想的设备,性能高,但是思科产品价格也很高,广大用户对其既爱又恨,如果能开发出思科 路由器的优秀的模拟器将有助于解决这个瓶颈。Dynamips的出现正好有效的解决了这个问题。Dynamips是Christophe Fillot编写的一个思科路由器模拟软件。它可以模拟思科2691,3620,3640,3660,3725,3745和思科7200硬件平台,而且可以运行标准的思科 IOS文件。这个模拟器可以用来:1.作为培训的平台使用,通过软件方式模拟使用真实环境中的设备。它可以让大家更熟悉思科的设备。2.测试和实验思科 IOS的各种特性。3.迅速检测实施到真实路由上的配置。正是在这个背景下,产生了这个课题。本设计将在Dynamips的基础上,进一步分析理解Dynamips原理,分析Dynamips 如何实现思科路由器的模拟,并在此基础上,构造思科 7200高档路由,3600系列中档路由,2691低档路由的仿真平台,平台可以真实运行思科 IOS软件,以上实现一个真实的网络教学环境,同时,同步开发网络拓朴设计、路由模块仿真等相关配套系统。该课题主要集中在如下方面:MIPS CPU仿真技术研究(一人)、Dynamips分析与设计(一人)、基于Dynamips的网络实验平台设计(一人)、网络拓扑图设计系统(一人)等几个方面进行设计。本文作者负责的模块为DYNAMIPS分析与设计。第一章Dynamips的介绍分析了模拟路由器的意义,以及Dynamips的特点,第二章对需要仿真的CISCO的设备进行分析并描述其实现过程,第三章对需要仿真的通信层协议进行分析,第四章对各层的实现进行分析。通过这些分析,能进一步理解了Dynamips原理,对思科路由器有了更深的认识。 由于本人能力有限,不足之处还请指正。第一章 Dynamips介绍1.1 路由器简介 近年来,路由器的发展有起有伏。20世纪90年代中期,传统路由器成为制约因特网发展的瓶颈,被ATM交换机取而代之,成为IP骨干网的核心,路由器变成了配角。进入90年代末期,Internet规模进一步扩大,流量每半年翻一番,ATM网又成为瓶颈,路由器东山再起。Gbps路由交换机在1997年面世后,人们又开始以Gbps路由交换机取代ATM交换机,架构以路由器为核心的骨干网。 作为核心设备,路由器在IP网上处于至关重要的位置。随着因特网应用的普及,网络带宽的迅速增加,用户对服务质量要求的提高,路由器的未来也面临着新的变革。 1.1.1 路由器的概念 路由器是一种连接多个网络或网段的网络设备,它能将不同网络或网段之间的数据信息进行“翻译”,以使它们能够相互“读”懂对方的数据,从而构成一个更大的网络。 路由器有两大典型功能,即数据通道功能和控制功能。数据通道功能包括转发决定、转发以及输出数据链路调度等,一般由硬件来完成;控制功能一般用软件来实现,包括与相邻路由器之间的信息交换、系统配置、系统管理等。1.1.2 路由器基本功能介绍传统上,路由器工作于所谓网络7层协议模型中的第3层,其主要任务是接收来自一个网络接口的数据包,根据其中所含的目的地址,决定转发到哪个目的地,可能是路由器也可能就是最终目的点,并决定从哪个网络接口转发出去。这是路由器最基本的功能——数据包转发功能。为了维护和使用路由器,路由器还需要有配置或者说控制功能。 控制功能是由一系列规则所提供的,举例来说,可能是优先权、拒绝访问或提供记账数据。当数据包进入路由器时,这些相关的规则也同样作用于数据包。在基于软件的路由器中,这些规则被存储于一个软件数据库内,每个数据包通过时都必须与该数据库进行核对。1.1.3 路由器的发展趋势芯片速度每18个月翻一番,而因特网的流量是每6个月翻一番。作为因特网的枢纽,路由器正在朝速度更快、服务质量更好和更易于综合化管理这三个方向发展。 速度更快 服务质量更好 管理更加智能化网络技术的发展日新月异,路由器技术特别是核心路由器技术正经历着巨大的变化。
1.2 虚拟路由器技术最近,一些有关IP骨干网络设备的新技术突破,为将来因特网新服务的实现铺平了道路。虚拟路由器就是这样一种新技术,它使一些新型因特网服务成为可能。通过这些新型服务,用户将可以对网络的性能、因特网地址和路由以及网络安全等进行控制。 在一个物理路由器上,可以形成多个逻辑上的虚拟路由器,每个虚拟路由器都单独地运行各自的路由协议实例,并且都有自己专用的I/O端口、缓存、地址空间、路由表和网络管理软件。虚拟骨干路由器,可以为客户提供成本低廉的专用骨干网控制和安全管理功能。控制和管理虚拟路由设备的软件是采用模块化设计的,如果这些软件运行在真正的、多进程的操作系统上(如:UNIX),那么它还支持多实例,也就是说它可以同时支持多个虚拟路由器。每个虚拟路由器的进程与其它路由器的进程都是相互分开的,其使用的内存也受到操作系统的保护,从而保证了数据的高度安全性;同时,还消除了由于软件模块的不完善所造成的与其它虚拟路由器之间的数据碰撞的可能性。 许多载波级路由器与高速的SONET/SDH网络连接进行分组转发时,都是靠硬件来实现线速性能的。而对于使用lwfree.cn由器各自单独地执行路由协议软件实例(如:OSPF,BGP)和网络管理软件的实例(如:SNMP或命令行),因此,用户对每个虚拟路由器都可以独立地进行监视和管理。独立运行网络协议实例,使得每个虚拟路由器都拥有一个完全独立的IP地址域,相互之间不会产生任何冲突。每个虚拟路由器都可以作为一个单独运行的实体来进行管理。其提供的基于用户的安全模块,可以保证属于某个虚拟路由器的所有网络管理功能和信息都只对具有权限的用户开放。另外,每个虚拟路由器的分组转发路径也都是相互独立的,这使得管理员可以分别为每个虚拟路由器单独配置性能。 通过虚拟路由器,大的通信突发数据流只会对本路由器产生影响,而不会影响到其它的路由器,从而为终端用户能够得到稳定的网络性能提供了保障。此外,虚拟路由器同时还提供独立的策略和IETFDS(Internet Engineering Task Force Differentiated Service)能力,使虚拟路由器可以为终端用户提供完全的客户化服务。通过给虚拟路由器的I/O端口进行配置,可以对接收的分组进行计数,这样就能够保证数据量不会超越预先确定的协议;同时虚拟路由器还可以根据数据分组的服务等级不同,将其数据分组分配到不同的队列中,以实现不同的服务质量。 目前,虚拟路由器已经得到了实际的应用。Nortel的Accelar1000路由交换机就使用虚拟路由端口在VLANs之间路由,虚拟路由器端口能够配置每个VLAN,在IP子网或VLANs之间实现路由。Accelar1000路由交换机支持虚拟路由器端口,且不降低其性能。
Dynamips设计与分析-Dynamips及相关教学软件研究与设计选择Dynamips的理由1.3.1 模拟器的种类CISCO实验模拟器有很多种,其中大多数都能满足ccna学习和考试需求。适合ccnp的模拟实验环境却不多。现在流行的主要有: routersim ccna3.0、 routersim ccnp router_simulator_v4.15 及更高版本 boson router simular 3.55 及更高版本 sybex ccna lab 思科网络学院的flash练习 思科网络学院的ccnp全套labs 思科出品的cisco interactive mentor(思科交互式学习指导cim) Boson netsim Dynamips
1.3.2 模拟器的现状 现在的模拟器各有优点和缺点,都不是尽善尽美。routersim的特点完全是按照ccna的实验设计的,如果学习na的实验内容,routersim是很适合的。实验教程分的很细致,讲解也很清楚,对于n a的学习者而言,是非常不错的选择,但是它的最大缺点也正是由于完全局限于实验,因为它的网络拓扑不能改变。 思科学院模拟器界面:cim,即思科出品的cisco interactive mentor。它提供ccna、ccnp、ccie以及cisco其它技术方面的实验共8部分。这个模拟器更灵活,几乎可以完全模拟真实操作,支持更多,是目前最权威的。但是,这个模拟器的命令不全。另外容量太大,不容易传播,价钱也非常高。 而本设计介绍的Dynamips则是一个非常好的模拟器,因为它直接模拟出cisco7200路由器的硬件环境,然后在这个环境中直接运行Cisco的IOS。所以dynamips模拟出的是真实的路由器。1.3.3 模拟器的不可替代性探讨 思科路由器设备太过昂贵,特别是在多个路由器组成的网络环境。没有或者只有少量的设备,做实验的机会和深度就无法保证。所以很难有机会在现实中拥有模拟器中提供的试验环境。模拟器的出现则较好的解决了这个问题,可以不用花大价钱去买那些昂贵的设备,却可以在PC机上完成一些必要的实验。因此选择了Dynamips这款出色的思科路由器模拟软件。在接下来的章节中将介绍Dynamips这款强大的模拟思科路由器软件,并且分析其是如何工作,实现这个模拟过程的。
1.4 Dynamips简介Dynamips是christophe Fillot编写的一个Cisco路由器模拟软件。它可以模拟Cisco2691,3620,3640,3660,3725,3745和Cisco7200硬件平台,而且可以运行标准的Cisco IOS文件。但是这个模拟器不能替代真实的路由器,它只是真实lab中的一个简单的辅助性的工具。Dynamips支持Windows和Linux操作系统, Dynamips是直接运行IOS来模拟思科路由器,通过和本地网卡桥接,Dynamips还可以直接和外网进行通信。通过加载NM-16ESW模块还可以做交换的部分实验。Dynamips运行时需要真实的Cisco2691,3620,3640,3660,3725,3745或者7200的IOS软件。在Windows系统上,实际上可以把IOS印象文件放在任何需要的地方,但是实例lab被配置为在C:\Progam Files\Dynamips\images目录中查找IOS文件。在Linux/Unix系统上,指定一个目录来保存IOS文件并把IOS文件放在指定的目录中。Cisco IOS印象文件是压缩的。这些压缩的文件将很好的配合Dynamips工作。然后通过这个解压进程,boot过程非常慢,像在真实路由器上一样。一般先解压IOS文件。Dynamips无疑解决了无法支付高昂的实验室租用费用的难题。
1.5 Dynamips的功能 模拟思科7200路由器 模拟思科3745路由器 模拟思科3725路由器 模拟思科3600路由器 模拟思科2691路由器 Virtual Netio(虚拟网络输入输出) Virtual Bridge(虚拟桥接) Virtual ATM switch(虚拟ATM交换机) Virtual Frame Relay switch(虚拟帧中继交换机) Virtual Ethernet Switch(虚拟以太网交换机)
1.6 Dynamips分析流程下面的几章将按照图1-1所示进行分析:
Dynamips设计与分析-Dynamips及相关教学软件研究与设计第二章 需要仿真的CISCO设备的分析本章主要从思科系列路由器的介绍,路由器的主要引擎,模块进行分析,先介绍7200路由器,主要对其引擎(网络处理引擎NPE),模块(端口适配器PA),启动过程进行分析,然后再说明Dynamips如何实现这两个部分的功能,最后面简单分析下Dynamips模拟7200路由器的启动过程及其他操作。
2.1 思科7200路由器2.1.1 7200路由器介绍 Cisco 7200系列路由器提供优异的性价比,可以满足下列需求:需要广域网和Internet网关连接的地区办事处和分公司;企业和服务供应商的远程站点集合,通过一个中心站点将多个分散站点连接起来;需要IBM数据中心连接的站点;需要结合上述所有特性多方面功能的站点,以便支持多服务语音、视频和数据流量。 Cisco 7200的一个关键优点是其模块性。通过4和6插槽机箱,提供300Kpps速度的5个处理器,带有48个端口的广泛的局域网和广域网接口,以及单个或双重电源,客户可以获得所需的性能和容量。这种模块性还提供投资保护和可靠的扩展路径。在7200系列的配置中,客户可以选择4种处理引擎、一个4或6插槽多服务机箱、不同的输入/输出(I/O)控制器以及多种LAN和WAN端口适配器,这使7200系列能够提供大量不同的配置,以满足不同的网络需求。Cisco 7201VXR和7206VXR机箱最高可以提供1 Gbps的背板带宽,并包括了集成的多服务交换(MIX)功能。端口适配器覆盖了多种LAN和WAN连接,端口总数最高可以达到48个,并提供单电源或双电源。这种模块化设计在使客户获得自己所需要的性能和容量的同时,还为客户提供了投资保护和有保证的扩展途径。图2-1是思科7200路由器结构图 图2-1 思科7200路由器结构图2.1.2 7200路由器主要引擎主要分析网络处理引擎(简称NPE)。7200路由器支持早NPE(NPE-100、NPE-150、NPE-200)和最新NPE(NPE-175、NPE-225、NPE-300、NPE-400、NPE-G1等等)。NPE包含主存储器,CPU,外围部件(PCI)内存(静态随机访问存储器 - SRAM),除了使用动态RAM(DRAM)的NPE-100和控制电路为PCI BUS。网络处理引擎(NPE)包括以下组件: 精简指令集计算技术(RISC)微处理器 网络处理引擎 微处理器 内部时钟速度NPE-100和NPE-150 R4700 150兆赫NPE-175 RM5270 200兆赫NPE-200 R5000 200兆赫NPE-225 RM5271 262兆赫NPE-300 RM7000 262兆赫NPE-400 RM7000 350兆赫NPE-G1 BCM1250 700兆赫 系统控制器 可升级的内存模块 缓存存储器为支持多种应用、带宽和性价比,Cisco 7200系列路由器提供了三种网络处理引擎(NPE)供选择。表2-1列出了可以获得的每种NPE的产品名称和说明。产品编号 产品描述NPE-225 Cisco 7200网络处理引擎NPE-225 NPE-300 Cisco 7200VXR网络处理引擎NPE-300,包括32MB SDRAMNPE-400 Cisco 7200VXR网络处理引擎NPE-400,包括128MB SDRAM 表2-1 NPE产品名称及说明2.1.3 7200路由器的模块主要分析端口适配器PA。PA是在物理媒介包含电路转换和接收信息包的模块化接口控制器,在思科7200路由器安装的端口适配器支持在线热插拔(OIR),下面是7200支持的模块信息:Slot 0: C7200-IO-FE <--> 支持1个Fastethernet接口C7200-IO-2FE <--> 支持2个 Fastethernet接口C7200-IO-GE-E <--> 插这个卡会同时出现2个端口,E0/0和GE0/0 Slot 1-5:751com.cnPA-4E <--> 支持4个Ethernet接口 PA-4T+ <--> 支持4个serial接口PA-8E <--> 支持8个Ethernet接口PA-8T <--> 支持8个serial接口 PA-A1 <--> 支持1个ATM port adapter接口PA-GE <--> 支持1个GigabitEthernet接口 PA-POS-OC3<--> 支持1个Packet Over SONET/SDH接口
表2-2给出了思科7200路由器的端口适配器参数及说明 描述 部件编号ATM端口适配器 1端口OC3/STM1增强多模和单模1端口DS3增强1端口E3增强8端口T1 IMA 增强8端口E1 IMA 增强ATM线路仿真服务 PA-A3-OC3MM, PA-A3-OC3SMPA-A3-T3PA-A3-E3PA-A3-8T1IMAPA-A3-8E1IMAPA-A2-4T1, PA-A2-4E1SONET端口适配器 1端口OC3/STM1 POS单模和多模 PA-POS-OC3-SM, PA-POS-OC3-MM动态分组传输 1端口OC12单模和多模 PA-SRP-OC12SM, PA-SRP-OC12MM语音支持端口适配器 2端口T1/E1高容量数字语音2端口T1/E1中容量数字语音2端口T1/E1 MIX支持T1/E14端口T1/E1 MIX支持T1/E18端口T1/E1 MIX支持T1/E1 PA-VXC-2TE1+PA-VXB-2TE1+PA-MCX-2TE1PA-MCX-4TE1PA-MCX-8TE1多通道和ISDN端口适配器 2端口增强多通道T31端口多通道T31端口多通道E31端口多通道STM-12端口多通道T1(CSU/DSU&PRI)4端口多通道T1(CSU/DSU&PRI)2端口多通道E1(G.703/G.704&PRI)8端口多通道E1(G.703/G.704&PRI)8端口ISDN BRI(S/T)4端口ISDN BRI(U) PA-MC-2T3+PA-MC-T3PA-MC-E3PA-MC-STM-1PA-MC-2T1PA-MC-4T1PA-MC-2E1/120PA-MC-8E1/120PA-8B-S/TPA-4B-U高速串口适配器 1端口HSSI2端口HSSI1端口高速增强它串行(使用DSU)2端口高速增强它串行(使用DSU)1端口高速E3串行(使用DSU)2端口高速E3串行(使用DSU) PA-HPA-2HPA-T3+PA-2T3+PA-E3PA-2E3串行端口适配器 4端口串行,增强8端口串行,V.35,RS-232或X.214端口串行E1(G.703) PA-4T+PA-8T-V35, PA-8T-232, PA-8T-X21PA-4E1G/75, PA-4E1G/120LAN端口适配器 4端口10BaseT8端口10BaseT5端口10BaseT1端口100BaseTX,FX2端口100BaseTX,FX1端口千兆位以太网4端口令牌环4/16Mbps,半/全双工12端口以太网/2端口快速以太网以太交换机 PA-4EPA-8EPA-5EFLPA-FE-TX, PA-FE-FXPA-2FE-TX, PA-2FE-FXPA-GEPA-4R-DTRPa-12E/2FE
Dynamips设计与分析-Dynamips及相关教学软件研究与设计 表2-2 思科7200路由器的端口适配器参数及说明2.1.4 7200路由器的启动过程 加电之后,ROM运行加电自检程序(POST), 检查路由器的处理器、接口及内存等硬件设备。 执行路由器中的启动程序(Bootstrap),搜索CISCO的IOS。 装入IOS后,寻找配置文件。配置文件通常在NVRAM中。配置文件也可从TFTP服务器装入。 装入配置文件后,其中的信息将激活有关接口、协议和网络参数。 当找不到配置文件时,路由器进入配置模式。 2.1.5 模拟7200路由器的实现1.网络处理引擎NPE的实现PC机上没有真正的NPE,通过Dynamips进行仿真模拟实现NPE。(1)定义CPU EEPROM /* NPE-100 */static m_uint16_t eeprom_cpu_npe100_data[16] = { 0x0135, 0x0203, 0xffff, 0xffff, 0x4906, 0x0004, 0x0000, 0x0000, 0x6000, 0x0000, 0x9901, 0x0600, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};/* NPE-150 */static m_uint16_t eeprom_cpu_npe150_data[16] = { 0x0115, 0x0203, 0xffff, 0xffff, 0x4906, 0x0004, 0x0000, 0x0000, 0x6000, 0x0000, 0x9901, 0x0600, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};/* NPE-175 */static m_uint16_t eeprom_cpu_npe175_data[16] = { 0x01C2, 0x0203, 0xffff, 0xffff, 0x4906, 0x0004, 0x0000, 0x0000, 0x6000, 0x0000, 0x9901, 0x0600, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};/* NPE-200 */static m_uint16_t eeprom_cpu_npe200_data[16] = { 0x0169, 0x0200, 0xffff, 0xffff, 0x4909, 0x8902, 0x0000, 0x0000, 0x6800, 0x0000, 0x9710, 0x2200, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};/* NPE-225 (same as NPE-175) */static m_uint16_t eeprom_cpu_npe225_data[16] = { 0x01C2, 0x0203, 0xffff, 0xffff, 0x4906, 0x0004, 0x0000, 0x0000, 0x6000, 0x0000, 0x9901, 0x0600, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};/* NPE-300 */static m_uint16_t eeprom_cpu_npe300_data[16] = { 0x01AE, 0x0402, 0xffff, 0xffff, 0x490D, 0x5108, 0x0000, 0x0000, 0x5000, 0x0000, 0x0012, 0x1000, 0x0000, 0xFFFF, 0xFFFF, 0xFF00,};/* NPE-400 */static m_uint16_t eeprom_cpu_npe400_data[64] = { 0x04FF, 0x4001, 0xF841, 0x0100, 0xC046, 0x0320, 0x001F, 0xC802, 0x8249, 0x14BC, 0x0242, 0x4230, 0xC18B, 0x3131, 0x3131, 0x3131, 0x3131, 0x0000, 0x0004, 0x0002, 0x0285, 0x1C0F, 0xF602, 0xCB87, 0x4E50, 0x452D, 0x3430, 0x3080, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};/* NPE-G1 */static m_uint16_t eeprom_cpu_npeg1_data[64] = { 0x04FF, 0x4003, 0x5B41, 0x0200, 0xC046, 0x0320, 0x0049, 0xD00B, 0x8249, 0x1B4C, 0x0B42, 0x4130, 0xC18B, 0x3131, 0x3131, 0x3131, 0x3131, 0x0000, 0x0004, 0x0002, 0x0985, 0x1C13, 0xDA09, 0xCB86, 0x4E50, 0x452D, 0x4731, 0x8000, 0x0000, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,};以上对NPE-100,NPE-150,NPE-175,NPE-200,NPE-200,NPE-225,NPE-300,NPE-400,NPE-G1进行了定义,给它们分别分配了地址。(2)获取一个NPE驱动函数原型为:struct c7200_npe_driver *c7200_npe_get_driver(char *npe_type)通过提供的参数NPE的类型(npe_type)匹配查找得到。(3)设置NPE类型函数原型为:int c7200_npe_set_type(c7200_t *router,char *npe_type)先定义一个c7200_npe_driver结构指针driver,先判断路由器虚拟机的标记status,如果正在运行中则出错显示运行中不能改变npe类型,否则利用参数npe_type检测driver是否存在,不存在的话则出错显示无法可知的npe类型。把driver赋给router->npe_driver,完成设置。(4)显示可利用的NPE驱动列表函数原型为:void c7200_npe_show_drivers(void)显示npe驱动列表的各种信息。(5)初始化NPE-100/* 初始化一个NPE-100 */int c7200_init_npe100(c7200_t *router){ vm_instance_t *vm = router->vm; int i; /* 设备处理器类型 */ mips64_set_prid(vm->boot_cpu,MIPS_PRID_R4600); /* 初始化Galileo GT-64010系统控制器 */ if (c7200_init_gt64010(router) == -1) return(-1); /* PCMCIA 控制器是在总线0 */ router->pcmcia_bus = vm->pci_bus[0]; /* 初始化端口适配器PCI总线 */ if (c7200_pa_create_pci_busses(router) == -1) return(-1); /* 为 PA Bays 1,3,5 和 PA Bays 2,4,6创建 PCI 总线 */lwfree.cn dev_dec21050_init(vm->pci_bus[0],2,vm->pci_bus_pool[24]); dev_dec21050_init(vm->pci_bus[0],3,NULL); dev_dec21050_init(vm->pci_bus[0],4,vm->pci_bus_pool[25]); /* 映射 PA PCI 总线 */ router->pa_bay[0].pci_map = vm->pci_bus[0]; for(i=1;i
pa_bay[i].pci_map = vm->pci_bus_pool[i]; c7200_pa_init_pci_bridge(router,1,vm->pci_bus_pool[24],1); c7200_pa_init_pci_bridge(router,3,vm->pci_bus_pool[24],2); c7200_pa_init_pci_bridge(router,5,vm->pci_bus_pool[24],3); c7200_pa_init_pci_bridge(router,2,vm->pci_bus_pool[25],1); c7200_pa_init_pci_bridge(router,4,vm->pci_bus_pool[25],2); c7200_pa_init_pci_bridge(router,6,vm->pci_bus_pool[25],3); return(0);}
Dynamips设计与分析-Dynamips及相关教学软件研究与设计其他NPE-150,NPE-175,NPE-200,NPE-225,NPE-300,NPE-400,NPE-G1的初始化与NPE-100的初始化基本相似,在此就不再分别进行分析。2.端口适配器PA的实现PC机上没有端口适配器,只有通过Dynamips来访真模拟实现。实现端口适配器至少要实现创建端口适配器、关闭端口适配器、实例化端口适配器。(1)创建一个端口适配器函数实现如下:/* 创建一个端口适配器 */int c7200_cmd_pa_create(c7200_t *router,char *str){ char *tokens[PA_DESC_MAX_TOKENS]; int i,count,res; u_int pa_bay; /* 一个端口适配器是这样描述的: "1:PA-FE-TX" */ if ((count = m_strsplit(str,':',tokens,PA_DESC_MAX_TOKENS)) != 2) { vm_error(router->vm,"unable to parse PA description '%s'.\n",str); return(-1); } /* 通过id解析此PA */ pa_bay = atoi(tokens[0]); /* 在当前的PA列表中添加此新的PA */ res = c7200_pa_add_binding(router,tokens[1],pa_bay); /* 完全列阵被strsplit清掉 */ for(i=0;idev_type || !bay->pa_driver) { vm_error(router->vm,"trying to shut down an empty bay %u.\n",pa_bay); return(-1); } /* 卸掉所有的NIO */ c7200_pa_disable_all_nio(router,pa_bay); /* 关闭 PA 驱动器 */ if (bay->drv_info && (bay->pa_driver->pa_shutdown(router,pa_bay) == -1)) { vm_error(router->vm,"unable to shutdown PA %u.\n",pa_bay); return(-1); } free(bay->dev_name); bay->dev_name = NULL; /* 赋空值 */ bay->drv_info = NULL; /* 赋空值 */ return(0);}(3)实例化一个端口适配器函数实现如下:/* 实例化一个PA */int c7200_pa_init(c7200_t *router,u_int pa_bay){ struct c7200_pa_bay *bay; size_t len; if (!(bay = c7200_pa_get_info(router,pa_bay))) return(-1); /* 检测设备类型是否专为此bay定义的 */ if (!bay->dev_type || !bay->pa_driver) { vm_error(router->vm,"trying to init empty slot %u.\n",pa_bay); return(-1); } /* 分配设备名称 */ len = strlen(bay->dev_type) + 10; if (!(bay->dev_name = malloc(len))) { vm_error(router->vm,"unable to allocate device name.\n"); return(-1); } snprintf(bay->dev_name,len,"%s(%u)",bay->dev_type,pa_bay); /* 实例化PA驱动器 */ if (bay->pa_driver->pa_init(router,bay->dev_name,pa_bay) == 1) { vm_error(router->vm,"unable to initialize PA %u.\n",pa_bay); return(-1); } /* 启动所有的NIO */ c7200_pa_enable_all_nio(router,pa_bay); return(0);}3.模拟启动7200路由器(1)初始化7200缺省参量 对C7200路由器的缺省参量进行设置,7200的NPE默认类型为NPE-200。(2)初始化7200平台在这个过程中要初始化MIPS处理器,初始化NPE,初始化RAM,初始化ROM,初始化适配器端口,Remote仿真控制器,Boot引导,显示设备。(3)启动IOS文件IOS文件是做思科路由器必须的文件,Dynamips自带有7200的IOS文件,如果还需要其他的IOS则需要购买或者到网上搜索查找。4.其它(1)虚拟桥接虚拟桥接被用来在模拟器之间模拟一个共享网络。例如:任何模拟器可以被当作一个虚拟的桥接。配置文件(-b命令可以列出)包括一个NETIO描述符列表,如下所示:语法:netio_type[:netio_parameters]例子: # Connection to instance "I0" 连接I0# Connection to instance "I2"udp:10004:127.0.0.1:10005I0将以下面的参数开始: dynamips ios.bin -p 1:PA-FE-TX:udp:10001:127.0.0.1:10000(2)虚拟ATM交换机虚拟ATM交换机过去习惯被模拟成一个在模拟器设备之间的ATM骨干网。虚拟交换机的使用不是强制的,可以直接把模拟器直接成点对点的ATM连接。请注意,仅仅
Dynamips设计与分析-Dynamips及相关教学软件研究与设计基础VP/VCb被模拟器支持,对于其他的ATM协议并不支持。模拟器可以被当作一台虚拟ATM交换机配置实例(-a命令可以列举出)# Virtual Interface ListIF:A0:udp:10001:127.0.0.1:10000IF:A1:udp:10002:127.0.0.1:10003IF:A2:udp:10004:127.0.0.1:10005# VP connection between I0 and I1VP:A0:10:A1:20VP:A1:20:A0:10# VP connection between I0 and I2VP:A0:11:A2:30VP:A2:30:A0:11# VC connection between I1 and I2VC:A1:5:2:A2:7:3VC:A2:7:3:A1:5:2在这个例子中,有三个虚拟接口,A0,A1,A2。还可以做VP交换或者VC交换:VP switching语法:VP:input_if:input_vpi:output_if:output_vpiVC switching语法:input_if:input_vpi:input_vci:output_if:output_vpi:output_vci(3)虚拟帧中继交换机虚拟帧中继交换机构造过去习惯于被模拟成一个模拟器之间的帧中继骨干。虚拟交换机的使用不是强制的,可以用适合的IOS直接连接模拟器设备。任何模拟器可以当作成一个虚拟帧中继交换机。配置例子:# Virtual Interface ListIF:S0:udp:10001:127.0.0.1:10000IF:S1:udp:10002:127.0.0.1:10003# DLCI switching between S0 and S1VC:S0:200:S1:100VC:S1:100:S0:200在这个例子中,有两个虚拟接口,s0和s1。IF:接口名称 netio_type[:netio_parameters]DLCI:交换构造VC:进入接口:进入_DLCI 出口接口:出口_DLCI在上面的例子中,交换机被配置为被接收到的包——从DLCI200的s0接口到DLCI 100的S1接口,反之亦然。(4)Dynamips模拟思科7200路由器可选择命令行概况-r 设置虚拟RAM的大小(缺省256M)-o 设置虚拟ROM大小(缺省值4M)-n 设置NVRAM大小(缺省128K)-l 设置登陆文件(默认pred_log0.txt),开启模拟器后,在模拟器文件夹可以看到这个文件-C 输入一个IOS配置文件进NVRAM-X 不使用文件模拟RAM(更快)-R 加载一个备用ROM (默认被插入)-S 加载一个象征文件-c 设置配置寄存器(默认0x2102)-m 设置底部MAC地址的(IOS选择默认)-k 设置时钟数(默认2s)-T 基于TCP的控制台 (默认 在终端)-A 基于TCP的AUX控制-i 阻塞路径说明,完全展现-j 禁用just in time 编译-t 选择NPE类型-M 选择中平面-p 定义一个端口适配器-s 绑定一个网络接口到端口适配器-a 虚拟ATM交换机配置文件-f 虚拟帧中继交换配置文件-b 虚拟桥接配置文件-e show主要机器的网络设备表(针对网卡的具体参数) (5)退出命令d : 显示设备清单r : 卸掉MIPS CPU寄存器 s : 延缓CPU竞争u : 恢复CPU竞争q : 离开CPU竞争b : 卸掉阻塞路径指令 c : 向盘写入IOS配置如果输入一个未知键,将被认为是帮助。
2.2 其它型号路由器其它型号的路由器如3745,3725,3600,2691等与7200原理比较相似,在此就不再一一分析。
Dynamips设计与分析-Dynamips及相关教学软件研究与设计第三章 需要仿真的通信层协议本章主要从需要仿真的通信层协议来进行分析,包括这几块:物理层,数据链路层,应用层。其中物理层里面主要分析:用UDP报文模拟传输,数据链路层里面主要分析:虚拟帧中继交换机,虚拟以太网交换机;应用层里面主要分析:虚拟机,虚拟设备,虚拟输入输出。
3.1 物理层3.1.1 物理层简介物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。物理层的定义:物理层提供机械的、电气的、功能的和规程的特性,目的是启动、维护和关闭数据链路实体之间进行比特传输的物理连接。这种连接可能通过中继系统,在中继系统内的传输也是在物理层的。物理层的主要功能: 为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成.一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接.所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路. 传输数据.物理层要形成适合数据传输需要的实体,为数据传送服务.一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞.传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要. 完成物理层的一些管理工作.物理层的四个重要特性: 机械特性 电气特性 功能特性 规程特性 1.机械特性主要定义物理连接的边界点,即接插装置。规定物理连接时所采用的规格、引脚的数量和排列情况。常用的标准接口:ISO 2110,25芯连接器,EIA RS-232-C,EIA RS-366-AISO 2593,34芯连接器,V.35宽带MODEMISO 4902,37芯和9芯连接器,EIA RS-449ISO 4903,15芯连接器,X.20、X.21、X.22.以下简单介绍几种标准接口:(1)V.35V.35是通用终端接口的规定,其实V.35是对60-108kHz群带宽线路进行48Kbps同步数据传输的调制解调器的规定,其中一部分内容记述了终端接口的规定。V.35对机械特性即对连接器的形状并未规定。但由于48Dbps-64Kbps的美国Bell规格调制解调器的普及,34引脚的ISO2593被广泛采用。模拟传输用的音频调制解调器的电气条件使用V.28(不平衡电流环互连电路),而宽频带调制解调器则使用平衡电流环电路。(2)X.21X.21是对公用数据网中的同步式终端(DTE)与线路终端(DCE)间接口的规定。主要是对两个功能进行了规定:其一是与其他接口一样,对电气特性、连接器形状、相互连接电路的功能特性等的物理层进行了规定;其二是为控制网络交换功能的网控制步骤,定义了网络层的功能。在专用线连接时只使用物理层功能,而在线路交换数据网中,则使用物理层和网络层的两个功能。(3)X.22X.22接口是指用户业务类别3~6的DTE/DCE复用接口,X.22建议规定了DTE和复用DCE之间的接口,该接口的操作速率为4800bit/s,并且能复用多条符合X.21建议规定的同步传输的用户信道,用户信道数目受限于网络自用结构所允许的用户信道数目。X.21建议支持的所有业务规定都是可行的。2.电气特性规定传输二进制位时,线路上信号的电压高低、阻抗匹配、传输速率和距离限制。早期的标准是在边界点定义电气特性,例如EIA RS-232-C、V.28;最近的标准则说明了发送器和接受器的电气特性,而且给出了有关对连接电缆的控制。 CCITT 标准化的电气特性标准CCITT V.10/X.26:新的非平衡型电气特性,EIA RS-423-ACCITT V.11/X.27 :新的平衡型电气特性,EIA RS-422-ACCITT V.28:非平衡型电气特性,EIA RS-232-CCCITT X.21/EIA RS-4493.功能特性主要定义各条物理线路的功能。线路的功能分为四大类:数据、控制、定时、地。4.规程特性主要定义各条物理线路的工作规程和时序关系物理层向数据链路层提供的服务: 物理连接的建立、维护与释放 物理连接分为点-点连接与多点连接 数据传输分为全双工、半双工与单工方式 数据传输分为串行传输方式与并行传输方式 串行传输方式的物理数据服务单元是位 并行传输方式的物理数据服务单元是N位,N为并行连接的物理通道数。数据传送要通过信道传输,信道channel一般是用来表示向某一方向传送信息的媒体。因此,一条通信电路往往包含一条发送信道和一条接收信道。通信方式有三个基本方式即单工通信,半双工通信,全双工通信。3.1.2 用UDP报文模拟传输用户数据报协议UDP增加了端口的功能和差错检测功能,发送数据前不需要建立连接,减少了开销和发送数据之前的时延。不使用拥塞控制,也不保证可靠交付,主机不需要维持具有许多参数的、复杂的连接状态表。由于UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。Dynamips在模拟思科路由器的过程中,用UDP报文模拟传输是一种非常重要的传输方式。
3.2 数据链路层3.2.1 数据链路层简介在发送数据时,数据链路层的任何是将在网络层交下来的IP数据报组装成帧,在两个相邻结点间的链路上传送以帧为单位的数据。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制,以及流量控制信息等)。控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。控制信息还使接收端能够检测到所收到的帧中有无差错。如发现有差错,数据链路层就放弃这人出了差错的帧,然后采取下面两种方法之一:或者不作任何其他的处理;或者由数据链路层通知对方重传这一帧,直到正确无误地收到此帧为止。数据链路层有时也常简称为链路层。在数据链路层主要需要仿真部分:帧中继交换机,以太网交换机。3.2.2 虚拟帧中继交换机帧中继是一种高性能的WAN协议,它运行在OSI参考模型的物理层和数据链路层。它是一种数据包交换技术,是X.25的简化版本。它省略了X.25的一些强健功能,如提供窗口技术和数据重发技术,而是依靠高层协议提供纠错功能,这是因为帧中继
Dynamips及相关教学软件研究与设计工作在更好的WAN设备上,这些设备较之X.25的WAN设备具有更可靠的连接服务和更高的可靠性,它严格地对应于OSI参考模型的最低二层,而X.25还提供第三层的服务,所以,帧中继比X.25具有更高的性能和更有效的传输效率。 帧中继广域网的设备分为数据终端设备(DTE)和数据电路终端设备(DCE),Cisco路由器作为 DTE设备。 帧中继技术提供面向连接的数据链路层的通信,在每对设备之间都存在一条定义好的通信链路,且该链路有一个链路识别码。这种服务通过帧中继虚电路实现,每个帧中继虚电路都以数据链路识别码(DLCI)标识自己。DLCI的值一般由帧中继服务提供商指定。帧中继即支持PVC也支持SVC。 帧中继本地管理接口(LMI)是对基本的帧中继标准的扩展。它是路由器和帧中继交换机之间信令标准,提供帧中继管理机制。它提供了许多管理复杂互联网络的特性,其中包括全局寻址、虚电路状态消息和多目发送等功能。 图3-1是一个帧中继交换机的应用图: 图3-1 帧中继交换机应用图虚拟帧中继交换机构造过去习惯于被模拟成一个模拟器之间的帧中继骨干。虚拟交换机的使用不是强制的,可以用适合的IOS直接连接模拟器设备。任何模拟器可以当作成一个虚拟帧中继交换机。配置例子# Virtual Interface ListIF:S0:udp:10001:127.0.0.1:10000IF:S1:udp:10002:127.0.0.1:10003# DLCI switching between S0 and S1VC:S0:200:S1:100VC:S1:100:S0:200在这个例子中,有两个虚拟接口,s0和s1。端口定义的构造与端口适配器很接近。 IF:interface_name:netio_type[:netio_parameters]DLCI交换构造 VC:进入接口:进入_DLCI 出口接口:出口_DLCI在上面的例子中,交换机被配置为被接收到的包从DLCI200的s0接口到DLCI 100的S1接口,反之亦然。3.2.3 虚拟以太网交换机近几年来,随着企业数据通信业务以及相关的融合业务的迅猛发展,以太网交换机作为不可或缺的关键设备不仅在数量上获得了极大的提高,而且在质量、性能等方面不断完善。 首先,速度是我们衡量网络性能的一个重要标准,从而也就成为以太网交换机等设备发展的一个重要方向。从最初的百兆到千兆再到万兆,以太网不断满足着人们快速增长的需求,给人们带来超乎寻常的体验。目前,人们对带宽的要求正在迅速提高,如迅猛发展的存储网络必需的海量数据传输通道;大量高带宽汇聚的城域网络;不断丰富的宽带应用所需的带宽支持;大型金融机构的数据集中;企业核心业务、ERP、CRM等复杂的应用扩展。今天,千兆为骨干、百兆为接入的主流结构,将逐渐向万兆为骨干、千兆为接入的结构过渡。 其次是智能化,这里所指的智能化不仅包括交换机设备智能化的管理,还包括它们对越来越多的智能业务的支持。随着网络部署新应用和融合多业务的需求日益迫切,单一交换机需要拥有丰富的功能以提供更多的支持,与此同时,复杂的网络环境加剧了网络管理的难度,通过智能交换设备进行网络的集中管理,不仅简化了管理步骤,而且降低了部署和维护的成本。从目前的市场发展趋势来看,智能交换机的需求量有了明显上升,越来越多的用户更愿意将智能交换机作为设备采购的首选。现在,越来越多的网络厂商更加注重交换设备的管理性能和功能融合,QoS、单一IP地址管理、远程控制等功能成为智能交换机不可或缺的重要特性。 此外,以太网交换机越来越多地融入路由功能。以往,大家习惯将交换机看作基于局域网技术的一种设备,认为只有在局域网上,才考虑使用交换机,如果要与广域网互连,那就是路由器的事情。实际上,随着ASIC技术和网络处理器的不断发展成熟以及网络逐渐被IP技术所统一,以太网交换技术已经走出了当年“桥接”设备的框架,可以应用到汇聚层和骨干层,路由器中所具有的丰富的网络接口,在目前的交换机上已经可以实现;路由器中拥有的丰富的路由协议,在交换机中也得到大量的应用;路由器中具有的大容量路由表在交换机中也可以实现。 对于整个以太网来说,它正在从企业级应用进入电信市场,出现了“电信级以太网”的概念和相关的解决lwfree.cn机的功能,可以满足部分用户的需求,对做实验也有一定的帮助。
3.3 应用层3.3.1 应用层简介应用层确定进程之间通信的性质以满足用户的需要(这反映在用户所产生的服务请求)。这里的进程就是指下在在运行的程序。应用层不仅要提供应用进程所需要的信息交换和远地操作,而且清寒要作为互相作用的应用进程的用户代理,来完成一些为进行语义上有意义的信息交换所知心朋友的功能。应用层直接为用户的应用进程提供服务。由于PC机上并无思科路由器的环境,所以Dynamips要对其进行仿真模拟出其环境,也要模拟出应用层上的协议。在应用层主要需要仿真部分:Virtual Machines虚拟机,Device设备,I/O输入输出。3.3.2 虚拟机(VM)由于PC机跟思科路由器的硬件设备不一样,从指令到构建也完全不同,所以我们需要在PC机上虚拟出思科路由器的工作环境,使在PC机上运行思科的IOS文件就像在真的思科路由器上运行一样,所以我们需要虚拟机。虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。既然是虚拟机,不外乎是虚拟硬件环境和指令系统,包括内存,设备,输入输出,总线等。7200 系列路由器使用NPE的DRAM、SDRAM和SRAM内存以根据型号的多种组合。可利用的内存分开成三个内存池:处理器池、I/O 池和PCI池(I/O-2在NPE-300)。有了虚拟机才能在虚拟机上运行思科路由器的IOS文件,各种设备才能够通过虚拟机运行,发挥其功效。3.3.3 模拟设备(Device)路由器和PC机一样,有中央处理单元CPU, CPU是路由器的处理中心。 PC机跟思科路由器构造完全不同,需要Dynamips在PC机上模拟出思科路由器的所有东西,包括Device,才能仿真出完全的思科路由器的环境,才能在PC机上像使用真正的思科路由器一样使用它。需要模拟的设备有CPU、寄存器(包含在CPU的实现中)、内存、总线、时钟、I/O。
Dynamips设计与分析-Dynamips及相关教学软件研究与设计第四章 各层实现方法通过第三章,了解了各层需要仿真的通信层协议,本章将具体分析各层是如何实现的。
4.1 物理层的实现在本节简单分析下用UDP报文模拟传输的实现。在Dynamips中使用了一个udp_connect函数来实现创建一个新的socket连接到指定的主机,其中的getaddrinfo函数返回的结构体struct addrinfo类型的成员包含了一个ai_addr的成员,该成员的类型是struct sockaddr,同时,addrinfo中还包含了ai_family, ai_socktype, ai_protocol成员,因此可以直接通过该返回结构来进行socket等函数的套接口调用。通过getaddrinfo函数得到该主机对应服务的所有的IP,然后尝试与其中一个IP来建立套接口进行连接。具体函数实现如下:/* 创建一个新的socket连接到指定的主机 *//* local_port即本地端口,remote_host即远程主机,remote_port即远程端口 */int udp_connect(int local_port,char *remote_host,int remote_port){ struct addrinfo hints,*res,*res0; struct sockaddr_storage st; int error, sck = -1; char port_str[20]; /* 定义了port_str数组及大小 */ memset(&hints,0,sizeof(hints)); /* 初始化内存空间 */ hints.ai_family = PF_UNSPEC; /* IPv4,IPv6都支持,将返回这2中类型的地址 */ hints.ai_socktype = SOCK_DGRAM; snprintf(port_str,sizeof(port_str),"%d",remote_port); /* 将参数远程端口remote_port按照整数的格式格式化,然后将其复制到port_str中,如果格式化后的长度sizeof(port_str),则只将其中的(sizeof(port_str)-1)个字符复制到port_str中,并给其后添加一个字符串结束符('\0')。*/ if ((error = getaddrinfo(remote_host,port_str,&hints,&res0)) != 0) { fprintf(stderr,"%s\n",gai_strerror(error)); return(-1); } /* 遍历 */ for(res=res0;res;res=res->ai_next) { /* 仅要IPv4和IPv6 */ if ((res->ai_family != PF_INET) && (res->ai_family != PF_INET6)) continue; /* 创建新的socket */ if ((sck = socket(res->ai_family,SOCK_DGRAM,res->ai_protocol)) < 0) { perror("udp_connect: socket"); continue; } /* 绑定到本地端口 */ memset(&st,0,sizeof(st)); /* 初始化内存空间 */ /* 以下语句判断IPv4,IPv6,或其它情况 */ switch(res->ai_family) { case PF_INET: { struct sockaddr_in *sin = (struct sockaddr_in *)&st; sin->sin_family = PF_INET; sin->sin_port = htons(local_port); break; } /* IPv4 */ case PF_INET6: { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&st;#ifdef SIN6_LEN sin6->sin6_len = res->ai_addrlen;#endif sin6->sin6_family = PF_INET6; sin6->sin6_port = htons(local_port); break; } /* IPv6 */ default: /* 不应该发生 */ close(sck); sck = -1; continue; } /* 尝试连接到远程主机 */ if (!bind(sck,(struct sockaddr *)&st,res->ai_addrlen) && !connect(sck,res->ai_addr,res->ai_addrlen)) break; close(sck); sck = -1; } freeaddrinfo(res0); /* 此处调用来释放getaddrinfo函数动态分配的内存 */ return(sck);}
4.2 数据链路层的实现在本层主要实现两个:虚拟帧中继交换机,虚拟以太网交换机。4.2.1 虚拟帧中继交换机的实现在这里主要分析如下几个部分: 创建一个帧中继交换机 删除一个帧中继交换机 创建一个交换机连接 删除一个交换机连接 保存帧中继的配置信息 读取帧中继交换机配置文件 启动一个帧中继交换机1.创建一个虚拟交换机表要想创建一个虚拟交换机表,首先要为要创建的这个表分配空间,初始化内存,初始化互斥锁对象,然后在固定的内存里面创建一个池,这里命名为Frame-Relay Switch,内存大小是t->mp占用空间的大小,然后进行命名,并且在注册表中增加一个记录,这样就创建了一个虚拟交换要表。此函数实现如下:frsw_table_t *frsw_create_table(char *name){ frsw_table_t *t; if (!(t = malloc(sizeof(*t)))) return NULL; memset(t,0,sizeof(*t)); /* 初始化内存 */ pthread_mutex_init(&t->lock,NULL); /* 初始化一个互斥锁对象 */mp_strdup(&t->mp,name))) goto err_name; if (registry_add(t->name,OBJ_TYPE_FRSW,t) == -1) { fprintf(stderr,"frsw_create_table: unable to create switch '%s'\n",name); goto err_reg; } return t; err_reg: /* 出错处理 */ err_name: mp_free_pool(&t->mp); free(t); return NULL;}
Dynamips设计与分析删除一个帧中继交换机调用registry_delete_if_unused(name,OBJ_TYPE_FRSW,frsw_free,NULL)实现。3.创建一个交换机连接先要分配一个新的VC,再要检查NIOs是合法的并且输入VC不存在,然后再增加一个RX监听器。4.删除一个交换机连接找到一个匹配的VC,然后删除它。5.保存帧中继交换机的配置信息保存帧中继交换机的名称,VC(虚拟连接)的输入、输出名称,和dlci_in、dlci_out等信息。6.读取帧中继交换机配置文件当需要应用帧中继交换机的时候就需要读取创建的帧中继交换机的配置信息。通过文件名匹配进行读取。7.启动一个虚拟的帧中继交换机函数实现如下:int frsw_start(char *filename){ frsw_table_t *t; if (!(t = frsw_create_table("default"))) { fprintf(stderr,"FRSW: unable to create virtual fabric table.\n"); return(-1); } if (frsw_read_cfg_file(t,filename) == -1) { fprintf(stderr,"FRSW: unable to parse configuration file.\n"); return(-1); } frsw_release("default"); return(0);}4.2.2 虚拟以太网交换机的实现在这里主要分析如下几个部分: 创建一个虚拟的以太网交换机 释放虚拟以太网交换机占用的资源 删除一个虚拟以太网交换机 为虚拟以太网交换机增加一个网络输入输出 从虚拟以太网交换机中移除一个网络输入输出 启动一个虚拟以太网交换机1.创建一个虚拟的以太网交换机首先应该为要创建的虚拟以太网交换机分配空间,并在内存中设置他的位置,大小,在注册表中增加要创建的信息,包括名称,类型(这里当然是以太网交换机)以及以太网交换机表的结构信息。这个函数的参数是name,即创建的以太网虚拟机的名称,首先定义一个以太网交换机表的指针t,然后给要创建的以太网虚拟机分配空间,然后调用函数memset(t,0,sizeof(*t)),即在虚拟内存中进行初始化设置。还要对名称进行合法性判断,不合法转到name出错处理,合法则调用registry_add函数在registry中增加记录,包括其名称,以及对象类型,这里是以太网交换机,然后判断能不能register switch,如不能则转到reg出错处理。否则返回t值达到创建的目的。该函数实现如下:ethsw_table_t *ethsw_create(char *name){ ethsw_table_t *t; if (!(t = malloc(sizeof(*t)))) return NULL; memset(t,0,sizeof(*t)); pthread_mutex_init(&t->lock,NULL); if (!(t->name = strdup(name))) goto err_name; if (registry_add(t->name,OBJ_TYPE_ETHSW,t) == -1) { fprintf(stderr,"ethsw_create: unable to register switch '%s'\n",name); goto err_reg; } return t; err_reg: free(t->name); err_name: free(t); return NULL;}2.释放虚拟以太网交换机占用的资源函数原型为:static int ethsw_free(void *data,void *arg)释放data->nio[i],再释放data->name,最后释放data。3.删除一个虚拟以太网交换机函数原型为:int ethsw_delete(char *name)通过调用registry_delete_if_unused(name,OBJ_TYPE_ETHSW,ethsw_free,NULL)函数来实现。4.为虚拟以太网交换机增加一个网络输入输出函数原型为:int ethsw_add_netio(ethsw_table_t *t,char *nio_name)尝试在NIO 列阵中查找一个free slot,如果没有free slot存在的话转到出错处理,然后获取NIO标志并且增加它的参考计数,默认的端口是连接在VLAN 1。5.从虚拟以太网交换机中移除一个网络输入输出函数原型为:int ethsw_remove_netio(ethsw_table_t *t,char *nio_name)在NIO 列阵设法查找NIO,在MAC地址表中除去这个端口,然后再从RX多重通道中移除这个NIO。6.启动一个虚拟以太网交换机想要实现启动一个以太网交换机,首先要创建一个以太网交换机,这个过程调用ethsw_create函数来实现,然后再读取以太网交换机的配置信息,这个过程通过调用ethsw_read_cfg_file函数来实现,这两个过程中要处理两种情况,一是无法创建,二是无法解析配置文件,这两种情况都要显示出错信息并返回值-1,最后要通过ethsw_release函数发布刚才创建的以太网交换机实现,以达到正常启动一个以太网交换机的目的。函数实现如下:int ethsw_start(char *filename){ ethsw_table_t *t; /* 创建一个默认的以太网交换机 */ /* 不能创建则显示出错 */ if (!(t = ethsw_create("default"))) { /* 无法解析则显示出错 */ if (ethsw_read_cfg_file(t,filename) == -1) { fprintf(stderr,"ETHSW: unable to parse configuration file.\n"); return(-1); } ethsw_release("default"); return(0);}
Dynamips设计与分析-Dynamips及相关教学软件研究与设计应用层的实现在本层主要实现三个部分:虚拟机Virtual Machines,虚拟设备Virtual Device,虚拟输入输出IO。4.3.1 虚拟机(VM)的实现首先分析vm_instance这个数据结构,它定义了很多参数,比方说设备类型,状态标记,实例id,对内存的定义有:RAM,ROM, IOMEM和NVRAM的大小。RAM,ROM,IOMEM,NVRAM分别是随机存储器,只读存储器,输入输出存储器以及非易失随机存储器。struct vm_instance { char *name; int type; /* 类型有C7200, C3600, ... */ int status; /* 实例状态标记 */ int instance_id; /* 实例id */ u_int ram_size,rom_size; /* RAM 和 ROM 大小(Mb) */ u_int iomem_size; /* IOMEM 大小(Mb) */ u_int nvram_size; /* NVRAM 大小(Kb) */…又定义了基本的硬件设备:CPU,PCI总线以及PCI I/O 空间。…cpu_group_t *cpu_group; /* CPU组 */ cpu_mips_t *boot_cpu; /* 引导CPU */ struct pci_bus *pci_bus[2]; /* PCI总线2 */ struct pci_bus *pci_bus_pool[VM_PCI_POOL_SIZE]; /* PCI 总线池 */ struct pci_io_data *pci_io_space; /* PCI 输入输出空间 */ …上面所说的这些都需要Dynamips进行虚拟实现,才能模拟出真正思科路由器的环境。在这里主要分析如下几个部分: 创建一个虚拟机实例 增加一个虚拟机 释放一个虚拟机 停止一个虚拟机 移除一个虚拟机 获取虚拟机类型 通过虚拟机关闭硬件资源 保存虚拟机配置信息到指定的文件1.创建一个虚拟机实例创建的虚拟机信息有名称,实例id,虚拟机类型。首先要为创建的虚拟机分配空间,然后是对内存空间初始化,包括类型虚拟机,虚拟机大小问题等。接着就是对虚拟机的各种属性进行详细的赋值操作了,包括虚拟机实例id,类型,状态标记,JIT使用的状态等等信息,最后还不要忘了对虚拟机命名,这里的函数是调用strdup()函数把参数名称复制给虚拟机指向的名称。最后一步就是在注册表中增加创建的这个虚拟机的记录。这样就实现了创建一个虚拟机。实现函数如下:vm_instance_t *vm_create(char *name,int instance_id,int machine_type){ vm_instance_t *vm; if (!(vm = malloc(sizeof(*vm)))) { fprintf(stderr,"VM %s: unable to create new instance!\n",name); return NULL; } /* 为创建的虚拟机分配空间 */ memset(vm,0,sizeof(*vm)); /* 这个函数对内存进行初始化,memset()的内涵:用来对一段内存空间全部设置为某个字符,这里全部设为0,初始化的空间大小即是虚拟机的大小,初始化的那段内存取名为vm。在Dynamips中进行创建操作时经常用到此函数 */ vm->instance_id = instance_id; /* 赋值id */ vm->type = machine_type; /* 赋虚拟机的类型 */ vm->status = VM_STATUS_HALTED; /* 赋虚拟机的状态标记 */ vm->jit_use = JIT_SUPPORT; /* 支持JIT标记 */ vm->vtty_con_type = VTTY_TYPE_TERM; vm->vtty_aux_type = VTTY_TYPE_NONE; vm->timer_irq_check_itv = VM_TIMER_IRQ_CHECK_ITV; if (!(vm->name = strdup(name))) { fprintf(stderr,"VM %s: unable to store instance name!\n",name); goto err_name; } /* 赋虚拟机的名称 */ if (vm_get_lock(vm) == -1) goto err_lock; if (vm_create_log(vm) == -1) goto err_log; if (registry_add(vm->name,OBJ_TYPE_VM,vm) == -1) { fprintf(stderr,"VM: Unable to store instance '%s' in registry!\n", vm->name); goto err_reg_add; } return vm; /* 返回虚拟机的值 */ err_reg_add: /* 以下为出错处理 */ vm_close_log(vm); err_log: free(vm->lock_file); err_lock: free(vm->name); err_name: free(vm); return NULL;}2.增加一个虚拟机函数原型为:void vm_object_add(vm_instance_t *vm,vm_obj_t *obj)通过改变obj指针和VM指针来完成3.释放一个虚拟机释放一个虚拟机就是释放其占用的资源,包括释放硬件资源,关闭记录文件,移除锁定文件,再释放虚拟机的各种参数。实现函数如下:void vm_free(vm_instance_t *vm){ if (vm != NULL) { vm_hardware_shutdown(vm); /* 关闭硬件资源 */ vm_close_log(vm); /* 关闭log文件 */ ); /* 释放虚拟机的各种属性 */ free(vm->sym_filename); free(vm->ios_image); free(vm->ios_config); free(vm->rom_filename); free(vm->name); free(vm); }}
Dynamips设计与分析-Dynamips及相关教学软件研究与设计停止一个虚拟机函数原型为:int vm_stop(vm_instance_t *vm)CPU组停止所有的CPU,VM标记为VM_STATUS_SHUTDOWN,并返回0。5.移除一个虚拟机函数原型为:void vm_object_remove(vm_instance_t *vm,vm_obj_t *obj)通过改变obj指针和VM指针来完成6.获取虚拟机类型函数原型为:char *vm_get_type(vm_instance_t *vm)通过vm->type得出虚拟机的型号是3600,7200,2691,3725,3745或其他。7.通过虚拟机关闭硬件资源函数原型为:int vm_hardware_shutdown(vm_instance_t *vm)CPU也要停止运行,释放object表、PCI总线使用的资源、PCI总线池,删除系统CPU组等操作8.保存虚拟机配置信息到指定的文件配置好虚拟机信息之后需要保存起来。函数原型为:void vm_save_config(vm_instance_t *vm,FILE *fd)保存虚拟机配置的各种信息4.3.2 虚拟设备(Device)的实现虚拟Device在Dynamips中是项重要的内容。先来看一个虚拟设备的数据结构:struct vdevice { char *name; u_int id; m_uint64_t phys_addr; /* 物理地址 */ m_uint32_t phys_len; /* 物理长度 */ m_iptr_t host_addr; /* 主机地址 */ void *priv_data; /* 私有数据 */ int flags; int fd; dev_handler_t handler; /* 句柄 */ struct vdevice *next,**pprev; };这是一个虚拟的设备结构,包括设备名称,编号,物理地址,物理长度,主机地址私有的数据等等信息,是虚拟设备必须具有的属性。在这里主要分析如下几个部分: 创建一个虚拟设备 获取虚拟设备 初始化一个虚拟设备 显示设备信息 映射一个设备1.创建一个虚拟设备函数实现如下:struct vdevice *dev_create(char *name){ struct vdevice *dev; if (!(dev = malloc(sizeof(*dev)))) { fprintf(stderr,"dev_create: insufficient memory to " "create device '%s'.\n",name); return NULL; } /* 为创建的虚拟设备分配空间 */ dev_init(dev); /* 初始化设备 */ dev->name = name; /* 为创建的虚拟设备命名 */ return dev; /* 返回虚拟设备 */}要创建一个设备,就应该有设备名称及占用的空间。因此这个函数先为设备分配一个空间,再调用dev_init(dev)函数对其初始化操作,最后返回这个设备值以达到创建一个设备的目的。2.获取虚拟设备要获取设备信息可以有三个方法,即通过id获取,通过name获取,通过物理地址查找获取(1)通过id获取设备信息函数实现如下:struct vdevice *dev_get_by_id(vm_instance_t *vm,u_int dev_id){ if (!vm || (dev_id >= MIPS64_DEVICE_MAX)) return NULL; return(vm->dev_array[dev_id]);}分析一下这个函数如何实现的,先判断id是否合法即在合法的范围内。合法则利用设备id的调用其虚拟机指向的设备阵列即可返回设备信息。(2)通过name获取设备信息函数实现如下:struct vdevice *dev_get_by_name(vm_instance_t *vm,char *name){ struct vdevice *dev; if (!vm) return NULL; for(dev=vm->dev_list;dev;dev=dev->next) if (!strcmp(dev->name,name)) return dev; return NULL;}先判断vm存在与否,再利用参数name匹配查找获得设备信息。(3)通过物理地址获取设备信息函数实现如下:struct vdevice *dev_lookup(vm_instance_t *vm,m_uint64_t phys_addr,int cached){ struct vdevice *dev; if (!vm) if ((phys_addr >= dev->phys_addr) && ((phys_addr - dev->phys_addr) < dev->phys_len)) return dev; } return NULL;}通过物理地址获取设备信息,先判断vm存在与否,再利用参数phys_add(物理地址)匹配查找获得设备信息。4.初始化一个虚拟设备函数原型为:void dev_init(struct vdevice *dev)调用memset(dev,0,sizeof(*dev)),为虚拟设备初始化内存,将值-1赋给dev->fd
Dynamips及相关教学软件研究与设计显示设备信息函数原型为:void dev_show(struct vdevice *dev)显示设备的各种参数信息。先判断参数dev的合法性,再显示设备指向的名称,物理地址,物理长度。6.映射一个设备在指定的物理地址中重新映射一个设备,先判断参数name是否存在,然后把参数paddr赋给设备指向的物理地址(dev->phys_addr),把参数len赋给设备指向的物理长度(dev->phys_len),把orig->fd赋给设备指向的fd,把orig->主机地址(orig->host_addr)赋给设备指向的主机地址(dev->host_addr),把orig->handler赋给设备指向的handler(dev->handler),最后返回dev各种值。4.3.3 虚拟输入输出(IO)的实现在这里主要分析PCI I/O和Network Input/Output(NIO)首先分析PCI I/O的实现 增加一个PCI I/O 移除PCI I/O 初始化PCI I/O再分析NIO 创建一个新的NetIO 删除一个NetIO 保存NETIO配置信息 通过NETIO发送一个包 通过NETIO接收一个包 TCP sockets的实现 UDP sockets的实现1.增加一个PCI I/O增加一个PCI I/O设备,首先第一步是为其分配空间,分配好空间后就要为其各属性赋上相应的值,这样就达到创建一个PCI I/O设备的目的了。具体情况是先定义一个i/o设备指针p,先为新的I/O device分配空间,将参数star赋给p指向的start,将参数end赋给p指向的end,将参数dev赋给p指向的real_dev,再将参数handle赋给p指向的handler,最后再把p赋给d指向的设备表dev_list并返回p。此函数如下:struct pci_io_device *pci_io_add(struct pci_io_data *d, m_uint32_t start,m_uint32_t end, struct vdevice *dev,dev_handler_t handler){ struct pci_io_device *p; if (!(p = malloc(sizeof(*p)))) { fprintf(stderr,"pci_io_add: unable to create a new device.\n"); return NULL; } /* 分配空间 */ p->start = start; /* 为各属性赋值 */ p->end = end; p->real_dev = dev; p->handler = handler; p->next = d->dev_list; p->pprev = &d->dev_list; if (d->dev_list != NULL) /* 在设备列表中增加记录 */ d->dev_list->pprev = &p->next; d->dev_list = p; return p;} 2.移除PCI I/O 函数原型为:void pci_io_data_remove(vm_instance_t *vm,struct pci_io_data *d)首先保证d不为空,然后移除pci i/o设备,再释放d自身的结构。3.初始化PCI I/O首先为其分配空间,然后在内存中设置相关信息,接着调用初始化设备的操作,将此PCI_IO的设备初始化,进行各种赋值操作包括其设备名称,私有的数据,物理地址,物理长度,设备句柄。最后虚拟机绑定设备的函数即vm_bind_device()将此PCI_IO绑定到虚拟机中。具体函数实现是先定义一个pci_io_data类型的指针d,先分配PCI I/O 数据结构空间,再把pci_io赋给d指向的设备名称(d->dev.name),把d赋给d指向的dev.priv_data,把参数paddr赋给d指向的设备物理地址(d->dev.phys_addr),把2*1048576赋给d指向的设备物理长度(d->dev.phys_len),把pci_io_access赋给d->dev.handler。最后调用虚拟机绑定设备函数vm_bind_device(vm,&d->dev)实现。此函数如下:struct pci_io_data *pci_io_data_init(vm_instance_t *vm,m_uint64_t paddr){ struct pci_io_data *d; if (!(d = malloc(sizeof(*d)))) { fprintf(stderr,"PCI_IO: out of memory\n"); return NULL; } /* 分配空间 */ memset(d,0,sizeof(*d)); /* 初始化内存 */ dev_init(&d->dev); /* 初始化设备 */ d->dev.name = "pci_io"; /* 赋值 */ d->dev.priv_data = d; d->dev.phys_addr = paddr; d->dev.phys_len = 2 * 1048576; d->dev.handler = pci_io_access; vm_bind_device(vm,&d->dev); return(d);}4.创建一个新的NetIO函数原型为:static netio_desc_t *netio_create(char *name)先为nio分配空间,设定nio型号为空,再保存名称。5.删除一个NetIO函数原型为:int netio_delete(char *name)通过调用registry_delete_if_unused(name,OBJ_TYPE_NIO,netio_free,NULL)函数实现。6.保存一个NETIO配置信息函数原型为:void netio_save_config(netio_desc_t *nio,FILE *fd)调用nio->save_cfg(nio,fd)函数来保存参数nio,fd的信息。7.通过NETIO发送一个包函数原型为:ssize_t netio_send(netio_desc_t *nio,void *pkt,size_t len)包括发送包的NIO名称, 发送包的字节数大小,其间要应用TX过滤器,最后成功返回发送包的信息。8.通过NETIO接收一个包函数原型为:ssize_t netio_recv(netio_desc_t *nio,void *pkt,size_t max_len)首先接收包的信息,包括包的名称,包的字节长度,再应用RX过滤器,返回包的长度len。9.TCP sockets的实现
Dynamips设计与分析释放一个NETIO TCP函数原型为:static void netio_tcp_free(netio_inet_desc_t *nid)调用close(nid->fd)函数实现。(2)发送一个NETIO TCP函数原型为:static ssize_t netio_tcp_send(netio_inet_desc_t *nid,void *pkt,size_t pkt_len)这是一个通过TCP发送一个包的很简单的协议,32位的网络格式包。发送nid->fd,pkt,pkt_len等信息。(3)接收一个NETIO TCP函数原型为:static ssize_t netio_tcp_recv(netio_inet_desc_t *nid,void *pkt,size_t max_len)首先判断参数的合法性,再返回所读取各种信息。10.UDP sockets的实现(1)释放一个NETIO UDP函数原型为:static void netio_udp_free(netio_inet_desc_t *nid)先释放nid->remote_host,再将其赋空值,最后关闭nid->fd。(2)发送一个NETIO UDP函数原型为:static ssize_t netio_udp_send(netio_inet_desc_t *nid,void *pkt,size_t pkt_len)往UDP socket中写一个包。调用send(nid->fd,pkt,pkt_len,0)函数实现。(3)从NETIO UDP中接收一个包函数原型为:static ssize_t netio_udp_recv(netio_inet_desc_t *nid,void *pkt,size_t max_len)调用recvfrom(nid->fd,pkt,max_len,0,NULL,NULL)函数来实现。第五章 结论论文介绍了Dynamips这个强大的思科路由器模拟软件,详细分析了Dynamips的工作流程并以及各个主要模块功能的实现过程,为“dynamips及相关教学软件研究与设计”这个课题的最终完成提供了前提条件。通过本次设计,做出了一个基于DYNAMIPS技术的思科路由仿真实验平台。这个平台最大的优点就是图形化操作界面,使用方便直观,用图形反映网络拓扑图结构,对各种设备进行配置,并能够自动生成配置脚本文件即拓扑文件,界面非常友好,容易操作,具有一定的使用价值。Dynamips是一款非常优秀的思科路由模拟器软件,其最大的缺点就是没有图形化界面,需要记住很多命令,操作起来不很方便;Dynamips模拟思科路由器的时候非常耗资源,尤其是耗费大量的内存和CPU资源,如何尽量降低内存与CPU的使用率也是一个难题。通过本次设计,对思科路由器也有了一定的解,对虚拟技术特别是对虚拟路由器有了新的认识,不过对此认识还不是很深刻,以后有待继续加强。在我们组本次设计开发出的系统中,由于掌握的知识有限,没有能够做出很好的判断实验是否成功的模块。所以,实现判断网络实验是否成功的功能,将是这个系统主要改进的部分。第六章 总结与体会 在没有做毕业设计以前觉得毕业设计很简单,但是通过这次做毕业设计发现自己的看法有点太片面。毕业设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。通过这次毕业设计使我明白了自己原来知识还比较欠缺。自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。通过这次毕业设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。 这次毕业设计让我更好的掌握了C语言这门基础程序设计语言,对指针部分有了更好的掌握,对软件开发有了新的认识。 在此之前我对于计算机网络不是很了解,尤其是网络设备,通过这次设计,查阅大量思科路由器的资料,使我对思科路由器有了一个较好的认识,也了解了一些网络方面前沿的技术。 在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。 毕业设计是一个比较长的过程,在这个过程中我学会了冷静思考,当遇到难题卡壳时我不再心浮气躁,而是会冷静下来,积极想出对策,如果个人无法解决,我会努力寻求同学和老师的帮助。 另外一点就是锻炼了我查寻资料的能力,不论是图书馆还是互联网络,都进行了大量的查寻资料的工作。 总之,这次毕业设计对我的帮助很大,使我的能力获得提高,但也存在些许问题,这就要靠自己以后更加努力,提高自已!谢辞本次设计过程中我得到了很多人的帮助,在此我要感谢他们。王*老师对我的设计起到了非常大的作用,他指导我如何去分析程序,如何理解DYNAMIPS,引导我从歪曲甚至错误的思路中走出来;是他一次次孜孜不倦的教导使得我对本次设计有了越来越清晰的认识;每当我遇到自己没办法解决的难题时,王老师总是耐心地指导我,设计才最终得以完成,王老师是让我受益最多的人。在此还要感谢跟我毕业设计同一小组的其他三位同学,他们分别是朱贵富、朱俊、李军,尤其是朱贵富同学,给了我很大的帮助,在我迷惘的时候是他给我讲清思路,解疑答惑,一起进步。有了大家的帮助,我的毕业设计才能更快更好的完成。再一次感谢他们,让我的大学时光如此光彩!最后要感谢Dynamips的作者christophe Fillot,给我们创作了一个如此优秀的软件!
Dynamips设计与分析-Dynamips及相关教学软件研究与设计参考文献[1] 谭浩强. C程序设计.第二版. 北京:清华大学出版社,2004.[2] 陈向群. 操作系统教程.第二版. 北京:北京大学出版社,2006.[3] 王锡江、潘金贵. C程序开发技术及工具库. 南京:南京大学出版社,1993.[4] 梁广民、王隆杰. 思科网络实验室路由、交换实验指南. 北京:电子工业出版社,2007.[5] 张庸. 计算机组成原理实验及课程设计指导. 重庆: 重庆大学出版社,2001.[6] 谢希仁. 计算机网络. 第四版. 北京: 电子工业出版社,2006.[7] Carl Hamacher. 计算机组成. 北京: 机械工业出版社,2004.[8] 石硕. 交换机/路由器及其配置. 北京: 电子工业出版社,2006.[9] 魏亮. 路由器原理与应用. 北京:人民邮电出版社,2005.[10] 石硕. 路由器原理与设计. 北京:电子工业出版社,2006.[11] 陆魁军. 网络实践指南——基于Cisco路由器和交换机. 北京:清华大学出版社,2007.[12] 雷震甲. 网络工程师教程. 第二版. 北京:清华大学出版社,2006.[13] 魏大新、李育龙、强振海. Cisco网络工程案例精粹. 北京: 电子工业出版社,2007.[14] 王群. 非常网管:网络基础. 北京:人民邮电出版社,2006.[15] Dynamips源代码
附录翻译部分IPv6 The New Internet Protocol (Second Edition)新因特网协议 IPv6 (第二版)第2章第1节第2章 IPv6的设计 IPv6的设计基于一个很简单的思想:如果IPv4存在任何重大缺陷,那么在前些年因特网就不可能取得如此巨大的成功。正是由于IPv4的设计相当好,所以IPv6理所当然要最大程度地保留其特点。确实,或许只增加地址长度、而不做其他任何变动就足够了。然而,10年来的实践经验还是有收益的,IPv6实际上就在这些经验的基础上建立起来。它并不是简单地从IPv4推导而来,而是决定性的改进版本。
2.1 IPv6报头格式 所有对新版本IP的介绍都从IPv6报头格式介绍开始。IPv6报头由64位的报头和个128字节的IPv6源地址和目的地址组成。报头总长40个字节,如图2-1所示。起始的64位组成结构如下■版本(4位)■类(8位)■数据流标签(四位)■“有效负载”长度(16位)■下一个报头类型(8位)■跳数极限(8位) 图2-1 IPv6报头
我们假设读者已经对“传统IP”有一定程度的了解.下面就通过与传统职的比较来分析新的IP——IPv6。2.1.1 新旧版本报头的比较新报头实际上比旧报头简单。新版本报头只有6个固定字段和2个地址中则有10个固定字段、2个地址和一些选项,如图2-2所示。 图2-2 IPv4报头 可以看出,在报头中唯一保持同样含义和同样位置的是版本字段,都是用最开始的4位来表示。这种设计的最初想法是在同一局域网上,使用相同的封装和链路驱动来同时运行IPv4和IPv6。网络应用程序判断报头开始位置的版本宁段,确定时数据包的处理。如果版本号为4(二进制的0100),那么就认为是IPv4的数据包;如果版本号为6(二进制的1010),那么就认为是一个IPv6的数据包。这种想法实际上已经被人抛弃,至少其影响已经减少。只要有可能,IPv4和IPv6都应在介质层分解复用。IPv6数据包在以太网里进行传输时将使用内容类型86DD(16进制),而不是IPv4的8000。旧报头中有6个字段不再采用,它们是:报头长度、服务类型、标识符、标志、段偏移量、报头校验和;有3个字段被重新命名,并在某些情况下略做改动,它们是:长度、协议类型和存活时间;对旧报头中的选项机制进行了彻底修正,增加了2个新的字段:类和数据流标签。2.1.2 简化 IPv4报头的设计以1975年的最高科技水平为基础。在20年后,我们不应该对我们现在知道有更好的做法而惊讶。我们从如下3个最主要的简化措施开始: ■对所有的报头都分配固定的格式 ■去掉报头校验和 ■去掉跳到跳的分段过程 IPv6报头不包含任何选项字段。这并不意味着我们就不能对特殊情况的数据包使用选项操作。恰恰相反,我们将在下一部分看到,在IPv4中虽然采用了变长的选项字段,但却无法实现选项操作。IPv6中的做法是在主报头后附加上一个“扩展报头”(extensionheaders)。这样他的一个明显好处就是在IPv6中不再需要报头长度字段(IHL)。 去掉报头校验和似乎是一个大胆的改动。这样做的主要优点是减小处理报头的开销,因为每次中转并不需要检查和更新校验和。这样做的最大危险就是在未侦测到的错误出现时可能会使网上出现路由出错的数据包。然而,由于大多数的包封装处理过程都有数据包校验和,因此危险会减到最低程度。实际上.在IEEE-802网络的介质访问控制过程、ATM电路的适配层的点对点协议(PPP)的帧处理过程中都设置了相应的校验和。IPv4包括有一个分段过程,以便发送方发送大数据包时不必担心网络的中继能力。如有必要,这些大数据包就校对成一定大小的片段。接受方在收到所有的片段之后再重组该数据包。然而,我们在传输控制协议的实现过程中得到一个重要结论:传输单元也应该就是控制单元。假设我们想通过一个只能传送小段包的网络去传输大数据包,那么数据包传输的成功性取决于每一小段传输的成功性。只要有—小段丢失,那么整个数据包都得重传,结果就极大地降低了网络的使用效率。 IPv6的规则是:主机通过一个称为“路径MTU发现”(path MTU discovery)的过程能知道最大的可接受的分段大小。如果它们试图发送较大的数据包,那么这些数据包就会被网络不加考虑地丢弃。这样,在IPv6中就无需IPv4中的那些分段控制字段,无须数据包标识符、分段标志以及段偏移。不过,在IPv6中包含有一个端到端的分段过程,我们将在下一节讲述。根据1996年的规范,所有的IPv6网络都假定能够传输536字节的有效负载。Steve Deering在1997年的IPv6版本中想把它提高到1500
Dynamips设计与分析字节。不想发现或记忆路径MTU的主机只发送小数据包就可以了。IM的最后简化版本还去掉了服务类型(TOS)字段。在IPv4中,主机要设置TOS来表明对最宽、最短、最便宜或者员可靠路径的需求。然而,这个字段在应用程序中很少使用。第6章我们将看到,IPv6提供了处理这些优先特性的机制。2.1.3 修订传统参数像IPv4一样,IPv6报头包含有数据包长度、存活时间和协议类型等参数。然而,这些字段的定义都根据经验做了修订。 IPv4中的总长度在IPv6中用“有效负载长度”代替。这两者有点细微差别,因为根据有效负载长度的定义,是指紧跟报头之后所携带的数据的长度。例如,假设有效负载是一个TCP数据包,它由20字节的TCP报头和400字节的应用数据组成。在州中,我们将在这个冗P数据包前加上一个20字节的IPv4报头,这样总长度就是440字节。而在IPv6中需要加上40字节的IPv6报头,但是有效负载的长度却设置为420而不是460。如同IPv4,IPv6的长度字段也用16位来编码,从而最大的数据包限制为64K字节。在后面我们将看到,实际上IPv6通过使用“大型数据报”(jumbogram)选项也可以为较大的数据包提供某些必要的处理措施。 协议类型字段改名为“下一个报头”类型。这反映了IP数据包的新型结构。在IPv4中,IP报头之后是传输协议数据,例如UDP或TCP数据包。而较简单的IPv6数据包也有几乎同样的结构,只要将其“下一个报头”类型设置成UDP(17)或TCP(6)协议类型即可。但我们在后面还将看到,在IP和TCP或UDP有效负载之间可以插入“扩展报头”(extensionheader)。这样,“下一个报头”类型就设置为第一个扩展报头的类型。将存活时间改为“跳数极限”(hop limit),遵循的是一个合理的设计原则——广告消息的真实性。在IPv4中,存活时间用秒数来表示,表明数据包在网络里被销毁之前能够保留的时间长短。存活时间的概念基于一种对传输控制协议的理论分析。如果数据包允许在网络中永远存活,保留无限长时间,那么网络中就有可能随时蹦出过时数据包,导致协议出错。例如,TCP有这样的机制:一个上下文相关的连接在结束连接后保持一定时间的空闲期。这种机制用来确保网络中所有属于过时连接的数据包都被清除干净。但只有当传输控制机构知道数据包可以在网络里保留多长时间时,这种机制才能正常工作。TTL字段就是用来设置这个时间的。IPv4规范要求TTL值在经过每个路由器时减1s,或如果在路由队列中等待的时间长于1s时就减实际的等待时间。但事实上,估计数据包的等待时间很困难。由于时间计数通常采用毫秒而不是秒,所以大多数路由器就只是简单地在每次中继时将TTL减1。在IPv6中,这种做法被正式采用,因此也就对这个字段采用新的名字。它累计的是跳数,而不是秒数。传输协议应能提供保护机制,来防止老的数据包复活,如采用RFC 1323中指定的时戳,或使用长计数字段。2.1.4 新增的字段 IPv6报头中有2个在IPv4中不曾出现的字段,即“数据流标签”和“类”。这2个字段主要用来协助处理“实时”通信,目前该领域还处在研究阶段。事实上,它是更改1996年规范中的“控制位”字段的名字和含义而来的。当IPv6规范在1996年第一次出版时,报头中设计有4位用来当作优先级字段,这样就能有16个可能值,优先级范围从“最高优先级”0到“最低优先级”15。然而,大量的研究和经验表明,必须修改这种优先级的概念。于是这个字段就扩大到8位,并重新命名为“类”。 “数据流标签”用来区分“请求进行同样处理”的数据包,即那些从特定源站点出发,使用给定的选项,发送到特定目的站点的数据包。我们将在第6章详细讲述这些字段的处理。