Introduction to ns-2 Noun Choi Oct. 11, 2007
Outline Background ns-2 Internals Short demo Troubleshooting Reference links Q & A
History and Status UCB REAL network simulator VINT from LBL, PARC, UCB, & USC ns-1 ns-2, currently maintained by USC/ISI –100K lines of C++ –70K lines of OTcl –30K lines of test suite –20K lines of documentation
Platforms Most UNIX and UNIX-like systems -FreeBSD or *BSD -Linux -Sun Solaris -HP, SGI WINDOWS –Under Cygwin
Components of ns-2 Tcl/TK: ns-2 is an extended Tcl interpreter OTcl: Object Tcl TclCL: Tcl with classes library ns-2 nam-1: Network Animator xgraph: Plotting and Graphing And more….
Installation Latest version: 2.31 (Mar 10, 2007) Download ns-allinone – build.html#allinonehttp:// build.html#allinone./install will configure, compile, & install Problem? –
What is ns-2 Discrete-event driven network simulation Object Oriented ns-2 is an extended Tcl (OTcl) interpreter ns-2 is written in C++ and OTcl –OTcl = Tcl + OO –C++ implements the code that executed frequently –OTcl configures the system
Pros & Cons Free Almost all network components are implemented Active contributions from researchers Easy to modify and/or add new functions Unreliable Real Object Oriented? Hard to troubleshoot Unrealistic abstraction
OTcl and C++: The Duality C++ otcl
OTcl Linkage set tcp [new Agent/TCP] init Agent/TCP init Agent Create Otcl shadow object TclObject Create C++ object constructor TclObject (C++) constructor parent constructor TcpAgent OTcl C++ static class TcpClass : public TclClass { public: TcpClass() : TclClass( "Agent/TCP" ) {} TclObject* create(int, const char*const*) { return (new TcpAgent );} } class_tcp;
OTcl Linkage (II) Command() Otcl $tcp advance 10 C++ int Agent::command(int argc, const char*const* argv) { if (argc == 3) { if (strcmp(argv[1], “advance") == 0) { int newswq = atoi(argv[2]); return (TCL_OK); } return (Agent::command(argc, argv); }
OTcl Linkage (III) bind(): link C++ member variables to Otcl object variables C++ TcpAgent::TcpAgent() { bind(“window_”, &wnd_); } // bind_time(), bind_bool(), bind_bw() Otcl $tcp set window_ 200 You must setting the initial values of variants in ~ns/tcl/lib/ns- default.tcl
OTcl Linkage (IV) Invoking Otcl procedure and obtaining its results Tcl::instance().evalf("%s Lookup_CIP_RT %d", name(), iph- >dst().addr_); nextHop = Tcl::instance().result(); Classifier/Addr/Cip instproc Lookup_CIP_RT { m_addr } { return … } Passing a results string to Otcl Tcl::instance().result(“………”) Buffer
How ns-2 works Scheduler Event Queue Target object Event (Packet) Time Object BObject A Deque Dispatch Register Event
Source code in Scheduler.cc void Scheduler::schedule(Handler* h, Event* e, double delay) { e->uid_ = uid_++; e->handler_ = h; double t = clock_ + delay; e->time_ = t; insert(e); } void Scheduler::run() { instance_ = this; Event *p; while (!halted_ && (p = deque())) { dispatch(p, p->time_); } void Scheduler::dispatch(Event* p, double t) { clock_ = t; p->uid_ = -p->uid_;// being dispatched p->handler_->handle(p);// dispatch }
An Example AB CBR Transport Network LL IFQ MAC NetIF CBR Sink Transport Network LL IFQ MAC NetIF Scheduler Wireless Channel
Demonstration BaseStation MobileNode Wireless Wired
Demonstration (Contd.) set opt(chan) Channel/WirelessChannel ;# channel type set opt(prop) Propagation/TwoRayGround ;# radio-propagation model set opt(netif) Phy/WirelessPhy ;# network interface type set opt(mac) Mac/802_11 ;# MAC type set opt(ifq)Queue/DropTail/PriQueue;# interface queue type set opt(ll) LL ;# link layer type set opt(ant) Antenna/OmniAntenna ;# antenna model set opt(ifqlen) 50 ;# max packet in ifq set opt(adhocRouting) DSDV;# routing protocol set opt(cp) "" ;# connection pattern file set opt(sc) "./scen/scen-3-test" ;# node movement file. set opt(x) 670 ;# x coordinate of topology set opt(y) 670 ;# y coordinate of topology set opt(seed) 0.0 ;# seed for random number gen. set opt(stop) 250 ;# time to stop simulation set opt(ftp1-start) 100 set opt(ftp2-start) 150 set num_wired_nodes 2 set num_bs_nodes 1
Demonstration (Contd.) # ================================================================ # accpet input parameter set opt(nn)[lindex $argv 0] set outfile_ [lindex $argv 1] # ================================================================ # check for boundary parameters and random seed if { $opt(x) == 0 || $opt(y) == 0 } { puts "No X-Y boundary values given for wireless topology\n" } if {$opt(seed) > 0} { puts "Seeding Random number generator with $opt(seed)\n" ns-random $opt(seed) }
Demonstration (Contd.) # create simulator instance set ns_ [new Simulator] # set up for hierarchical routing $ns_ node-config -addressType hierarchical AddrParams set domain_num_ 2 ;# number of domains lappend cluster_num 2 1 ;# number of clusters in each domain AddrParams set cluster_num_ $cluster_num lappend eilastlevel ;# number of nodes in each cluster AddrParams set nodes_num_ $eilastlevel ;# of each domain set tracefd [open $outfile_.tr w] set namtrace [open $outfile_.nam w] $ns_ trace-all $tracefd $ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y)
Demonstration (Contd.) # Create topography object set topo [new Topography] # define topology $topo load_flatgrid $opt(x) $opt(y) # create God create-god [expr $opt(nn) + $num_bs_nodes] #create wired nodes set temp { } ;# hierarchical addresses for wired domain for {set i 0} {$i < $num_wired_nodes} {incr i} { set W($i) [$ns_ node [lindex $temp $i]] }
Demonstration (Contd.) # configure for base-station node $ns_ node-config -adhocRouting $opt(adhocRouting) \ -llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \ -phyType $opt(netif) \ -channelType $opt(chan) \ -topoInstance $topo \ -wiredRouting ON \ -agentTrace OFF \ -routerTrace OFF \ -macTrace OFF #create base-station node set temp { } ;# hier address to be used for wireless ;# domain set BS(0) [$ns_ node [lindex $temp 0]] $BS(0) random-motion 0 ;# disable random motion #provide some co-ord (fixed) to base station node $BS(0) set X_ 1.0 $BS(0) set Y_ 2.0 $BS(0) set Z_ 0.0
Demonstration (Contd.) #configure for mobilenodes $ns_ node-config -wiredRouting OFF for {set j 0} {$j < $opt(nn)} {incr j} { set node_($j) [ $ns_ node [lindex $temp \ [expr $j+1]] ] $node_($j) base-station [AddrParams addr2id \ [$BS(0) node-addr]] } #create links between wired and BS nodes $ns_ duplex-link $W(0) $W(1) 5Mb 2ms DropTail $ns_ duplex-link $W(1) $BS(0) 5Mb 2ms DropTail $ns_ duplex-link-op $W(0) $W(1) orient down $ns_ duplex-link-op $W(1) $BS(0) orient left-down
Demonstration (Contd.) # setup TCP connections set tcp1 [new Agent/TCP] $tcp1 set class_ 2 set sink1 [new Agent/TCPSink] $ns_ attach-agent $node_(0) $tcp1 $ns_ attach-agent $W(0) $sink1 $ns_ connect $tcp1 $sink1 set ftp1 [new Application/FTP] $ftp1 attach-agent $tcp1 $ns_ at $opt(ftp1-start) "$ftp1 start" set tcp2 [new Agent/TCP] $tcp2 set class_ 2 set sink2 [new Agent/TCPSink] $ns_ attach-agent $W(1) $tcp2 $ns_ attach-agent $node_(2) $sink2 $ns_ connect $tcp2 $sink2 set ftp2 [new Application/FTP] $ftp2 attach-agent $tcp2 $ns_ at $opt(ftp2-start) "$ftp2 start"
Demonstration (Contd.) # Tell all nodes when the simulation ends for {set i } {$i < $opt(nn) } {incr i} { $ns_ at $opt(stop).0 "$node_($i) reset"; } $ns_ at $opt(stop).0 "$BS(0) reset"; $ns_ at $opt(stop).0002 "puts \"NS EXITING...\" ; $ns_ halt" $ns_ at $opt(stop).0001 "stop" proc stop {} { global ns_ tracefd namtrace # $ns_ flush-trace close $tracefd close $namtrace } puts "Starting Simulation..." $ns_ run
Trace File Format EventAbbreviationTypeValue Normal Event r: Receive d: Drop e: Error +: Enque -: Deque %g %d %d %s %d %s %d %d.%d %d.%d %d %d doubleTime IntSource Node intDestination Node stringPacket Name intPacket Size stringFlags IntFlow ID IntSource Address IntDestination Address IntSequence Number IntUnique Packet ID
Troubleshooting Problem while installing –Compiler may complain – Program crashes –Use gdb Unexpected results Hidden problem –Slice & dice the trace log
Reference Links Manual & Tutorial – – – NS/n3.pdfhttp://www-sop.inria.fr/maestro/personnel/Eitan.Altman/COURS- NS/n3.pdf Mailing List – Tcl – OTcl – tclCL –