Presentation is loading. Please wait.

Presentation is loading. Please wait.

Network Simulation and Simulator Internals 潘仁義

Similar presentations


Presentation on theme: "Network Simulation and Simulator Internals 潘仁義"— Presentation transcript:

1 Network Simulation and Simulator Internals 潘仁義 jypan@comm.ccu.edu.tw
Introduction to ns2 Network Simulation and Simulator Internals 潘仁義 Modified from Su Wen’s ns2 ppt & Padmaparna Haldar’s

2 The Network Simulator - ns-2
The source code and documentation is currently maintained by VINT project at ISI 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 NS2 is an object oriented simulator, written in C++, with an OTcl interpreter as a frontend 抽考: ns2安裝

3 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

4 Documentation introductory: Marc Greis's tutorial
reference: Ns Manual (formerly called "ns Notes and Documentation") ns by Example Practical Programming in Tcl and Tk (

5 Current Status ns-2 (2.1b6) Simulator Core Other Components
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, …

6 ns Directory Structure
ns-allinone Tcl8.0 TK8.0 OTcl tclcl ns-2 nam-1 tcl ... C++ code ex test lib mcast ... examples validation tests OTcl code simple.tcl

7 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

8 Hello World simple.tcl arches 74% ns simple.tcl Hello World!
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%

9 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)

10 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 A 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:

11 ns-2 Environment Simulation Scenario Tcl Script C++ Implementation 1 2
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(); } C++ Implementation

12 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

13 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)

14 Using ns Problem Result Simulation Modify analysis model ns Setup/run
with ns

15 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

16 Basic Tcl procedures: proc pow {x n} { if {$n == 1} { return $x }
variables: set x 10 puts “x is $x” functions and expressions: pow x 2 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.

17 Basic otcl Class Person # constructor: Person instproc init {age} { $self instvar age_ set age_ $age } # method: Person instproc greet {} { puts “$age_ years old: How are you doing?” # subclass: Class Kid -superclass Person Kid instproc greet {} { $self instvar 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 Person a 45; Kid b 15 a greet; b greet Person info instances a info class; a info vars => can easily make variations of existing things (TCP, TCP/Reno)

18 Otcl and C++: The Duality
C++/OTcl split objects otcl OTcl (object variant of Tcl) and C++ share class hierarchy TclCL is glue library that makes it easy to share functions, variables, etc

19 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

20 C++ and Otcl linkage II Some important objects: 目前悟性不夠
NsObject: has recv() method Connector: has target() and drop() BiConnector: uptarget() & downtarget() 目前悟性不夠

21 TclObject: Hierarchy and Shadowing
OTcl class hierarchy C++ 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 Agent/TCP/JS JSTcpAgent _o123 *tcp Agent/TCP/JS OTcl shadow object Agent/TCP/JS C++ object

22 TclObject: Creation and Deletion
Agent/TCP/JS constructor Agent/TCP constructor invoke parent TclObject constructor create C++ object invoke parent constructor which C++ object to create? – TclClass JSTCPAgent constructor invoke parent complete initialization complete initialization create OTcl shadow object OTcl C++ do nothing, return TclObject (C++) constructor invoke parent constructor parent (Agent) bind variables and return bind variables and return

23 Class Hierarchy in ns TclObject NsObject Connector Classifier Queue
Delay Agent Trace AddrClassifier McastClasifier DropTail RED TCP Enq Deq Drop Reno SACK JS

24 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_; };

25 TCP Jump Start – Step 2 New file: tcp-js.cc bind(“MAXWIN_”, &MAXWIN_);
#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_);

26 TclObject::bind() Link C++ member variables to OTcl object variables
TcpAgent::TcpAgent() { bind(“window_”, &wnd_); … … } bind_time(), bind_bool(), bind_bw() (set with unit) OTcl set tcp [new Agent/TCP] $tcp set window_ 200

27 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

28 Calling C++ functions from 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);

29 TclObject::command()
OTcl space no such procedure $tcp send TclObject::unknown{} $tcp cmd send C++ space TcpAgent::command() match “send”? Yes No process and return Invoke parent: return Agent::command()

30 Calling Otcl functions from C++
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);

31 EmbeddedTcl How it works Makefile.in:
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

32 Summary TclObject TclClass Tcl: primitives to access Tcl interpreter
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

33 Event Scheduler Create event scheduler Schedule events Start 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()”

34 Extending ns in OTcl ns-allinone Tcl8.0 TK8.0 OTcl tclcl ns-2 nam-1
... C++ code ex test mysrc lib mcast ... examples validation tests msg.tcl OTcl code

35 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

36 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

37 Program size, complexity
THE Merit of OTcl Program size, complexity low high C/C++ OTcl split objects Smoothly adjust the granularity of scripting to balance extensibility and performance With complete compatibility with existing simulation scripts

38 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

39 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}

40 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

41 Backup slide

42 OTcl Linkage 描述 名稱 繼承 C++ object class MyAgent Agent Linkage object
OTcl Linkage是c++和OTcl 的一個介面。 描述 名稱 繼承 C++ object class MyAgent Agent Linkage object CLass TCL CLass OTcl object Agent/MyAgentOtcl C++ code OLcl Linkake OTcl code

43 OTcl Linkage

44 如何使用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++變數

45 如何使用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.

46 如何使用OTcl linkage Export C++ Object Control Commands to OTcl -

47 如何使用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()"

48 如何使用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".

49 如何使用OTcl linkage

50 如何使用OTcl linkage

51 C++ Guidelines Decide position in class hierarchy
i.e., which class to derive from? Create new packet header (if necessary) Create C++ class, fill in methods Define OTcl linkage (if any) Write OTcl code (if any) Build (and debug)

52 Where to Find What?

53 Where to Find What? ns-lib.tcl: The simulator class and most of its member function definitions except for LAN, Web, and Multicast related ones are located here. ns-default.tcl: The default values for configurable parameters for various network components are located here. the parameters are actually C++ variables made available to OTcl via an OTcl linkage function bind(C++_variable_name, OTcl_variable_name)  

54 Where to Find What? ns-packet.tcl: The packet header format initialization implementation is located here. When you create a new packet header, you should register the header in this file to make the packet header initialization process and give you the offset of your header in the stack. other OTcl files: Other OTcl files in this directory, The FTP application is entirely implemented in OTcl and the source code is located in "ns-source.tcl".


Download ppt "Network Simulation and Simulator Internals 潘仁義"

Similar presentations


Ads by Google