Chinaunix首页 | 论坛 | 博客
  • 博客访问: 850206
  • 博文数量: 180
  • 博客积分: 10029
  • 博客等级: 上将
  • 技术积分: 2185
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-06 09:15
文章存档

2010年(133)

2009年(47)

我的朋友

分类: 系统运维

2010-03-27 22:56:35

  (这个是柯老师的博文, 繁体中文的, 还是很好看懂的,就不简体化啦!)
  
   很多网友的邮件和问题都是围绕着Trace文件的分析, 笔者在空间里已经演示了很多的分析方法,再次,我转载大牛柯志亨老师的博文, 放在空间供大家参看!
 
對於使用網路模擬軟體來做網路效能分析的人而言,步驟通常是先設計出符合自己需要的網路模擬環境,設定其不同的參數,執行模擬,收集結果資料,最後把資料使用圖片或表格把結果呈現出來以方便分析實驗。一般而言,對於ns2的初學者而言,總是會遇到一個問題,就是網路模擬程式跑完後,接下來該如何分析。這是非常重要的一個過程,所以希望ns2的初學者能好好的研究此章節的內容,相信一定會對大家的研究有相當的幫助。
        本節打算以一個簡單的網路環境為範例,介紹如何使用一些工具來分析和呈現模擬結果,這包含了如何去量測End-to-End Delay、Jitter、Packet Loss、和Throughput。而採用的方法是去分析traffic trace檔案的方式,這種方法的優點是簡單且不需要去修改到ns2核心的部份,但缺點是若是模擬資料若是太多,traffic trace的檔案會太大,這樣會增加分析所需要的時間。另外一種方法,是去更改ns2核心,增加或修改一些檔案,把所需要量測的參數直接記錄下來,這種方法的優點是模擬結束後,所需要量測的數據已經完全記錄下來,但缺點是要動到ns2核心的部分,對於初學者而言,這是一個很大的門檻,這個方法筆者留到後面的章節在做介紹。
        筆者先對要模擬的環境做一個簡單的介紹。這個網路的環境包含了四個網路節點(n0,n1,n2,n3),如下圖所示。網路節點n0到節點n2之間,和節點n1到節點n2之間的網路頻寬(bandwidth)是2Mbps,延遲時間(propagation delay)是10ms。網路拓樸中的頻寬瓶頸是在節點n2到節點n3之間,頻寬為1.7Mbps,延遲的時間為20ms。每個網路節都是採用DropTail queue的方式,且在節點n2到節點n3之間的最大佇列長度是10個封包的長度。在節點n0到n3之間會有一條FTP的連線,FTP應用程式是架構在TCP之上,所以在寫模擬環境的描述語言的時候,必需先建立一條TCP的連線,在來源端n0上使用TCP agent產生”tcp”來發送TCP的封包;在目的地端n3使用TCPsink agent產生”sink”來接受TCP的資料、並產生回覆封包(ACK)回傳送端、最後把接收的TCP封包釋放。最後要把這兩個agent連起來(connect),連線才能建立。若是沒有額外的參數設定,TCP封包的長度為1Kbytes。在這裡順便補充說明一下,對於ns2模擬參數內定值設定是在ns-allinone-2.27\ns-2.27\tcl\lib目錄下的ns-default.tcl,有想要進一步瞭解的人,可以去查看此檔。另外,在節點n1到n3之間有一條固定的傳輸速率的連線(Constant Bit Rate,CBR),CBR應用程式是架構在UDP之上,因此必需在n1使用UDP agent來產生”udp”用來發送UDP封包,在n3上使用Null agent來產生”sink”以接收由n1傳送過來的UDP封包,然後把接收的封包釋放。CBR的傳送速度為1Mbps,每一個封包大小為1Kbytes。CBR是在0.1秒開始傳送,在4.5秒結束傳輸;FTP是在1.0秒開始傳送,4.0秒結束傳輸。

  ns2的trace文件分析过程 收藏
 
對於使用網路模擬軟體來做網路效能分析的人而言,步驟通常是先設計出符合自己需要的網路模擬環境,設定其不同的參數,執行模擬,收集結果資料,最後把資料使用圖片或表格把結果呈現出來以方便分析實驗。一般而言,對於ns2的初學者而言,總是會遇到一個問題,就是網路模擬程式跑完後,接下來該如何分析。這是非常重要的一個過程,所以希望ns2的初學者能好好的研究此章節的內容,相信一定會對大家的研究有相當的幫助。
        本節打算以一個簡單的網路環境為範例,介紹如何使用一些工具來分析和呈現模擬結果,這包含了如何去量測End-to-End Delay、Jitter、Packet Loss、和Throughput。而採用的方法是去分析traffic trace檔案的方式,這種方法的優點是簡單且不需要去修改到ns2核心的部份,但缺點是若是模擬資料若是太多,traffic trace的檔案會太大,這樣會增加分析所需要的時間。另外一種方法,是去更改ns2核心,增加或修改一些檔案,把所需要量測的參數直接記錄下來,這種方法的優點是模擬結束後,所需要量測的數據已經完全記錄下來,但缺點是要動到ns2核心的部分,對於初學者而言,這是一個很大的門檻,這個方法筆者留到後面的章節在做介紹。
        筆者先對要模擬的環境做一個簡單的介紹。這個網路的環境包含了四個網路節點(n0,n1,n2,n3),如下圖所示。網路節點n0到節點n2之間,和節點n1到節點n2之間的網路頻寬(bandwidth)是2Mbps,延遲時間(propagation delay)是10ms。網路拓樸中的頻寬瓶頸是在節點n2到節點n3之間,頻寬為1.7Mbps,延遲的時間為20ms。每個網路節都是採用DropTail queue的方式,且在節點n2到節點n3之間的最大佇列長度是10個封包的長度。在節點n0到n3之間會有一條FTP的連線,FTP應用程式是架構在TCP之上,所以在寫模擬環境的描述語言的時候,必需先建立一條TCP的連線,在來源端n0上使用TCP agent產生”tcp”來發送TCP的封包;在目的地端n3使用TCPsink agent產生”sink”來接受TCP的資料、並產生回覆封包(ACK)回傳送端、最後把接收的TCP封包釋放。最後要把這兩個agent連起來(connect),連線才能建立。若是沒有額外的參數設定,TCP封包的長度為1Kbytes。在這裡順便補充說明一下,對於ns2模擬參數內定值設定是在ns-allinone-2.27\ns-2.27\tcl\lib目錄下的ns-default.tcl,有想要進一步瞭解的人,可以去查看此檔。另外,在節點n1到n3之間有一條固定的傳輸速率的連線(Constant Bit Rate,CBR),CBR應用程式是架構在UDP之上,因此必需在n1使用UDP agent來產生”udp”用來發送UDP封包,在n3上使用Null agent來產生”sink”以接收由n1傳送過來的UDP封包,然後把接收的封包釋放。CBR的傳送速度為1Mbps,每一個封包大小為1Kbytes。CBR是在0.1秒開始傳送,在4.5秒結束傳輸;FTP是在1.0秒開始傳送,4.0秒結束傳輸。
 
[Simulation Topology]
(还未找到原出处)
 
TclScript
 

# 產生一個模擬的物件

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

 
阅读(3556) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~