Top Banner
Outline An introduction to ns-2 What is ns-2 Fundamentals writing ns-2 codes Wireless support Traces support and visualization Emulation Related work
84
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Ns Week9 Ns2 Tutorial III.v2

Outline• An introduction to ns-2

• What is ns-2• Fundamentals• writing ns-2 codes• Wireless support• Traces support and visualization• Emulation• Related work

Page 2: Ns Week9 Ns2 Tutorial III.v2

Writing ns-2 codes

• Extending ns• In OTcl• In C++

• Debugging

Page 3: Ns Week9 Ns2 Tutorial III.v2

ns Directory Structure

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

tcl

ex test lib

...

...

examples validation tests

C++ code

OTcl code

ns-allinone

mcast

ensure new changes do not

break the old codes

Page 4: Ns Week9 Ns2 Tutorial III.v2

Validation test

old ns-2 test.tcl Standard output

new ns-2That contains Your changes

test.tcl new output

If standard output ≠ new output THEN something is broken

Page 5: Ns Week9 Ns2 Tutorial III.v2

Extending ns in OTcl

• If you don’t want to compile• source your changes in your simulation

scripts• Otherwise

• Modifying code; recompile• Adding new files

• Change Makefile (NS_TCL_LIB), tcl/lib/ns-lib.tcl• Recompile

Page 6: Ns Week9 Ns2 Tutorial III.v2

Example: Agent/Message

n0 n1

n4

n5

n2

n3

128Kb, 50ms

10Mb, 1ms 10Mb, 1ms

C Ccrosstraffic

S Rmessage agent

Page 7: Ns Week9 Ns2 Tutorial III.v2

Agent/Message

• An UDP agent (without UDP header)• Up to 64 bytes user message• Good for fast prototyping a simple idea• Usage requires extending ns functionality

SS RR

pkt: 64 bytesof arbitrary string

Receiver-sideprocessing

Page 8: Ns Week9 Ns2 Tutorial III.v2

Agent

• A protocol endpoint/enity• Provide

• a local and destination address (like an IP-layer sender)• Functions to generate or fill in packet fields

• To create a new agent• Decide its inheritance structure• Create recv function (and timeout if necessary) to process

the packets• Define OTcl linkage if necessary• Create new header if necessary

Page 9: Ns Week9 Ns2 Tutorial III.v2

Exercise

• Define a new class “Sender” and a new class “Receiver” which are based on class Agent/Message

• Sender• Send a message to the Receiver every 0.1 sec• Message contains its address and a sequence number

• Receiver• Receive message from the Sender• Acknowledge the receive message to the sender• The acknowledgement contains its address and the

sequence number of received message• How would you implement Ping with Agent/Message?

Page 10: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 1

• Define senderclass Sender class Sender ––superclasssuperclass Agent/MessageAgent/Message

# Message format: # Message format: ““AddrAddr Op Op SeqNoSeqNo””

