TOMATOFAN 发表于 2011-12-22 08:53

NS2网络模拟的原理

<span class="Apple-style-span" style="color: rgb(85, 85, 85); line-height: 21px; "><div style="font-family: Ubuntu, UbuntuBeta !important; "><span style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: normal; border-collapse: collapse; font-size: 12px; ">1. 网络模拟和网络仿真&nbsp;&nbsp;此处参考《NS与网络模拟》--徐雷鸣</span></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;(仅仅在此处,我们需要分别对待这两个术语,其他时刻请依据语境判断)</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;徐老师在该书的开头详细阐明了“网络模拟”和“网络仿真”这两个有着本质差别的概念;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;网络模拟 Simulation</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模拟,即针对一个物理的或抽象的系统,选取某些行为特征,用另一个系统来表示他们的过程;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;网络仿真 Emulation</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仿真,即用另一个数据处理系统(主要是硬件),来全部或部分地<font color="#FF0000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">模仿</font>某一数据处理系统,以至于<font color="#FF0000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">模仿系统<font color="#000000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">能像</font>被模仿系统</font><font color="#000000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">一样接受相同的数据,执行同样的程序,获得同样的结果。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(模仿系统和被模仿系统,在我们考虑范围内在功能上是等价的!)</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;故而:</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;Simulation强调的是模仿一个系统过程的 某些行为特征;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;Emulation 强调的是模仿者可以<font color="#FF0000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">取代</font>被模仿者或者嵌入到被模仿的系统中,并且表现出等价的行为;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;NS的设计之初是兼有“模拟”和“仿真”两大功能的。NS首先是可以模拟一个网络的运行过程,在此基础上做仿真的扩展,再嵌入到一个活动的网络中去。 NS中特定的对象可以把真实网络的分组数据引入到模拟器中,并将模拟器中产生的分组数据输出到真实的网络中。 不过,NS中的这种仿真功能一直都没有得到充分开发,现在还相当不成熟,平台移植性也比较差,很少被人使用。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font color="#FF0000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;注意: (以下是个人心得)</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font color="#FF0000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;1. NS2模拟时,传递的每个数据包实际上只有包头信息,并且默认情况下该包头信息包含几乎各种协议规定的字段,而每一次具体的模拟仅仅在相应的字段上进行操作(只使用与协议相关的包头字段); 因为模拟过程中数据包的数据毫无作用,所以根本不必传输,即仅仅包头信息就已完整表征实际网络中的一个分组(数据包)。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font color="#FF0000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;2. 网络模拟的关键之一就是时间的控制(事件是按时序产生的、行为是时间依赖的、况且TCP/IP协议本身就时分依赖于计时器。&nbsp;&nbsp;模拟过程的时间显然是无法与真实网络同步的,而且也没必要同步(仿真时才需要同步),因此模拟的时间戳通过NS2计时器功能模块统一控制,每一个计时器的实现也是依赖于模拟时间的,而不是实际时间。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font color="#000000" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">2. NS是一个离散事件模拟器&nbsp;&nbsp;&nbsp;&nbsp;此处参考《NS Manual》</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;上面我提到NS2的仿真时间与实际时间是不一致的(模拟处理过程的速率不直接对应着实际时间),而是通过统一时钟控制和分组包头对应的时间戳字段标志来完成的。 因此不难理解NS的离散时间模拟的本质,也可以说是时间驱动的网络模拟。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;NS是一个离散事件模拟器。简单来说,系统状态的改变由事件决定,状态变迁仅仅发生在事件发生时进行。&nbsp;在NS2网络模拟过程中,典型的事件包括分组到达、时钟超时等。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;模拟器所做的工作就是不停地处理事件容器(一般是FIFO队列)中一个个的事件,而一个事件的处理又可能会引发后续的事件(被加入到时间容器中),直到所有时间被处理完成或者某一个特定事件的发生位置,模拟过程终止。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;NS的核心部分是一个离散事件模拟引擎,对应为Scheduler类,负责记录当前时间,调度网络事件队列中的时间,并调用与事件相关联的处理函数,提供产生新事件的函数,指定事件发生的时间(即,给相应的Event类实例的时间变量赋值),等等。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">3. NS2软件编写&nbsp;&nbsp;&nbsp;此处看考《NS Manual》</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NS2是由UC Berkely结合C++和OTCL语言开发的面向对象的离散事件模拟器。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于采用这两种语言的解释:</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1) 网络模拟的任务为两类</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;高效灵活的操作:&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体网络协议的详细模拟和实现需要一种系统编程语言, 它应该具有高效操作字节、包头等数据结构,便于特定的算法在大规模数据集合上的实现,而且这些算法往往是需要重复执行的,所以高效是很重要的。&nbsp;&nbsp;对于这类任务而言,运行效率是关键,而编程开发、重编译、与其他模块的组合耗时则不影响网络模拟过程。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;便捷的网络场景配置:</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们的网络模拟实际上是围绕着网络组件(节点、链路、队列、特定协议、路由算法)和网络环境的具体参数进行的,换句话说,我们利用不同的网络组件创建我们的网络场景,更改网络组件的参数和网络环境的参数,进行不断的重复测试和对比测试。 因此我们需要高效的网络配置方案,以便在较短的时间开发出大量的网络场景。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;(2)选择C++和OTCL语言&nbsp;&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C++ 程序运行效率高,是强制类型语言,容易实现复杂的数据结构和精确的、复杂的算法, 不过修改、debug和重新编译的耗时比较长, 因此被选做用于具体协议的开发实现。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OTCL运行速度比较慢,但是可以很方便地(并且是交互地)修改,不需要编译(解释性语言),而且OTCL不是强制类型的,不容易出错, 因此适合用来做模拟的配置。</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;(3)拓展NS2时语言选取的建议</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">OTCL: 模拟场景的建立、具体参数的配置,以及模拟中只需要运行一侧的程序;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果通过Otcl脚本操作已经存在的C++对象很方便达到目的时;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C++ :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要对一个数据流的每个分组进行处理的任何工作;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果必须修改已存在的C++类的行为时(以实现特定网络协议)。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">4. NS2 软件结构的初识</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前面已经说到NS2模拟的核心是离散事件模拟引擎。 原则上用户可以利用该引擎对任何系统进行模拟,而不陷于通信网络系统。&nbsp;&nbsp;通过很多NS设计者的努力,NS已经针对网络模拟预先做了大量的模型化工作,从而方便用户将焦点集中在所关注的协议本身,快速实现协议、方便完成测试。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NS2对网络系统中一些通用的实体已经进行了建模,例如链路、队列、分组、节点等, 并用对象来实现这些实体的特性和功能,这就是NS的构件库。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相对于一般的离散事件模拟器来说,NS的优势就在于它所具有的丰富的构件库,并且它们易于组合,易于扩展。用户可以充分利用这些已有的对象,进行少量的扩展,组合出所要研究的网络系统的模型,然后进行模拟(测试)。 这样,减轻了进行网络模拟研究的工作量,提高了效率。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NS的构件库所支持的网络类型包括: 广域网、局域网、移动通信网、卫星通信网等;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所支持的路由方式包括: 层次路由、动态路由、多播路由等;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NS还提供了跟踪和监测的对象,可以把网络系统的状态和事件记录下来以便分析。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NS的构件库还提供了大量的数学方面的支持,包括随机数产生、随机变量、积分等</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NS2的结构示意图:</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" src="http://blogimg.chinaunix.net/blog/upfile2/100211230539.jpg" alt="NS2网络模拟的原理" title="NS2网络模拟的原理" style="font-family: Ubuntu, UbuntuBeta !important; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该图Legend: 这是NS2 的整体框架, 网络模拟用户使用OTCl脚本进行场景创建,并通过命令是的Event Scheduler执行; OTCL脚本的命令和网络构件库,则是通过Tclcl机制实现对应的。</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; ">&nbsp;</div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简化的NS2 网络模拟用户的视图:</font><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" src="http://blogimg.chinaunix.net/blog/upfile2/100211231235.jpg" real_src="http://blogimg.chinaunix.net/blog/upfile2/100211231235.jpg" width="500" alt="NS2网络模拟的原理" title="NS2网络模拟的原理" style="font-family: Ubuntu, UbuntuBeta !important; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; ">&nbsp;&nbsp;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;</font></div><div style="font-family: Ubuntu, UbuntuBeta !important; "><font face="宋体" style="font-family: Ubuntu, UbuntuBeta !important; word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该图Legend:用户OTCL脚本由Otcl解释器解释执行, 最后得到模拟结果,进而进行分析或利用NAM显示模拟的整个过程。</font></div></span>
页: [1]
查看完整版本: NS2网络模拟的原理