1 Network Simulator (NS-2) I-Wei Ting ( 丁義偉 ) 2009/3/31.
-
date post
20-Dec-2015 -
Category
Documents
-
view
260 -
download
6
Transcript of 1 Network Simulator (NS-2) I-Wei Ting ( 丁義偉 ) 2009/3/31.
1
Network Simulator (NS-2)
I-Wei Ting ( 丁義偉 )
2009/3/31
2
Outline
Part 1: Introduction
Part 2: NS2 directory structure
Part 3: Network Scenario
3
A: What is network simulator? NS is a discrete event simulator targeted at networking research. Ns
provides substantial support for simulation of TCP, routing, and multicast protocols over wired and wireless (local and satellite) networks.
NS began as the REAL network simulator in 1989 and has evolved over the past few years.
In 1995 ns development was supported by DARPA through the VINT project at LBL, Xerox PARC, UCB, and USC/ISI.
In 1996, the first version of ns2 was release.
4
Version ns-2.34 pending ns-2.33 released on March 31, 2008 .. .. ns-2.30 released on Sept 26, 2006 .. ns-2.1b9 released on Sat Apr 13 16:26:33 PDT 2002 .. ns-2.0a1 Wed Nov 6 13:57:31 PST 1996
v1.0a1 Mon Jul 31 16:05:08 PDT 1995
http://www.isi.edu/nsnam/ns/CHANGES.html
5
Why we use it?
New protocol is not easily implemented in real. (development, money, time, device, people)
New protocol is not easily verified in the world. (mobile IP, ad hoc…etc, more nodes or network topology)
New protocol is not easily compared others (How to convince other people?)
Network Simulator simulates protocol layers (physical, datalink, network, transport, applicatoin)
6
B: Where do I get NS2?
http://www.isi.edu/nsnam/ns
7
Step 1
8
Step 2
9
C: What platforms does NS2 run on and how to install NS2?
Operation systems (FreeBSD, Linux, SunOS, Solaris, Windows)
Setup for Linux-based system If the file is put at /root
Step 1: cd /root Step 2: tar zxvf ns-allinone-2.30.tar.gz Step 3: cd /root/ns-allinone-2.30
Step 4: ./install
Setup for win9x/2000/XP 中文教學網站 - 柯志亨 (Chih-Heng, Ke)
http://140.116.72.80/~smallko/ns2/ns2.htm 安裝流程
http://140.116.72.80/~smallko/ns2/setup.htm
註 :在裝 cygwin時,要自已勾選全部的套件,以免 lost套件,無法 compiler過去。
10
D: Where can I find documentation for NS2?
http://www.isi.edu/nsnam/ns/ns-documentation.html
download
11
E: Where are some tutorial I can start from?
http://www.isi.edu/nsnam/ns/tutorial/index.html
12
F: What protocols does NS2 support?
Application layer: Traffic models and applications Web, FTP, telnet, constant-bit rate, real audio
Translation layer: Transport protocols Unicast: TCP(Reno,Vegas,etc.), UDP Multicast: SRM
Network layer: Routing and queueing Wired routing: Dijkstra,DV Wireless routing: mobile IP Ad hoc routing :DSR,AODV,TORA,DSDV Queueing protocols: RED, drop-tail, SFQ etc
Data link layer Ethernet, 802.11
Physical layer Wired(point-to-point, LANs), wireless (multiple propagation models)…
13
14
Part 2: NS2 structure
A: Why use two programming language?
B: Overview for NS2 structure
C: Directory structure
D: How to run a scenario in NS2
15
A: Why using two programming language to implement?
第一 : 需要一種程式設計語言,能夠有效率的處理位元組( Byte ),封包標頭( Packet Header )等資訊,需要應用合適的演算法在大量的資料上。因此,程式內部的運行速度( run-time speed )就非常重要。 (c++)
第二 : 許多網路中的研究工作都圍繞著網路元件和環境參數的設置和改變而進行的,需要在短時間內快速的開發和模擬出所需要的網路環境( scenarios ),並且方便修改和發現、修復。在這種情形下, (run-around time) 就顯得很重要了,因為模擬環境的建立和參數資訊的配置只需要運行一次。 (Otcl)
NS2 is an object-oriented, discrete event driven network simulator developed at UC Berkely written in C++ and OTcl. C++ for “data”
Per packet action OTcl for “control”
Periodic or triggered action
16
B: Overview for NS2 structure
C++ network elem ents
Otcl script ns trace fileuser
perl script results
visualisation tool diagram
nam
generates
uses
nam trace file
17
Event-driven simulator
… … E9 E8 E7 E6 E5 E4 E3 E2 E1
Simulation Time
Event 1
18
C: Directory structure (After install)
ns-allinone-2.30
tk8.4 bintcl8.4 ns-2.30 nam-1.12…..
Source node(C++)
Execute files
19
D: How to run a scenario in NS2 (linux-based)
Step 1: cd /root/ns-allinone-2.30
Step 2: cd bin
Step 3: ./ns my_scenario.tcl
20
21
Part 3: Network Scenario
A: What is network scenario?
B: How to write a simple scenario
C: How to run a scenario in NS2 (linux-based)
D: How to get the trace file?
22
A: What is network scenario? ( 人、事、時、地、物 )
http://www.isi.edu/nsnam/ns/tutorial/index.html
23
B: How to write a simple scenario?
1.建立一個模擬器物件 (Must) set ns [new Simulator]
2.開啟一個 nam trace 檔案 (Option) set nf [open out.nam w] $ns namtrace-all $nf
3.宣告一個 finish程序 (Must) proc finish {} { global ns nf $ns flush-trace # Close the trace file close $nf
# Execute nam on the trace file exec nam out.nam & exit 0 }
24
(simulation environment)
1.建立節點及其屬性 Wired node Wireless node
wireless mobile IP ad-hoc networks
2.建立節點之間的實體連線及其性質 3.建立傳輸的應用程式及其傳輸速率
25
1 、建立有線的節點 (Created wired nodes)
set my_node0 [$ns node] set my_node1 [$ns node]
2 、建立實體連線 (Created physical link)
$ns duplex-link $n0 $n2 2Mb 10ms SFQ $ns simple-link $n1 $n2 3Mb 2ms RED 雙向、單向,頻寬,延遲時間,佇列的種類 (DropTail, FQ, SFQ, RED, CBQ)
3 、設定佇列的大小 (set queue length)
$ns queue-limit $my_node0 $my_node1 50
4 、設定節點及連線的 label 、顏色 (color) (Option)
$ns duplex-link-op $n0 $n1 color "green”
$ns duplex-link-op $n0 $n1 label“line1”
26
5 、設定連線的成本 (link cost)
6 、設定繞路 (routing) 屬性
$ns cost $my_node1 $my_node2 10 $ns cost $my_node0 $my_node2 5
預設 :static routing 靜態 routing : $ns rtproto Static 動態 routing : $ns rtproto DV $ns rtproto DV $n1 $n2 $n3
27
7 、建立 UTP 連線
set udp0 [new Agent/UDP] # 建立 Agent$ns attach-agent $n0 $udp0 # 此 Agent 連於 n0 節點上
set cbr0 [new Application/Traffic/CBR] # 應用程式$cbr0 set packetSize_ 400 # 封包大小 (bytes)$cbr0 set interval_ 0.25 # 設定傳送的間隔$cbr0 attach-agent $udp0
set sink [new Agent/LossMonitor] # 建立接受端$ns attach-agent $n3 $sink # 接受端節點$ns connect $udp0 $sink # 將傳送端及接受端連在一起
28
8 、建立 FTP 連線
set tcp [new Agent/TCP] # 建立 TCP 連線$ns attach-agent $n0 $tcp # 將此 TCP 連至 n0 節點
set ftp [new Application/FTP] # 建立一個 FTP 應用程式 $ftp attach-agent $tcp # 將此 FTP 連至 TCP 物件
set sink [new Agent/TCPSink] # 建立 TCP 的接受端 $ns attach-agent $n3 $sink # 將接受端連至 n3 節點 $ns connect $tcp $sink # 將傳送端及接受端連在一起
29
此部份要安排事件發生的前後順序 例如: 第 2 秒, A節點開始傳輸UTP封包到B節點 第 3 秒, C節點開始傳輸TCP封包到D節點 第 17 秒, A節點結束傳送 第 16 秒, C 節點結束傳送
(time schedular, event occur)
$ns at 2 "$cbr0 start"
$ns at 17 “$cbr0 stop”
$ns at 3 "$ftp start"
$ns at 16 “$ftp stop”
$ns at 20 "finish"
$ns rtmodel-at 1.0 down $my_node1 $my_node
$ns rtmodel-at 2.0 up $my_node1 $my_node2
設定某連線中斷及修復
30
1. set ns [new Simulator]
2. set nf [open out.nam w]3. $ns namtrace-all $nf
4. proc finish {} {5. global ns nf6. $ns flush-trace7. close $nf8. exec ./nam out.nam &9. exit 010 }
11. set n0 [$ns node]12. set n1 [$ns node]13. set n2 [$ns node]14. set n3 [$ns node]
15. $ns duplex-link $n0 $n2 2Mb 10ms DropTail16. $ns duplex-link $n1 $n2 2Mb 10ms DropTail17. $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail
18. $ns queue-limit $n2 $n3 10
(Any Editor: notepad,ultra-editor…)
(Option)
(Option)
31
19. set tcp [new Agent/TCP]
20. $ns attach-agent $n0 $tcp
21. set sink [new Agent/TCPSink]
22. $ns attach-agent $n3 $sink
23. $ns connect $tcp $sink
24. set ftp [new Application/FTP]
25. $ftp attach-agent $tcp
26. set udp [new Agent/UDP]
27. $ns attach-agent $n1 $udp
28. set null [new Agent/LossMonitor]
29. $ns attach-agent $n3 $null
30. $ns connect $udp $null
31. set cbr [new Application/Traffic/CBR]
32. $cbr attach-agent $udp
33. $cbr set packet_size_ 1000
34. $cbr set interval_ 0.25
32
35. $ns at 0.1 "$cbr start"36. $ns at 1.0 "$ftp start"37. $ns at 4.0 "$ftp stop"38. $ns at 4.5 "$cbr stop"39. $ns at 5.0 "finish"40. $ns run
33
C: How to run a scenario in NS2 (linux-based)
Step 1: cd /root/ns-allinone-2.30
Step 2: cd bin
Step 3: ./ns my_scenario.tcl
34
Useful additional program
NAM: Viewing network simulation traces and real world packet traces
35
36
1 2 3 4 5 6 7 8 9 10 11 12
r 1.340958 3 2 ack 40 ------- 2 3.2 0.1 11 181
+ 1.340958 2 0 ack 40 ------- 2 3.2 0.1 11 181
- 1.340958 2 0 ack 40 ------- 2 3.2 0.1 11 181
+ 1.341225 2 3 cbr 210 ------- 0 0.0 3.1 84 166
- 1.341225 2 3 cbr 210 ------- 0 0.0 3.1 84 166
r 1.453111 1 0 tcp 60 ------- 2 0.1 3.2 97 81
+ 1.453111 0 2 tcp 60 ------- 2 0.1 3.2 97 81
d 1.453111 0 2 tcp 60 ------- 2 0.1 3.2 97 81
C: How to get the trace file?
set my_trace [open demo1.tr w]$ns trace-all $my_trace
37
每個欄位所代表的意義如下: 1. 代表事件的類別
r :代表目的端收到 packet + :代表 packet 放入 queue 中 - :代表 packet 從 queue 中取出 d :代表 queue 已經滿了,這個 packet 被 drop 掉
2. 代表事件發生的時間 3. 代表 packet 的 source node 4. 代表 packet 的 destination node 5. 代表 packet 的類別 6. 代表 packet 的大小 (encoded in IP header) 7. 代表 packet 的 flags 8. 代表 connection(flow) 的 id 9. 代表 source address ( node.port ) 10. 代表 destinations address ( node.port ) 11. 代表 packet 的 sequence number ( network layer protocol's ) 12. 代表 packet 的 id ( unique )
38
Set f1 [open demo1.record w] proc record { } {
global null f1
set ns [Simulator instance]
set time 0.1
set now [$ns now]
set bw [$null set bytes_ ]
puts $f1 “$now $bw”
$null set bytes_ 0
$ns at [expr $now+$time] “record”
} $ns at 0.0 “record”
LossMonitor nlost_ :Number of packets lost npkts_ :Number of packets received bytes_ :Number of bytes received lastPktTime_ :Time at which the last packet was received expected_ :The expected sequence number of the next packet
39
Network Setting Sender : Node 1, 2, 3 Receiver : Node 7 Using CBR Packet Size : 1000(k) Time Interval : 1 (s) Simulation Time : 15 (s)
Relay Nodes Receiver
1
76
5
4
3
2
Senders
40
Tcl Code#Create a simulator objectset ns [new Simulator]
#Define different colors for data flows$ns color 1 Blue$ns color 2 Red$ns color 3 Green
#Open the nam trace fileset nf [open out.nam w]$ns namtrace-all $nf
#Open the trace fileset nd [open out.tr w]$ns trace-all $nd
41
Tcl Code
#Define a 'finish' procedureproc finish {} {
global ns nd nf $ns flush-trace
#Close the trace fileclose $ndclose $nf#Execute nam on the trace file
exec nam out.nam & exit 0}
42
Tcl Code#Create four nodes
set s0 [$ns node]
set s1 [$ns node]
set s2 [$ns node]
set r0 [$ns node]
set r1 [$ns node]
set r2 [$ns node]
set d [$ns node]
#Create links between the nodes
$ns duplex-link $s0 $r0 10Mb 10ms DropTail
$ns duplex-link $s1 $r0 10Mb 10ms DropTail
$ns duplex-link $s2 $r1 10Mb 10ms DropTail
$ns duplex-link $r0 $r2 10Mb 10ms DropTail
$ns duplex-link $r1 $r2 10Mb 10ms DropTail
$ns duplex-link $r2 $d 10Mb 10ms DropTail
Relay Nodes Receiver
1
76
5
4
3
2
Senders
s0
s1
s2 r1
r0
r2 d
43
Tcl Code
#Set position of each node$ns duplex-link-op $s0 $r0 orient right-down$ns duplex-link-op $s1 $r0 orient right-up$ns duplex-link-op $s2 $r1 orient right-up$ns duplex-link-op $r0 $r2 orient right-down$ns duplex-link-op $r1 $r2 orient right-up$ns duplex-link-op $r2 $d orient right
#Monitor the queue for the link$ns duplex-link-op $r0 $r2 queuePos 0.5$ns duplex-link-op $r1 $r2 queuePos 0.5$ns duplex-link-op $r2 $d queuePos 0.5
44
Tcl Code#Set flow ID$udp0 set fid_ 1$udp1 set fid_ 2$udp2 set fid_ 3
#Schedule events for the CBR agents$ns at 0.0 "$cbr0 start"$ns at 0.0 "$cbr1 start"$ns at 0.0 "$cbr2 start"$ns at 15.0 "$cbr0 stop"$ns at 15.0 "$cbr1 stop"$ns at 15.0 "$cbr2 stop“
#Call the finish procedure after 5 seconds of simulation time$ns at 15.0 "finish"
#Run the simulation$ns run
45
Simulation
46
Analyze Result out.tr+ 0 1 3 cbr 1000 ------- 2 1.0 6.1 0 1- 0 1 3 cbr 1000 ------- 2 1.0 6.1 0 1+ 0 1 3 cbr 1000 ------- 2 1.0 6.1 1 2+ 0 1 3 cbr 1000 ------- 2 1.0 6.1 2 3+ 0 1 3 cbr 1000 ------- 2 1.0 6.1 3 4+ 0 1 3 cbr 1000 ------- 2 1.0 6.1 4 5+ 0 2 4 cbr 1000 ------- 3 2.0 6.1 0 6- 0 2 4 cbr 1000 ------- 3 2.0 6.1 0 6+ 0 2 4 cbr 1000 ------- 3 2.0 6.1 1 7...
47
Analyze ResultEvent Time From To
nodePkt
nodePkt type
Flags size
Fid Src addr
Dst addr
Seq Num Pkt id
+ 0 1 3 cbr 1000 2 1.0 6.1 0 1
- 0 1 3 cbr 1000 2 1.0 6.1 0 1
+ 0 1 3 cbr 1000 2 1.0 6.1 1 2
+ 0 1 3 cbr 1000 2 1.0 6.1 2 3
+ 0 1 3 cbr 1000 2 1.0 6.1 3 4
+ 0 1 3 cbr 1000 2 1.0 6.1 4 5
+ 0 2 4 cbr 1000 3 2.0 6.1 0 6
- 0 2 4 cbr 1000 3 2.0 6.1 0 7
+ 0 2 4 cbr 1000 3 2.0 6.1 1 8
eventr:receive(at to_node)+:enqueue(at queue)-:dequeue(at queue)d:drop (at queue)
Src addr:(node).(port)Dst addr:(node).(port)
48
awk – measure delayBEGIN { # 程式初始化,設定一變數以記錄目前最高處理封包的 ID 。 highest_packet_id = 0; } { action = $1; time = $2; from = $3; to = $4; type = $5; pktsize = $6; flow_id = $8; src = $9; dst = $10; seq_no = $11; packet_id = $12;
49
awk – measure delay# 記錄目前最高的 packet ID if ( packet_id > highest_packet_id )
highest_packet_id = packet_id; # 記錄封包的傳送時間 if ( start_time[packet_id] == 0 )
start_time[packet_id] = time; # 記錄 CBR (flow_id=1) 的接收時間 if ( flow_id == 3 && action != "d" ) { if ( action == "r" ) { end_time[packet_id] = time; } } else { # 把不是 flow_id=2 的封包或者是 flow_id=2 但此封包被 drop 的時間設為 -1 end_time[packet_id] = -1; } }
50
awk – measure delay
END {
# 當資料列全部讀取完後,開始計算有效封包的端點到端點延遲時間 for ( packet_id = 0; packet_id <= highest_packet_id; packet_id++ ) {
start = start_time[packet_id];
end = end_time[packet_id];
packet_duration = end - start;
# 只把接收時間大於傳送時間的記錄列出來 if ( start < end ) printf("%f %f\n", start, packet_duration);
}
51
Result
Executing:$awk –f measure-delay.awk out.tr
0.010800 0.0224000.000800 0.0340000.001600 0.0348000.002400 0.0356000.003200 0.0364001.000000 0.033200.....
52
53
Wireless Ad hoc network
1 2 6client server
3 4 5
54
my_scenario.tcl
1. set val(chan) Channel/WirelessChannel 2. set val(prop) Propagation/TwoRayGround 3. set val(netif) Phy/WirelessPhy 4. set val(mac) Mac/802_11 5. set val(ifq) Queue/DropTail/PriQueue 6. set val(ll) LL 7. set val(ant) Antenna/OmniAntenna 8. set val(ifqlen) 50 9. set val(nn) 7 10. set val(rp) AODV
11. set ns [new Simulator] 12. set tracefd [open my_scenario.tr w] 13. $ns trace-all $tracefd
55
14. set nf [open my_scenario.nam w] 15. $ns namtrace-all-wireless $nf 1000 1000
16. set topo [new Topography] 17. $topo load_flatgrid 1000 1000 18. create-god $val(nn)
19. $ns node-config -adhocRouting $val(rp) \ 20. -llType $val(ll) \ 21. -macType $val(mac) \ 22. -ifqType $val(ifq) \ 23. -ifqLen $val(ifqlen) \ 24. -antType $val(ant) \ 25. -propType $val(prop) \ 26. -phyType $val(netif) \ 27. -channelType $val(chan) \ 28. -topoInstance $topo \ 29. -agentTrace ON \ 30. -routerTrace ON \ 31. -macTrace OFF \ 32. -movementTrace OFF
56
33. $node_(0) set X_ 1.0 34. $node_(0) set Y_ 999.0
35. $node_(1) set X_ 100.0 36. $node_(1) set Y_ 500.0
37. $node_(2) set X_ 250.0 38. $node_(2) set Y_ 500.0
39. $node_(3) set X_ 400.0 40. $node_(3) set Y_ 500.0
41. $node_(4) set X_ 550.0 42. $node_(4) set Y_ 500.0
43. $node_(5) set X_ 700.0 44. $node_(5) set Y_ 500.0
45. $node_(6) set X_ 850.0 46. $node_(6) set Y_ 500.0
57
47. set udp0 [new Agent/UDP] 48. set null0 [new Agent/Null] 49. $ns attach-agent $node_(2) $udp0 50. $ns attach-agent $node_(6) $null0 51. $ns connect $udp0 $null0 52. set cbr0 [new Application/Traffic/CBR] 53. $cbr0 set type_ CBR 54. $cbr0 set packet_size_ 500 55. $cbr0 set interval_ 0.5 56. $cbr0 attach-agent $udp0
57. $ns at 0.0 "$node_(0) setdest 1 999 10" 58. $ns at 0.0 "$node_(1) setdest 100 500 10" 59. $ns at 0.0 "$node_(2) setdest 250 500 10" 60. $ns at 0.0 "$node_(3) setdest 400 500 10" 61. $ns at 0.0 "$node_(4) setdest 550 500 10" 62. $ns at 0.0 "$node_(5) setdest 700 500 10" 63. $ns at 0.0 "$node_(6) setdest 850 500 10"
58
64. $ns at 100.0 "$cbr0 start" 65. $ns at 105.0 "$cbr0 stop" 66. $ns at 110.0 "stop"
67. proc stop {} { 68. global ns tracefd nf 69. $ns flush-trace 70. exit 0 71. }
72. $ns run
59
Consideration of TCL and C++
1. How to choose source and destination in different time? 2. How to configure the query action? 3. How to simulate cache operation? 4. How to apply routing protocol to create routing path? 5. How to write the caching protocol?
Topic:SimpleCache protocol
1 2 6client server
3 4 5
60
A B C D
A B C D
A B C E
DSDV
DSR
AODV
A A-B A-B-C
A-B-C-DA-B-C-DA-B-C-D
D N H S
A C 3 4
D N H S
A B 2 2
E E 1 4
D N H S
E B 3 4
D N H S
A A 1 2
E C 2 4
RREQ RREQ RREQ
RREPRREPRREP
61
/root/ns-allinone-2.30/ns-2.30/aodv (aodv.cc, aodv.h)
// Event-driven sequential for the basic request and response // Description 1: Each MH executes Query_Model(...) each second. // // QueryTimer trigger Query_Model(...) --> Requester_Lookup_Local_Cache(...) // If local miss, run AODV routing to create the routing path. // --> [AODV: sendRequest(...)-->...--> recvReply(...)] // // --> Begin_to_Data_Discovery_Process(index,rt->rt_dst) // --> Requester_Send_Data_Request(source, destination, query_data_id); // --> Recv_Data_Request_from_Requester(p); // --> Intermediate_Forward_Data_Request(p); // --> Recv_Data_Request_from_Intermdiate(p); // --> Intermediate_Forward_Data_Request(p); // ........... // ........... // ........... // --> Original_Server_Send_Data_Reply(p) // --> Recv_Data_Reply_from_Original_Server(p); // --> Intermediate_Forward_Data_Reply(p); // --> Recv_Data_Reply_from_Intermediate(p); // --> Intermediate_Forward_Data_Reply(p); // ........... // ........... // ........... // // --> Requester_Recv_Data_Reply(p)
62
1. void QueryTimer::handle(Event*)
void QueryTimer::handle(Event*) { agent->query_model(); Scheduler::instance().schedule(this, &intr, 1); }
…. …. …. …. …. E10 E9 E8 E7 E6 E5 E4 E3 E2 E1
Simulation Time
第 1 秒第 2 秒
63
2. query_model()
…. …. …. …. …. E10 E9 E8 E7 E6 E5 E4 E3 E2 E1
Simulation Time
第 1 秒第 2 秒
64
Useful variable
CURRENT_TIME printf(“\n current_time=%.5f”,CURRENT_TIME);
index: printf(“\n node_id =%d”,index);
65
How to compile source code?
1. cd /root/ns-allinone-2.30/ns-2.30 2. make