280 likes | 410 Views
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++
E N D
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 • http://www.isi.edu/nsnam/ns/ns-build.html#allinone • ./install will configure, compile, & install • Problem? • http://www.isi.edu/nsnam/ns/ns-problems.html
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
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 Pros & Cons
OTcl and C++: The Duality C++ otcl
static class TcpClass : public TclClass { public: TcpClass() : TclClass("Agent/TCP") {} TclObject* create(int, const char*const*) { return (new TcpAgent);} } class_tcp; TclObject Agent/TCP Agent Create C++ object init init Create Otcl shadow object OTcl C++ TclObject (C++) parent TcpAgent constructor constructor constructor OTcl Linkage set tcp [new Agent/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
Buffer 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(“………”)
Register Event Deque Scheduler Object B Object A Dispatch Dispatch How ns-2 works Event Queue Target object Event (Packet) Time
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 }
Scheduler An Example A B CBR Sink CBR Transport Transport Network Network LL LL IFQ IFQ MAC MAC NetIF NetIF Wireless Channel
Demonstration MobileNode Wireless Wired Wired MobileNode BaseStation MobileNode
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 1 1 4 ;# 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 {0.0.0 0.1.0} ;# 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 {1.0.0 1.0.1 1.0.2 1.0.3} ;# 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
Troubleshooting • Problem while installing • Compiler may complain • http://www.isi.edu/nsnam/ns/ns-problems.html • Program crashes • Use gdb • Unexpected results • Hidden problem • Slice & dice the trace log
Reference Links • http://www.isi.edu/nsnam/ns/ • Manual & Tutorial • http://www.isi.edu/nsnam/ns/ns-documentation.html • http://www.isi.edu/nsnam/ns/tutorial/index.html • http://www-sop.inria.fr/maestro/personnel/Eitan.Altman/COURS-NS/n3.pdf • Mailing List • http://www.isi.edu/nsnam/ns/ns-lists.html • Tcl • http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html • OTcl • http://bmrc.berkeley.edu/research/cmt/cmtdoc/otcl/tutorial.html • tclCL • http://www.openmash.org/lxr/source/tclcl/tclcl.tcl?c=tutorials