Sender Sender instprocinstproc sendsend--next {} {next {} {

$self $self instvarinstvar seqseq_ _ agent_addragent_addr__

$self send $self send ““$$agent_addragent_addr_ send $_ send $seqseq__””

incrincr seqseq__

global nsglobal ns

$ns at [$ns at [exprexpr [$ns now]+0.1] "$self send[$ns now]+0.1] "$self send--next"next"

}}

Page 11: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 2

• Define sender packet processing

Sender Sender instprocinstproc recvrecv msgmsg {{

$self $self instvarinstvar agent_addragent_addr__

set set sdrsdr [[lindexlindex $$msgmsg 0]0]

set set seqseq [[lindexlindex $$msgmsg 2]2]

puts "Sender gets puts "Sender gets ackack $$seqseq from $from $sdrsdr""

}}

Page 12: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 3

• Define receiver packet processing

Class Receiver Class Receiver ––superclasssuperclass Agent/MessageAgent/Message

Receiver Receiver instprocinstproc recvrecv msgmsg {{

$self $self instvarinstvar agent_addragent_addr__

set set sdrsdr [[lindexlindex $$msgmsg 0]0]

set set seqseq [[lindexlindex $$msgmsg 2]2]

puts puts ““Receiver gets Receiver gets seqseq $$seqseq from $from $sdrsdr””

$self send $self send ““$$addraddr_ _ ackack $$seqseq””}}

Page 13: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 4

• Scheduler and tracing

# Create scheduler# Create scheduler

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

# Turn on Tracing# Turn on Tracing

set set fdfd [new [new ““message.trmessage.tr”” w]w]

$ns trace$ns trace--all $all $fdfd

Page 14: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 5

• Topologyfor {set i 0} {$i < 6} {for {set i 0} {$i < 6} {incrincr i} {i} {

set n($i) [$ns node]set n($i) [$ns node]}}$ns duplex$ns duplex--link $n(0) $n(1) 128kb 50ms link $n(0) $n(1) 128kb 50ms DropTailDropTail$ns duplex$ns duplex--link $n(1) $n(4) 10Mb 1ms link $n(1) $n(4) 10Mb 1ms DropTailDropTail$ns duplex$ns duplex--link $n(1) $n(5) 10Mb 1ms link $n(1) $n(5) 10Mb 1ms DropTailDropTail$ns duplex$ns duplex--link $n(0) $n(2) 10Mb 1ms link $n(0) $n(2) 10Mb 1ms DropTailDropTail$ns duplex$ns duplex--link $n(0) $n(3) 10Mb 1ms link $n(0) $n(3) 10Mb 1ms DropTailDropTail

$ns queue$ns queue--limit $n(0) $n(1) 5limit $n(0) $n(1) 5$ns queue$ns queue--limit $n(1) $n(0) 5limit $n(1) $n(0) 5

Page 15: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 6

• Routing

# Packet loss produced by # Packet loss produced by queueingqueueing

# Routing protocol: let# Routing protocol: let’’s run distance vectors run distance vector

$ns $ns rtprotortproto DVDV

Page 16: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 7

• Cross trafficset udp0 [new Agent/UDP]set udp0 [new Agent/UDP]$ns attach$ns attach--agent $n(2) $udp0agent $n(2) $udp0set null0 [new Agent/NULL]set null0 [new Agent/NULL]$ns attach$ns attach--agent $n(4) $null0agent $n(4) $null0$ns connect $udp0 $null0$ns connect $udp0 $null0

set exp0 [new Application/Traffic/Exponential]set exp0 [new Application/Traffic/Exponential]$exp0 set rate_ 128k$exp0 set rate_ 128k$exp0 attach$exp0 attach--agent $udp0agent $udp0$ns at 1.0 $ns at 1.0 ““$exp0 start$exp0 start””

Page 17: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 8• Message agents

set set sdrsdr [new Sender][new Sender]$$sdrsdr set set seqseq_ 0_ 0$$sdrsdr set set packetSizepacketSize_ 1000_ 1000

set set rcvrrcvr [new Receiver][new Receiver]$$rcvrrcvr set set packetSizepacketSize_ 40_ 40

$ns attach$ns attach--agent $n(3) $agent $n(3) $sdrsdr$ns attach$ns attach--agent $n(5) $agent $n(5) $rcvrrcvr$ns connect $$ns connect $sdrsdr $$rcvrrcvr$ns at 1.1 $ns at 1.1 ““$$sdrsdr sendsend--nextnext””

Page 18: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Step 9

• End-of-simulation wrapper (as usual)

$ns at 2.0 finish$ns at 2.0 finish

proc finish {} {proc finish {} {

global ns global ns fdfd

$ns flush$ns flush--tracetrace

close $close $fdfd

exit 0exit 0

}}

$ns run$ns run

Page 19: Ns Week9 Ns2 Tutorial III.v2

Agent/Message: Result

• Example output> ./ns > ./ns msg.tclmsg.tclReceiver gets Receiver gets seqseq 0 from 30 from 3Sender gets Sender gets ackack 0 from 50 from 5Receiver gets Receiver gets seqseq 1 from 31 from 3Sender gets Sender gets ackack 1 from 51 from 5Receiver gets Receiver gets seqseq 2 from 32 from 3Sender gets Sender gets ackack 2 from 52 from 5Receiver gets Receiver gets seqseq 3 from 33 from 3Sender gets Sender gets ackack 3 from 53 from 5Receiver gets Receiver gets seqseq 4 from 34 from 3Sender gets Sender gets ackack 4 from 54 from 5Receiver gets Receiver gets seqseq 5 from 35 from 3

Page 20: Ns Week9 Ns2 Tutorial III.v2

Add Your Changes into ns

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

tcl

ex test lib

...

...

examples validation tests

C++ code

OTcl code

ns-allinone

mcastmysrc

msg.tcl

Page 21: Ns Week9 Ns2 Tutorial III.v2

Add Your Change into ns• tcl/lib/ns-lib.tclClass SimulatorClass Simulator……source ../source ../mysrc/msg.tclmysrc/msg.tcl

• MakefileNS_TCL_LIB = NS_TCL_LIB = \\tcl/mysrc/msg.tcltcl/mysrc/msg.tcl \\……

• Or: change Makefile.in, make make distcleandistclean, then ./configure ./configure ----enableenable--debug ,debug ,

make depend make depend andand makemake

Page 22: Ns Week9 Ns2 Tutorial III.v2

Writing ns-2 codes

• Extending ns• In OTcl• In C++

• New components

Page 23: Ns Week9 Ns2 Tutorial III.v2

Extending ns in C++

• Modifying code• make depend• Recompile

• Adding code in new files• Change Makefile• make depend• recompile

Page 24: Ns Week9 Ns2 Tutorial III.v2

Creating New Components

• Guidelines• Two styles

• New agent based on existing packet headers• Add new packet header

Page 25: Ns Week9 Ns2 Tutorial III.v2

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)

