Introduction to ns2

54
Introduction to ns2 Network Simulation and Si mulator Internals 潘潘潘 [email protected] Modified from Su Wen’s ns2 ppt [email protected] & Padmaparna Haldar’s [email protected]

description

Introduction to ns2. Network Simulation and Simulator Internals 潘仁義 [email protected]. Modified from Su Wen ’ s ns2 ppt [email protected] & Padmaparna Haldar ’ s [email protected]. The Network Simulator - ns-2. http://www.isi.edu/nsnam/ns/ - PowerPoint PPT Presentation

Transcript of Introduction to ns2

Page 1: Introduction to ns2

Introduction to ns2

Network Simulation and Simulator Internals潘仁義

[email protected] from Su Wen’s ns2 ppt

[email protected]& Padmaparna Haldar’s

[email protected]

Page 2: Introduction to ns2

The Network Simulator - ns-2

http://www.isi.edu/nsnam/ns/ The source code and documentation is currently mai

ntained 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

NS2 is an object oriented simulator, written in C++, with an OTcl interpreter as a frontend

抽考 : ns2 安裝

Page 3: Introduction to 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

Page 4: Introduction to ns2

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/n

s2.htm

Page 5: Introduction to ns2

Current Status

ns-2 (2.1b6) Simulator Core100K lines of C++70K lines of OTcl30K lines of test suite20K lines of documentation

Other ComponentsTcl/TK 8.x, OTcl, TclCL, nam-1Tcl-debug, GT-ITM, xgraph, …

Page 6: Introduction to ns2

ns Directory Structure

TK8.0 OTcl tclclTcl8.0 ns-2 nam-1

tcl

ex test lib

...

...

examples validation tests

C++ code

OTcl code

ns-allinone

mcast

simple.tcl

Page 7: Introduction to ns2

Running simulations with ns

Compile the simulator core (“ns”)Write a simulation script in Otcl

e.g. my-test.tcl

Running the simulatore.g. ns my-test.tcl

Page 8: Introduction to ns2

Hello World

simple.tclset 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%

Page 9: Introduction to ns2

Discrete Event Simulation

Model world as eventsSimulator has list of eventsProcess: take next one, run it, until doneEach 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)

Page 10: Introduction to ns2

Discrete Event Examples

Consider two nodeson an Ethernet:

A B

simplequeuingmodel:

t=1, A enqueues pkt on LANt=1.01, LAN dequeues pkt

and triggers B

detailedCSMA/CDmodel:

t=1.0: A sends pkt to NICA’s NIC starts carrier sense

t=1.005: A’s NIC concludes cs,starts tx

t=1.006: B’s NIC begins reciving pktt=1.01: B’s NIC concludes pkt

B’s NIC passes pkt to app

Page 11: Introduction to ns2

ns-2 EnvironmentSimulation Scenario

Tcl Script

C++ Implementation

1 2

set ns_ [new Simulator]

set node_(0) [$ns_ node]

set node_(1) [$ns_ node]

class MobileNode : public Node {

friend class PositionHandler;public: MobileNode();

••

}

Page 12: Introduction to ns2

Why two languages? (Tcl & C++)

C++: Detailed protocol simulations require systems programming language byte manipulation, packet processing, algorithm imple

mentationRun time speed is importantTurn around time (run simulation, find bug, fix bug, rec

ompile, re-run) is slowerTcl: Simulation of slightly varying parameters or c

onfigurationsquickly exploring a number of scenariositeration time (change the model and re-run) is more im

portant

Page 13: Introduction to ns2

C++ and OTcl Separation

“data” / control separationC++ for “data”:

per packet processing, core of ns fast to run, detailed, complete control

OTcl for control:Simulation scenario configurationsPeriodic or triggered actionManipulating existing C++ objects fast to write and change

+ running vs. writing speed– Learning and debugging (two languages)

Page 14: Introduction to ns2

Using ns

Problem

Simulationmodel

Setup/run simulation

with ns

Resultanalysis

Modifyns

Page 15: Introduction to ns2

Summary: Generic Script Structure

set ns [new Simulator]set ns [new Simulator]

# [Turn on tracing]# [Turn on tracing]

# Create topology# Create topology

# Setup packet loss, link dynamics# Setup packet loss, link dynamics

