马元飞
(内蒙古集宁师范学院,内蒙古 乌兰察布 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.