Page 26: Ns Week9 Ns2 Tutorial III.v2

New Agent, Old Header

• Exercise: TCP jump start• Wide-open transmission window at the

beginning• From cwndcwnd_ += 1_ += 1 To cwndcwnd_ = MAXWIN__ = MAXWIN_

•• Useful for deep space communication Useful for deep space communication

Page 27: Ns Week9 Ns2 Tutorial III.v2

TCP Jump Start – Decide position in class hierarchy

TclObject

NsObject

Connector Classifier

Delay AddrClassifierAgent McastClasifierQueue Trace

DropTail RED TCP Enq Deq Drop

Reno SACK JS

Handler

Page 28: Ns Week9 Ns2 Tutorial III.v2

TCP Jump Start – Create C++ class

• New file: tcp-js.h

class class JSTCPAgentJSTCPAgent : public : public TcpAgentTcpAgent {{

public:public:

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

cwndcwnd_ = MAXWIN_;_ = MAXWIN_;

}}

private:private:

intint MAXWIN_;MAXWIN_;

};};

Page 29: Ns Week9 Ns2 Tutorial III.v2

TCP Jump Start – Define OTcllinkage

• New file: tcp-js.ccstatic JSTcpClass : public TclClass {public:

JSTcpClass() : TclClass("Agent/TCP/JS") {}TclObject* create(int, const char*const*) {

return (new JSTcpAgent());}

};JSTcpAgent::JSTcpAgent() {

bind(“MAXWIN_”, MAXWIN_);}

Page 30: Ns Week9 Ns2 Tutorial III.v2

TCP Jump Start – Build

• Create an instance of jump-start TCP in your tcl script tcp-js.tcl

• Set MAXWIN_ value in tcl• Add tcp-js.o in Makefile.in• Re-configure, make depend and recompile• Run yr tcl script tcp-js.tcl

Page 31: Ns Week9 Ns2 Tutorial III.v2

Packet Format

header

dataip header

tcp header

rtp header

trace header

cmn header

...

ts_

ptype_

uid_

size_

iface_

remove-all-packet-headers ;# removes all except commonadd-packet-header IP Message ;# hdrs reqd for cbr traffic

Page 32: Ns Week9 Ns2 Tutorial III.v2

New Packet Header

• Create new header structure• Create static class for OTcl linkage (packet.h)• Enable tracing support of new header(trace.cc)• Enable new header in OTcl (tcl/lib/ns-packet.tcl)• This does not apply when you add a new field

into an existing header!

Page 33: Ns Week9 Ns2 Tutorial III.v2

packet.h

• PT_REALAUDIO,• name_[PT_REALAUDIO] = "ra";

Page 34: Ns Week9 Ns2 Tutorial III.v2

ns-packet.tcl

foreach prot {Common FlagsIP …

} {add-packet-header $prot

}

Page 35: Ns Week9 Ns2 Tutorial III.v2

How Packet Header WorksPacket

next_

hdrlen_

bits_ size determinedat compile time

size determinedat compile time

size determinedat compile time

……

hdr_cmn

hdr_ip

