270 likes | 773 Views
NS2 教學. Introduction. 為什麼要用 Simulator 作模擬? 為什麼要用 NS2 ? Open source Object-Oriented OTcl. Outline . 什麼是 NS2 Tcl 簡介 開始模擬 模擬結果分析 分析結果圖形化. 什麼是 NS2?. N etwork S imulator – Version 2 1989 年由 Real Network Simulator 改版,目前由 SAMAN 和 CONSER 維護
E N D
Introduction 為什麼要用Simulator作模擬? 為什麼要用NS2? Open source Object-Oriented OTcl
Outline 什麼是NS2 Tcl簡介 開始模擬 模擬結果分析 分析結果圖形化
什麼是NS2? Network Simulator – Version 2 1989年由Real Network Simulator 改版,目前由SAMAN和CONSER維護 NS is a discrete event simulator targeted at networking research.
NS2架構 Event Scheduler UI Network Component Tclcl OTcl TCL C++
為什麼要用二種語言 ? 用 C++ : 處理封包傳送 更改一些底層或新增 protocols 之類的 C++ Class 不常更動,執行速度快 用 OTcl : 負責設定檔部分 運作已編譯過的 C++ Objects 常會更動,執行時需花一點直譯的時間
Tcl簡介(Tool Command Language) ns使用MIT發展的OTcl (Object Tcl)做為描述、配置、執行模擬的語言,OTcl是Tcl的物件導向延伸版本。在使用ns進行網路模擬之前,必須先學會這個語言,可以參考ns/otcl/doc目錄下有一份OTcl Tutorial,是一份不錯的入門文件。
Tcl簡介(Tool Command Language) cont. 1: #範例:遞迴解費氏數 2: set count 20 ; # The number of Fibonacci numbers to print 3: set num(0) 0; set num(1) 1 ; # First and second seed values 4: puts "The first $count Fibonacci numbers:" 5: for { set i 1 } { $i < $count } { incr i 1 } { 6: puts "$i:\t$num(0)" 7: set num(1) [ expr $num(0) + $num(1) ] 8: incr i 1 9: puts "$i:\t$num(1)" 10: set num(0) [ expr $num(0) + $num(1) ] 11: }
Tcl簡介(Tool Command Language) cont. 2: set count 20 ; # The number of Fibonacci numbers to print 3: set num(0) 0; set num(1) 1 ; # First and second seed values set count 20 int count = 20; set num(0) 0; set num(1) 1 ; int num[2]; num[0] = 0; num[1] = 1;
Tcl簡介(Tool Command Language) cont. puts "The first $count Fibonacci numbers:" "…"dovariable substitution {…} variable substitution does not take place Puts “the first $count Fibonacci numbers” the first 20 Fibonacci numbers Puts {the first $count Fibonacci numbers} the first $count Fibonacci numbers
Tcl簡介(Tool Command Language) cont. for { set i 1 } { $i < $count } { incr i 1 } { for ( i = 1 ; i < count ; i++ ) { 流程控制 (control flow) if-else、switch、while、for、foreach set i 0 while {$i < 5} { puts "In the while loop, and i == $i" incr i 1 } set my_planet "earth" if {$my_planet == "earth"} { puts "I feel right at home." } elseif {$my_planet == "venus"} { puts "This is not my home." } else { puts "I am neither from Earth, nor from Venus." } set num_legs 4 switch $num_legs { 2 {puts "It could be a human."} 4 {puts "It could be a cow."} 6 {puts "It could be an ant."} 8 {puts "It could be a spider."} default {puts "It could be anything."} }
Tcl簡介(Tool Command Language) cont. set num(1) [ expr $num(0) + $num(1) ] num[1] = num[0] + num[1]; [] indicate command substitution puts "I am [expr 10 * 3] years old, and my I.Q. is [expr 100 + 75]" 執行的結果: I am 30 years old, and my I.Q. is 175
NS2模擬:Tcl Script # 產生一個模擬的物件 set ns [new Simulator] #針對不同的資料流定義不同的顏色,這是要給NAM用的 $ns color 1 Blue $ns color 2 Red #開啟一個NAM trace file set nf [open out.nam w] $ns namtrace-all $nf #開啟一個trace file,用來記錄封包傳送的過程 set nd [open out.tr w] $ns trace-all $nd
NS2模擬:Tcl Script (cont.) #定義一個結束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd #以背景執行的方式去執行NAM exec nam out.nam & exit 0 }
NS2模擬:Tcl Script (cont.) #產生四個網路節點 set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] #把節點連接起來 $ns duplex-link $n0 $n2 2Mb 10ms DropTail $ns duplex-link $n1 $n2 2Mb 10ms DropTail $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail #設定ns2到n3之間的Queue Size為10個封包大小 $ns queue-limit $n2 $n3 10
NS2模擬:Tcl Script (cont.) #設定節點的位置,這是要給NAM用的 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n1 $n2 orient right-up $ns duplex-link-op $n2 $n3 orient right #觀測n2到n3之間queue的變化,這是要給NAM用的 $ns duplex-link-op $n2 $n3 queuePos 0.5 #建立一條TCP的連線 set tcp [new Agent/TCP] # 創造一個TCP的Agent $ns attach-agent $n0 $tcp # TCP agent 結合到 node(n0) # 但就此範例光是 TCP 無法產生任何 Traffic, 所以通常我們都會再建立一些 # Application 的 Protocol 於 TCP 上(如 FTP、Telnet) set ftp [new Agent/TCP] $ns attach-agent $n3 $sink
NS2模擬:Tcl Script (cont.) #設定FTP和CBR資料傳送開始和結束時間 $ns at 0.1 "$cbr start" $ns at 1.0 "$ftp start" $ns at 4.0 "$ftp stop" $ns at 4.5 "$cbr stop" #結束TCP的連線 $ns at 4.5 "$ns detach-agent $n0 $tcp #$ns at < time > < event > #在模擬環境中,5秒後去呼叫finish來結束模擬 $ns at 5.0 "finish“ #開始執行 scheduler. $ns run
NS2模擬:模擬結果 + 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 - 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 - 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 r 0.114 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0 - 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2 - 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2 r 0.122 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 + 0.122 2 3 cbr 1000 ------- 2 1.0 3.1 1 1 ................................................................. 一 三 五 七 九 十一 二 四 六 八 十 十二 event time from to node pkt node pkt type flag size fid src addr dst addr seq num pkt id
awk語言 – 數值分析 資料列:awk從資料檔上讀取的基本單位,以trace file為例,awk讀入的 第一筆資料列為 ”+ 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0” 第二筆資料列為 “- 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0” 一般而言,一筆資料列相當於資料檔上的一行資料。
awk語言 – 簡介 程式主要節構: Pattern1 { Actions1 } Pattern2 { Actions2 } …………………………… Patternx { Actionsx } 一般常用關係判斷式來當成Pattern。例如: x > 3 用來判斷變數x是否大於3 x == 5 用來判斷變數x是否等於5 awk提供c語言常見的關係運算元,如:>、<、>=、<=、==、!=等等 Actions是由許多awk指令所構成,而awk的指令與c語言中的指令非常類似 。 IO指令:print 、 printf( ) 、getline ...... 流程控制指令: if ( ...) {...} else {…}、 while(…){…} ……
awk語言 – 執行流程 執行awk時, 它會反複進行下列四步驟 自動從指定的資料檔中讀取一筆資料列。 自動更新(Update)相關的內建變數之值。 逐次執行程式中 所有 的 Pattern { Actions } 指令。 當執行完程式中所有 Pattern { Actions }時,若資料檔中還有未讀取的料,則反覆執行步驟1到步驟4。
awk語言 – 例子 BEGIN { #程式初始化,設定一變數以記錄目前最高處理封包的ID。highest_packet_id = 0; } { action = $1; time = $2; node_1 = $3; node_2 = $4; type = $5; flow_id = $8; node_1_address = $9; node_2_address = $10; seq_no = $11; packet_id = $12;
awk語言 – 例子 (cont.) #記錄封包的傳送時間 if ( start_time[packet_id] == 0 ) start_time[packet_id] = time; #記錄CBR (flow_id=2) 的接收時間 if ( flow_id == 2 && action != "d" ) { if ( action == "r" ) { end_time[packet_id] = time; } } else { #把不是flow_id=2的封包或者是flow_id=2但此封包被drop的時間設為-1 end_time[packet_id] = -1; } }
分析結果圖形化 [xgraph] xgraph的運作是把第一排當作x軸的資料,第二排當作是y軸的資料 [gnuplot] 命令導向的交談式繪圖程式(command-driven interactive function plotting program)。
一些不錯介紹NS2的網站 NS2使用說明 http://140.116.72.80/~smallko/ns2/ns2.htm http://netlab.cse.yzu.edu.tw/ns2/ns2_website/ 一些已開發的模組 http://www.isi.edu/nsnam/ns/ns-contributed.html Tcl簡單介紹 http://k-lug.org/~griswold/NS2/fib.html AWK Tutorial Guide http://phi.sinica.edu.tw/aspac/reports/94/94011/ GNUPLOT使用手冊 http://phi.sinica.edu.tw/aspac/reports/94/94002/