全部博文(180)
分类: 系统运维
2010-03-27 22:56:35
# 產生一個模擬的物件 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
#定義一個結束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd #以背景執行的方式去執行NAM exec nam out.nam & exit 0 }
#產生四個網路節點 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
#觀測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
#建立一條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
#設定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 |
模擬結束後,會產生兩個檔案,一個是out.nam,這是給NAM用的,用來把模擬的過程用視覺化的方式呈現出來,這可以讓使用者用”看”的方式去瞭解封包傳送是如何從來源端送到接收端。另一個檔案是out.tr,這個檔案記錄了模擬過程中封包傳送中所有的事件,例如第一筆記錄是一個CBR的封包,長度為1000bytes,在時間0.1秒的時候,從n1傳送到n2。這個檔案對我們做效能分析很重要,所以要先對這個檔案的格式做仔細的介紹。
+ 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 ................................................................. |
每一筆記錄的開始都是封包事件發生的原因,若是r則表示封包被某個節點所接收,若是+則表示進入了佇列,若是-則表示離開佇列,若是d則表示封包被佇列所丟棄。接著的第二個欄位表示的是事件發生的時間;欄位三和欄位四表示事件發生的地點(從from node到to node);欄位五表示封包的型態;欄位六是封包的大小,欄位七是封包的旗標標註;欄位八表示封包是屬於那一個資料流;欄位九和欄位十是表示封包的來源端和目的端,這兩個欄位的格式是a.b,a代表節點編號,b表示埠號(port number);欄位十一表示封包的序號;最後欄位十二表示封包的id。以前面trace file的第一筆為例,意思就是說有一個封包pakcet id為0,資料流id為2,序號為0,長度為1000 bytes,型態為CBR,它是從來源端1.0要到目的地3.1,在時間0.1秒的時候,從節點1進入了節點2的佇列中。
接下來,筆者先簡單介紹awk,然後如何使用awk去分析trace file,以得到Throughput、Delay、Jitter、和Loss Rate。
[awk]
A.簡介
awk是一種程式語言。它具有一般程式語言常見的功能。因awk語言具有某些特點,如:使用直譯器(Interpreter)不需先行編譯;變數無型別之分(Typeless),可使用文字當陣列的註標(Associative Array)等特色。因此,使用awk撰寫程式比起使用其它語言更簡潔便利且節省時間。awk還具有一些內建功能,使得awk擅於處理具資料列(Record),欄位(Field)型態的資料;此外, awk內建有pipe的功能,可將處理中的資料傳送給外部的 Shell命令加以處理, 再將Shell命令處理後的資料傳回awk程式,這個特點也使得awk程式很容易使用系統資源。
B. awk是如何運作的
為便於解釋awk程式架構,以及相關的術語,筆者就以上面trace file為例,來加以介紹。
a.名詞定義:
1. 資料列: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”
一般而言,一筆資料列相當於資料檔上的一行資料。
2. 欄位(Field):為資料列上被分隔開的子字串。
以資料列”+ 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讀入資料列後,會把每個欄位的值存入欄位變數。
欄位變數
意義
$0
為一字串, 其內容為目前awk所讀入的資料列.
$1
代表 $0 上第一個欄位的資料.
$2
代表 $0 上第二欄個位的資料.
……
……
b.程式主要節構:
Pattern1 { Actions1 }
Pattern2 { Actions2 }
……………………………
Pattern3 { Actions3 }
一般常用”關係判斷式”來當成Pattern。例如:
x > 3 用來判斷變數x是否大於3
x == 5 用來判斷變數x是否等於5
awk提供c語言常見的關係運算元,如:>、<、>=、<=、==、!=等等
Actions是由許多awk指令所構成,而awk的指令與c語言中的指令非常類似。
IO指令:print 、 printf( ) 、getline ......
流程控制指令 : if ( ...) {...} else {…}、 while(…){…} ……
在awk程式的流程為先判斷Pattern的結果,若為真True則執行相對應的Actions,若為假False則不執行相對的Actions。若是處理的過程中沒有Pattern,awk會無條件的去執行Actions。
c.工作流程: 執行awk時, 它會反複進行下列四步驟。
1. 自動從指定的資料檔中讀取一筆資料列。
2. 自動更新(Update)相關的內建變數之值。
3. 逐次執行程式中 所有 的 Pattern { Actions } 指令。
4. 當執行完程式中所有 Pattern { Actions }時,若資料檔中還有未讀取的料,則反覆執行步驟1到步驟4。
awk會自動重覆進行上述的四個步驟,所以使用者不須在程式中寫這個迴圈。
具体的AWK代码和测试结果, 请参考:
http://blog.csdn.net/beijibingshan/archive/2007/06/14/1653007.aspx