實驗 ( 五 ) 網路效能量測
DESCRIPTION
實驗 ( 五 ) 網路效能量測. 計算機網路 COMPUTER NETWORK. 實驗步 驟. 學習 TCL 語言 分析 out.tr 分析相關數值 學習 AWK 語言 利用 NSG2 所提供的範例檔,並產生 TCL 檔 再利用 Out.tr 去計算出有關網路效能的數值. TCL. TCL(Tool Command Language) 用途 : 描述腳本 描述要模擬的網路環境和參數設定. TCL 基本介紹 ( 變數宣告及使用 ). set $ Example 執行方法 執行 結果. variable.tcl. s et name “jim” - PowerPoint PPT PresentationTRANSCRIPT
實驗 ( 五 ) 網路效能量測計算機網路 COMPUTER NETWORK
實驗步驟1. 學習 TCL 語言2. 分析 out.tr
3. 分析相關數值4. 學習 AWK 語言5. 利用 NSG2 所提供的範例檔,並產生 TCL 檔6. 再利用 Out.tr 去計算出有關網路效能的數值
TCLTCL(Tool Command Language)用途:描述腳本描述要模擬的網路環境和參數設定
TCL 基本介紹 ( 變數宣告及使用 )set $Example
執行方法
執行結果
set name “jim”Puts “my name is $name”
variable.tcl
$ns variable.tcl
my name is jim
TCL 基本介紹 ( 表示式 )expr判斷真假example
數學表示式Example
set value [expr 0==1]puts $value
expr1.tcl expr2.tcl
set value [expr 2+3]puts $value
$ns expr1.tcl0
$ns expr2.tcl5
TCL 基本介紹 ( 指令替換 )exampleCommandSubstitution.tcl
puts “I am [expr 10*2] years old”
$ns CommandSubsitution.tclI am 20 years old
TCL 基本介紹 ( 流程控制 )if-else 、 switch 、 while 、 for 、 foreachexample ControlFlow.tclset my_planet “earth”If {$my_planet == “earth”} { puts “I feel right at home.”} else if {$my_planet == “mars”}{ puts “This is not my home.”} else { puts “I am neither from earth , nor from mars.”}set temp 25If {$temp < 20 } { puts “It’s a little chilly.”} else { puts “Warm enough for me”}
$ns ControlFlow.tclI feel right at home.Warm enough for me.
空格要注意,一定要空,不然不能跑
TCL 基本介紹 ( 程序 )TCL 中也允許使用者自定程序example procedure.tcl
proc sum_proc {a b} { return[expr $a =$b]}set num1 5set num2 6set sum [sum_proc $num1 $num2]puts “the sum is $sum”
$ns procedure.tclthe sum is 11
空格注意
TCL 基本介紹 ( 陣列 )example array.tcl
set myarray(0) “Zero”set myarray(1) “One”set myarray(2) “Two”for { set i 0} {$i <3} {incr i 1} { puts $myarray($i)}
$ns array.tclZeroOneTwo
空格要注意,一定要空,不然不能跑
Out.tr Analysis
欄位一 : 封包事件(r:receive,+:enpueue,-:dequeue,d:drop)欄位二 : 事件發生時間欄位三、欄位四 : from node 到 to node欄位五 : 封包型態欄位六 : 封包大小
欄位七 : 旗標欄位八 : 表示封包屬於的資料流欄位九、欄位十 : 封包來源端和目的端 x.y -> x:節點編號 , y:port number欄位十一 : 封包序號欄位十二 : 封包id
Event time Fromnode
Tonode
Packettype
Packetsize
flags FlowId
Srcaddr
Dstaddr
Seqnum
PacketID
+ 0.1 1 2 cbr 1000 --------- 2 1.0 3.1 0 0
1 2 3 4 5 6 7 8 9 10 11 12
AnalysisEnd-to-End Delay 端點到端點的延遲= receiver time – sender timeJitter 抖動率 ( 延遲時間變化量 )
= (receiver time(j) – sender time(j)) – (receiver time(i) – sender time(i)), j > iThroughput 吞吐量packet loss 封包遺失率Ex: from node=1 to node=2 且 event=“+” 從 n1 送到 n2 封包Flowid=2 & event=“d” 封包遺失所以封包遺失率 = 封包遺失數 /( 封包送達數 + 封包遺失數 )
AWK一種程式語言變數無形別之分擅長處理資料列、欄位型態的資料。
AWK
當 awk 讀入資料列後,會把每個欄位的值存入欄位變數欄位變數 意義 上例欄位的東西$0 為一串列,其內容為目前
awk 所獨去的資料列
+ 0.1 1 2 cbr 1000 --------- 2 1.0 3.1 0 0
$1 代表 $0 上第一個欄位的資料
+
$2 代表 $0 上第二個欄位的資料
0.1
$X 代表 $0 上第 X 個欄位的資料
……….
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12
$0
AWK程式主要結構
一般常用”關係判斷式來當 Pattern”提供 C語言常見的關係運算元,如 >、 <、 >=、 <=、 ==、 !=…等I/O指令 :print、 printf()…… 等流程控制指令 :if(…){…}else{…} 、 while(…){…}……AWK語言與 C語言類似,在空格不會像 TCL一樣,有一定要空格的問題
Pattern1 { Action1}Pattern2 { Action2}………………………………….Pattern3 { Action3}
AWK工作流程1. 從指定的資料檔中讀取一筆資料列2. 更新相關的內建變數之值3. 逐次執行程式所有的 Pattern { Actions }4. 當所有的 Pattern{Action} 接執行完時,若資料
檔中還有位讀取的資料則反覆執行步驟 1 步驟 4 *awk 會自動執行上述迴圈步驟,使用者不需再寫迴圈
AWK 學習網站一血落閣 Linux相關技術學習http://blog.xuite.net/mb1016.flying/linux/28111008-linux+shell+awk+%E8%AA%9E%E6%B3%95
此網站是翻譯成繁中版 來源出處 (weekly123的专栏 http://blog.csdn.net/weekly123/article/details/1465675)網站二http://lalakiwe.myweb.hinet.net/Documents/awk/awk_1.html
作業本實驗將利用 NSG2 實作範例圖 ( 圖同實驗三 ) 所產生的 tcl 檔和 out.tr 檔再撰寫一程式,計算每個封包之 delay time , jitter
及 Package Loss Rate
PacketLoss.awk BEGIN {# 程式初始化 , 設定一變數記錄 packet 被 drop 的數目
fsDrops = 0;
numFs = 0; }
{ action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $10; seq_no = $11; packet_id = $12; #統計從n1送出多少packets #統計flow_id為2,且被drop的封包
} END { printf }
Delay.awk(1) BEGIN {
# 程式初始化,設定一變數以記錄目前最高處理封包的 ID 。
highest_packet_id = 0;
}
{ action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $10;
seq_no = $11;
packet_id = $12;
# 記錄目前最高的 packet ID
if ( packet_id > highest_packet_id )
# 記錄封包的傳送時間
if ( start_time[packet_id] == 0 )
start_time[packet_id] = time;
Delay.awk(2) # 記錄 CBR (flow_id=2) 的接收時間
if ( flow_id == 2 && action != "d" ) {
if ( action == "r" ) {
}
} else {
# 把不是 flow_id=2 的封包或者是 flow_id=2 但此封包被 drop 的時間設為 -1
}
}
END {
# 當資料列全部讀取完後,開始計算有效封包的端點到端點延遲時間
for ( packet_id = 0; packet_id <= highest_packet_id; packet_id++ ) {
start =
end =
packet_duration = end - start;
# 只把接收時間大於傳送時間的記錄列出來 if ( start < end ) printf("%f %f\n", start, packet_duration);
}
}
Jitter.awk(1) BEGIN {# 程式初始化,設定一變數以記錄目前最高處理封包的 ID 。
highest_packet_id = 0;}
{ action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $10;
seq_no = $11;
packet_id = $12;
# 記錄目前最高的 packet ID
if ( packet_id > highest_packet_id )
# 記錄封包的傳送時間
if ( start_time[packet_id] == 0 ) {
# 記錄下包的 seq_no
pkt_seqno[packet_id] = seq_no;
start_time[packet_id] = time; }
}
Jitter.awk(2) # 記錄 CBR (flow_id=2) 的接收時間 if ( flow_id == 2 && action != "d" ) {
if ( action == "r" ) {
}
} else {
# 把不是 flow_id=2 的封包或者是 flow_id=2但此封包被丟棄的時間設為 -1
}
END {
# 初始化 jitter 計算所需變量 last_seqno = 0;
last_delay = 0;
seqno_diff = 0;
# 當資料列全部讀取完後,開始計算有效封包的端點到端點延遲時間
for ( packet_id = 0; packet_id <= highest_packet_id; packet_id++ ) {
start =
end =
packet_duration = end - start;
Jitter.awk(3) # 只把接收時間大於傳送時間的記錄列出來
if ( start < end ) {
# 得到了 delay 值 (packet_duration) 後計算 jitter
seqno_diff =
delay_diff =
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;
}
}
}
HINT根據上列 (P17~P22 投影片 ) 提示,來完成橘色空格,並完成 AWK 檔,搭配 out.tr 來計算出相關數值
如果真的不熟悉 AEK 語言
,也可以由 (P17~P22 投影片 )
提示,自行做出 C 、 C++ 程式語言版本,來計算出相關數值
作業Doc 檔上,須說明 :1. 封面 ( 班級、學號、姓名 ) 檔名範例 :Hw3_498410561_ 張建雄2. 相關程式碼3. Terminal 在執行 $awk 結果之截圖 ( 如有三個 awk 檔,則截三個圖 )
4. 如果是用其他語言的也須附上截圖5. 心得若有問題請 e-mail 給助教