撰文:周翔
摘要:
网络仿真是进行网络技术研究的一种基本手段。在新技术的研究过程中,由于各种原因,实际网络系统的实现往往是代价较高或是不现实的。在这种情况下,仿真就成了最佳可供选择的测试、评估和验证手段之一。本文对当前若干主流网络仿真软件进行了简要介绍和评价,并对两款主流的网络仿真软件Opnet和NS2进行了用例对比分析,最后对各种网络仿真软件进行了总结。
关键字:
网络仿真 网络模拟 建模 Opnet Modeler NS2
1.引言
网络仿真也被称为网络模拟,因为对各种网络仿真过程来说,其中也有“模拟”的含义,即,网络仿真既可以取代真实的应用环境得出可靠的运行结果和数据,也可以模仿一个系统过程中的某些行为和特征。顾名思义,网络模拟,就是用计算机程序对通信网络进行模型化,通过程序的运行模仿通信网络的运行过程。那么,为什么要进行通信网络的仿真呢?
在网络迅速膨胀的今天,网络研究人员一方面要不断思考新的网络协议和算法,为网络发展做前瞻性的基础研究;另一方面也要研究如何利用和整合现有的资源,使网络达到最高效能。无论是哪一方面都需要对新的网络方案进行验证和分析。进行网络技术的研究一般有以下3种手段:
(1)分析方法,就是对所研究的对象和所依存的网络系统进行初步分析,根据一定的限定条件和合理假设,对研究对象和系统进行描述,抽象出研究对象的数学分析模型,利用数学分析模型对问题进行求解
(2)实验方法,就是设计出研究所需要的合理硬件和软件配置环境,建立测试床和实验室,在现实的网络上实现对网络协议、网络行为和网络性能的研究。
(3)仿真方法,应用网络仿真软件建立所研究的网络系统的模拟模型,在计算机上运行这个模型,并分析运行的输出结果。
然而,前两种方法都存在很大的局限性。分析方法的有效性和精确性受假设限制很大。当一个系统很复杂时,就无法用一些限制性假设来对系统进行详细描述。实验方法的局限性在于成本很高,重新配置或共享资源很难,运用起来不灵活。而仿真方法在很大程度上可以弥补前两种方法的不足。仿真方法可以根据需要设计所需的网络模型,用相对较少的时间和费用了解网络在不同条件下的各种特性,获取网络研究的丰富有效的数据。网络仿真无疑提供了一个方便、高效的验证和分析方法,因此网络仿真技术在现代通信网络设计和研究中的作用正变得越来越大。
2.对几款主流网络仿真软件的评价
当前有许多优秀的网络仿真软件,其中有 Opnet、NS2、Matlab等,这为网络研究人员提供了很好的网络仿真平台。主流的网络仿真软件都采用了离散事件模拟技术,并提供了丰富的网络仿真模型库和高级语言编程接口,这无疑提高了仿真软件的灵活性和使用方便性。下面将对各种主流的网络仿真软件进行简要评价。
OPNET Modeler
OPNET Modeler是OPNET Technology公司的四个系列网络仿真软件产品的其中之一,它主要面向的用户为网络设计专业人士,能够满足大型复杂网络的仿真需要。OPNET Modeler有如下特点:
(1)提供三层建模机制,最底层为Process模型,以状态机来描述协议;其次为Node模型,由相应的协议模型构成,反映设备特性;最上层为网络模型。三层模型和实际的网络、设备、协议层次完全对应,全面反映了网络的相关特性;
(2)提供了一个比较齐全的的基本模型库,包括:路由器、交换机、服务器、客户机、ATM设备、DSL设备、ISDN设备等等。同时,OPNET Technology公司会对不同的企业用户提供附加的专用模型库,但需另外付费;
(3)采用离散事件驱动的模拟机理(discrete event driven),与时间驱动相比,计算效率得到很大提高。
(4)采用混合建模机制,把基于包的分析方法和基于统计的数学建模方法结合起来,既可得到非常细节的模拟结果,又大大提高了仿真效率。
(5)OPNET具有丰富的统计量收集和分析功能。它可以直接收集常用的各个网络层次的性能统计参数,能够方便地编制和输出仿真报告。
(6)提供了和网管系统、流量监测系统的接口,能够方便的利用现有的拓扑和流量数据建立仿真模型,同时还可对仿真结果进行验证。
NS2
NS2(Network Simulator, version 2)是一种面向对象的网络仿真器,本质上是一个离散事件模拟器。NS2由UC Berkeley开发而成。它本身有一个虚拟时钟,所有的仿真都由离散事件驱动的。目前NS2可以用于仿真各种不同的IP网,已经实现的一些仿真有:网络传输协议,比如TCP和UDP;业务源流量产生器,比如FTP、Telnet、Web CBR和VBR;路由队列管理机制,比如Droptai、RED和CBQ;路由算法,比如Dijkstra等。NS2也为进行局域网的仿真而实现了多播以及一些MAC子层协议。
NS2使用C++和Otcl作为开发语言。NS可以说是Otcl的脚本解释器,它包含仿真事件调度器、网络组件对象库以及网络构建模型库等。事件调度器计算仿真时间,并且激活事件队列中的当前事件,执行一些相关的事件,网络组件通过传递分组来相互通信,但这并不耗费仿真时间。所有需要花费仿真时间来处理分组的网络组件都必须要使用事件调度器。它先为这个分组发出一个事件,然后等待这个事件被调度回来之后,才能做下一步的处理工作。事件调度器的另一个用处就是计时。NS是用Otcl和C++编写的。由于效率的原因,NS将数据通道和控制通道的实现相分离。为了减少分组和事件的处理时间,事件调度器和数据通道上的基本网络组件对象都使用C++写出并编译的,这些对象通过映射对Otcl解释器可见。
当仿真完成以后,NS将会产生一个或多个基于文本的跟踪文件。只要在Tcl脚本中加入一些简单的语句,这些文件中就会包含详细的跟踪信息。这些数据可以用于下一步的分析处理,也可以使用NAM将整个仿真过程展示出来。
Matlab
MATLAB软件是由美国Mathworks公司推出的用于数值计算和图形处理的科学计算系统环境。MATLAB是英文MATrix LABoratory(矩阵实验室)的缩写。MATLAB环境下,用户集成了程序设计、数值计算、图形绘制、输入输出、文件管理等各项功能。 MATLAB提供了一个人机交互的数学系统环境,该系统的基本数据结构是矩阵,在生成矩陈对象时,不要求作明确的维数说明。与利用C语言或FORTRAN语言作数值计算的程序设计相比,利用MATLAB可以节省大量的编程时间。
MTALAB系统由五个主要部分组成:
(1)MATALB语言体系。MATLAB是高层次的矩阵/数组语言。具有条件控制、函数调用、数据结构、输入输出、面向对象等程序语言特性。利用它既可以进行小规模端程,完成算法设计和算法实验的基本任务,也可以进行大规模编程,开发复杂的应用程序。
(2)MATLAB工作环境包括管理工作空间中的变量据输入输出的方式和方法,以及开发、调试、管理M文件的各种工具。
(3)图形图像系统。这是MATLAB图形系统的基础,包括完成2D和3D数据图示、图像处理、动画生成、图形显示等功能的高层MATLAB命令,也包括用户对图形图像等对象进行特征控制的低层MATLAB命令,以及开发GUI应用程序的各种工具。
(4)MATLAB数学函数库。这是对MATLAB使用的各种数学算法的总称。包括各种初等函数的算法,也包括矩阵运算、矩阵分析等高层次数学算法等。
(5)MATLAB应用程序接口。这是MATLAB为用户提供的一个函数库,使得用户能够在MATLAB环境中使用C程序或FORTRAN程序,包括从MATLAB中调用程序(如动态链接库),读写MAT文件的功能。
由此可见,MATLAB是一个功能十分强大的系统,是集数值计算、图形管理、程序开发为一体的环境。除此之外,MATLAB还具有很强的功能扩展能力,与它的主系统一起,可以配备各种各样的工具箱,以完成一些特定的任务。
CASSAP
CASSAP是美国Synopsys(新思科技)公司开发了一款仿真软件,主要应用于数字信号处理和网络通信领域,它可以在概念、体系结构、算法三个层次上实现仿真。CASSAP采用了数据流驱动仿真器,它比基于时钟周期的仿真器速度提高了8-16倍。CASSAP提供了1000多个高层模块,并可对其中所需模块自动生成行为级或RTL级VHDL,也可生成各种风格的DSP代码,供DSP处理器作软件实现。CASSAP可广泛应用于需分析和评估算法、实现方式的数字传输系统,如通讯、图像、多媒体等,并提供了针对GSM、CDMA、DECT等标准的专用开发平台。
SPW
SPW仿真软件是Cadence公司的产品,它提供了面向电子系统的模块化设计、仿真及实施环境,是进行算法开发,滤波器设计,C代码生成,硬/软件结构联合设计和硬件综合的理想环境。SPW的一个显著特点是他提供了HDS接口和Matlab接口。Matlab里面的很多模型可以直接调入SPW,然后利用HDS生成C语言仿真代码或者是HDL语言仿真代码。SPW通常可以应用于无线和有线载波通信、多媒体和网络设计与分析等领域。
3.实例分析
上一节简要介绍了5款网络仿真软件,其中比较常用的是OPNET Modeler和NS2,很多大学和科研单位大都采用这两种工具进行网络方面的研究和设计分析。这一节将通过一个实例来展示这两种网络仿真软件的特点,并对这两种软件进行比较分析。
在这个实例中,我们采用网络的拓扑结构如图1所示,图中有5个节点,其中0、1、2号节点是发送节点,4号节点是接收节点。下面是使用OPNET Modeler和NS2两种软件的仿真过程。
3.1使用NS2进行网络仿真
在本节中,笔者将使用NS2对图1中的网络进行仿真。使用NS2进行网络仿真的第一步是编写OTCL脚本。在OTCL脚本文件(example_ns2.tcl)中,笔者首先定义了5个节点和连接这5个节点的4条边:
#定义5个节点
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
#定义4条边
$ns duplex-link $n0 $n3 1Mb 100ms DropTail
$ns duplex-link $n1 $n3 1Mb 100ms DropTail
$ns duplex-link $n2 $n3 1Mb 100ms DropTail
$ns duplex-link $n3 $n4 1Mb 100ms DropTail
要把节点n0、n1、n2定义为发送节点,即将Traffic Source(发送源)与节点n0、n1、n2相连,我们可以先定义下面的函数:
proc attach-expoo-traffic { node sink size burst idle rate } {
#获得模拟器实例
set ns [Simulator instance]
#建立连接节点的UDP对象
set source [new Agent/UDP]
$ns attach-agent $node $source
#建立traffic源的对象并设置traffic参数
set traffic [new Application/Traffic/Exponential]
$traffic set packetSize_ $size
$traffic set burst_time_ $burst
$traffic set idle_time_ $idle
$traffic set rate_ $rate
$traffic attach-agent $source
#建立发送者与接收者的关系
$ns connect $source $sink
return $traffic
}
上面的函数返回发送源的句柄,因此,我们可以使用下面的语句将3个发送源与n0、n1、n2相连:
set source0 [attach-expoo-traffic $n0 $sink0 200 2s 1s 100k]
set source1 [attach-expoo-traffic $n1 $sink1 200 2s 1s 200k]
set source2 [attach-expoo-traffic $n2 $sink2 200 2s 1s 300k]
由上面的代码我们可以看出,每个数据发送源的峰值发送速率分别为100kbit/s、200kbit/s和300kbit/s。而下面的代码用来定义接收器(n4与3个sink对象相关联):
set sink0 [new Agent/LossMonitor]
set sink1 [new Agent/LossMonitor]
set sink2 [new Agent/LossMonitor]
$ns attach-agent $n4 $sink0
$ns attach-agent $n4 $sink1
$ns attach-agent $n4 $sink2
同时,定义3个文件来保存每个接收器(sink)每秒接收到的数据量:
set f0 [open out0.tr w]
set f1 [open out1.tr w]
set f2 [open out2.tr w]
在脚本中,笔者定义了一个record函数来记录网络仿真时感兴趣的数据:
proc record {} {
global sink0 sink1 sink2 f0 f1 f2
#获得模拟器实例
set ns [Simulator instance]
#设置每0.5秒会调用本函数一次
set time 0.5
#记录有多少字节被接收节点接收?
set bw0 [$sink0 set bytes_]
set bw1 [$sink1 set bytes_]
set bw2 [$sink2 set bytes_]
#获得当前的时间
set now [$ns now]
#向文件中写入带宽(单位为MBit/s)
puts $f0 "$now [expr $bw0/$time*8/1000000]"
puts $f1 "$now [expr $bw1/$time*8/1000000]"
puts $f2 "$now [expr $bw2/$time*8/1000000]"
#将接收器接收到的字节重置为0
$sink0 set bytes_ 0
$sink1 set bytes_ 0
$sink2 set bytes_ 0
#重新调用record函数
$ns at [expr $now+$time] "record"
}
在脚本的最后,笔者定义了finish函数来关闭文件和打开Xgraph观察运行结果:
proc finish {} {
global f0 f1 f2
#关闭输出文件
close $f0
close $f1
close $f2
#调用Xgraph显示网络仿真曲线
exec xgraph out0.tr out1.tr out2.tr -geometry 800x400 &
exit 0
}
在仿真网络运行时,我们可以设置一开始就调用record函数,并在运行后10秒时启动发送者发送数据,并在运行后50秒时停止发送数据,最后调用finish函数使用Xgraph显示运行结果(显示接收端的数据接收速度)。
图2是用Xgraph显示的网络仿真结果,从图中可以看出每个数据接收端的接收速率曲线(注意到3个数据接收端的峰值接收速率分别为100kbit/s、200kbit/s和300kbit/s),这与先前在脚本中定义的峰值发送速率相同。
3.2使用Opnet进行网络仿真
在这一节中,笔者将使用Opnet Moderler 8.0对图1所示的网络进行仿真。对图1所示的简单网络结构,在Opnet Moderler中是不必要写脚本的。在绝大多数的仿真实验中,Opnet Moderler仅使用户通过其界面就可以完成。在本节的例子中,网络拓扑结构在Opnet Moderler中如图3所示。
在Opnet Moderler中,笔者使用了三个以太网工作站(ethernet_station_adv)来表示网络中的三个数据源节点n0、n1和n2,用两个交换机(ethernet4_switch_adv)来表示网络流量中转节点n3和n4,用三个以太网工作站(ethernet_station_adv)来表示网络中的三个数据接收器sink1、sink2和sink3。连接各个节点的链路为10BaseT。然后,因为要限制n0、n1和n2的输出流量之比为1:2:3,所以可以设置n0、n1和n2的发送分组的间隔分别为服从均值为6、3和2的指数分布。最后,可以设置网络模拟运行时间为1小时(60分钟),取10000个取样点,可得每个接收端(sink1、sink2和sink3)的负载(load)统计曲线如图4。
图3:使用Opnet Moderler对图1的网络进行仿真的界面
从图4中可以看出,sink1、sink2、sink3的负载曲线密度依次增大,负载的峰值和均值也依次增高。通过NS2和Opnet Modeler的仿真过程,说明了在链路服务速率足够大的情况下,每个数据源的输出速率与接收端的数据输入速率成近似的正比例关系。
图4:使用Opnet Modeler得到的每个sink的负载曲线
3.3比较分析
通过对NS2和Opnet Modeler的操作和数据观察结果的对比,我们可以从软件功能和操作易用性两个方面对这两个软件进行分析。
在软件功能方面,Opnet Modeler做的比较完备,可以对分组的到达时间分布、分组长度分布,网络节点类型和链路类型等进行很详细的设置,而且可以通过不同厂家提供的网络设备和应用场景来设计自己的仿真环境,用户也可以方便的选择库中已有的网络拓扑结构。而NS2在这方面的选择不如Opnet Modeler丰富,只能根据实际仿真的环境通过脚本建立逻辑的网络结构,而查看结果需要其他软件的辅助。
在操作易用性方面,Opnet Modeler的优越性是毋庸置疑的,因为它可以使用比较少的操作就可以得到比较详尽和真实的仿真结果。而NS2则要通过编写脚本和C++代码来实现网络仿真,而且用这种方式建立复杂的网络结果则变的非常困难。
当然,NS2是自由软件,免费,这是与OPNET相比最大的优势,而且,作为用户,可以相对比较容易地对NS2进行功能扩展。
4.总结
本文通过对5款当前主流网络仿真软件的简要分析,介绍了网络仿真的概念和当前网络仿真软件的技术特点和应用范围;并通过在NS2和Opnet Modeler对同一个网络结构进行仿真的过程给读者提供了网络仿真过程的感性认识。网络仿真提供了从设想到实现的桥梁,因此它是一个计算机网络设计与分析过程中的一个重要环节。
参考文献
[1]李建东 编著,《信息网络理论基础》,西安电子科技大学出版社,2001。
[2]徐雷鸣等编著,《NS2与网络模拟》,人民邮电出版社,2003。
[3][美]William Stalling著,齐望东等译,《高速网络与互连网络――性能与服务质量》,2003。
[4] http://www.isi.edu/nsnam/ns/tutorial/index.html
[5] http://nile.wpi.edu/NS/