• 实验目的

掌握NS2网络模拟器的部署、配置和使用方法;掌握利用NS2进行网络仿真的方法。具备利用NS2进行网络场景构建和协议仿真分析的基本能力。重点:网络场景构建。难点:不同场景下的协议仿真与性能分析。

  • 实验内容

在linux系统下部署、安装和配置NS2网络模拟器;了解其功能模块及配套工具的使用,掌握利用NS2进行网络仿真,构建两种不同类型网络仿真场景并进行结果分析。

  • 实验原理:

NS2的核心部分是一个离散事件模拟引擎,该引擎包含一个Scheduler类,用于记录当前系统时间、调度网络队列中的事件,并调用其他函数产生新的事件,同时指定新事件的时间。NS2使用C++和OTcl进行组合编程。其中,底层的实体类用C++语言实现,以提高执行效率;同时有一个与之对应的OTcl类,用于配置对象、组合对象、描述模拟过程并调用NS2完成模拟过程。这种将NS2中一个构件用两个不同语言的类来实现的方式被称为分裂对象模型,通过TclCl机制来实现。NS2可以应用于多种网络协议的模拟和验证,如AODV(Ad hoc On-demand Distance Vector Routing)按需路由协议。在AODV模拟中,NS2可以模拟节点的移动性、路由发现过程、路由维护过程等,并收集相关的网络性能指标进行分析。NS2的工作实验原理主要基于离散事件模拟引擎和分裂对象模型,通过C++和OTcl的组合编程实现对网络实体的模拟和模拟过程的描述。NS2具有广泛的应用领域和强大的功能,是研究和验证网络协议的重要工具之一。

  • 实验条件:

硬件:一台计算机

软件:Linux操作系统、NS2工具包

  • 实验过程
  1. NS2仿真示例——nam方式

代码:

set ns [new Simulator]/建立对象

$ns color 1 Blue /设定颜色

$ns color 2 Red

set nf [open out.nam w]   /打开跟踪文件

$ns namtrace-all $nf



proc finish {} {        /定义结束过程   

    global ns nf

    $ns flush-trace

    close $nf                 

    exec nam out.nam &    

    exit 0

}



set ns0 [$ns node]           

set ns1 [$ns node]

set ns2 [$ns node]

set ns3 [$ns node]



$ns duplex-link $ns0 $ns2 1Mb 10ms DropTail      

$ns duplex-link $ns1 $ns2 1Mb 10ms DropTail

$ns duplex-link $ns3 $ns2 1Mb 10ms DropTail



$ns duplex-link-op $ns0 $ns2 orient right-down   

$ns duplex-link-op $ns1 $ns2 orient right-up

$ns duplex-link-op $ns2 $ns3 orient right

$ns duplex-link-op $ns2 $ns3 queuePos 0.5



set udp0 [new Agent/UDP]          /建立代码

$udp0 set class_ 1

$ns attach-agent $ns0 $udp0



set cbr0 [new Application/Traffic/CBR]           

$cbr0 set packetSize_ 500

$cbr0 set interval_ 0.005

$cbr0 attach-agent $udp0



set udp1 [new Agent/UDP]

$udp1 set class_ 2

$ns attach-agent $ns1 $udp1



set cbr1 [new Application/Traffic/CBR]

$cbr1 set packetSize_ 500

$cbr1 set interval_ 0.005

$cbr1 attach-agent $udp1



set null0 [new Agent/Null]  /建立代理NULL                     

$ns attach-agent $ns3 $null0



$ns connect $udp0 $null0

$ns connect $udp1 $null0



$ns at 0.5 "$cbr0 start"    /传送数据                 

$ns at 1.0 "$cbr1 start"

$ns at 4.0 "$cbr1 stop"

$ns at 4.5 "$cbr0 stop"

$ns at 5.0 "finish" /调用结束过程

$ns run/仿真

运行结果:

从n0开始传送数据。

从n1开始传送数据

采用FIFO机制丢包,丢弃n0发送数据包。

  1. NS2仿真示例——Xgraph方式

代码:

set ns [new Simulator]



set f0 [open out0.tr w]

set f1 [open out1.tr w]

set f2 [open out2.tr w]



set n0 [$ns node]

set n1 [$ns node]

set n2 [$ns node]

set n3 [$ns node]

set n4 [$ns node]



$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



proc finish {} {

    global f0 f1 f2

    close $f0

    close $f1

    close $f2

    

    exec xgraph out0.tr out1.tr out2.tr -geometry 800x400 &

    exit 0

}



proc attach-expoo-traffic { node sink size burst idle rate } {

    set ns [Simulator instance]

    set source [new Agent/UDP]

    $ns attach-agent $node $source

    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 set rate_ $rate

    $traffic attach-agent $source

   

    $ns connect $source $sink

    return $traffic

}



proc record {} {

    global sink0 sink1 sink2 f0 f1 f2

    set ns [Simulator instance]

    set time 0.5

    set bw0 [$sink0 set bytes_]

    set bw1 [$sink1 set bytes_]

    set bw2 [$sink2 set bytes_]

    set now [$ns now]

    puts $f0 "$now [expr $bw0/$time*8/1000000]"

    puts $f1 "$now [expr $bw1/$time*8/1000000]"

    puts $f2 "$now [expr $bw2/$time*8/1000000]"

   

    $sink0 set bytes_ 0

    $sink1 set bytes_ 0

    $sink2 set bytes_ 0

    

    $ns at [expr $now + $time] "record"

}



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



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]

$ns at 0.0 "record"

$ns at 10.0 "$source0 start"

$ns at 10.0 "$source1 start"



$ns at 10.0 "$source2 start"

$ns at 50.0 "$source0 stop"

$ns at 50.0 "$source1 stop"

$ns at 50.0 "$source2 stop"

$ns at 60.0 "finish"

$ns run

运行结果:

三条数据流的峰值分别为0.1Mbit/s,0.2Mbit/s,0.3Mbit/s

  • 实验收获

了解了ns2的基本原理,对ns2的使用更加熟练,掌握如何利用NS2进行网络仿真,学习到ns2功能模块和一些配套工具的使用。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