# Create routing agents# Create routing agents

# Create: # Create:

# - multicast groups# - multicast groups

# - protocol agents# - protocol agents

# - application and/or setup traffic sources# - application and/or setup traffic sources

# Post-processing procs# Post-processing procs

# Start simulation# Start simulation

Page 16: Introduction to ns2

Basic Tcl

variables:set x 10puts “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 $xincr 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.

Page 17: Introduction to ns2

Basic otclClass Person# constructor:Person instproc init {age} {

$self instvar age_set age_ $age

}# method:Person instproc greet {} {

$self instvar age_puts “$age_ years old: How are you doing?”

}

# subclass:Class Kid -superclass PersonKid 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

=> can easily make variations of existing things (TCP, TCP/Reno)

Person a 45; Kid b 15a greet; b greetPerson info instancesa info class; a info vars

Page 18: Introduction to ns2

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++

otcl

C++/OTcl split object

s

Page 19: Introduction to ns2

C++ and OTcl Linkage

Class Tcl: instance of OTcl interpreterTcl& tcl = Tcl::instance();

tcl.evalc(“puts stdout hello world”);

tcl.result() and tcl.error()

Class TclObject and TclClassVariable bindings

bind(“rtt_”, &t_rtt_)Invoking command method in shadow class

$tcp advanceby 10

Page 20: Introduction to ns2

C++ and Otcl linkage II

Some important objects:NsObject: has recv() methodConnector: has target() and drop()BiConnector: uptarget() & downtarget()

目前悟性不夠

Page 21: Introduction to ns2

TclObject: Hierarchy and Shadowing

TclObject

Agent

Agent/TCP/JS

Agent/TCP/JS OTcl shadow object

_o123Agent/TCP/JS C++

object

*tcp

TclObject

Agent

JSTcpAgent

OTcl classhierarchy

C++ classhierarchy

static JSTcpClass : public TclClass {public:JSTcpClass():TclClass("Agent/TCP/JS"){} TclObject* create(int,const char*const*) { return (new JSTcpAgent());}};

Page 22: Introduction to ns2

C++

OTcl

TclObject: Creation and Deletion

invoke parentconstructor

Agent/TCP/JSconstructor

Agent/TCP constructor

invoke parentconstructor

TclObjectconstructor

create C++object

JSTCPAgentconstructor

invoke parentconstructordo nothing,

return

TclObject (C++)constructor

bind variablesand return

bind variablesand return

create OTclshadow object

complete initialization

complete initialization

which C++ object to create? – TclClass

invoke parentconstructor

parent (Agent)constructor

Page 23: Introduction to ns2

Class Hierarchy in ns

TclObject

NsObject

Connector Classifier

Delay AddrClassifierAgent McastClasifierQueue Trace

DropTail RED TCP Enq Deq Drop

Reno SACK JS

Page 24: Introduction to ns2

TCP Jump Start – Step 1

New file: tcp-js.h

class JSTcpAgent : public TcpAgent {class JSTcpAgent : public TcpAgent {

public:public:

virtual void set_initial_window() {virtual void set_initial_window() {

cwnd_ = MAXWIN_;cwnd_ = MAXWIN_;

}}

JSTcpAgent();JSTcpAgent();

private:private:

int MAXWIN_;int MAXWIN_;

};};

Page 25: Introduction to ns2

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

Page 26: Introduction to ns2

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)

OTclset tcp [new Agent/TCP]set tcp [new Agent/TCP]$tcp set window_ 200$tcp set window_ 200

Page 27: Introduction to ns2

Initialization of Bound Variables

Initialization through OTcl class variablesAgent/TCP set Agent/TCP set window_window_ 50 50

Do all initialization of bound variables in ~ns/lib/ns-default.tclOtherwise a warning will be issued when the

shadow object is createdAfter modifying, remember to make ns2

Page 28: Introduction to ns2

Calling C++ functions from Otcl

OTclset 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);}

Page 29: Introduction to ns2

TclObject::command()

$tcp send TclObject::unknown{} $tcp cmd sendno suchprocedure

TcpAgent::command()

match “send”?

Invoke parent: return Agent::command()

process and return

Yes No

OTcl space

C++ space

Page 30: Introduction to ns2

Calling Otcl functions from C++

