Profil von 超楠为了爱和梦想FotosBlogListen Extras Hilfe

超楠 王

24 Juli

NS-trace分析3:Gnuplot

 執行 GNUPLOT 程式時,GNUPLOT 首先檢查是否設定環境參數 DISPLAY, 若有則依其設定。當其確定為 X 環境時,將輸出模式設定為 X11。筆者以cbr_delay為例,先簡單示範如何把圖給畫出來。畫圖的指令是plot,要畫的檔案cbr_delay。

gnuplot> plot "cbr_delay"

圖是畫出來了,但是筆者要的不是把數據用打點的方式畫出來,而是要把這些點連起來。沒關係,接下來,只要學著修改環境變數,就可以畫出理想的圖了。

 

C.      修改環境變數

a.座標軸(Axis)繪圖參數在設定座標軸方面的參數可分為變數名稱、標點、網格、顯示範圍、 座標軸顯示方式與顯示與否等六方面的設定。不過筆者只介紹幾個常用的設定,詳細的設定可以參考http://phi.sinica.edu.tw/aspac/reports/94/94002/

 

功能

繪圖參數名稱

標點設定

xticsydtics

網格設定

grid

座標顯示方式

logscale

顯示範圍設定

autoscalexrange

...

NS-trace分析2: awk脚本

筆者把量測CBR封包端點到端點間延遲時間的awk程式,寫在檔案measure-delay.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;
 

#記錄目前最高的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=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;

   }
}                                                                                                         
 

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);
   
}

}
 
執行方法: ($為shell的提示符號)

$awk -f measure-delay.awk
out.tr
 

[Jitter]

Jitter 就是延遲時間變化量delay variance,由於網路的狀態隨時都在變化,有時候流量大,有時候流量小,當流量大的時候,許多封包就必需在節點的佇列中等待被傳送,因此每個封包從傳送端到目的地端的時間不一定會相同,而這個不同的差異就是所謂的Jitter。Jitter越大,則表示網路越不穩定。筆者把量測CBR flow的Jitter的awk寫在檔案measure-jitter.awk內。

 

BEGIN {

#程式初始化

   old_time=0;

   old_seq_no=0;

   i=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;

 

#判斷是否為n2傳送到n3,且封包型態為cbr,動作為接受封包

   if(node_1==2 && node_2==3 && type=="cbr" && action=="r") {

#求出目前封包的序號和上次成功接收的序號差值

               dif=seq_no-old_seq_no;

 

#處理第一個接收封包

        if(dif==0) 

          dif=1;

 

#求出jitter

         jitter[i]=(time-old_time)/dif;

         seq[i]=seq_no;

                               i=i+1;

         old_seq_no=seq_no;

         old_time=time;

   }    

}

END {

   for (j=1; j <i ;j++)

    printf("%d\t%f\n",seq[j],jitter[j]);

}

 

執行方法: ($為shell的提示符號)
$awk -f measure-jitter.awk out.tr
 
若是要把結果存到檔案,可使用導向的方式。(把結果存到cbr_jitter檔案中)

$awk -f measure-jitter.awk
out.tr > cbr_jitter
 
[另一種計算Jitter的方法---更精確的方式]
 

# ================================================================================

# NormalJitter.awk

# Version now: 0.1

# Last Modified Date: 2004-10-23,19:39:54

# == Usage ==

# awk -f NormalJitter.awk out.tr

# == Programed By ==

# 查輝(ZHA HUI), Wuhan, China, Email: zhahui AT gmail.com

# == Description ==

# awk 程式給出了另外一種jitter的計算方法,這種方法中jitter 的計算是基于以下公式:

# jitter ((recvtime(j)-sendtime(j))-(recvtime(i)-sendtime(i)))/(j-i), 其中 j>i

# == Attention ==

# NormalJitter.awk中關於jitter 的計算完全基于柯志亨博士的measure-delay.awk程式中delay

# 計算。而measure-delay.awk 在柯博士網頁中的ns2類比例子中是正確的,但是對于不同的例子需要根

# 據情況進行一定的修改,並可能需要加入某些魯棒性處理代碼(例如對于第一個包的處理,對于丟包的處

# 理等)

# == Reference ==

# http://140.116.72.80/~smallko/ns2/ns2.htm

# == Feedback ==

# 如有任何關於本程式jitter 計算的問題,請致信

# 柯志亨(ChihHeng, Ke) 博士 smallko2001 AT pchome.com.tw 或者與本人聯繫。

# == Acknowledgements ==

# Dr. ChihHeng, Ke provided valuable documents and awk files upon my requests.

# ================================================================================

 

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;

 

#記錄目前最高的packet ID

   if ( packet_id > highest_packet_id ) {

           highest_packet_id = packet_id;

        }

 

#記錄封包的傳送時間

   if ( start_time[packet_id] == 0 )  {

           # 記錄下包的 seq_no -- ZHA

           pkt_seqno[packet_id] = seq_no;

           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;

   }

}                                                       

END {

        # 初始化jitter計算所需變量 -- ZHA

        last_seqno = 0;

        last_delay = 0;

        seqno_diff = 0;

#當資料列全部讀取完後,開始計算有效封包的端點到端點延遲時間

    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 ) {

               # 得到了 delay(packet_duration)后計算 jitter -- ZHA

               seqno_diff = pkt_seqno[packet_id] - last_seqno;

               delay_diff = packet_duration - last_delay;

               if (seqno_diff == 0) {

                       jitter =0;

               } else {

                       jitter = delay_diff/seqno_diff;

               }

               printf("%f %f\n", start, jitter);

               last_seqno = pkt_seqno[packet_id];

               last_delay = packet_duration;

       }

    }

}

 

 