hdr_tcp

size determinedat simulatorstartup time

(PacketHeaderManager)

PacketHeader/Common

PacketHeader/IP

PacketHeader/TCP

Page 36: Ns Week9 Ns2 Tutorial III.v2

Example: Agent/Message

• New packet header for 64-byte message• New transport agent to process this new

header

Page 37: Ns Week9 Ns2 Tutorial III.v2

New Packet Header – Step 1

• Create header structurestructstruct hdr_msghdr_msg {{

char msg_[64];char msg_[64];static static intint offset_;offset_;inline static inline static intint& offset() { return offset_; }& offset() { return offset_; }inline static inline static hdr_msghdr_msg* access(Packet* p) {* access(Packet* p) {return (return (hdr_msghdr_msg*) p*) p-->access(offset_);>access(offset_);

}}/* per/* per--field member functions */field member functions */char* char* msgmsg() { return (() { return (msgmsg_); }_); }intint maxmsgmaxmsg() { return (() { return (sizeof(msgsizeof(msg_)); }_)); }

};};

Page 38: Ns Week9 Ns2 Tutorial III.v2

New Packet Header – Step 2

• Otcl linkage: PacketHeader/Messagestatic class static class MessageHeaderClassMessageHeaderClass : :

public public PacketHeaderClassPacketHeaderClass {{public:public:MessageHeaderClassMessageHeaderClass() : () : PacketHeaderClass("PacketHeaderClass("PacketHeaderPacketHeader/Message/Message",",

sizeof(hdr_msgsizeof(hdr_msg)) {)) {bind_offset(&hdr_msg::offsetbind_offset(&hdr_msg::offset_);_);

}}} } class_msghdrclass_msghdr;;

Page 39: Ns Week9 Ns2 Tutorial III.v2

New Packet Header – Step 3

• Enable tracing (packet.h):enumenum packet_t {packet_t {

PT_TCP,PT_TCP,……,,PT_MESSAGEPT_MESSAGE,,PT_NTYPE // This MUST be the LAST onePT_NTYPE // This MUST be the LAST one

};};class p_info {class p_info {

…………name_[PT_MESSAGE] = name_[PT_MESSAGE] = ““messagemessage””;;name_[PT_NTYPE]= "undefined";name_[PT_NTYPE]= "undefined";

…………};};

Page 40: Ns Week9 Ns2 Tutorial III.v2

New Packet Header – Step 4

• Register new header (tcl/lib/ns-packet.tcl)

foreachforeach protprot {{

{ Common { Common off_cmnoff_cmn_ }_ }

……

{ { Message Message off_msgoff_msg__ }}

}}

addadd--packetpacket--header $header $protprot

Page 41: Ns Week9 Ns2 Tutorial III.v2

Packet Header: Caution

• Some old code, e.g.:RtpAgent::RtpAgentRtpAgent::RtpAgent() {() {

…………

bind(bind(““off_rtpoff_rtp__””, &, &off_rtpoff_rtp););

}}

…………

hdr_rtphdr_rtp* * rhrh = (= (hdr_rtphdr_rtp*)p*)p-->>access(off_rtpaccess(off_rtp_);_);

• Don’t follow this example!

Page 42: Ns Week9 Ns2 Tutorial III.v2

Agent/Message – Step 1

TclObject

NsObject

Connector Classifier

Delay AddrClassifierAgent McastClasifierQueue Trace

DropTail RED TCP Enq Deq Drop

Reno SACK

Message

Page 43: Ns Week9 Ns2 Tutorial III.v2

Agent/Message – Step 2

• C++ class definition// Standard split object declaration// Standard split object declaration

static static ……

class class MessageAgentMessageAgent : public Agent {: public Agent {

public:public:

MessageAgentMessageAgent() : Agent(() : Agent(PT_MESSAGEPT_MESSAGE) {}) {}

virtual virtual intint command(intcommand(int argcargc, const char*const* , const char*const* argvargv););

virtual void virtual void recv(Packetrecv(Packet*, Handler*);*, Handler*);

};};

Page 44: Ns Week9 Ns2 Tutorial III.v2

Agent/Message – Step 3• Packet processing: $msgAgent send “data1”

