馬元飛
(內蒙古集寧師范學院,內蒙古 烏蘭察布 012000)
網絡性能分析[1]一般有以下3種手段:數學分析法、實驗探究法和仿真模擬法。然而前兩種方法都存在很大的局限性:數學分析法的有效性和精確性受假設限制很大,一些假設無法對復雜網絡系統進行準確的限定和描述;實驗探究法局限于成本居高不下,重新配置與資源共享難度大,運行缺少靈活性,實驗床規模難以做到很大,不能實現網絡中多種通信量和拓撲的融合。而仿真模擬的方法可以彌補前兩種方法的不足,它采用計算機程序對網絡進行模型化,通過程序的運行模擬仿真網絡的運行過程。仿真模擬法利用數學建模和統計分析的方法模擬網絡行為,通過建立網絡設備和網絡鏈路的統計模型,模擬網絡流量的傳輸,從而獲取網絡設計及優化所需要的網絡性能數據。
NS2[2]是一個面向對象、可擴展的離散事件驅動的網絡仿真器,其核心部分是一個離散事件模擬引擎。NS2仿真器具有強大的數據處理功能,可擴展性強,執行效率高,且仿真結果的可靠性高。NS2支持TCP、UDP等傳輸層網絡協議,可以模擬網絡數據傳輸如FTP、CBR等以及路由隊列的管理機制如DropTail,RED和CBQ等。同時,NS2可以進行無線通信網絡和衛星網絡進行仿真。
NS2中并未直接提供性能分析工具,但是NS2會將仿真過程中的封包事件進行記錄[3],本文以此為據,通過對其進行數據采集來完成性能分析。封包事件記錄每條由11個字段構成,字段含義從左到右依次為:(1)封包事件發生原因:“r”表示接收封包,“+”表示封包入隊、"-"表示封包出隊、“d”表示丟棄封包;(2)事件發生的時間;(3)發生地點;(4)封包類型;(5)封包大小;(6)封包標志標注;(7)封包數據流歸屬;(8,9)源端、目的端;(10,11)封包序號、封包 ID。為了便于執行分析,我們將上述記錄文件分割為接收端和發送端兩個部分,其中發送端包含:序號、時間、和封包大小,接收端包含序號、傳送時間、到達時間、封包延遲時間、封包大小。
常用的網絡性能分析指標[4]有吞吐量、丟包率、抖動率等,具體內容說明如下:(1)吞吐量定義為在一個時隙內成功發送的數據包數量,一般指鏈路上所有通信數據總的傳輸速率,計算時采用接收的封包總大小除以所花費的時間即可;(2)丟包率是指測試中所丟失數據包數量占所發送數據包的比率,計算采用發送端的封包數量減去接收端封包數量并除以封包總數;(3)抖動率是網絡延遲的變化量,它是由同一應用的任意兩個相鄰數據包在傳輸路由
中經過網絡延遲而產生,計算采用封包延遲時間差距除以封包序號差距得到,計算公式如下:

實驗網絡環境(圖1)包括兩個傳輸節點s1和s2,路由器r和數據接收端d。s1到r之間和s2到r之間的網絡帶寬都是2Mbps,傳遞時延為10ms。網絡中的帶寬瓶頸在r和d之間,帶寬為1.7Mbps,傳遞時延為20ms。所有鏈路管理機制都采用DropTail,r到d之間的最大隊列長度是10個封包。s1與d之間會有一條FTP聯機,另外,s2到d之間有一條CBR[3]聯機,其傳送速度為1Mbps,每一個封包大小為1KB。

圖1 實驗拓撲圖
我們假設CBR數據流持續時間從0.1秒到4.5秒,FTP數據流持續時間從1.0到4.0秒。按照上述網絡環境編寫TCL程序代碼,并在NS2中仿真執行,得到sd_udp(發送端s2),rd_udp(接受端d)兩個記錄文件。我們以這兩個文件為數據樣本,針對CBR,完成性能分析。本文性能分析關注點有3個方面:丟包率、抖動率、吞吐量。
(1)丟包率計算。從sd_udp文件中,可以得知共有550條記錄(550行):從rd_udp文件中,可以得知共有542筆記錄,所以共有8個封包遺失,因此udp封包遺失率為8/550=1.45%.
(2)抖動率計算。計算采用AWK[5]腳本語言編寫,腳本代碼如下:
###執行方法:###
###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;
}{}
執行后生成cbr_jitter文件,用GNUPLOT[6]作圖,得到圖2,從中發現在[1,4]秒時間段內,由于受到FTP數據流干擾,CBR數據流呈現較大的抖動,實驗結果與預期相符。

圖2 抖動率變化
(3)吞吐量計算
計算采用PERL腳本[7]編寫,腳本代碼如下:
#使用方法:perl measure-throughput.pl
#記錄文件文件名
$infile=$ARGV[0];
#多少時間計算一次(單位為秒)
$granularity=$ARGV[1];
$sum=0;
$sum_total=0;
$clock=0;
$maxrate=0;
$init=0;
#打開記錄文件
open(DATA,"<$infile")
||die"Can't open$infile$!";
#讀取記錄文件中的每行數據,數據是以空白分成眾多字段while(){
@x=split('');
if($init==0){
$start=$x[2];$init=1;
}
#讀取的第零個字段是pkt_id
#讀取的第一個字段是封包傳送時間
#讀取的第二個字段是封包接收時間
#讀取的第三個字段是封包end to end delay
#讀取的第四個字段是封包大小
#判斷所讀到的時間,是否已經達到要統計吞吐量的時候
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)
print STDOUT"$x[2]:$throughput bps ";
#設定下次要計算吞吐量的時間
$clock=$clock+$granularity;
$sum_total=$sum_total+$x[4];
$sum=$x[4];
}
}
$endtime=$x[2];
#計算最后一次的吞吐量大小
$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 ";
#關閉檔案
close DATA;
exit(0);
采用命令perl measure-throughput.pl rd_udp 0.5執行后,結果如圖3,從中可以發現CBR最高吞吐量大約出現在4.5秒,也就是FTP停止后一段時間,此時正是信道被CBR獨占的時段,實驗結果與預期相符。

圖3 吞吐量變化
隨著網絡的不斷發展,網絡結構越來越復雜,人們對網絡的要求也越來越高,隨之對網絡性能的分析也變得越來越重要。本文從丟包率、抖動率、吞吐量3個角度對NS2環境下網絡性能分析方法進行了研究,下一步的工作可以在此基礎上,將該方法擴展到更加復雜的網絡應用場景,發現網絡性能的瓶頸,進一步對網絡環境進行改善,使網絡資源得到充分利用。
[1]趙吉波,周宇,周紅瓊.基于NS2仿真的IP網絡性能分析與研究[J].電子設計工程,2012,20(4):113-115.
[2]NS2.http://www.isi.edu/nsnam/ns/[EB/OL].2013
[3]柯志亨,程榮祥,鄧德雋.NS2仿真實驗-多媒體和無線網絡通信[M].北京:電子工業出版社,2009.
[4]楊雅輝,李小東.IP網絡性能指標體系的研究[J].通信學報,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.