Upload
plushvocal
View
156
Download
7
Embed Size (px)
Citation preview
NS2
Network Simulator (Open Source)
OSI Layers
Packet-Level
Wired and WirelessEthernet, 802.11, WiMAX, etc.
NS2 安裝
首先,先從官方網站下載 Ns-allinone版本 NS-2 Simulator Download
下載好的檔案放在 home的根目錄中進入 terminal輸入 su命令並輸入管理員密碼,切換到管理員模式注意在開始安裝所需之 patch前要確定你的 linux要能上網在安裝 patch時,遇到【 Y/N】都選擇 “ y”
NS2 安裝
安裝 patchyum install gcc
yum install tcl-devel
yum install autoconf
yum install automake
yum install gcc-c++
yum install libX11-devel
yum install xorg-x11-proto-devel
yum install libXt-devel
yum install libXmu-devel
yum install libtool
NS2 安裝
把剛剛下載的 Ns-allinone解壓檔 到 home的根目錄解壓縮
tar -xvf ns-allinone-2.34.tar.gz
進入解完壓縮的目錄cd ns-allinone-2.34/
開始安裝./install
NS2 安裝
在 Fedora 14下安裝 NS2一般都不會太順利,會有些錯誤提示出現因為 gcc版本更新後對內部函數簡化所造成的不相容
正常情況下,第一次會出現的錯誤為:tools/ranvar.cc: in member function `virtual double gammarandomvariable::value()’:tools/ranvar.cc:219:70: error: cannot call constructor `GammaRandomVariable::GammaRandomVariable’tools/ranvar.cc:219:70: error: for a function-style cast, remove the redundant`::GaammaRandomVariable’make: *** [tools/ranvar.o] Error 1ns make failed
NS2 安裝
解決辦法在 ns-allinone-2.34/tools資料夾下,找到錯誤提示的 ranvar.cc檔案,打開並找到對應的 219行進行刪除(:GaammaRandomVariable),並存檔,重新再根目錄下打入 ./install 進行第二次安裝,等再次出現相似問題時,仿照剛剛所說的方法解決直到安裝成功
安裝成功時所出現的訊息Please put /opt/ns-allinone-2.34/bin:/opt/ns-allinone-2.34/tcl8.4.18/unix:/opt/ns-allinone-2.34/tk8.4.18/unix into your PATH environment; so that you'll be able to run itm/tclsh/wish/xgraph. IMPORTANT NOTICES:
1. You MUST put /opt/ns-allinone-2.34/otcl-1.13, /opt/ns-allinone-2.34/lib, into your LD_LIBRARY_PATH environment variable. If it complains about X libraries, add path to your X libraries into LD_LIBRARY_PATH. If you are using csh, you can set it like: setenv LD_LIBRARY_PATH If you are using sh, you can set it like: export LD_LIBRARY_PATH=
2. You MUST put /opt/ns-allinone-2.34/tcl8.4.18/library into your TCL_LIBRARY environmental variable. Otherwise ns/nam will complain during startup.
NS2 安裝
最後設置環境變數PATH=/home/Geo/ns-allinone-2.34/bin:/home/Geo/ns-allinone-2.34/tcl8.4.18/unix:/home/Geo/ns-allinone-2.34/tk8.4.18/unix:$PATH
LD_LIBRARY_PATH=/home/Geo/ns-allinone-2.34/otcl-1.13:/home/Geo/ns-allinone-2.34/lib
TCL_LIBRARY=home/Geo/ns-allinone-2.34/tcl8.4.18/library
輸入 ns指令,出現%則表示安裝完成,輸入 exit退出
測試 NS2是否能正確執行範例,若正確安裝便可看到圖形介面。測試 simple.tcl檔案到跟目錄下輸入
cd ns-allinone-2.34/ns-2.34/tcl/ex
Ns simple.tcl
NS2 安裝測試
9
NS2 安裝測試
10
Compiler in NS2
NS2 use two languagesC++
TCL/OTCL
TCL is an interpreter languageModify and execute again without compiling
Execution speed is slower
C++Modify and execute after compiling
Execution speed is faster
NS2-Package Components
Main Componentns-2.34\
Virtual Simulatornam-1.14\
TCL Languagesotcl-1.13\
tcl8.4.18\
tclcl-1.19\
tk8.4.18\
Graph toolsxgraph-12.1\
Main Source Code
ns2.34\Physical and MAC Layer
mac\ 、 mobile\ 、 etc.
Network Layeraodv\ 、 dsdv\ 、 dsr\ 、 etc.
Transport Layertcp\
Application Layerapp\
Main Source Code
Configuration files (in TCL Language)tcl\
Examples code tcl\ex\
tcl\lib\Some functions written in TCL\OTCL language.
Defaults value. (ns-default.tcl)
15
TCL語言
TCL(Tool Command Language)在 NS2中主要用來描述腳本,也就是用來描述模擬的網路環境和參數
NS2 Topology Construction
Parameter Initialization
Algorithm Implementation
Traffic Scheduling
16
簡單的 TCL程式
hello.tcl:
set s "Hello World"
puts $s
Command: ns hello.tcl
Result: Hello World
17
變數 (variable)的宣告
利用 set來指定變數值Ex.: set a 0
unset取消此變數Ex.: unset a
18
變數替換 (variable substituion)
變數替換Ex.:
set name “Jacky"
puts "I am $name"
Result:
I am Jacky
19
表示式 (expressions)
語法 : expr arg ?arg arg ...?
作用 :執行運算Ex.:
set value [expr 2+3]
puts $value
Result: 5
[]代表一個完整指令
20
incr指令語法 :
incr varName ?increment?
作用 :作加法運算
範例 : set i 0 incr i incr i 4結果 : 0 1 5
21
append指令
語法 :append varName ?value value value ...?
作用 :在變數後面附加資料
範例 : set i 1
append i 2 3 4 5
結果 : 12345
22
exec指令
語法 :exec ?switches? arg ?arg ...?
作用 :執行外部程式
範例 : exec umane
結果 : CYGWIN_NT 5-1
23
list指令
語法 :list ?arg arg ...?
作用 :建立清單
範例 : list a b “ c d”
結果 : a b { c d}
24
eval指令
語法 :eval arg ?arg ...?
作用 :將參數當成 script, 用遞迴方式執行
範例 : eval [list set i] 3
結果 : 3
25
lindex指令
語法 :lindex $list ?index...?
作用 :在 list中抽出索引指定的資料
範例 : lindex {a b c} 2 lindex {a b c} end結果 : c c
26
linsert指令
語法 :linsert $list index element ?element element ...?
作用 :在指定的位置插入資料
範例 : set aa [list a b c d]
linsert $aa end-1 1 2 3
結果 a b c 1 2 3 d
27
lappend指令
語法 :lappend varName ?value value value ...?
作用 :在變數值後將引數當 list附加資料
範例 : set var a
lappend var b c d
結果 :
a b c d
28
concat指令
語法 :concat ?arg arg ...?
作用 :將多個 list合併
範例 : set a [concat "a b" 1 2 {c {d e}}]
lindex $a 5
結果 : d e
29
llength指令
語法 :llength $list
作用 :計算出 list元素的個數
範例 : llength {a b}
結果 : 2
30
lrange指令
語法 :lrange $list first last
作用 :在 list中將索引範圍內的元素列出
範例 : lrange {a b c d} 1 end
結果 : b c d
31
陣列
語法 :array option arrayname ?arg1 arg2 …?
作用 :設定陣列的元素
範例 : set myarray(00) 456 puts $myarray(00)
結果 : 456
32
option: set指令
語法 :array set arrayname $list
作用 :設定陣列元素
範例 : array set myarray {0 123 00 456 a b}
結果 : 0 123 00 456 a b
33
TCL之流程控制
If-else
Switch
For loop
Foreach loop
While loop
34
流程控制範例 (if-else)
Ex.: set grade 90 if {$grade >= 90} {
puts "Your level is A! " } elseif {$grade < 90} {
puts "Your level isn’t A! " } else {
puts "You set wrong data! " }
Result: Your level is A!
一定要空一格其它也一定要
35
流程控制範例 (switch)
Ex.: set num 1
switch $num {
1 {puts "I’m John."}
2 {puts "I’m Mary."}
3 {puts "I’m Andy."}
default {puts "What’s your name?"}
}
Result: I’m John.
36
流程控制範例 (for loop)
計算 1+2+…+100
Ex.: set ans 0
for {set a 0} {$a < 101} {incr a 1} {
set ans [expr $ans+$a]
}
puts $ans
Result: 5050
37
流程控制範例 (foreach loop)
計算 1+2+…+10
Ex.: Set j 0
foreach i {1 2 3 4 5 6 7 8 9 10} {
set j [expr $i+$j]
}
puts $j
Result: 55
38
流程控制範例 (while loop)
計算 1+2+…+100Ex.: set a 0 set ans 0 while {$a < 101} { set ans [expr $ans+$a] incr a 1 } puts $ans
Result: 5050
NS2 簡單範例
sample.tcl
# 產生一個模擬的物件set ns [new Simulator]
#針對不同的資料流定義不同的顏色,這是要給 NAM用的$ns color 1 Blue
$ns color 2 Red
#開啟一個 NAM trace fileset nf [open out.nam w]
$ns namtrace-all $nf
NS2 簡單範例
#開啟一個 trace file,用來記錄封包傳送的過程set nd [open out.tr w]
$ns trace-all $nd
#定義一個結束的程序proc finish {} {
global ns nf nd
$ns flush-trace
close $nf
close $nd
#以背景執行的方式去執行 NAM (The Network Animator)
exec nam out.nam &
exit 0
}
NS2 簡單範例
#產生四個網路節點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
#設定節點的位置,這是要給 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
NS2 簡單範例
#觀測 n2到 n3之間 queue的變化,這是要給 NAM用的$ns duplex-link-op $n2 $n3 queuePos 0.5
#建立一條 TCP的連線set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
#在 NAM中, TCP的連線會以藍色表示$tcp set fid_ 1
#在 TCP連線之上建立 FTP應用程式set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
NS2 簡單範例
#建立一條 UDP的連線set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
#在 NAM中, UDP的連線會以紅色表示$udp set fid_ 2
#在 UDP連線之上建立 CBR應用程式set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false
NS2 簡單範例
#設定 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 detach-agent $n3 $sink“
#在模擬環境中, 5秒後去呼叫 finish來結束模擬 (這樣要注意模擬環境中#的 5秒並不一定等於實際模擬的時間$ns at 5.0 "finish“
#執行模擬$ns run
NS2 簡單範例
AWK
使用直譯器不需先行編譯無變數型別之分,也不用事先宣告可使用文字當陣列標籤 (index)
將檔案內一行的資料列,一筆一筆的讀進來每筆資料以空白字元分隔成許多欄位預設變數 $0整個資料列 , $1為第一欄 , $2為 ...
內建 pipe功能,能將資料與 shell間相互傳送用法與 C程式相似
AWK
Awk運用 (awk主要用來顯示模擬過程記錄檔進而做數值分析
當 awk讀入資料列後,會把每個欄位的值存入欄位變數
AWK
指令 awk–f out.tr
AWK
Awk範例– delay.awk
AWK
AWK
執行方法 : ($為 shell的提示符號 )$awk-f measure-delay.awk out.tr
若是要把結果存到檔案,可使用導向的方式。 (把結果存到 cbr_delay檔案中 )
$awk-f measure-delay.awk out.tr > cbr_delay
Gnuplot
圖形模式輸入 gnuplot
Gnuplot
plot “cdr_delay”
nsBench
先到 nsBench的官方網頁下載安裝檔 http://
www.mnlab.cs.depaul.edu/projects/nsbench/nsBench.jar
54
nsBench
新增四個節點,模擬實驗三之環境。
連結各點。
55
每個 link 點選兩下以設定參數。
新增 TCP Agent 及 TCP Sink。
nsBench
新增 FTP traffic。
連接 ftp1-tcp0 tcp0-n0 tcp0-sink0
56
同理建立 udp0 cbr0 null1 及連線。
點選兩下 cbr0 設定參數。
nsBench
新增並設定 scenario。
57
設定 Trace 的檔案名稱。
nsBench
產生程式碼並儲存專案。
58
nsBench
觀看 TCL程式碼
nsBench
nsBench
nsBench
nsBench 修改程式碼
透過 nsBench 可讓使用者利用更友善的 GUI 介面來產生內部程式碼,但使用 nsBench 在 nsBench 平台上卻沒辦法執行,所以我們仍需要在 cygwin的繪圖模式中,輸入指令執行該程式碼。
由 nsBench 所產生出的程式碼需要做一些小小的設定如需將結果繪出,在 proc finish {} block 中加入 exec nam out.nam & 如下圖。
加入顏色區別 flow:在程式碼中加入 $ns color 1 Blue,將 flow 辨識為 1
的資料流以藍色表示 (視資料流數量加入 Red Green … 等 )。
63
nsBench 修改程式碼繪出時的圖形排列 (沒設定的話會很亂,搞不清楚哪個節點扮演的角色 ), $ns
duplex-link-op $n1 $n2 orient right-down (節點 n2 在節點 n1 的右下方,依此自行設定相對位置 )
顯示 queue 的變化, $ns duplex-link-op $n2 $n3 queuePos 0.5
64
NS2 Scenarios Generator
NS2 Scenarios Generator
NS2 Scenarios Generator
NS2 Scenarios Generator
作業
寫一個簡單的 TCL Script來表示 Hidden Terminal 與 Expose Terminal 再有 CSMA/CA與沒有 CSMA/CA的差別四個節點節點依時間點不同而移動移動當中造成上訴兩個問題
利用 awk 來分析並比較上訴兩個問題的效能Packet delivery rate
Fairness
報告TCL, Awk/Gnuplot scripts 都要加上 comment
說明上訴兩者的效能差異
Hidden Terminal Problem
Exposed Terminal Problem