intint MessageAgent::command(intMessageAgent::command(int, const char*const* , const char*const* argvargv)){{

TclTcl& & tcltcl = = Tcl::instanceTcl::instance();();if (strcmp(argv[1], "send") == 0) {if (strcmp(argv[1], "send") == 0) {Packet* Packet* pktpkt = = allocpktallocpkt();();hdr_msghdr_msg* * mhmh = = hdr_msg::access(pkthdr_msg::access(pkt););// We ignore message size check...// We ignore message size check...strcpy(mhstrcpy(mh-->>msgmsg(), argv[2]);(), argv[2]);send(pktsend(pkt, 0);, 0);return (TCL_OK);return (TCL_OK);

}}return (return (Agent::command(argcAgent::command(argc, , argvargv));));

}}

Page 45: Ns Week9 Ns2 Tutorial III.v2

Agent/Message – Step 4• Packet processing: receive

void void MessageAgent::recv(PacketMessageAgent::recv(Packet* * pktpkt, Handler*), Handler*){{

hdr_msghdr_msg* * mhmh = = hdr_msg::access(pkthdr_msg::access(pkt););

// // OTclOTcl callbackcallbackchar wrk[128];char wrk[128];sprintf(wrksprintf(wrk, "%s , "%s recvrecv {%s}", name(), {%s}", name(), mhmh-->>msgmsg());());TclTcl& & tcltcl = = Tcl::instanceTcl::instance();();tcl.eval(wrktcl.eval(wrk););

Packet::free(pktPacket::free(pkt););}}

Page 46: Ns Week9 Ns2 Tutorial III.v2

Writing ns-2 codes

• Extending ns• In OTcl• In C++• Debugging: OTcl/C++, memory• Pitfalls

Page 47: Ns Week9 Ns2 Tutorial III.v2

Debugging C++ in ns

• C++/OTcl debugging

• Memory debugging (memory leak is a common bug)• purify• dmalloc

Page 48: Ns Week9 Ns2 Tutorial III.v2

C++/OTcl Debugging

• Usual technique• Break inside command()• Cannot examine states inside OTcl!

• Solution• Execute tcl-debug inside gdb• http://expect.nist.gov/tcl-debug/tcl-debug.ps.Z

Page 49: Ns Week9 Ns2 Tutorial III.v2

C++/OTcl Debugging

C++ OTcl

debug 1debug 1

debug 1debug 1

OtclOtcl commandcommand

OtclOtcl commandcommand

Page 50: Ns Week9 Ns2 Tutorial III.v2

C++/OTcl Debugging

((gdbgdb) ) call call Tcl::instance().eval(Tcl::instance().eval(““debugdebug 11””))15: 15: lappendlappend auto_path $auto_path $dbg_librarydbg_librarydbg15.3> wdbg15.3> w*0: application*0: application15: 15: lappendlappend auto_path $auto_path $dbg_librarydbg_library

dbg15.4> Simulator info instancesdbg15.4> Simulator info instances_o1_o1dbg15.5> _o1 nowdbg15.5> _o1 now00dbg15.6> # and other fun stuffdbg15.6> # and other fun stuffdbg15.7> dbg15.7> cc((gdbgdb) where) where#0 0x102218 in write()#0 0x102218 in write()............

Page 51: Ns Week9 Ns2 Tutorial III.v2

Memory Debugging in ns

• Purify• Set PURIFY macro in ns Makefile• Usually, put -colloctor=<ld_path>

• Gray Watson’s dmalloc library• http://www.dmalloc.com• make distclean• ./configure --with-dmalloc=<dmalloc_path>• Analyze results: dmalloc_summarize

Page 52: Ns Week9 Ns2 Tutorial III.v2

dmalloc: Usage

