馬元飛
(內(nèi)蒙古集寧師范學(xué)院,內(nèi)蒙古 烏蘭察布 012000)
網(wǎng)絡(luò)性能分析[1]一般有以下3種手段:數(shù)學(xué)分析法、實(shí)驗(yàn)探究法和仿真模擬法。然而前兩種方法都存在很大的局限性:數(shù)學(xué)分析法的有效性和精確性受假設(shè)限制很大,一些假設(shè)無法對(duì)復(fù)雜網(wǎng)絡(luò)系統(tǒng)進(jìn)行準(zhǔn)確的限定和描述;實(shí)驗(yàn)探究法局限于成本居高不下,重新配置與資源共享難度大,運(yùn)行缺少靈活性,實(shí)驗(yàn)床規(guī)模難以做到很大,不能實(shí)現(xiàn)網(wǎng)絡(luò)中多種通信量和拓?fù)涞娜诤?。而仿真模擬的方法可以彌補(bǔ)前兩種方法的不足,它采用計(jì)算機(jī)程序?qū)W(wǎng)絡(luò)進(jìn)行模型化,通過程序的運(yùn)行模擬仿真網(wǎng)絡(luò)的運(yùn)行過程。仿真模擬法利用數(shù)學(xué)建模和統(tǒng)計(jì)分析的方法模擬網(wǎng)絡(luò)行為,通過建立網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)鏈路的統(tǒng)計(jì)模型,模擬網(wǎng)絡(luò)流量的傳輸,從而獲取網(wǎng)絡(luò)設(shè)計(jì)及優(yōu)化所需要的網(wǎng)絡(luò)性能數(shù)據(jù)。
NS2[2]是一個(gè)面向?qū)ο蟆⒖蓴U(kuò)展的離散事件驅(qū)動(dòng)的網(wǎng)絡(luò)仿真器,其核心部分是一個(gè)離散事件模擬引擎。NS2仿真器具有強(qiáng)大的數(shù)據(jù)處理功能,可擴(kuò)展性強(qiáng),執(zhí)行效率高,且仿真結(jié)果的可靠性高。NS2支持TCP、UDP等傳輸層網(wǎng)絡(luò)協(xié)議,可以模擬網(wǎng)絡(luò)數(shù)據(jù)傳輸如FTP、CBR等以及路由隊(duì)列的管理機(jī)制如DropTail,RED和CBQ等。同時(shí),NS2可以進(jìn)行無線通信網(wǎng)絡(luò)和衛(wèi)星網(wǎng)絡(luò)進(jìn)行仿真。
NS2中并未直接提供性能分析工具,但是NS2會(huì)將仿真過程中的封包事件進(jìn)行記錄[3],本文以此為據(jù),通過對(duì)其進(jìn)行數(shù)據(jù)采集來完成性能分析。封包事件記錄每條由11個(gè)字段構(gòu)成,字段含義從左到右依次為:(1)封包事件發(fā)生原因:“r”表示接收封包,“+”表示封包入隊(duì)、"-"表示封包出隊(duì)、“d”表示丟棄封包;(2)事件發(fā)生的時(shí)間;(3)發(fā)生地點(diǎn);(4)封包類型;(5)封包大??;(6)封包標(biāo)志標(biāo)注;(7)封包數(shù)據(jù)流歸屬;(8,9)源端、目的端;(10,11)封包序號(hào)、封包 ID。為了便于執(zhí)行分析,我們將上述記錄文件分割為接收端和發(fā)送端兩個(gè)部分,其中發(fā)送端包含:序號(hào)、時(shí)間、和封包大小,接收端包含序號(hào)、傳送時(shí)間、到達(dá)時(shí)間、封包延遲時(shí)間、封包大小。
常用的網(wǎng)絡(luò)性能分析指標(biāo)[4]有吞吐量、丟包率、抖動(dòng)率等,具體內(nèi)容說明如下:(1)吞吐量定義為在一個(gè)時(shí)隙內(nèi)成功發(fā)送的數(shù)據(jù)包數(shù)量,一般指鏈路上所有通信數(shù)據(jù)總的傳輸速率,計(jì)算時(shí)采用接收的封包總大小除以所花費(fèi)的時(shí)間即可;(2)丟包率是指測試中所丟失數(shù)據(jù)包數(shù)量占所發(fā)送數(shù)據(jù)包的比率,計(jì)算采用發(fā)送端的封包數(shù)量減去接收端封包數(shù)量并除以封包總數(shù);(3)抖動(dòng)率是網(wǎng)絡(luò)延遲的變化量,它是由同一應(yīng)用的任意兩個(gè)相鄰數(shù)據(jù)包在傳輸路由
中經(jīng)過網(wǎng)絡(luò)延遲而產(chǎn)生,計(jì)算采用封包延遲時(shí)間差距除以封包序號(hào)差距得到,計(jì)算公式如下:
實(shí)驗(yàn)網(wǎng)絡(luò)環(huán)境(圖1)包括兩個(gè)傳輸節(jié)點(diǎn)s1和s2,路由器r和數(shù)據(jù)接收端d。s1到r之間和s2到r之間的網(wǎng)絡(luò)帶寬都是2Mbps,傳遞時(shí)延為10ms。網(wǎng)絡(luò)中的帶寬瓶頸在r和d之間,帶寬為1.7Mbps,傳遞時(shí)延為20ms。所有鏈路管理機(jī)制都采用DropTail,r到d之間的最大隊(duì)列長度是10個(gè)封包。s1與d之間會(huì)有一條FTP聯(lián)機(jī),另外,s2到d之間有一條CBR[3]聯(lián)機(jī),其傳送速度為1Mbps,每一個(gè)封包大小為1KB。
圖1 實(shí)驗(yàn)拓?fù)鋱D
我們假設(shè)CBR數(shù)據(jù)流持續(xù)時(shí)間從0.1秒到4.5秒,F(xiàn)TP數(shù)據(jù)流持續(xù)時(shí)間從1.0到4.0秒。按照上述網(wǎng)絡(luò)環(huán)境編寫TCL程序代碼,并在NS2中仿真執(zhí)行,得到sd_udp(發(fā)送端s2),rd_udp(接受端d)兩個(gè)記錄文件。我們以這兩個(gè)文件為數(shù)據(jù)樣本,針對(duì)CBR,完成性能分析。本文性能分析關(guān)注點(diǎn)有3個(gè)方面:丟包率、抖動(dòng)率、吞吐量。
(1)丟包率計(jì)算。從sd_udp文件中,可以得知共有550條記錄(550行):從rd_udp文件中,可以得知共有542筆記錄,所以共有8個(gè)封包遺失,因此udp封包遺失率為8/550=1.45%.
(2)抖動(dòng)率計(jì)算。計(jì)算采用AWK[5]腳本語言編寫,腳本代碼如下:
###執(zhí)行方法:###
###awk-f measure-jitter.awk rd_udp>cbr_jitter###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 ",send_time,jitter);
}
last_pkt_id=pkt_id;
last_e2e_delay=e2e_delay;
}{}
執(zhí)行后生成cbr_jitter文件,用GNUPLOT[6]作圖,得到圖2,從中發(fā)現(xiàn)在[1,4]秒時(shí)間段內(nèi),由于受到FTP數(shù)據(jù)流干擾,CBR數(shù)據(jù)流呈現(xiàn)較大的抖動(dòng),實(shí)驗(yàn)結(jié)果與預(yù)期相符。
圖2 抖動(dòng)率變化
(3)吞吐量計(jì)算
計(jì)算采用PERL腳本[7]編寫,腳本代碼如下:
#使用方法:perl measure-throughput.pl
#記錄文件文件名
$infile=$ARGV[0];
#多少時(shí)間計(jì)算一次(單位為秒)
$granularity=$ARGV[1];
$sum=0;
$sum_total=0;
$clock=0;
$maxrate=0;
$init=0;
#打開記錄文件
open(DATA,"<$infile")
||die"Can't open$infile$!";
#讀取記錄文件中的每行數(shù)據(jù),數(shù)據(jù)是以空白分成眾多字段while(){
@x=split('');
if($init==0){
$start=$x[2];$init=1;
}
#讀取的第零個(gè)字段是pkt_id
#讀取的第一個(gè)字段是封包傳送時(shí)間
#讀取的第二個(gè)字段是封包接收時(shí)間
#讀取的第三個(gè)字段是封包end to end delay
#讀取的第四個(gè)字段是封包大小
#判斷所讀到的時(shí)間,是否已經(jīng)達(dá)到要統(tǒng)計(jì)吞吐量的時(shí)候
if($x[2]-$clock<=$granularity)
{
#計(jì)算單位時(shí)間內(nèi)累積的封包大小
$sum=$sum+$x[4];
#計(jì)算累積的總封包大小
$sum_total=$sum_total+$x[4];
}
else
{
#計(jì)算吞吐量
$throughput=$sum*8.0/$granularity;
if($throughput>$maxrate){
$maxrate=$throughput;
}
#輸出結(jié)果:時(shí)間吞吐量(bps)
print STDOUT"$x[2]:$throughput bps ";
#設(shè)定下次要計(jì)算吞吐量的時(shí)間
$clock=$clock+$granularity;
$sum_total=$sum_total+$x[4];
$sum=$x[4];
}
}
$endtime=$x[2];
#計(jì)算最后一次的吞吐量大小
$throughput=$sum*8.0/$granularity;
print STDOUT"$x[2]:$throughput bps ";
$clock=$clock+$granularity;
$sum=0;
#print STDOUT"$sum_total$start$endtime ";
$avgrate=$sum_total*8.0/($endtime-$start);
print STDOUT"Average rate:$avgrate bps ";
print STDOUT"Peak rate:$maxrate bps ";
#關(guān)閉檔案
close DATA;
exit(0);
采用命令perl measure-throughput.pl rd_udp 0.5執(zhí)行后,結(jié)果如圖3,從中可以發(fā)現(xiàn)CBR最高吞吐量大約出現(xiàn)在4.5秒,也就是FTP停止后一段時(shí)間,此時(shí)正是信道被CBR獨(dú)占的時(shí)段,實(shí)驗(yàn)結(jié)果與預(yù)期相符。
圖3 吞吐量變化
隨著網(wǎng)絡(luò)的不斷發(fā)展,網(wǎng)絡(luò)結(jié)構(gòu)越來越復(fù)雜,人們對(duì)網(wǎng)絡(luò)的要求也越來越高,隨之對(duì)網(wǎng)絡(luò)性能的分析也變得越來越重要。本文從丟包率、抖動(dòng)率、吞吐量3個(gè)角度對(duì)NS2環(huán)境下網(wǎng)絡(luò)性能分析方法進(jìn)行了研究,下一步的工作可以在此基礎(chǔ)上,將該方法擴(kuò)展到更加復(fù)雜的網(wǎng)絡(luò)應(yīng)用場景,發(fā)現(xiàn)網(wǎng)絡(luò)性能的瓶頸,進(jìn)一步對(duì)網(wǎng)絡(luò)環(huán)境進(jìn)行改善,使網(wǎng)絡(luò)資源得到充分利用。
[1]趙吉波,周宇,周紅瓊.基于NS2仿真的IP網(wǎng)絡(luò)性能分析與研究[J].電子設(shè)計(jì)工程,2012,20(4):113-115.
[2]NS2.http://www.isi.edu/nsnam/ns/[EB/OL].2013
[3]柯志亨,程榮祥,鄧德雋.NS2仿真實(shí)驗(yàn)-多媒體和無線網(wǎng)絡(luò)通信[M].北京:電子工業(yè)出版社,2009.
[4]楊雅輝,李小東.IP網(wǎng)絡(luò)性能指標(biāo)體系的研究[J].通信學(xué)報(bào),2002,23(11):1-7.
[5]AWK.[EB/OL].(2012-11-22)[2013-01-11].http://www.grymoire.com/Unix/Awk.html.
[6]GNUPLOT.[EB/OL].(2012-09-03)[2013-01-11].http://www.gnuplot.info/.
[7]Brian d foy,Tom Phoenix,Randal L,Schartz.Perl語言入門.http://wenku.baidu.com/view/c8dbc908f12d2af90242e629.html[EB/OL],2006.