第1章 NS-2仿真基础
1.1 初识NS-2
1.1.1 NS-2的起源
NS的英文全称是 Network Simulator,翻译为网络仿真器,也称网络模拟器[1-3]。NS-2是网络仿真器的第2个版本。通常认为, NS源于 UC Berkeley 1989年开发的 REAL网络仿真器(REAL network simulator)。REAL是在哥伦比亚大学开发的 NEST网络测试平台(network simulation testbed )的基础上实现的,是针对基于 UNIX系统的网络仿真和设计进行的,主要用于模拟各种网际协议(Internet Protocol,IP)网络。其主要发行版本有 REAL4.0、REAL4.5和 REAL5.0。1995年,NS-2的开发得到美国军方和美国国家科学基金项目的资助,由 UC Berkeley、USC/ISI、Xerox PARC和 LBNL合作开发。1995年7月31日,NS推出 v1.0al版本,此后一直不断有改进和更新。1996年11月6日,NS-2的第一个版本NS-2.0al版本推出。此外,2003年2月26日发布NS-2.1b10版本后,NS-2改变了版本标注方法,将NS-2.1b10作为NS-2.26。目前,NS-2的*新版本是NS-2.35。
1.1.2 NS-2的原理
1.NS-2的分裂对象模型
NS-2是一款面向对象的网络仿真器,本质上是一个离散事件仿真器。NS-2使用分裂对象模型的开发机制,运用 C++和 OTcl开发。两种语言采用 TclCL进行自动连接和映射[4]。NS-2的分裂对象模型如图1.1所示。NS-2考虑效率和操作便利等因素,将数据通道和控制通道分离。数据通道上的网络组件和事件调度器对象使用 C++编写,并通过 TclCL映射机制映射到OTcl,可以减少事件和分组的处置时间。NS-2可以看作 OTcl的脚本解释器,包含离散事件调度器、网络组件对象库。离散事件调度器用来控制网络仿真的进程,并在合适的时间激活离散事件队列中的当前事件,执行该离散事件。网络组件用来模拟网络设备或节点的通信,通过制定网络仿真场景和网络仿真进程,交换特定的分组来模拟真实网络情况,并把执行情况记录到 Trace文件中,通过分析解读 Trace文件获取网络仿真结果。用户使用简单易用的 Tcl(tool command language)/OTcl脚本就可以对网络拓扑特性、节点属性、链路属性等各种部件和参数进行快捷便利的配置。NS-2采用这种分裂对象模型,一方面可以提高网络仿真的效率,加快网络仿真速度;另一方面可以增强网络仿真配置的灵活性和操作的便捷性。
图1.1 NS-2的分裂对象模型
2.NS-2的事件驱动机制
时间相关的仿真,依据对事件的处理方式可以分为时间驱动机制和事件驱动机制。时间驱动机制(图1.2(a))在每一个固定的时间间隔.内寻找事件,在.时间段结束时执行事件。时间驱动机制的性能受时间间隔.的影响,如果.太大,则会导致误差;如果.太小,则会耗费计算机资源。事件驱动机制(图1.2(b))不需要在固定的时间间隔结束时执行事件,可以在事件发生时刻执行事件,从而避免时间驱动机制存在的问题。事件驱动机制不按照固定的时间间隔进行,可以在任意时间触发和执行事件。
事件驱动有以下四个特点。
①每个事件都标明了发生时间,并存储在事件列表中。
②在仿真过程中,从事件列表中检索和删除具有*小时间戳的事件,执行它,并将仿真时钟推进到与检索到的事件相关联的时间戳。
③在执行时,一个事件可以触发一个或多个事件。触发的事件被标明发生时间,并存储在事件列表中。为确保仿真不会在时间上倒退,触发事件的时间戳不能小于仿真时钟。
④事件驱动的仿真从事件列表中的一组初始事件开始运行,直到列表为空或满足其他停止条件。
图1.2 事件驱动机制和事件驱动机制
NS-2采用事件驱动机制,网络中发生的事件,如发送分组、接收分组和丢弃分组,都会被记录到 Trace文件中,因此 Trace文件中的每一条记录都是一个事件。
1.1.3 NS-2的功能
开发NS-2的*初目的是研究大规模网络,以及当前和未来网络协议的交互行为,为仿真研究有线网络和无线网络上的传输控制协议(Transmission Control Protocol, TCP)、路由协议和多播协议等提供强有力的支持。NS-2功能非常强大,模块丰富,包括网络传输协议,如用户数据报协议(User Datagram Protocol,UDP)和 TCP;业务源流量产生器,如 Telnet、文件传输协议(File Transfer Protocol,FTP)、恒定比特流(constant bit rate,CBR)、 Web和变比特流(variable bit rate,VBR);路由队列管理机制,如随机早期检测(random early detection,RED)、Droptail和基于分类的队列(class based queueing,CBQ);路由算法;无线局域网(wireless local area network,WLAN);移动 IP;卫星通信网络等。
在无线网络仿真领域,NS-2可以开展 Ad Hoc网络、飞行自组织网络(flying Ad Hoc networks, FANETs)[5]、车载自组织网络(vehicular Ad Hoc networks, VANETs)、无人机(unmanned aerial vehicle, UAV)辅助 VANETs[6]、卫星网络和水声传感器网络(underwater acoustic sensor networks, UASNs)的仿真工作[7,8]。总之,NS-2博大精深,能够仿真空天地海无线网络,验证协议性能,为协议的设计实现提供重要参考。
1.1.4 NS-2的特点
1.NS-2能在 Linux和 Windows系统上稳定运行
NS-2能够在 Linux(Fedora、Ubuntu)环境下稳定运行,也能够在 Windows(Windows XP、Windows 7、Windows 10)加 Cygwin的环境下平稳运行。在 Linux和 Windows两个系统上安装的NS-2功能完全一致,没有任何不同。相比较而言, Linux环境下的NS-2运行速度快, Windows环境下的NS-2协议设计实现较为方便。在 Windows环境下,更有利于不熟悉 Linux环境的初学者快速入门。
2.NS-2采用 C++和 OTcl两种开发语言进行开发
NS-2可以看成一个信息系统, C++相当于后台, OTcl相当于前台。这样的设计使NS-2架构清晰,同时兼具 C++运行速度快和 OTcl解释执行不需要编译的优点。如果要仿真NS-2现有的协议,用户不需要关注后台 C++,只要设计 OTcl脚本即可。因此,NS-2的架构非常清晰,便于使用者快速入门。此外,NS-2的设计思想可以为设计实现网络仿真软件、卫星仿真软件和作战仿真软件提供参考借鉴。
3.NS-2拥有完善规范的 Trace机制
NS-2采用事件驱动机制,将仿真过程中发生的事件记录到 Trace文件中,通过分析 Trace文件得出网络协议性能指标。NS-2为网络协议设计了完善规范的 Trace格式,用户可以根据需要设计自己的 Trace格式,也可以直接运用NS-2设计的 Trace格式。Trace记录的信息较多,仿真过程生成的 Trace文件会占据一定的存储空间,同时也会消耗一定的时间。随着计算机硬件性能的提高,这些问题都迎刃而解了。
4.NS-2开放源代码
NS-2是一款面向对象的、基于离散事件调度机制的开源网络仿真器。开放源代码使用户可以通过阅读源代码,深刻理解NS-2的设计思想,为设计自主可控的网络仿真器提供参考。开放源代码使用户能够阅读通信协议的源代码,为设计实现自己的协议提供参考。通过使用和修改NS-2的源代码,用户可以更新和拓展它的功能,为NS-2添加新的协议和功能。
5.NS-2在世界范围内拥有广泛的使用者
近年来,在网络仿真领域, NS-3[9-11]、OMNeT++[12-17]、Qualnet、 OPNET[18-22]和 GloMoSim[23,24]等软件不乏使用者,但NS-2仍然是网络仿真领域的主流仿真软件之一。据 Reina等[25]统计,在传统 Ad Hoc网络的概率广播方案研究领域,使用NS-2作为仿真工具的文献占56%,使用 Qualnet的文献占8%,使用 OPNET的文献占3%,使用 GloMoSim的文献占13%。据 Muhammad等[26]统计,在无线传感器网络群智能路由协议的仿真领域,使用NS-2作为仿真工具的文献占29%,使用 OPNET的文献占4%,使用 OMNeT++的文献占4%,使用 MATLAB的文献占4%,使用自研发仿真器的文献占29%,没有说明仿真器的文献占19%。
1.1.5 NS-2的学习方法
1.夯实理论基础,补齐知识断点
NS-2对于初学者而言,有一个陡峭的学习过程,原因在于初学者存在知识断点。这些知识断点主要包括通信理论、仿真理论、NS-2架构、网络协议设计理论、 Linux环境编程和 C++编程等。补齐知识断点,不是要求初学者系统学习方方面面的知识,而是按照自己的需要学习知识点。
2.勤于动手操作,积累实践经验
NS-2是一款开源网络仿真器。学好NS-2的关键就是要多动手、多实践,不能停留在思考阶段,这是由开源软件的特点决定的。开源软件并非商业软件,几乎没有完善的指导手册。在学习NS-2的过程中,如果我们一开始就积累相关知识,而不去实践,即使花费很长时间也很难入门。只有多摸索,多总结经验,才能真正掌握NS-2。
3.去粗取精,有所为有所不为
NS-2相关资料和书籍非常丰富,要取其精华、去其糟粕,对掌握的资料进行甄别。NS-2自身的源代码和研究者开发的源代码也非常丰富,同样要甄别利用。在学习研究NS-2代码的过程中,要有所为,有所不为,尽量把和研究方向不相关的代码看成黑盒,只关注输入和输出,而不必关注其中的内容,尽量把时间和精力放在相关的研究上。
4.探索仿真捷径,领悟仿真之道
爬山的方式有多种,如坐索道、按照固有路径、自己选择路径等。以上方式各有各的优点和缺点,坐索道的方式毫无疑问是能*快到达山顶的,但是不能尽情欣赏沿途的风景;按照固有路径可以充分借鉴前人的经验,按部就班地欣赏风景;自己选择路径可以欣赏独*的风景,但是也存在到达不了山顶的风险。如果把NS-2网络仿真比作爬山,相应地也存在三种方式。坐索道的方式就是找一篇货真价实的顶级期刊文章,努力复现它,这样就可以快速掌握NS-2。按照固有路径的方式,就是向相关书籍学习,向熟悉精通NS-2网络仿真的研究者请教,这样就能沿着别人的学习路径,少走一些弯路。遗憾的是,目前还缺少高质量的关于NS-2网络仿真的书籍,缺少NS-2网络仿真交流平台。按自己选择路径的方式,就是结合自己研究领域的实际需要和知识积累,采用自学的方式学习NS-2。这种方式的好处是能领略别人没有见过的NS-2风景,坏处是如果相关知识积累不够,可能事倍功半,半途而废。本书的后续部分尽可能将学习应用NS-2的过程展现出来,帮助初学者探索NS-2网络仿真捷径,领悟NS-2网络仿真之道。
1.2 安装NS-2
NS-2在 Linux操作系统和 Windows操作系统环境下都能良好地运行。其安装有多种方式。
第一种方式: Fedora/Ubuntu+NS-2
展开