Network Simulator
NS简介 NS(Network Simulator)它是由LBNL ( Lawrence Berkeley National Laboratory ) 的网络研究小组开发的仿真工具。 NS具有可扩展、易配置、可编程等特点。 NS是面向对象的,离散事件驱动的网络环境模拟器,开发于UC Berkeley,它可以模拟各种IP网络环境。 NS实现了对许多网络协议的模拟,如TCP,UDP,和数据源发生器(traffic source)如FTP,WWW,Telnet,Web,CBR和VBR等。
Ns简介(续) NS也实现了Multicasting和一些应用于局域网的在MAC层的协议。 NS-2由C++和Otcl(加上面向对象特性的TCL脚本程序设计语言,开发于MIT)两种程序设计语言实现。
Ns 简介(续) Ns前端运行Otcl Ns 用C++实现网络协议栈 Otcl:运行速度慢,容易修改 =>场景配置 => 协议栈实现
Tcl与Tk编程环境 Tcl与Tk是安装在Unix/Linux环境下的两个包,它们一起构成了一套开发系统应用程序和图形用户界面接口(GUI)应用程序的环境。 Tcl的全称是Tool Command Language。 Tk是Tcl在X Window环境下的扩展,它包含了Tcl的全部的C库函数,以及支持X Window的窗口、控件等C库函数,为用户开发图形用户界面提供了方便。
举例 proc test {} { set a 43 set b 27 set c [expr $a + $b] set d [expr [expr $a - $b] * $c] for {set k 0} {$k < 10} {incr k} {…………} } # 调用上面的test test
Tcl的面向对象扩展——OTcl Otcl是Tcl的面向对象(Object Oriented)的扩展,在Otcl中加入了类的概念。 对象是类的实例,它有自己的属性和自己的内部操作 虽然和C++中对象和类以及其他面向对象程序设计语言中的概念相同,但是具体实现和语法却存在很大的差别。
举例 Tcl基础 set a 123 ;#creates a variable whose name is a and whose value is 123 set b $a ;#creates b whose value is a’s value set c [expr $b+10] ;#evaluate the characters between the brackets as a TCL script and use the result as the value of c for {set i 0} {$i < 3} {incr i} {puts $i}
举例 Class mom mom instproc greet {} { $self instvar age_ puts "$age_ years old mom say: How are you doing?" } Set a [new mom] $a greet 从实际的otcl程序入手,遇到问题再去查资料,不必从头学
Ns-2的组件体系结构 分类器(classifier) 连接器(connector)
分类器 分类器(classifier)是Ns-2基本网络组件的一个大类。它的基本派生类有地址分类器(AddrClassifier)和多播分类(McastClassifier)等。 拓扑结点(Node)是由一个结点入口对象和若干个分类器(Classifier)组成的一个复合对象。
节点(Node)
连接器(connector) 连接器——Connector是Ns-2基本网络组件中的另一个大类。它的基本派生类对象包括缓冲队列(Queue)、延迟(Delay)、各种产生和处理数据包的代理(Agent)和对象的跟踪器(Trace)。 拓扑结点连接类(Link)是Ns-2中另一个主要的复合组件对象。一个结点和另一个结点之间的简单连接(simplex-link)是单向的。一个最基本的简单连接由一个连接入口、包缓冲队列、延迟处理对象、废弃处理对象和时间处理对象(TTL)组成。 一个结点的输出队列,是通过和这个结点相连的Link中的缓冲队列来实现的。
Link
代理(Agent) UDP TCP Agent/UDP Agent/TCP Agent/TCPSink Agent/TCP/Vegas Agent/TCP/Reno
应用程序(application) Ns-2中有两种类型的“应用程序” 数据源发生器(Traffic Generator) Exponential On/Off Pareto On/Off CBR 模拟的应用程序(Simulated applications) Application/FTP Application/Telnet
举例 Set ns [new Simulator] set f [open out.tr w] $ns trace-all $f set nf [open out.nam w] $ns namtrace-all $nf set n0 [$ns node] set n1 [$ns node] $ns duplex-link $n0 $n1 1Mb 10ms DropTail
set tcp0 [new Agent/TCP] $ns attach-agent $n0 $udp0 set ftp0 [new Application/FTP] $ftp0 attach-agent $tcp0 set sink0 [new Agent/TCPSink] $ns attach-agent $n1 $sink0 $ns connect $tcp0 $sink0 $ns at 1.0 "$ftp0 start“
$ns at 3.0 "finish“ proc finish {} { global ns f nf $ns flush-trace close $f close $nf exec nam out.nam & exit 0 } $ns run
一个简单的无线仿真脚本(1) Scenario containing 3 mobile nodes moving within 670mX670m flat topology using DSDV ad hoc routing protocol TCP and CBR traffic
一个简单的无线仿真脚本(2) #Define Global Variables set ns_ [new Simulator] ; create a ns simulator instance set topo [new Topography] ; create a topology and $topo load_flatgrid 670 670 ; define it in 670x670 area
一个简单的无线仿真脚本(3) #Define standard ns/nam trace set tracefd [open 694demo.tr w] $ns_ trace-all $tracefd set namtrace [open 694demo.nam w] $ns_ namtrace-all-wireless $namtrace 670 670
一个简单的无线仿真脚本(4) #Create “God” set god_ [create-god 3] God is used to store an array of the shortest number of hops required to reach from one node to an other
一个简单的无线仿真脚本(5) #Define how a mobile node should be created $ns_ node-config -adhocRouting DSDV\ -llType LL \ -macType Mac/802_11\ -ifqLen 50 \ -ifqType Queue/DropTail/PriQueue \ -antType Antenna/OmniAntenna \ -propType Propagation/TwoRayGround \ -phyType Phy/WirelessPhy \ -channelType Channel/WirelessChannel \ -topoInstance $topo -agentTrace ON \ -routerTrace OFF \ -macTrace OFF
一个简单的无线仿真脚本(6) Use “for loop” to create 3 nodes: #Create a mobile node set node [$ns_ node] $node random-motion 0 ;# disable random motion Use “for loop” to create 3 nodes: for {set i < 0} {$i<3} {incr i} { set node_($i) [$ns_ node] }
一个简单的无线仿真脚本(7) Mobile Movement Generator Random movement #Define node movement model Mobile Movement Generator $node_(0) set X_ 10.0 $node_(0) set Y_ 400.0 $node_(0) set Z_ 0.0 $node_(0) setdest 400.0 10.0 1.0 Random movement $node start
一个简单的无线仿真脚本(8) #Define traffic model(cbr) set udp1 [new Agent/UDP] $ns_ attach-agent $node_(0) $udp1 set null1 [new Agent/Null] $ns_ attach-agent $node_(2) $null1 set cbr1 [new Application/Traffic/CBR] $cbr1 set packetSize_ 1024 $cbr1 set rate_ 1048576 $cbr1 attach-agent $udp1 $ns_ connect $udp1 $null1 $ns_ at 10.0 "$cbr1 start“
一个简单的无线仿真脚本(9) #Define traffic model(tcp) set tcp1 [new Agent/TCP/Newreno] set sink1 [new Agent/TCPSink] $ns_ attach-agent $node_(0) $tcp1 $ns_ attach-agent $node_(2) $sink1 $ns_ connect $tcp1 $sink1 $tcp1 set fid_ 1 set ftp1 [new Application/FTP] $ftp1 attach-agent $tcp1 $ns_ at 10.0 "$ftp1 start"
一个简单的无线仿真脚本(10) # Tell nodes when the simulation ends for {set i 0} {$i < 3 } {incr i} { $ns_ at200.0 "$node_($i) reset"; } #Tell ns/nam the simulation stop time $ns_ at 200.0 “$ns_ nam-end-wireless 200.00” $ns_ at 200.00 “$ns_ halt” #Start your simulation $ns_ run
数据流
Ns的安装 以2.1b8为例(redhat7.2) 先在网上找到ns-allinone-2.1b8a.tar.gz tar –zxvf ns-allinone-2.1b8a.tar.gz,得到ns-allinone-2.1b8a的目录 Cd ns-allinone-2.1b8a ./install 安装结束
问题的解决 如果在安装过程中遇到问题,可以到www.isi.edu/nsnam上查询 需要注意的是,在不同的系统下安装出现的问题会有所不同
更改设置 Vi .bash_profile PATH=原有的+$HOME/ns-allinone-2.1b8a/bin:$HOME/ns-allinone-2.1b8a/tk8.3.2/unix LD_LIBRARY_PATH=$HOME/ns-allinone-2.1b8a/otcl-1.0a7:$HOME/ns-allinone-2.1b8a/lib
更改设置(续) TCL_LIBRARY=$HOME/ns-allinone-2.1b8a/tcl8.3.2/library Export PATH LD_LIBRARY_PATH TCL_LIBRARY
Ns命令的使用 在任何路径下,直接键入ns 如果要运行某个tcl程序(比如example.tcl,那么: ns example.tcl
程序的查找(以MPLS为例) 相关的C程序 相关的TCL程序 Cd ns-allinone-2.1b8a Cd ns-2.1b8a Ls *mpls* 相关的TCL程序 Cd tcl
对ns的重新编译 不修改程序名字,只修改代码 修改了程序名字(或增加新的文件) Cd ns-allinone-2.1b8a Cd ns-2.1b8a Make 修改了程序名字(或增加新的文件) Cd ns*8a/ns*8a Vi Makefile.in Old.o -> new.o (加入new.o) ./configure
节点层次结构
节点层次结构(续)
ns-2目录结构 sim tk8.0 otcl Tcl tcl8.0 ns-2 nam-1 tcl ex test lib ... tcl code C++ code example validation test tcl code core
Tracing Trace packets on all links $ns trace-all [open test.out w] <event> <time> <from> <to> <pkt> <size>--<flowid> <src> <dst> <seqno> <aseqno> + 1 0 2 cbr 210 ------- 0 0.0 3.1 0 0 - 1 0 2 cbr 210 ------- 0 0.0 3.1 0 0 r 1.00234 0 2 cbr 210 ------- 0 0.0 3.1 0 0 Trace packets on all links in nam-1 format $ns namtrace-all [open test.nam w]
文档资料 www.isi.edu/nsnam 文档 进入Web resources->mailing lists->ns-users ,可以找到一些问题的解答,也可以进行提问 在Subscribing to Ns-users 中,可以登记你的邮箱,以后通过邮箱直接发问,也可以通过邮箱收到其他人的问题和解答 文档 Ns-doc3的前三章是一些基本的东西,如ns的体系结构等。其余章节是针对某一部分,可以进行实际工作时边做边看