Download presentation
Presentation is loading. Please wait.
1
計算機網路 COMPUTER NETWORK
實驗(五)網路效能量測 計算機網路 COMPUTER NETWORK
2
實驗步驟 學習TCL語言 分析out.tr 分析相關數值 學習AWK語言 利用NSG2所提供的範例檔,並產生TCL檔
3
TCL TCL(Tool Command Language) 用途:描述腳本 描述要模擬的網路環境和參數設定
4
TCL基本介紹(變數宣告及使用) set $ Example 執行方法 執行結果 variable.tcl set name “jim”
Puts “my name is $name” $ns variable.tcl my name is jim
5
TCL基本介紹(表示式) set value [expr 0==1] puts $value set value [expr 2+3]
判斷真假 example 數學表示式 Example expr2.tcl expr1.tcl set value [expr 0==1] puts $value set value [expr 2+3] puts $value $ns expr1.tcl $ns expr2.tcl 5
6
TCL基本介紹(指令替換) example CommandSubstitution.tcl
puts “I am [expr 10*2] years old” $ns CommandSubsitution.tcl I am 20 years old
7
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.” puts “Warm enough for me” $ns ControlFlow.tcl I feel right at home. Warm enough for me. 空格要注意,一定要空,不然不能跑
8
TCL基本介紹(程序) TCL中也允許使用者自定程序 example procedure.tcl proc sum_proc {a b} {
空格注意 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
9
TCL基本介紹(陣列) set myarray(0) “Zero” set myarray(1) “One”
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 空格要注意,一定要空,不然不能跑
10
Out.tr Analysis 欄位一 : 封包事件 (r:receive,+:enpueue, -:dequeue,d:drop)
欄位二 : 事件發生時間 欄位三、欄位四 : from node 到 to node 欄位五 : 封包型態 欄位六 : 封包大小 欄位七 : 旗標 欄位八 : 表示封包屬於的資料流 欄位九、欄位十 : 封包來源端和目的端 x.y -> x:節點編號 , y:port number 欄位十一 : 封包序號 欄位十二 : 封包id Event time From node To Packet type size flags Flow Id Src addr Dst Seq num ID + 0.1 1 2 cbr 1000 1.0 3.1
11
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” 封包遺失 所以封包遺失率= 封包遺失數/(封包送達數+封包遺失數)
12
AWK 一種程式語言 變數無形別之分 擅長處理資料列、欄位型態的資料。
13
AWK 當awk讀入資料列後,會把每個欄位的值存入欄位變數 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12
$ $ $ $ $ $ $ $ $ $ $ $12 $0 當awk讀入資料列後,會把每個欄位的值存入欄位變數 欄位變數 意義 上例欄位的東西 $0 為一串列,其內容為目前awk所獨去的資料列 cbr $1 代表$0上第一個欄位的資料 + $2 代表$0上第二個欄位的資料 0.1 $X 代表$0上第X個欄位的資料 ……….
14
AWK 程式主要結構 一般常用”關係判斷式來當Pattern”
提供C語言常見的關係運算元,如>、<、>=、<=、==、!=…等 I/O指令:print、printf()……等 流程控制指令:if(…){…}else{…}、while(…){…}…… AWK語言與C語言類似,在空格不會像TCL一樣,有一定要空格的問題 Pattern { Action1} Pattern { Action2} …………………………………. Pattern { Action3}
15
AWK 工作流程 從指定的資料檔中讀取一筆資料列 更新相關的內建變數之值 逐次執行程式所有的 Pattern { Actions }
16
AWK學習 網站一血落閣 Linux相關技術學習
linux+shell+awk+%E8%AA%9E%E6%B3%95 此網站是翻譯成繁中版 來源出處(weekly123的专栏 網站二
17
作業 本實驗將利用NSG2實作範例圖(圖同實驗三)所產生的 tcl檔和out.tr檔
再撰寫一程式,計算每個封包之delay time,jitter 及Package Loss Rate
18
PacketLoss.awk dst = $10; seq_no = $11; packet_id = $12;
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
19
Delay.awk(1) BEGIN { 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;
20
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); }
21
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; } }
22
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;
23
Jitter.awk(3) printf("%f %f\n", start, jitter);
#只把接收時間大於傳送時間的記錄列出來 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; }
24
HINT 根據上列(P17~P22投影片) 提示,來完成橘色空格, 並完成AWK檔,搭配out.tr 來計算出相關數值
如果真的不熟悉AEK語言 ,也可以由(P17~P22投影片) 提示,自行做出C、C++程式 語言版本,來計算出相關數 值
25
作業 Doc檔上,須說明: 封面(班級、學號、姓名) 檔名範例:Hw3_498410561_張建雄 相關程式碼
Terminal在執行$awk結果之截圖(如有三個awk檔,則截三個圖) 如果是用其他語言的也須附上截圖 心得 若有問題請 給助教
Similar presentations