网络能量测量.docx
《网络能量测量.docx》由会员分享,可在线阅读,更多相关《网络能量测量.docx(25页珍藏版)》请在冰豆网上搜索。
网络能量测量
實驗八網路效能量測
實驗目的
1.學習如何量測以UDP為傳輸協定的應用程式之吞吐量(throughput)、封包延遲(packetdealy)、抖動率(packetjitter)、和封包遺失率(packetlossrate)。
2.學習如何量測以TCP為傳輸協定的應用程式之吞吐量(throughput)。
背景知識
當模擬結束後,我們通常會需要使用模擬過程中所產生的模擬過程記錄檔來分析以得到吞吐量、封包延遲、抖動率、或封包遺失率。
但是,NS2所提供的模擬過程記錄檔格式並不是統一的,模擬環境若是全部都是有線的,其紀錄檔格式如下所示:
event
time
from
node
tonode
pkt
type
pktsize
flags
fid
srcaddr
dstaddr
seqnum
pktid
r:
receive(atto_node)
+:
enqueue(atqueue)
-:
dequeue(atqueue)src_addr:
node.port
d:
drop(atqueue)dst_addr:
node.port
圖一.有線網路環境下的模擬過程記錄檔格式
+0.112cbr1000-------21.03.100
-0.112cbr1000-------21.03.100
+0.10812cbr1000-------21.03.111
-0.10812cbr1000-------21.03.111
r0.11412cbr1000-------21.03.100
+0.11423cbr1000-------21.03.100
-0.11423cbr1000-------21.03.100
…………………………………………………………………
圖二.有線網路環境下的模擬過程記錄檔範例
格式說明:
1.每一筆記錄的開始都是封包事件發生的原因,若是”r”則表示封包被某個節點所接收;若是”+”則表示進入了佇列;若是”-“則表示離開佇列;若是”d”則表示封包被佇列所丟棄。
2.第二個欄位表示的是事件發生的時間。
3.欄位三和欄位四表示事件發生的地點(從fromnode到tonode)。
4.欄位五表示封包的型態。
5.欄位六是封包的大小。
6.欄位七是封包的旗標標註。
7.欄位八表示封包是屬於哪一個資料流。
8.欄位九和欄位十是表示封包的來源端和目的端,這兩個欄位的格式是a.b,a代表節點編號,b表示埠號(portnumber)。
9.欄位十一表示封包的序號;欄位十二表示封包的id。
以前面模擬過程記錄檔的第一筆為例,意思就是說有一個封包pakcetid為0,資料流id為2,序號為0,長度為1000bytes,型態為CBR,它是從來源端1.0要到目的地3.1,在時間0.1秒的時候,從節點1要進入了節點2。
若是模擬環境為無線的,則模擬過程記錄檔格式則會跟路由協定和是否有設定要使用新格式而不同,以DSDV且沒有設定使用新格式的範例如下所示:
s0.029290548_1_RTR---0message32[0000]-------[1:
255-1:
255320]
s0.029365548_1_MAC---0message84[0ffffffff1800]-------[1:
255-1:
255320]
r0.030037615_0_MAC---0message32[0ffffffff1800]-------[1:
255-1:
255320]
r0.030062615_0_RTR---0message32[0ffffffff1800]-------[1:
255-1:
255320]
s1.000000000_0_AGT---1tcp40[0000]-------[0:
01:
0320][00]00
………………………………………………………………………………………
圖三DSDV且沒有設定使用新格式的範例
格式說明:
1.第一個欄位是封包事件發生的原因。
s:
傳送(send)、r:
接收(Receive)、d:
丟棄(Drop)、f:
轉送(Forward)。
2.第二個欄位是事件發生的時間。
3.第三個欄位是事件發生的節點ID。
4.第四個欄位是說明這是發生在那一層的事件。
RTR:
路由層(RouterTrace)、AGT:
應用層(AgentTrace)、MAC:
媒體存取層(MacTrace)。
5.第七個欄位是封包的型態。
6.第八個欄位是封包的大小。
7.第十四個欄位是來源節點位址。
(NodeID:
PortNumber)
8.第十五個欄位是目的節點位址。
(NodeID:
PortNumber)
其他欄位說明請參考[1]。
若是使用相同的模擬tcl檔,但加入了如$ns_use-newtrace(使用新的格式),則產生的範例如下所示:
s-t0.029290548-Hs1-Hd-1-Ni1-Nx10.00-Ny40.00-Nz0.00-Ne-1.000000-NlRTR-Nw----Ma0-Md0-Ms0-Mt0-Is1.255-Id-1.255-Itmessage-Il32-If0-Ii0-Iv32
s-t0.029365548-Hs1-Hd-1-Ni1-Nx10.00-Ny40.00-Nz0.00-Ne-1.000000-NlMAC-Nw----Ma0-Mdffffffff-Ms1-Mt800-Is1.255-Id-1.255-Itmessage-Il84-If0-Ii0-Iv32
r-t0.030037615-Hs0-Hd-1-Ni0-Nx10.00-Ny20.00-Nz0.00-Ne-1.000000-NlMAC-Nw----Ma0-Mdffffffff-Ms1-Mt800-Is1.255-Id-1.255-Itmessage-Il32-If0-Ii0-Iv32
r-t0.030062615-Hs0-Hd-1-Ni0-Nx10.00-Ny20.00-Nz0.00-Ne-1.000000-NlRTR-Nw----Ma0-Mdffffffff-Ms1-Mt800-Is1.255-Id-1.255-Itmessage-Il32-If0-Ii0-Iv32
……………………………………………………………………………………………………………
圖四DSDV且設定使用新格式的範例
格式說明:
1.第一個欄位是封包事件發生的原因。
s:
傳送(send)、r:
接收(Receive)、d:
丟棄(Drop)、f:
轉送(Forward)。
2.第二個欄位是事件發生的時間。
-ttime(時間)
3.第三個欄位是下一站的資訊(Nexthopinfo)。
-Hs:
idforthisnode
-Hd:
idthenexthoptowardsthedestination
4.第四個欄位是節點屬性類型標籤(Nodepropertytypetag)。
-Ni:
nodeid
-Nx–Ny-Nz:
node’sx/y/zcoordinate
-Ne:
nodeenergylevel
-Nl:
tracelevel,suchasAGT,RTR,MAC
-Nw:
reasonfortheevent
5.第五個欄位是封包在IP層的資訊(PacketinformationatIPlevel)。
-Is:
sourceaddress.Sourceportnumber(來源位置,a.b其中a為節點ID,b為埠號)
-Id:
destaddress.destportnumber(目的位置)
-It:
packettype(封包類型)
-Il:
packetsize(封包大小)
-If:
flowid(資料流ID)
-Ii:
uniqueid(唯一的ID編號)
-Iv:
ttlvalue(TimeToLive的值)
6.第六個欄位是MAC層的資訊(packetinfoatMAClevel)。
-Ma:
duration
-Md:
destination’sethernetaddress
-Ms:
source’sethernetaddress
-Mt:
ethernettype
其他欄位說明請參考[1]。
看完以上的簡介後,讀者就會發現若是直接去分析NS2在模擬過程所產生的記錄檔是一件辛苦的事情,當使用不同的路由協定或者模擬的環境不同時,所需要的分析程式就會不同,因而造成使用者的不便。
所以筆者就開發了新的記錄檔的方式,讓使用者能方便地分析模擬的結果。
筆者所採用的方法是當有一條以UDP為傳輸協定的應用程式開始發送資料時,當封包從應用程式層到UDP層時,我們就把封包的序號、時間、和大小記錄到一個檔案中(發送端記錄檔),而當封包到達接收端時,同樣地我們把收到的封包序號、傳送時間(在傳送端要發送封包時會把當時的時間放在封包的標頭檔[commonheader]中)、到達時間、封包延遲時間(=到達時間-傳送時間)、和封包大小記錄到另一個檔案中(接收端記錄檔),有了這兩個記錄檔,我們要求得吞吐量、封包延遲、抖動率、或封包遺失率就變得很簡單了。
對於封包遺失率,我們可以先計算發送端記錄檔中有多少筆記錄,每一筆記錄就代表一個送出封包的資訊,因此有多少筆記錄就代表有多少封包被送出,同理,我們去計算接收端記錄檔中有多少記錄,每一筆記錄代表每一個所接収封包的資訊,因此有多少筆記錄就代表有多少封包被接收,從這兩個數值的差值我們就可以得知會有多少的封包在傳送的過程被丟棄了,然後再把這個差值除以全部送出的封包量,就可以得到封包遺失率。
對於封包延遲,則可以直接從接收端記錄檔的第四欄得到。
對於抖動率(jitter),則可以使用封包延遲時間差距除以封包序號差距得到(jitter=((recvtime(j)-sendtime(j))-(recvtime(i)-sendtime(i)))/(j-i)=delay(j)-delay(i)/(j-1),其中j>i)。
對於吞吐量,則可以把所接收的封包大小總和除以所花費的時間就可以得到。
若是要求得以TCP為傳輸協定的應用程式的吞吐量,方法也跟UDP相同,直接分析接收端記錄檔的資訊就可以了。
實驗步驟
[有線網路]
模擬環境:
如下圖所示,這個網路的環境包含了兩個傳輸節點s1和s2,路由器r,和資料接收端d。
s1到r之間與s2到r之間的網路頻寬都是2Mbps,傳遞延遲時間是10ms。
網路架構中的頻寬瓶頸是在r到d之間,頻寬為1.7Mbps,傳遞延遲的時間為20ms。
所有鏈路的管理機制都是採用DropTail,且r到d之間的最大佇列長度(queuelimit)是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)
#產生一個模擬的物件
setns[newSimulator]
#針對不同的資料流定義不同的顏色,這是要給NAM用的
$nscolor1Blue
$nscolor2Red
#開啟一個NAM記錄檔
setnf[openout.namw]
$nsnamtrace-all$nf
#開啟一個模擬過程記錄檔,用來記錄封包傳送的過程
setnd[openout.trw]
$nstrace-all$nd
#定義一個結束的程序
procfinish{}{
globalnsnfnd
$nsflush-trace
close$nf
close$nd
#以背景執行的方式去執行NAM
#execnamout.nam&
exit0
}
#產生傳輸節點,s1的id為0,s2的id為1
sets1[$nsnode]
sets2[$nsnode]
#產生路由器節點,r的id為2
setr[$nsnode]
#產生資料接收節點,d的id為3
setd[$nsnode]
#s1-r的鏈路具有2Mbps的頻寬,10ms的傳遞延遲時間,DropTail的佇列管理方式
#s2-r的鏈路具有2Mbps的頻寬,10ms的傳遞延遲時間,DropTail的佇列管理方式
#r-d的鏈路具有1.7Mbps的頻寬,20ms的傳遞延遲時間,DropTail的佇列管理方式
$nsduplex-link$s1$r2Mb10msDropTail
$nsduplex-link$s2$r2Mb10msDropTail
$nsduplex-link$r$d1.7Mb20msDropTail
#設定r到d之間的QueueLimit為10個封包大小
$nsqueue-limit$r$d10
#設定節點的位置,這是要給NAM用的
$nsduplex-link-op$s1$rorientright-down
$nsduplex-link-op$s2$rorientright-up
$nsduplex-link-op$r$dorientright
#觀測r到d之間queue的變化,這是要給NAM用的
$nsduplex-link-op$r$dqueuePos0.5
#建立一條TCP的連線
settcp[newAgent/TCP]
$nsattach-agent$s1$tcp
#mTcpSink是TCPsink的延申,除了具有TCPSink的功能外,也能記錄所送出封包資訊
setsink[newAgent/TCPSink/mTcpSink]
#設定tcp接收記錄檔的檔名為tcp_sink
$sinkset_filenametcp_sink
$nsattach-agent$d$sink
$nsconnect$tcp$sink
#在NAM中,TCP的連線會以藍色表示
$tcpsetfid_1
#在TCP連線之上建立FTP應用程式
setftp[newApplication/FTP]
$ftpattach-agent$tcp
$ftpsettype_FTP
#建立一條mUDP的連線
#mUDP是UDP的延申,除了具有UDP的功能外,也能記錄所送出封包資訊
setudp[newAgent/mUDP]
#設定傳送記錄檔檔名為sd_udp
$udpset_filenamesd_udp
$nsattach-agent$s2$udp
#新增的接收Agent,可以把接收封包資訊記錄到檔案中
setnull[newAgent/mUdpSink]
#設定接收檔記錄檔檔名為rd_udp
$nullset_filenamerd_udp
$nsattach-agent$d$null
$nsconnect$udp$null
#在NAM中,UDP的連線會以紅色表示
$udpsetfid_2
#在UDP連線之上建立CBR應用程式
setcbr[newApplication/Traffic/CBR]
$cbrattach-agent$udp
$cbrsettype_CBR
#設定傳送封包的大小為1000byte
$cbrsetpacket_size_1000
#設定傳送的速率為1Mbps
$cbrsetrate_1mb
$cbrsetrandom_false
#設定FTP和CBR資料傳送開始和結束時間
$nsat0.1"$cbrstart"
$nsat1.0"$ftpstart"
$nsat4.0"$ftpstop"
$nsat4.5"$cbrstop"
#結束TCP的連線(不一定需要寫下面的程式碼來實際結束連線)
$nsat4.5"$nsdetach-agent$s1$tcp;$nsdetach-agent$d$sink"
#在模擬環境中,5秒後去呼叫finish來結束模擬(這樣要注意模擬環境中
#的5秒並不一定等於實際模擬的時間
$nsat5.0"finish"
#執行模擬
$nsrun
執行方式:
$nswired-measure.tcl
模擬結束後就會產生tcp_sink,sd_udp,和rd_udp三個記錄檔。
●計算CBR的封包遺失率。
從sd_udp檔案中,可以得知共有550筆記錄;從rd_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:
packetdelay’withlinespoints1
gnuplot>setxlabel‘packetsequence’
gnuplot>setylabel‘delaytime(sec)’
gnuplot>setterminalgif
gnuplot>setoutput“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){
jitter=(e2e_delay-last_e2e_delay)/(pkt_id-last_pkt_id);
printf("%f%f\n",send_time,jitter);
}
last_pkt_id=pkt_id;
last_e2e_delay=e2e_delay;
}
{
}
執行方法:
$awk–fmeasure-jitter.awkrd_udp>cbr_jitter
gnuplot>plot“cbr_jitter”title‘cbr:
packetjitter’withlinespoints1
gnuplot>setxlabel‘packetstarttime(sec)’
gnuplot>setylabel‘jitter(sec)’
gnuplot>setterminalgif
gnuplot>setoutput“cbr_jitter.gif”
gnuplot>replot
●求得吞吐量。
Perl分析UDP吞吐量程式(measure-throughput.pl)
#使用方法:
perlmeasure-throughput.pl
#記錄檔檔名
$infile=$ARGV[0];
#多少時間計算一次(單位為秒)
$granularity=$ARGV[1];
$sum=0;
$sum_total=0;
$clock=0;
$maxrate=0;
$init=0;
#打開記錄檔
open(DATA,"<$infile")
||die"Can'topen$infile$!
";
#讀取記錄檔中的每行資料,資料是以空白分成眾多欄位
while(){
@x=split('');
if($init==0){
$start=$x[2];
$init=1;
}
#讀取的第零個欄位是pkt_id
#讀取的第一個欄位是封包傳送時間
#讀取的第二個欄位是封包接收時間
#讀取的第三個欄位是封包endtoenddelay
#讀取的第四個欄位是封包大小
#判斷所讀到的時間,是否已經達到要統計吞吐量的時候
if($x[2]-$clock<=$granularity)
{
#計算單位時間內累積的封包大小
$sum=$sum+$x[4];
#計算累積的總封包大小
$sum_total=$sum_total+$x[4];
}
else
{
#計算吞吐量
$throughput=$sum*8.0/$granularity;
if($throughput>$maxrate){
$maxrate=$throughput;
}
#輸出結果:
時間吞吐量(bps)
printSTDOUT"$x[2]:
$throughputbps\n";
#設定下次要計算吞吐量的時間
$clock=$clock+$granularity;
$sum_total=$sum_total+$x[4];
$sum=$x[4];
}
}
$endtime=$x[2];
#計算最後一次的吞吐量大小
$throughput=$sum*8.0/$granularity;
printSTDOUT"$x[2]:
$throughputbps\n";
$clock=$clock+$granularity;
$sum=0;
#printSTDOUT"$sum_total$start$endtime\n";
$avgrate=$sum_tot