Xiaowei`s ns tutorial

ns-2 Tutorial, part 2
Dave Anderson, Xiaowei Yang
(Modified from Polly Huang’s slides)
1
Outline
• Ns-2 internals
– script -> internal structure
• How to Extend ns
2
Script Code
# Create a topology
Set ns [new Simulator]
set n0 [$ns node]
set n1 [$ns node]
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
# Add Transport agents
set tcp [new Agent/TCP]
$ns attach-agent $n0 $tcp
set tcpsink [new Agent/TCPSink]
$ns attach-agent $n1 $tcpsink
$tcp connect $tcpsink
# Add application
set ftp [new Application/FTP]
$ftp attach-agent $tcp
# Create a schedule
$ns at 0.5 "$ftp start"
$ns at 4.5 "$ftp stop"
#Run the simulation
$ns run
FTP
FTP
TCP
TCP
1Mb
n0
n1
10ms
3
Discrete Event-Driven Simulator
time_, uid_, next_, handler_
head_ ->
handler_ -> handle()
insert
$ns at 0.5 “$ftp start”
$ns at 4.5 “$ftp stop”
$ns run
time_, uid_, next_, handler_
4
Ns Node
n0
n1
Port
Classifier
Port
Classifier
Addr
Classifier
entry_
0
1
Addr
Classifier
dmux_
entry_
classifier_
1
0
dmux_
classifier_
set n0 [$ns node]
set n1 [$ns node]
5
Network Topology - Link
n0
n1
n1
entry_
head_
enqT_
queue_
drophead_
deqT_
link_
ttl_
drpT_
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
6
Routing
n0
n1
Port
Classifier
Port
Classifier
Addr
Classifier
entry_
0
1
Addr
Classifier
dmux_
Link n0-n1
entry_
classifier_
1
0
dmux_
classifier_
Link n1-n0
7
Transport
n0
n1
Port
Classifier
Port
Classifier
Addr
Classifier
entry_
0
1
0
dst_=1.0
Addr
Classifier
Agent/TCP
agents_
dmux_
Link n0-n1
entry_
classifier_
1
0
0
dst_=0.0
Agent/TCPSink
agents_
dmux_
classifier_
Link n1-n0
set tcp [new Agent/TCP]
$ns attach-agent $n0 $tcp
8
Application
n0
n1
Port
Classifier
Addr
Classifier
entry_
0
1
0
dmux_
Application/FTP
dst_=1.0
Port
Classifier
Addr
Classifier
Agent/TCP
agents_
Link n0-n1
entry_
classifier_
1
0
0
dst_=0.0
Agent/TCPSink
agents_
dmux_
classifier_
Link n1-n0
set ftp [new Application/FTP]
$tcp attach-agent $ftp
9
Packet Flow
n0
n1
Port
Classifier
Addr
Classifier
entry_
0
1
0
Application/FTP
dst_=1.0
Port
Classifier
Addr
Classifier
Agent/TCP
Link n0-n1
entry_
0
dst_=0.0
Agent/TCPSink
1
0
Link n1-n0
10
Packet Format
cmn header
header
data
ts_
ptype_
ip header
uid_
tcp header
size_
rtp header
iface_
trace header
...
11
Extending ns-2 Simulator
12
otcl and C++: The Duality
C++
otcl
• C++ for data
– per packet action
• otcl for control
– periodic or triggered action
13
Adding New Classes
variables
New Class
otcl
bind()
TclClass()
variables
C++
procedures
command()
procedures
New Class
14
TclClass
C++
TclObject
NsObject
Agent
EchoAgent
mirroring
Static
class TcpClass
OTcl : public TclClass {
public:
TclObject
TcpClass()
: TclClass(“Agent/Echo”) {}
TclObject* create(int, const char*const*) {
return (new EchoAgent());
??
}
} class_echo;
Agent
Agent/Echo
15
TclObject: bind()
• C++
EchoAgent::TcpAgent() {
bind(“msglen_”, &len_);
…
}
• otcl
Agent/Echo set msglen_ 50
16
• C++
TclObject: command()
Int EchoAgent::command(int argc, const char*const* argv)
{
if (argc == 2) {
if (strcmp(argv[1], “send”) == 0) {
send();
return(TCL_OK);
} else if (strcmp(argv[1], “recv”) == 0) {
send();
return(TCL_OK);
}
}
return (Agent::command(argc, argv);
}
• otcl
set echo [new Agent/Echo]
$echo send
17