[Loss]

筆者把量測CBR Packet Loss的情況寫在檔案measure-drop.awk內。

 

BEGIN {

#程式初始化,設定一變數記錄packet被drop的數目

               fsDrops = 0;

               numFs = 0;

}

{

   action = $1;

   time = $2;

   node_1 = $3;

   node_2 = $4;

   src = $5;

   flow_id = $8;

   node_1_address = $9;

   node_2_address = $10;

   seq_no = $11;

   packet_id = $12;

 

#統計從n1送出多少packets

               if (node_1==1 && node_2==2 && action == "+")

                               numFs++;

              

#統計flow_id為2,且被drop的封包

               if (flow_id==2 && action == "d")

                               fsDrops++;

}

END {

               printf("number of packets sent:%d lost:%d\n", numFs, fsDrops);

}

 

執行方法: ($為shell的提示符號)
$awk -f measure-drop.awk out.tr
 
執行結果:

number of packets sent: 550  lost:8

這代表CBR送出了550個封包,但其中8個封包丟掉了。

 

[Throughput]

筆者把量測CBR Throughput的情況寫在檔案measure-throughput.awk內。在這裡的Throughput是指average throughput。

 

BEGIN {

               init=0;

               i=0;

}

{

               action = $1;

            time = $2;

            node_1 = $3;

            node_2 = $4;

            src = $5;

            pktsize = $6;

            flow_id = $8;

            node_1_address = $9;

            node_2_address = $10;

            seq_no = $11;

            packet_id = $12;

  

              if(action=="r" && node_1==2 && node_2==3 && flow_id==2) {

                              pkt_byte_sum[i+1]=pkt_byte_sum[i]+ pktsize;

                              

                               if(init==0) {

                                              start_time = time;

                                              init = 1;

                               }

                              

                               end_time[i] = time;

                               i = i+1;

               }

}

END {

#為了畫圖好看,把第一筆記錄的throughput設為零,以表示傳輸開始

               printf("%.2f\t%.2f\n", end_time[0], 0);

              

               for(j=1 ; j<i ; j++){

                               th = pkt_byte_sum[j] / (end_time[j] - start_time)*8/1000;

                               printf("%.2f\t%.2f\n", end_time[j], th);

               }

#為了畫圖好看,把第後一筆記錄的throughput再設為零,以表示傳輸結束

               printf("%.2f\t%.2f\n", end_time[i-1], 0);

}

 

執行方法: ($為shell的提示符號)
$awk -f measure-throughput.awk 
out.tr
 
若是要把結果存到檔案,可使用導向的方式。(把結果存到cbr_throughput檔案中)

$awk -f measure-throughput.awk out.tr > cbr_throughput

NS-trace 分析1:awk语言简介

现在转载一下,呵呵
ns模擬結束後,會產生兩個檔案,一個是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程式很容易使用系統資源。

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會自動重覆進行上述的四個步驟,所以使用者不須在程式中寫這個迴圈。

ns学习之修改错误

前日终于有点收获,执行ns/example/wireless1/tcl的时候出现错误,经过分析,终于修改正确,虽然这只是一个小的成就,但是对于我来说却是就有很重要的意义的。
现在把错误的原因和如何修改写下来,希望对学习ns的人有所帮助
wireless1.tcl中channel(cp)的路径为../mobility/...,实际路径应该为../../tcl/mobility/...,就是加载场景的时候出错误了,另外一个也是如此,仔细对比错误提示就可以发现。
希望这是一个好的开端,我的ns之旅可以从此之后一帆风顺!
10 April

go after my dream

我想换题目,因为我觉得以前那个题目实在是做不下去了,虽然一切从头开始很难,也总比明明知道一条路走不通再去走而好。我记得casey说:i give up yours.i go after mine.我也想追求自己的梦想。我觉得自己的选择是对的,虽然这样可能老师会不高兴,但是我决心这样走下去,我不会后悔的,一定要坚持下来。god bless me!
05 April

要做的事

有很多事要做,但是时间太少,一转眼就要研三了,想想自己还有很多事情没有做呢,真的要加油了呀!
整理一下吧:
1、英语。
英语其实我是有优势的,但是实在是太长时间没有碰了,而且每次都是突击一下,断断续续地,从现在开始要进行系统的学习了。写下来也是为了鞭策自己吧,从现在开始要多听多看,等到研三回到学校要系统的学,我的目标是剑桥商务英语高级,一定要做到,相信自己。
2、数学。
我的毕业设计课题跟数学有很大的关系,所以一定要好好学习数学,虽然这方面我不是强项,也要努力多理解一点。
3、专业知识
我的专业知识并不多,好多概念其实我都不明白,这也跟我没有真正的into有关系,所以即使只是为了找工作,我也要多多的学习一下。
整理一下自己的思路,决定以后就在这几个方面努力了,希望可以做好,做最好的自己。

不做电脑的奴隶

现在对着电脑真的是时间太长了,有的时候根本忘记了时间,我觉得皮肤,眼睛和身体都不舒服,所以这种状况一定要改变,一定要改变。
不能做电脑的奴隶,要让电脑为我服务。
要坚持下来呀!
 
Es sind keine Fotoalben vorhanden.