ad_hoc_ns2仿真
基于网络仿真器NS2的Ad hoc网络路 由协议仿真 作者:马崇霄、吴长奇 引言NS2(Network Simulation Version 2)是一种功能强大的网络模拟仿真 器,它是用C++和OTCL两种语言完成的。C++语言编写协议执行模块,OTCL语 言编写模拟任务。NS2 主要针对有线局域网、无线局域网、Ad Hoc网络、卫星通信网、路由选择协议、 组播路由协议等进行网络模拟仿真。尽管一些文献[1,2]基于NS已经做过Ad Hoc网络中的几种单径路由协 议的性能仿真分析,但很少文献给出仿真各个步骤中的详细分析程序,本文以 AODV(Ad Hoc On-demand Distance Vector)路由协议为例,详细介绍了整个 仿真过程的步骤和所使用的程序,并绘出图表。 1、AODV路由协议简介AODV综合使用了DSDV(Destination-Sequenced Distance-Vector) 中目标序列号和DSR(Dynamic Source Routing)中按需路由发现技术,提供 了一种按需单径距离矢量无环路由。该协议主要分为路由发现和路由维护两部 分。路由发现:当源节点需要与其它节点通信但没有到该目的节点的路由 时,它就广播路由请求RREQ,当其它节点收到这个RREQ时,首先判断是否收 到过具有相 同源节点和目的节点的RREQ,如果是重复收到就丢弃,如果没有 就利用RREQ中的信息建立反向路由。如果中间节点含有到目的节点的路由,就 发送路由应答 RREP给源节点,否则广播该RREQ。当RREQ的目的节点收到 RREQ时,同样建立反向路由,然后向RREQ的源节点发送RREP。路由维护:节点通过MAC层周期性广播hello消息来判断链路状态, 如果该节点连续3次未收到Hello响应消息,就认为链路已经断开,并删除包 含该链 路的路由信息,发起路由错误RERR,通知相邻结点和相应的上游结点 删除因链路断开而导致目的结点不可达的路由信息。 2、AODV路由协议的仿真过程 2.1 NS2仿真一般步骤 NS2仿真可以分为构件的扩展阶段,仿真阶段,对仿真结果分析阶段。 一般分为以下几个步骤:(1)编写所需构件: 即新构件的添加或移植。(2)测试:测试自己编写的构件是否通过。当NS库中的构件满足仿真 需要(例如我们对NS库已有的AODV、DSDV、DSR等协议进行仿真),则第1步 和第2步可以省略,仿真过程直接从第3步开始。(3)编写Otcl脚本文件:配置仿真网络的拓扑结构,确定链路基本特 性,移动节点所使用的路由协议,节点的数量等,并进行端设备的协议绑定, 设置仿真使 用的场景和传输负载(TCP流或CBR流),设置仿真的开始和结束 时间等。并在脚本文件里设置trace对象, trace文件是记录仿真过程中发生 所有事件的文件。也可以同时设置nam对象,nam是用于演示网络运行动画的 工具。(4)用NS命令执行脚本文件: 执行后会在与脚本文件同一目录下生成 *.tr的文件,记录仿真结果。如果在脚本文件中设置了nam对象,则会在同一 目录下生成*.nam的文件。(5)分析trace文件:由于trace文件比较大,我们需要编写gawk程序 进行仿真后期的数据处理(计算分组投递率、路由负载、吞吐量等),再用 gnuplot或者matlab等绘图工具将处理后获得的数据绘制成图形,以便更直观 的分析比较协议的性能。 2.2 仿真出trace文件的过程由于AODV是NS2组件库里的自带协议,故仿真过程直接从编写脚本文 件开始。笔者使用Red Hat LINUX9.0操作系统下的NS2.26版本进行仿真。仿 真过程如下:(1) 利用NS工具cbrgen.tcl生成业务场景文件,在ns-2.26/indep- utils/目录下输入命令:ns cbrgen.tcl –type cbr –nn 50 –seed 1 –mc 10 –rate 2.0 >cbr1该命令创建了一个具有50个移动节点、10对通信连接、每秒钟发送 两个分组的以CBR为业务源的通信场景文件cbr1。(2) 利用NS工具setdest生成移动场景文件,在ns-2.26/indep- utild/cum-scen-gen/setdest目录下输入命令:./setdest –n 50 –p 0 –s 20 –t 300 -x 1000 –y 300 >scence1 该命令创建一个具有50个节点、节点在每个地点停留0秒(即不停留) 、最大移动速度20m/s,仿真时间300秒,长1000米,宽300米的移动场景文 件scence1。 (3)编写脚本文件,下面给出仿真过程中使用的aodv.tcl: #===================================== #Define options #===================================== set val(chan) Channel/wireless ; set val(prop) Propagation/TwoRayGrond; set val(netif) Phy/WirelessPhy ; set val(mac) Mac/802_11 ; set val(ifq) Queue/DropTail/PriQueue ; set val(ll) LL ; set val(ant) Antenna/OmniAntenna ; set val(ifqlen) 50 ; set val(nn) 50 ; set opt(cp) “cbr1” ; set opt(sc) “scence1” ; #=============================== # Main Program #=============================== set ns_ [new Simulator] set tracefd [open aodv.tr w] $ns_ trace-all $tracefd $ns_ use-newtrace set namtracefd [open aodv.nam w] $ns_ namtrace-all-wireless $namtracefd 1000 300 set topo [new Topography] $topo load_flatgrid 1000 300 set god_ [new God] create-god $val(nn) $ns_ node-config –adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -channelType $val(chan) \ -topoInstance $topo \