560 likes | 765 Views
Introduction to ns2. Network Simulation and Simulator Internals 潘仁義 jypan@comm.ccu.edu.tw. Modified from Su Wen ’ s ns2 ppt suwen@dcs.uky.edu & Padmaparna Haldar ’ s haldar@isi.edu. The Network Simulator - ns-2. http://www.isi.edu/nsnam/ns/
E N D
Introduction to ns2 Network Simulation and Simulator Internals 潘仁義 jypan@comm.ccu.edu.tw Modified from Su Wen’s ns2 ppt suwen@dcs.uky.edu & Padmaparna Haldar’s haldar@isi.edu
The Network Simulator - ns-2 • http://www.isi.edu/nsnam/ns/ • The source code and documentation is currently maintained by VINT project at ISI • http://nsnam.isi.edu/nsnam/index.php/Main_Page • Sept 3, 2007: ns-2.32 released. • Mar 10, 2007: ns-2.31 released. • July 2, 2006: ns-3 project announced. • NS2 is a discrete event simulator targeted at networking research • NS2is an object oriented simulator, written in C++, with an OTcl interpreter as a frontend 抽考: ns2安裝
ns-2 Overview • Collection of various protocols at multiple layers • TCP(reno, tahoe, vegas, sack) • MAC(802.11, 802.3, TDMA) • Ad-hoc Routing (DSDV, DSR, AODV, TORA) • Sensor Network (diffusion, gaf) • Multicast protocols, Satellite protocols, and many others • Codes are contributed from multiple research communities • Good: Large set of simulation modules • Bad: Level of support and documentation varies • The source code and documentation is currently maintained by VINT project at ISI
Documentation • introductory: Marc Greis's tutorial • reference: Ns Manual (formerly called "ns Notes and Documentation") • ns by Example • Practical Programming in Tcl and Tk (http://www.beedub.com/book/) • http://hpds.ee.ncku.edu.tw/~smallko/ns2/ns2.htm
Current Status • ns-2 (2.1b6) Simulator Core • 100K lines of C++ • 70K lines of OTcl • 30K lines of test suite • 20K lines of documentation • Other Components • Tcl/TK 8.x, OTcl, TclCL, nam-1 • Tcl-debug, GT-ITM, xgraph, …
ns Directory Structure ns-allinone Tcl8.0 TK8.0 OTcl tclcl ns-2 nam-1 C++ code ... tcl ex test mcast lib ... examples validation tests OTcl code simple.tcl
Running simulations with ns • Compile the simulator core (“ns”) • Write a simulation script in Otcl • e.g. my-test.tcl • Running the simulator • e.g. ns my-test.tcl
Hello World simple.tcl set sim [new Simulator] $sim at 1 “puts \“Hello World!\”” $sim at 1.5 “exit” $sim run arches 74% ns simple.tcl Hello World! arches 75%
Discrete Event Simulation • Model world as events • Simulator has list of events • Process: take next one, run it, until done • Each event happens in an instant of virtual (simulated) time, but takes an arbitrary amount of real time • Ns uses simple model: single thread of control => no locking or race conditions to worry about (very easy)
A B Discrete Event Examples simple queuing model: Consider two nodes on an Ethernet: t=1, A enqueues pkt on LAN t=1.01, LAN dequeues pkt and triggers B t=1.0: A sends pkt to NIC A’s NIC starts carrier sense t=1.005: A’s NIC concludes cs, starts tx t=1.006: B’s NIC begins reciving pkt t=1.01: B’s NIC concludes pkt B’s NIC passes pkt to app detailed CSMA/CD model:
Simulation Scenario 2 C++ Implementation 1 ns-2 Environment set ns_ [new Simulator] set node_(0) [$ns_ node] set node_(1) [$ns_ node] Tcl Script class MobileNode : public Node { friend class PositionHandler; public: MobileNode(); • • }
Why two languages? (Tcl & C++) • C++: Detailed protocol simulations require systems programming language • byte manipulation, packet processing, algorithm implementation • Run time speed is important • Turn around time (run simulation, find bug, fix bug, recompile, re-run) is slower • Tcl: Simulation of slightly varying parameters or configurations • quickly exploring a number of scenarios • iteration time (change the model and re-run) is more important
C++ and OTcl Separation • “data” / control separation • C++ for “data”: • per packet processing, core of ns • fast to run, detailed, complete control • OTcl for control: • Simulation scenario configurations • Periodic or triggered action • Manipulating existing C++ objects • fast to write and change • running vs. writing speed • Learning and debugging (two languages)
Using ns Problem Result analysis Simulation model Modify ns Setup/run simulation with ns
Summary: Generic Script Structure set ns [new Simulator] # [Turn on tracing] # Create topology # Setup packet loss, link dynamics # Create routing agents # Create: # - multicast groups # - protocol agents # - application and/or setup traffic sources # Post-processing procs # Start simulation
variables: set x 10 puts “x is $x” functions and expressions: set y [pow x 2] set y [expr x*x] control flow: if {$x > 0} { return $x } else { return [expr -$x] } while { $x > 0 } { puts $x incr x –1 } procedures: proc pow {x n} { if {$n == 1} { return $x } set part [pow x [expr $n-1]] return [expr $x*$part] } Also lists, associative arrays, etc. => can use a real programming language to build network topologies, traffic models, etc. Basic Tcl
Class Person # constructor: Person instproc init {age} { $selfinstvar age_ set age_ $age } # method: Person instproc greet {} { $selfinstvar age_ puts “$age_ years old: How are you doing?” } # subclass: Class Kid -superclass Person Kid instproc greet {} { $selfinstvar age_ puts “$age_ years old kid: What’s up, dude?” } set a [new Person 45] set b [new Kid 15] $a greet $b greet # “new” in ns2 only Basic otcl Person a 45 Kid b 15 a greet b greet => can easily make variations of existing things (TCP, TCP/Reno)
Otcl and C++: The Duality • OTcl (object variant of Tcl) and C++ share class hierarchy • TclCL is glue library that makes it easy to share functions, variables, etc C++ C++/OTcl split objects otcl
C++ and OTcl Linkage • Class Tcl: instance of OTcl interpreter Tcl& tcl = Tcl::instance(); tcl.evalc(“puts stdout hello world”); tcl.result() and tcl.error() • Class TclObject and TclClass • Variable bindings bind(“rtt_”, &t_rtt_) • Invoking command method in shadow class $tcp advanceby 10
C++ and Otcl linkage II • Some important objects: • NsObject: has recv() method • Connector: has target() and drop() • BiConnector: uptarget() & downtarget() • 目前悟性不夠
TclObject: Hierarchy and Shadowing C++ class hierarchy OTcl class hierarchy TclObject TclObject static JSTcpClass : public TclClass { public: JSTcpClass():TclClass("Agent/TCP/JS"){} TclObject* create(int,const char*const*) { return (new JSTcpAgent());} }; Agent Agent JSTcpAgent Agent/TCP/JS *tcp _o123 Agent/TCP/JS OTcl shadow object Agent/TCP/JS C++ object
Agent/TCP/JS constructor Agent/TCP constructor TclObject constructor invoke parent constructor create C++ object which C++ object to create? – TclClass complete initialization complete initialization create OTcl shadow object parent (Agent) constructor JSTCPAgent constructor TclObject (C++) constructor invoke parent constructor invoke parent constructor do nothing, return bind variables and return bind variables and return TclObject: Creation and Deletion invoke parent constructor OTcl C++
Class Hierarchy in ns TclObject NsObject Connector Classifier Queue Delay Agent Trace AddrClassifier McastClasifier DropTail RED TCP Enq Deq Drop JS Reno SACK
TCP Jump Start – Step 1 • New file: tcp-js.h class JSTcpAgent : public TcpAgent { public: virtual void set_initial_window() { cwnd_ = MAXWIN_; } JSTcpAgent(); private: int MAXWIN_; };
TCP Jump Start – Step 2 • New file: tcp-js.cc #include “tcp.h” #include “tcp-js.h” static class JSTcpClass : public TclClass { public: JSTcpClass() : TclClass("Agent/TCP/JS") {} TclObject* create(int, const char*const*) { return (new JSTcpAgent()); } }class_jstcp; JSTcpAgent::JSTcpAgent() { bind(“MAXWIN_”, &MAXWIN_); }
TclObject::bind() • Link C++ member variables to OTcl object variables • C++ TcpAgent::TcpAgent() { bind(“window_”, &wnd_); … … } • bind_time(), bind_bool(), bind_bw() (set with unit) • OTcl set tcp [new Agent/TCP] $tcp set window_ 200
Initialization of Bound Variables • Initialization through OTcl class variables Agent/TCP set window_ 50 • Do all initialization of bound variables in ~ns/lib/ns-default.tcl • Otherwise a warning will be issued when the shadow object is created • After modifying, remember to make ns2
Calling C++ functions from Otcl • OTcl set tcp [new Agent/TCP] $tcp advance 10 • C++ int TcpAgent::command(int argc, const char*const* argv) { if (argc == 3) { if (strcmp(argv[1], “advance”) == 0) { int newseq = atoi(argv[2]); …… return(TCL_OK); } } return (Agent::command(argc, argv); }
TclObject::command() OTcl space no such procedure $tcp send TclObject::unknown{} $tcp cmd send C++ space TcpAgent::command() match “send”? Yes No Invoke parent: return Agent::command() process and return
Calling Otcl functions from C++ • OTcl Agent/TCP instproc advance {num} { set window_ [expr $window_ + $num] return $window_ } • C++ Tcl& tcl = Tcl::instance(); char *result; tcl.evalf(“%s advance %d”, name_, size); result = tcl.result(); wnd_ = atoi(result);
EmbeddedTcl • How it works • tcl2c++: provided by TclCL, converts tcl scripts into a C++ static character array • Makefile.in: tclsh8.0 bin/tcl-expand.tcl tcl/lib/ns-lib.tcl | tcl2c++ et_ns_lib > gen/ns_tcl.cc
Summary • TclObject • Unified interpreted (OTcl) and compiled (C++) class hierarchies • Seamless access (procedure call and variable access) between OTcl and C++ • TclClass • The mechanism that makes TclObject work • Tcl: primitives to access Tcl interpreter
Event Scheduler • Create event scheduler • set ns [new Simulator] • Schedule events • $ns at <time> <event> • <event>: any legitimate ns/tcl commands • $ns at 0.1 “$ftp start” • $ns at 4.0 “$ftp stop” • $ns at 5.0 “finish” • Start scheduler • $ns run • ns/common/scheduler.cc • Scheduler::command() “now”, “at” • ns/link/delay.cc • LinkDelay::recv() “s.schedule()”
Extending ns in OTcl ns-allinone Tcl8.0 TK8.0 OTcl tclcl ns-2 nam-1 C++ code ... tcl mcast lib ... ex test mysrc examples msg.tcl validation tests OTcl code
Add Your Changes into ns • source your changes in your sim scripts • Or • add to tcl/lib/ns-lib.tcl … source ../mysrc/msg.tcl • Change Makefile NS_TCL_LIB = \ tcl/mysrc/msg.tcl \ … • Recompile
Scalability vs Flexibility • It’s tempting to write all-OTcl simulation • Benefit: quick prototyping • Cost: memory + runtime • Solution • Control the granularity of your split object by migrating methods from OTcl to C++ • Conventional Wisdom: • C++ for “data” • Per packet action • OTcl for control • Periodic or triggered action
THE Merit of OTcl • Smoothly adjust the granularity of scripting to balance extensibility and performance • With complete compatibility with existing simulation scripts Program size, complexity low high OTcl C/C++ split objects
Object Granularity Tips • Functionality • Per-packet processing C++ • Hooks, frequently changing code OTcl • Data management • Complex/large data structure C++ • One-time configuration variables OTcl
Memory Conservation Tips • Avoid trace-all • Use arrays for a sequence of variables • Instead of n$i, say n($i) • Avoid OTcl temporary variables • Use dynamic binding • delay_bind() instead of bind() • See object.{h,cc}
Memory Leaks • Purify or dmalloc, but be careful about split objects: for {set i 0} {$i < 500} {incr i} { set a [new RandomVariable/Constant] } • It leaks memory, but can’t be detected! • Solution • Explicitly delete EVERY split object that was new-ed
OTcl Linkage • OTcl Linkage是c++和OTcl 的一個介面。 C++ code OLcl Linkake OTcl code
如何使用OTcl linkage • Export C++ class variables to OTcl • - bind(): real or integer variables- bind_time(): time variable- bind_bw(): bandwidth variable- bind_bool(): boolean variable請在ns-2/tcl/lib/ns-lib.tcl設預設值,否則會有警告message OTcl變數 C++變數
如何使用OTcl linkage • Export C++ Object Control Commands to OTcl • This is done by defining a "command" member function of your C++ object, which works as an OTcl command interpreter. • When OTcl object( is created and the user tries to call a member function of that object (i.e. $myagent call-my-priv-func), OTcl searches for the given member function name in the OTcl object. If the given member function name cannot be found, then it invokes the "MyAgent::command" passing the invoked OTcl member function name and arguments in argc/argv format.
如何使用OTcl linkage • Export C++ Object Control Commands to OTcl • -
如何使用OTcl linkage • Execute an OTcl command from C++. • makes an OTcl interpreter print out the value in "my_var1" and "my_var2" private member variables • To execute an OTcl command from C++, you should get a reference to "Tcl::instance()"
如何使用OTcl linkage • Compile, run and test "MyAgent“ • put "ex-linkage.cc" file, and save it under the "ns-2" directory. • Open "Makefile", add "ex-linkage.o" at the end of object file list. • Re-compile NS using the "make" command. • Run the OTcl script using command "ns ex-linkage.tcl".