PowerPoint 簡報

Download Report

Transcript PowerPoint 簡報

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