OTclAgent/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);

Page 31: Introduction to ns2

EmbeddedTcl

How it workstcl2c++tcl2c++: provided by TclCL, converts tcl script

s into a C++ static character arrayMakefile.in:tclsh8.0 bin/tcl-expand.tcl tcl/lib/ns-litclsh8.0 bin/tcl-expand.tcl tcl/lib/ns-lib.tcl | tcl2c++ et_ns_lib > gen/ns_tcl.b.tcl | tcl2c++ et_ns_lib > gen/ns_tcl.cccc

Page 32: Introduction to ns2

Summary

TclObjectUnified interpreted (OTcl) and compiled (C++)

class hierarchiesSeamless access (procedure call and variable

access) between OTcl and C++TclClass

The mechanism that makes TclObject workTcl: primitives to access Tcl interpreter

Page 33: Introduction to ns2

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()”

Page 34: Introduction to ns2

Extending ns in OTcl

TK8.0 OTcl tclclTcl8.0 ns-2 nam-1

tcl

ex test lib

...

...

examples validation tests

C++ code

OTcl code

ns-allinone

mcastmysrc

msg.tcl

Page 35: Introduction to ns2

Add Your Changes into ns

source your changes in your sim scripts

Or add to tcl/lib/ns-lib.tcl

……source ../mysrc/msg.tclsource ../mysrc/msg.tcl

Change MakefileNS_TCL_LIB = \NS_TCL_LIB = \

tcl/mysrc/msg.tcl \tcl/mysrc/msg.tcl \……

Recompile

Page 36: Introduction to ns2

Scalability vs Flexibility

It’s tempting to write all-OTcl simulationBenefit: quick prototypingCost: memory + runtime

SolutionControl the granularity of your split object by migra

ting methods from OTcl to C++

Conventional Wisdom:C++ for “data”

Per packet action

OTcl for controlPeriodic or triggered action

Page 37: Introduction to ns2

THE Merit of OTcl

Program size, complexity

C/C++ OTcl

Smoothly adjust the granularity of scripting to balance extensibility and performance

With complete compatibility with existing simulation scripts

high low

split objects

Page 38: Introduction to ns2

Object Granularity Tips

FunctionalityPer-packet processing C++Hooks, frequently changing code OTcl

Data managementComplex/large data structure C++One-time configuration variables OTcl

Page 39: Introduction to ns2

Memory Conservation Tips

Avoid trace-alltrace-all

Use arrays for a sequence of variablesInstead of n$in$i, say n($i)n($i)

Avoid OTcl temporary variablesUse dynamic binding

delay_bind()delay_bind() instead of bind()bind()See object.{h,cc}

Page 40: Introduction to ns2

Memory Leaks

Purify or dmalloc, but be careful about split objects:for {set i 0} {$i < 500} {incr i} {for {set i 0} {$i < 500} {incr i} {

set a [new RandomVariable/Constanset a [new RandomVariable/Constant]t]

}}It leaks memory, but can’t be detected!

SolutionExplicitly delete EVERY split object that was n

ew-ed

Page 41: Introduction to ns2

Backup slide

Page 42: Introduction to ns2

OTcl Linkage

OTcl Linkage 是 c++ 和 OTcl 的一個介面。

C++ code

OLcl Linkake

OTcl code

描述 名稱 繼承C++ object

classMyAgent Agent

Linkage object

MyAgent

CLass

TCL CLass

OTcl object

Agent/MyAgentOtcl

Page 43: Introduction to ns2

OTcl Linkage

Page 44: Introduction to ns2

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

Page 45: Introduction to ns2

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

Page 46: Introduction to ns2

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

-

Page 47: Introduction to ns2

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

Page 48: Introduction to ns2

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

Page 49: Introduction to ns2

如何使用 OTcl linkage

Page 50: Introduction to ns2

如何使用 OTcl linkage

Page 51: Introduction to ns2

C++ Guidelines

Decide position in class hierarchyi.e., which class to derive from?

Create new packet header (if necessary)Create C++ class, fill in methodsDefine OTcl linkage (if any)Write OTcl code (if any)Build (and debug)

Page 52: Introduction to ns2

Where to Find What?

Page 53: Introduction to ns2

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) 

Page 54: Introduction to ns2

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".