1、网络能量测量實驗八 網路效能量測實驗目的1. 學習如何量測以UDP為傳輸協定的應用程式之吞吐量(throughput)、封包延遲(packet dealy)、抖動率(packet jitter)、和封包遺失率(packet loss rate)。2. 學習如何量測以TCP為傳輸協定的應用程式之吞吐量(throughput) 。背景知識 當模擬結束後,我們通常會需要使用模擬過程中所產生的模擬過程記錄檔來分析以得到吞吐量、封包延遲、抖動率、或封包遺失率。但是,NS2所提供的模擬過程記錄檔格式並不是統一的,模擬環境若是全部都是有線的,其紀錄檔格式如下所示:eventtimefromnodeto no
2、depkttypepkt sizeflagsfidsrc addrdst addrseq numpkt idr:receive (at to_node)+:enqueue (at queue)-:dequeue (at queue) src_addr:node.portd:drop (at queue) dst_addr:node.port圖一. 有線網路環境下的模擬過程記錄檔格式 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
3、1 2 cbr 1000 - 2 1.0 3.1 1 1r 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圖二. 有線網路環境下的模擬過程記錄檔範例格式說明:1. 每一筆記錄的開始都是封包事件發生的原因,若是”r”則表示封包被某個節點所接收;若是”+”則表示進入了佇列;若是”-“則表示離開佇列;若是”d”則表示封包被佇列所丟棄。2. 第二個欄位表示的是事件發生的時間。3. 欄位三和欄位四表示事件發生的地點(從from node到to
4、node)。4. 欄位五表示封包的型態。5. 欄位六是封包的大小。6. 欄位七是封包的旗標標註。7. 欄位八表示封包是屬於哪一個資料流。8. 欄位九和欄位十是表示封包的來源端和目的端,這兩個欄位的格式是a.b,a代表節點編號,b表示埠號(port number) 。9. 欄位十一表示封包的序號;欄位十二表示封包的id。以前面模擬過程記錄檔的第一筆為例,意思就是說有一個封包pakcet id為0,資料流id為2,序號為0,長度為1000 bytes,型態為CBR,它是從來源端1.0要到目的地3.1,在時間0.1秒的時候,從節點1要進入了節點2。若是模擬環境為無線的,則模擬過程記錄檔格式則會跟路由
5、協定和是否有設定要使用新格式而不同,以DSDV且沒有設定使用新格式的範例如下所示:s 0.029290548 _1_ RTR - 0 message 32 0 0 0 0 - 1:255 -1:255 32 0 s 0.029365548 _1_ MAC - 0 message 84 0 ffffffff 1 800 - 1:255 -1:255 32 0 r 0.030037615 _0_ MAC - 0 message 32 0 ffffffff 1 800 - 1:255 -1:255 32 0 r 0.030062615 _0_ RTR - 0 message 32 0 fffffff
6、f 1 800 - 1:255 -1:255 32 0 s 1.000000000 _0_ AGT - 1 tcp 40 0 0 0 0 - 0:0 1:0 32 0 0 0 0 0圖三 DSDV且沒有設定使用新格式的範例格式說明:1. 第一個欄位是封包事件發生的原因。s:傳送(send)、r: 接收(Receive)、d:丟棄(Drop)、f:轉送(Forward)。2. 第二個欄位是事件發生的時間。3. 第三個欄位是事件發生的節點ID。4. 第四個欄位是說明這是發生在那一層的事件。RTR:路由層(Router Trace)、AGT:應用層(Agent Trace)、MAC:媒體存取層(Ma
7、c Trace)。5. 第七個欄位是封包的型態。6. 第八個欄位是封包的大小。7. 第十四個欄位是來源節點位址。(NodeID:PortNumber)8. 第十五個欄位是目的節點位址。(NodeID:PortNumber)其他欄位說明請參考1 。 若是使用相同的模擬tcl檔,但加入了如$ns_ use-newtrace (使用新的格式),則產生的範例如下所示:s -t 0.029290548 -Hs 1 -Hd -1 -Ni 1 -Nx 10.00 -Ny 40.00 -Nz 0.00 -Ne -1.000000 -Nl RTR -Nw - -Ma 0 -Md 0 -Ms 0 -Mt 0 -I
8、s 1.255 -Id -1.255 -It message -Il 32 -If 0 -Ii 0 -Iv 32 s -t 0.029365548 -Hs 1 -Hd -1 -Ni 1 -Nx 10.00 -Ny 40.00 -Nz 0.00 -Ne -1.000000 -Nl MAC -Nw - -Ma 0 -Md ffffffff -Ms 1 -Mt 800 -Is 1.255 -Id -1.255 -It message -Il 84 -If 0 -Ii 0 -Iv 32 r -t 0.030037615 -Hs 0 -Hd -1 -Ni 0 -Nx 10.00 -Ny 20.00 -N
9、z 0.00 -Ne -1.000000 -Nl MAC -Nw - -Ma 0 -Md ffffffff -Ms 1 -Mt 800 -Is 1.255 -Id -1.255 -It message -Il 32 -If 0 -Ii 0 -Iv 32 r -t 0.030062615 -Hs 0 -Hd -1 -Ni 0 -Nx 10.00 -Ny 20.00 -Nz 0.00 -Ne -1.000000 -Nl RTR -Nw - -Ma 0 -Md ffffffff -Ms 1 -Mt 800 -Is 1.255 -Id -1.255 -It message -Il 32 -If 0 -
10、Ii 0 -Iv 32圖四 DSDV且設定使用新格式的範例格式說明:1. 第一個欄位是封包事件發生的原因。s:傳送(send)、r: 接收(Receive)、d:丟棄(Drop)、f:轉送(Forward)。2. 第二個欄位是事件發生的時間。 -t time (時間)3. 第三個欄位是下一站的資訊(Next hop info)。-Hs: id for this node-Hd: id the next hop towards the destination4. 第四個欄位是節點屬性類型標籤(Node property type tag)。-Ni: node id-Nx Ny -Nz: node
11、s x/y/z coordinate-Ne: node energy level-Nl: trace level, such as AGT, RTR, MAC-Nw: reason for the event5. 第五個欄位是封包在IP層的資訊 (Packet information at IP level)。-Is: source address. Source port number (來源位置,a.b其中a為節點ID,b為埠號)-Id: dest address.dest port number (目的位置)-It: packet type (封包類型)-Il: packet size
12、(封包大小)-If: flow id (資料流ID)-Ii: unique id (唯一的ID編號)-Iv: ttl value (Time To Live的值)6. 第六個欄位是MAC層的資訊 (packet info at MAC level)。 -Ma: duration-Md: destinations ethernet address-Ms: sources ethernet address-Mt: ethernet type其他欄位說明請參考1 。看完以上的簡介後,讀者就會發現若是直接去分析NS2在模擬過程所產生的記錄檔是一件辛苦的事情,當使用不同的路由協定或者模擬的環境不同時,所
13、需要的分析程式就會不同,因而造成使用者的不便。所以筆者就開發了新的記錄檔的方式,讓使用者能方便地分析模擬的結果。筆者所採用的方法是當有一條以UDP為傳輸協定的應用程式開始發送資料時,當封包從應用程式層到UDP層時,我們就把封包的序號、時間、和大小記錄到一個檔案中(發送端記錄檔),而當封包到達接收端時,同樣地我們把收到的封包序號、傳送時間(在傳送端要發送封包時會把當時的時間放在封包的標頭檔common header中)、到達時間、封包延遲時間(=到達時間 - 傳送時間)、和封包大小記錄到另一個檔案中(接收端記錄檔),有了這兩個記錄檔,我們要求得吞吐量、封包延遲、抖動率、或封包遺失率就變得很簡單了
14、。對於封包遺失率,我們可以先計算發送端記錄檔中有多少筆記錄,每一筆記錄就代表一個送出封包的資訊,因此有多少筆記錄就代表有多少封包被送出,同理,我們去計算接收端記錄檔中有多少記錄,每一筆記錄代表每一個所接収封包的資訊,因此有多少筆記錄就代表有多少封包被接收,從這兩個數值的差值我們就可以得知會有多少的封包在傳送的過程被丟棄了,然後再把這個差值除以全部送出的封包量,就可以得到封包遺失率。對於封包延遲,則可以直接從接收端記錄檔的第四欄得到。對於抖動率(jitter),則可以使用封包延遲時間差距除以封包序號差距得到(jitter ( (recvtime(j) - sendtime(j) ) - (rec
15、vtime(i) - sendtime(i) ) ) / (j-i) = delay(j) - delay(i) / (j-1), 其中 ji )。對於吞吐量,則可以把所接收的封包大小總和除以所花費的時間就可以得到。若是要求得以TCP為傳輸協定的應用程式的吞吐量,方法也跟UDP相同,直接分析接收端記錄檔的資訊就可以了。實驗步驟有線網路模擬環境:如下圖所示,這個網路的環境包含了兩個傳輸節點s1和s2,路由器r,和資料接收端d。s1到r之間與s2到r之間的網路頻寬都是2Mbps,傳遞延遲時間是10ms。網路架構中的頻寬瓶頸是在r到d之間,頻寬為1.7Mbps,傳遞延遲的時間為20ms。所有鏈路的管
16、理機制都是採用DropTail,且r到d之間的最大佇列長度(queue limit)是10個封包的長度。在s1到d之間會有一條FTP的連線,另外,在s2到d之間有一條CBR的連線, 其傳送速度為1Mbps,每一個封包大小為1Kbytes。CBR是在0.1秒開始傳送,在4.5秒結束傳輸;FTP是在1.0秒開始傳送,4.0秒結束傳輸。 TCL程式碼。(book/lab8/wired-measure.tcl)# 產生一個模擬的物件set ns new Simulator#針對不同的資料流定義不同的顏色,這是要給NAM用的$ns color 1 Blue$ns color 2 Red#開啟一個NAM
17、記錄檔set nf open out.nam w$ns namtrace-all $nf#開啟一個模擬過程記錄檔,用來記錄封包傳送的過程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#產生傳輸節點, s1的id為0, s2的id為1set s1 $ns nodeset s2 $ns node#產生路由器節點, r的id為2set r $n
18、s node#產生資料接收節點, d的id為3set d $ns node#s1-r的鏈路具有2Mbps的頻寬,10ms的傳遞延遲時間,DropTail的佇列管理方式#s2-r的鏈路具有2Mbps的頻寬,10ms的傳遞延遲時間,DropTail的佇列管理方式#r-d的鏈路具有1.7Mbps的頻寬,20ms的傳遞延遲時間,DropTail的佇列管理方式$ns duplex-link $s1 $r 2Mb 10ms DropTail$ns duplex-link $s2 $r 2Mb 10ms DropTail$ns duplex-link $r $d 1.7Mb 20ms DropTail#設定
19、r到d之間的Queue Limit為10個封包大小$ns queue-limit $r $d 10#設定節點的位置,這是要給NAM用的$ns duplex-link-op $s1 $r orient right-down$ns duplex-link-op $s2 $r orient right-up$ns duplex-link-op $r $d orient right#觀測r到d之間queue的變化,這是要給NAM用的$ns duplex-link-op $r $d queuePos 0.5#建立一條TCP的連線set tcp new Agent/TCP$ns attach-agent
20、$s1 $tcp# mTcpSink是TCPsink的延申,除了具有TCPSink的功能外,也能記錄所送出封包資訊set sink new Agent/TCPSink/mTcpSink#設定tcp接收記錄檔的檔名為tcp_sink$sink set_filename tcp_sink$ns attach-agent $d $sink$ns connect $tcp $sink#在NAM中,TCP的連線會以藍色表示$tcp set fid_ 1#在TCP連線之上建立FTP應用程式set ftp new Application/FTP$ftp attach-agent $tcp$ftp set t
21、ype_ FTP#建立一條mUDP的連線#mUDP是UDP的延申,除了具有UDP的功能外,也能記錄所送出封包資訊set udp new Agent/mUDP#設定傳送記錄檔檔名為sd_udp$udp set_filename sd_udp$ns attach-agent $s2 $udp#新增的接收Agent,可以把接收封包資訊記錄到檔案中set null new Agent/mUdpSink#設定接收檔記錄檔檔名為rd_udp$null set_filename rd_udp$ns attach-agent $d $null$ns connect $udp $null#在NAM中,UDP的連
22、線會以紅色表示$udp set fid_ 2#在UDP連線之上建立CBR應用程式set cbr new Application/Traffic/CBR$cbr attach-agent $udp$cbr set type_ CBR#設定傳送封包的大小為1000 byte$cbr set packet_size_ 1000#設定傳送的速率為1Mbps$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$n
23、s at 4.5 $cbr stop#結束TCP的連線(不一定需要寫下面的程式碼來實際結束連線)$ns at 4.5 $ns detach-agent $s1 $tcp ; $ns detach-agent $d $sink#在模擬環境中,5秒後去呼叫finish來結束模擬(這樣要注意模擬環境中#的5秒並不一定等於實際模擬的時間$ns at 5.0 finish#執行模擬$ns run執行方式: $ns wired-measure.tcl模擬結束後就會產生tcp_sink,sd_udp,和rd_udp三個記錄檔。 計算CBR的封包遺失率。從sd_udp檔案中,可以得知共有550筆記錄;從rd_
24、udp檔案中,可以得知共有542筆記錄,所以共有8個封包遺失,因此封包遺失率就為8/550 = 1.45% 求得封包延遲時間。$awk print $1, $4 rd_udp cbr_delay說明:使用awk,把rd_udp檔案中的第一(封包序號)和第四欄(封包延遲時間)列印到cbr_delay的檔案中。使用gnuplot畫出cbr_delay。gnuplot plot “cbr_delay” title cbr: packet delaywith linespoints 1gnuplot set xlabel packet sequencegnuplot set ylabel delay
25、time (sec)gnuplot set terminal gifgnuplot set output “cbr_delay.gif”gnuplot replot結果是不是跟第一本計算機網路實驗當中使用awk分析原本的記錄檔一樣呢。 求得抖動率。awk 分析程式 (measure-jitter.awk) 。BEGIN last_pkt_id = -1; last_e2e_delay = -1; pkt_id = $1; send_time = $2; rcv_time = $3; e2e_delay = $4; pkt_size = $5; if( last_pkt_id !=-1) jit
26、ter = (e2e_delay - last_e2e_delay) / (pkt_id - last_pkt_id); printf(%f %fn, send_time, jitter); last_pkt_id = pkt_id; last_e2e_delay = e2e_delay;執行方法:$awk f measure-jitter.awk rd_udp cbr_jittergnuplot plot “cbr_jitter” title cbr: packet jitterwith linespoints 1gnuplot set xlabel packet start time (s
27、ec)gnuplot set ylabel jitter (sec)gnuplot set terminal gifgnuplot set output “cbr_jitter.gif”gnuplot replot 求得吞吐量。Perl分析UDP吞吐量程式 (measure-throughput.pl)#使用方法: perl measure-throughput.pl #記錄檔檔名$infile=$ARGV0;#多少時間計算一次(單位為秒)$granularity=$ARGV1;$sum=0;$sum_total=0;$clock=0;$maxrate=0;$init=0;#打開記錄檔open
28、 (DATA,$infile) | die Cant open $infile $!; #讀取記錄檔中的每行資料,資料是以空白分成眾多欄位 while () x = split( ); if($init=0) $start=$x2; $init=1; #讀取的第零個欄位是pkt_id#讀取的第一個欄位是封包傳送時間#讀取的第二個欄位是封包接收時間#讀取的第三個欄位是封包end to end delay#讀取的第四個欄位是封包大小 #判斷所讀到的時間,是否已經達到要統計吞吐量的時候 if ($x2-$clock $maxrate) $maxrate=$throughput; #輸出結果: 時間
29、吞吐量(bps) print STDOUT $x2: $throughput bpsn; #設定下次要計算吞吐量的時間 $clock=$clock+$granularity; $sum_total=$sum_total+$x4; $sum=$x4; $endtime=$x2; #計算最後一次的吞吐量大小 $throughput=$sum*8.0/$granularity;print STDOUT $x2: $throughput bpsn;$clock=$clock+$granularity;$sum=0;#print STDOUT $sum_total $start $endtimen;$avgrate=$sum_tot
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1