• Turn on dmalloc• alias dmalloc ’eval ‘\dmalloc –C \!*`’• dmalloc -l log low

• dmalloc_summarize ns < logfile• ns must be in current directory• Itemize how much memory is allocated in

each function

Page 53: Ns Week9 Ns2 Tutorial III.v2

Homework

• Run ns-2 on http://www.isi.edu/nsnam/ns/tutorial/examples/example2.tcl

• Execute dmalloc• Submit the memory profile to TA• Due date: May 30

Page 54: Ns Week9 Ns2 Tutorial III.v2

Pitfalls

• Scalability vs flexibility• Or, how to write scalable simulation?

• Memory conservation tips• Memory leaks

Page 55: Ns Week9 Ns2 Tutorial III.v2

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

Page 56: Ns Week9 Ns2 Tutorial III.v2

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 57: Ns Week9 Ns2 Tutorial III.v2

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

Page 58: Ns Week9 Ns2 Tutorial III.v2

Memory usage

Simulator 268KBUnicast node 2KBMulticast node 6KBDuplex link 9KBPacket 2KB

Page 59: Ns Week9 Ns2 Tutorial III.v2

Memory Conservation Tips

• Remove unused packet headers• Avoid tracetrace--allall

• Use arrays for a sequence of variables• Instead of n$in$i, say n($i)n($i)

• Avoid OTcl temporary variables• temp=A; B=temp

• Use dynamic binding•• delay_bind()delay_bind() instead of bind()bind()• See object.{h,cc}

• Use different routing strategies• Computing routing tables dominate the simulation setup time

• Run on FreeBSD• use less memory for malloc()

Page 60: Ns Week9 Ns2 Tutorial III.v2

Memory Leaks

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

•• set a [new set a [new RandomVariableRandomVariable/Constant]/Constant]

•• }}

• It leaks memory, but can’t be detected!• Solution

• Explicitly delete EVERY split object that was new-ed

Page 61: Ns Week9 Ns2 Tutorial III.v2

Final Word

• My extended ns dumps OTcl scripts!• Find the last 10-20 lines of the dump• Is the error related to “_o*** cmd …” ?

• Check your command()• Otherwise, check the otcl script pointed by the

error message

Page 62: Ns Week9 Ns2 Tutorial III.v2

Questions?

Page 63: Ns Week9 Ns2 Tutorial III.v2

Outline

• An introduction to ns-2• What is ns-2• Fundamentals• Writing ns-2 codes• Traces support and visualization• Wireless support• Emulation• Related work

Page 64: Ns Week9 Ns2 Tutorial III.v2

ns nam Interface

• Color• Node manipulation• Link manipulation• Topology layout• Protocol state• Misc

Page 65: Ns Week9 Ns2 Tutorial III.v2

nam Interface: Color

• Color mapping$ns color 40 red$ns color 40 red

$ns color 41 blue$ns color 41 blue

$ns color 42 chocolate$ns color 42 chocolate

• Color ↔ flow id association$tcp0 set fid_ 40$tcp0 set fid_ 40 ;# red packets;# red packets

$tcp1 set fid_ 41$tcp1 set fid_ 41 ;# blue packets;# blue packets

Page 66: Ns Week9 Ns2 Tutorial III.v2

nam Interface: Nodes• Color

$node color red$node color red

• Shape (can’t be changed after sim starts)$node shape box$node shape box ;# circle, box, hexagon;# circle, box, hexagon

• Marks (concentric “shapes”)$ns at 1.0 $ns at 1.0 ““$n0 add$n0 add--mark m0 blue boxmark m0 blue box””$ns at 2.0 $ns at 2.0 ““$n0 delete$n0 delete--mark m0mark m0””

• Label (single string)$ns at 1.1 $ns at 1.1 ““$n0 label $n0 label \\””web cache 0web cache 0\\””””$node label$node label--at upat up$node label$node label--color bluecolor blue

Page 67: Ns Week9 Ns2 Tutorial III.v2

nam Interfaces: Links

• Color$ns duplex$ns duplex--linklink--op $n0 $n1 color "green"op $n0 $n1 color "green"

• Label$ns duplex$ns duplex--linklink--op $n0 $n1 label "op $n0 $n1 label "abcedabced““$ns duplex$ns duplex--linklink--op $n1 $n2 labelop $n1 $n2 label--color bluecolor blue$ns duplex$ns duplex--linklink--op $n1 $n2 labelop $n1 $n2 label--at downat down

• Queue position$ns duplex-link-op queuePos right

• Dynamics (automatically handled)$ns $ns rtmodelrtmodel Deterministic {2.0 0.9 0.1} $n0 $n1Deterministic {2.0 0.9 0.1} $n0 $n1

• Asymmetric links not allowed

Page 68: Ns Week9 Ns2 Tutorial III.v2

nam Interface: Topology Layout

• “Manual” layout: specify everything$ns duplex$ns duplex--linklink--op $n(0) $n(1) orient rightop $n(0) $n(1) orient right

$ns duplex$ns duplex--linklink--op $n(1) $n(2) orient rightop $n(1) $n(2) orient right

$ns duplex$ns duplex--linklink--op $n(2) $n(3) orient rightop $n(2) $n(3) orient right

$ns duplex$ns duplex--linklink--op $n(3) $n(4) orient 60degop $n(3) $n(4) orient 60deg

• If anything missing automatic layout

Page 69: Ns Week9 Ns2 Tutorial III.v2

nam Interface: Misc

• Packet color$ns color $n blue$ns color $n blue$agent set fid_ $n$agent set fid_ $n

• Annotation• Add textual explanation to your simulation$ns at 3.5 "$ns trace$ns at 3.5 "$ns trace--annotate annotate \\““packet droppacket drop\\""““

• Control playback $ns at 0.0 "$ns set$ns at 0.0 "$ns set--animationanimation--rate 0.1ms"rate 0.1ms"

Page 70: Ns Week9 Ns2 Tutorial III.v2

The nam user interface

Page 71: Ns Week9 Ns2 Tutorial III.v2

Summary of nam

• Turn on nam tracing in your Tcl script• As easy as turning on normal tracing

•$ns namtrace $file

• Specify color/shape/label of node/link• $ns duplex-link-op $node1 $node2 orient left

• Execute nam• exec nam $filename

Page 72: Ns Week9 Ns2 Tutorial III.v2

A live demoNam.exe

Page 73: Ns Week9 Ns2 Tutorial III.v2

namgraph

• Display a graph showing when packets are received/dropped.

• Enabling namgraph• Run the namfilter script on your nam trace file:

exec tclsh /path/to/namfilter.tcl out.nam

Page 74: Ns Week9 Ns2 Tutorial III.v2

namgraph

Page 75: Ns Week9 Ns2 Tutorial III.v2

The nam editor

• Create simple scenarios graphically• Good for those who don’t want to learn Tcl,

but only a limited subset of ns is currently available

Page 76: Ns Week9 Ns2 Tutorial III.v2

The nam editor

Page 77: Ns Week9 Ns2 Tutorial III.v2

Topology generator

• Inet• GT-ITM• TIERS• BRITE

Page 78: Ns Week9 Ns2 Tutorial III.v2

Inet topology generator

• from University of Michigan • AS level Internet topology • Create topologies with accurate degree

distributions • Conversion of Inet output to ns-2 format

• inet2ns < inet.topology > ns.topology

Page 79: Ns Week9 Ns2 Tutorial III.v2

GT-ITM• Installation

• Comes with ns-allinone• Require Knuth’s cweb and SGB

• Usage• itm <config_file>

• Three graph models• Flat random: Waxman• n-level hierarchy• Transit-stub

Page 80: Ns Week9 Ns2 Tutorial III.v2

GT-ITM: Transit-Stub Model

stubdomains

transitdomains

transit-transit link

stub-stub link

Page 81: Ns Week9 Ns2 Tutorial III.v2

Converters for GT-ITM

• sgb2ns• Convert SGB format to ns config file•• sgb2ns <SGB_file> <sgb2ns <SGB_file> <OTcl_fileOTcl_file>>

•• ts2nsts2ns: output lists of transit and stub nodes• sgb2hier

• Convert transit-stub information into hierarchical addresses

•• sgb2hierns <SGB_file> <sgb2hierns <SGB_file> <OTcl_fileOTcl_file>>

Page 82: Ns Week9 Ns2 Tutorial III.v2

Tiers topology generator• 3-level hierarchy• Conversion of Tiers output to ns-2 format

• an awk script tiers2ns.awk is included in ~ns-2/bin to convert the output of tiers into ns-2 scripts.

Page 83: Ns Week9 Ns2 Tutorial III.v2

BRITE• From Boston University• Supports multiple generation models

• flat AS• flat Router• hierarchical topologies

• Object-oriented design to allow the flexibility to add new topology models

• Can import from Inet, GT-ITM, Skitter,..• Can export to ns-2, JavaSim, SSFNET format• Written in Java and C++• GUI support

Page 84: Ns Week9 Ns2 Tutorial III.v2

Summary

http://www.isi.edu/nsnam/ns/ns-topogen.html

Packages Graphs Edge Method

NTG n-level probabilistic

RTG Flat random Waxman

GT-ITM Flat random, n-level, Transit-stub various

TIERS 3-level spanning tree