基于NS2的Ad Hoc网络AODV路由协议仿真

原创


修改人


修改时间


版本

微风无尘


微风无尘


2011.5.30


V1.1

实验环境说明:

1.版本:Ubuntu11.04; ns2.33。

2.cbrgen.tcl文件在路径:~/ns-allinone-2.33/ns-2.33/indep-utils/cmu-scen-gen/。

3. setdest路径:~/ns-allinone-2.33/ ns-2.33/indep-utils/cmu-scen-gen/etdest/。

4. AODV协议测试文件路径:~/ns-allinone-2.33/ ns-2.33/AODV/testfile/。

实验目的:

1.学习Ad Hoc网络AODV路由协议与其在NS2中的仿真;

2.掌握NS2中的随机数据流与随机场景的生成;

3.初步学习使用对trace文件的处理方法,学习gnuplot工具的使用和Linux操作系统的shell编程。



实验主要参考文献:

[1]马崇霄,吴长奇.基于网络仿真器NS2的Adhoc网络路由协议仿真[J].电子测量技术,2008(5):75-79



实验代码下载地址:

http://ishare.iask.sina.com.cn/f/16457611.html



一、场景测试

1、生成随机数据流

cbrgen.tcl

使用格式:

usage: cbrgen.tcl [-type cbr|tcp] [-nn nodes] [-seed seed] [-mc connections] [-rate rate]

(如果生成的随机数据流文件里只有上面的这一句的话,可能是命令的格式错误,注意参数之间用空格符分开)



2、生成随机场景

setdest

setdest -v -n -p -M -t -x -y

or

setdest -v -n -s -m -M -t -P -p -x -y

默认版本为第一版。



实验步骤:

步骤一:在终端~/ns-allinone-2.33/ ns-2.33/indep-utils/cmu-scen-gen/路径下输入命令:

ns cbrgen.tcl -type cbr -nn 50 -seed 1 -mc 10 -rate 2.0 > cbr-50n-10c-2p



注:也可以将cbrgen.tcl复制到所需文件夹下直接命令行运行。

该命令创建了一个具有50个移动节点、10对通信连接、每秒钟发送2个分组的以CBR为业务源的通信场景文件cbr-50n-10c-2p。



步骤二:在终端~/ns-allinone-2.33/ ns-2.33/indep-utils/cmu-scen-gen/setdest/路径下输入命令:

./setdest -n 50 -p 0 -M 20 -t 300 -x 1000 -y 300 > scene-50n-0p-20M-300t-1000-300



注:如果在终端~/ns-allinone-2.33/ ns-2.33/indep-utils/cmu-scen-gen/setdest/路径下输入命令:

cp setdest /usr/local/bin/

将可执行文件setdest复制到/usr/local/bin/文件夹目录里,即可在任意文件夹路径下使用setdest命令。



参考文章[1]中所使用命令为:

./setdest -n 50 -p 0 -s 20 -t 300 -x 1000 -y 300 > scene-50n-0p-20M-300t-1000-300

按文章[1]使用该命令会出现以下错误:

setdest: setdest.cc:595: void Node::RandomSpeed(): Assertion `speed != 0.0' failed.

已放弃

这是错误的,因为参数-s表示的是:speed type (uniform, normal),而-m表示的最小速度,-M表示的是最大速度。



该命令创建一个具有50个节点、节点在每个地点停留0秒(即不停留)、最大移动速度20m/s,仿真时间300秒,长1000米,宽300米的移动场景文件scene-50n-0p-20M-300t-1000-300。



步骤三:将生成的随机数据流文件cbr-50n-10c-2p与场景文件scene-50n-0p-20M-300t-1000-300拷贝到运行的程序所在文件夹中(如~/ns-allinone-2.33/ ns-2.33/AODV/testfile/)。



步骤四:

在终端输入~/ns-allinone-2.33/ ns-2.33/AODV/testfile/路径下输入命令:

ns aodv.tcl

按照参考文献[1]所给的代码运行到这步的时候可能出现的错误及其对应的解决方法见我博客的另一篇文章《实验三中可能出现的错误及其解决方法》。

改正并无错误之后,显示(不同的测试显示的具体内容可能不一样):

warning: Please use -channel as shown in tcl/ex/wireless-mitf.tcl

INITIALIZE THE LIST xListHead

SORTING LISTS ...DONE!

channel.cc:sendUp - Calc highestAntennaZ_ and distCST_

highestAntennaZ_ = 1.5, distCST_ = 550.0

Client 8: Handoff Attempted

Client 9: Handoff Attempted

Client 36: Handoff Attempted

Client 14: Handoff Attempted

Client 6: Handoff Attempted

Client 35: Handoff Attempted

Client 34: Handoff Attempted

Client 38: Handoff Attempted

Client 7: Handoff Attempted

Client 15: Handoff Attempted
二、trace仿真数据文件分析

表1仿真参数表:

参数类型


参数值

Simulation Time


300 sec

Simulation Terrain


1000m*300m

Number of nodes


50

Mobility Model Random


waypoint

Mobility


0~20m/s

Radio frequency


2.4GHz

Mac protocol


802.11

Transmission range


250m



先撰写awk脚本,再用nawk命令运行。

1、分组投递率

awk脚本:

# getRatio.awk 分组投递率分析

# 初始化设定

BEGIN {

sendLine = 0;

recvLine = 0;

fowardLine = 0;

}

# 应用层收到包

$0 ~/^s.* AGT/ {

sendLine ++ ;

}

# 应用层发送包

$0 ~/^r.* AGT/ {

recvLine ++ ;

}

# 路由层转发包

$0 ~/^f.* RTR/ {

fowardLine ++ ;

}

# 最后输出结果

END {

printf "cbr s:%d r:%d, r/s Ratio:%.4f, f:%d \n", sendLine, recvLine, (recvLine/sendLine),fowardLine;

}



输入命令:

nawk -f getRatio.awk aodv.tr

显示:

cbr s:5012 r:4839, r/s Ratio:0.9655, f:7138



2、路由发起频率

awk脚本:

#frequency.awk

BEGIN{

requests=0;

frequency=0;

}

{

id=$5;

source_ip=$57;

if(($1=="s") && ($61=="REQUEST") && (id==source_ip))

{requests++;}

}

END{

frequency=requests/300;

printf("%.4f\n",frequency);

}



输入命令:

nawk -f frequency.awk aodv.tr

显示:

0.6767



3、归一化路由开销

awk脚本:

#load.awk

BEGIN{

recvLine=0;

load=0;

Normalized_load=0;

}

{

if(($1=="r") && ($19=="AGT") && ($35=="cbr"))

{

recvLine++;

}

if((($1=="s") || ($1=="f")) && ($19=="RTR") && (($35=="AODV")||($35=="message")))

{

load++;

}

}

END{

Normalized_load=load/recvLine;

printf("l:%d,nload:%.4f\n",load,Normalized_load);

}



输入命令:

nawk -f load.awk aodv.tr

显示:

l:10360,nload:2.1409



4.平均时延

awk脚本:

#delay.awk

BEGIN{

highest_packet_id=0;

duration_total=0;

}

$0 ~/^r.*AGT/{

receives++;

}

{

time=$3;

packet_id=$41;

if(($1=="s") && ($19=="AGT") && (start_time[packet_id]==0)) {

start_time[packet_id]=time;

if(packet_id>highest_packet_id)

highest_packet_id=packet_id;

}

if(($1=="r") && ($19=="AGT") && (end_tim[packet_id]==0)) {

end_time[packet_id]=time;

}

if($1=="d"){

end_time[packet_id]=-1;

}

}

END{

for(packet_id = 0; packet_id <= highest_packet_id; packet_id++) {

start=start_time[packet_id];

end=end_time[packet_id];

if(end != -1 && start < end) {

packet_duration=end - start;

duration_total = duration_total + packet_duration;

}

}

printf("%.4f\n",duration_total/receives);

}



输入命令:

nawk -f delay.awk aodv.tr

显示:

0.0270
三、绘制图表并进行性能分析

参考文章[1]中使用MATLAB画图,其实我们在Linux环境下可以使用gnuplot和xgraph进行画图。

由于运动场景是随机生成的,一次场景的生成具有随机性,故需要在同样的业务负载下进行几次运动场景的测试后取平均值来评价一个协议的性能。

为了实现使用5种不同的暂停时间:0s,50s,100s,200s和300s,并取5次仿真结果的平均值,对aodv.tcl进行多次测试,并生成5种随机场景和随机数据流。

参考文献[1]中对10个和20个CBR业务源轻载和中载两种情况分别进行仿真实验。

需要撰写批处理文件(shell代码),也可以重复测试5次,再取平均值。



1、多次测试(shell代码)

撰写批处理文件,此处以计算分组投递率为例。

(1)为了实现对10个和20个CBR业务两种情况分别计算5次分组投递率仿真结果平均值,我们对getRatio.awk作修改,另存为getRatio2.awk,其代码如下:

# getRatio2.awk 分组投递率分析

# 初始化设定

BEGIN {

sendLine = 0;

recvLine = 0;

fowardLine = 0;

}

# 应用层收到包

$0 ~/^s.* AGT/ {

sendLine ++ ;

}

# 应用层发送包

$0 ~/^r.* AGT/ {

recvLine ++ ;

}

# 路由层转发包

$0 ~/^f.* RTR/ {

fowardLine ++ ;

}

# 最后输出结果

END {

#printf "cbr s:%d r:%d, r/s Ratio:%.4f, f:%d \n", sendLine, recvLine, (recvLine/sendLine),fowardLine;

printf "%d %.4f\n", scr, (recvLine/sendLine) >> outfile;

}

(2)shell代码文件run代码如下:

#!/bin/sh

#判断以下文件是否存在,如果存在,则将其删除

#$1.1.data

if [ -f $1.1.data ]; then

rm $1.1.data;

fi

#$1.1.temp

if [ -f $1.1.temp ]; then

rm $1.1.temp;

fi

#$1.2.data

if [ -f $1.2.data ]; then

rm $1.2.data;

fi

#$1.2.temp

if [ -f $1.2.temp ]; then

rm $1.2.temp;

fi

#$1.plot

if [ -f $1.plot ]; then

rm $1.plot;

fi



for j in 0 50 100 200 300

do

for i in $(seq 1 1 5)

do

setdest -n 50 -p $j -M 20 -t 300 -x 1000 -y 300 > scene-50n-0p-20M-300t-1000-300



#生成数据流场景1

ns cbrgen.tcl -type cbr -nn 50 -seed 1 -mc 10 -rate 2.0 > cbr-50n-10c-2p

ns aodv.tcl ; #一次NS运行

nawk -v outfile=$1.1.temp -v scr=$i -f getRatio2.awk $1.tr



#生成数据流场景2

ns cbrgen.tcl -type cbr -nn 50 -seed 1 -mc 20 -rate 2.0 > cbr-50n-10c-2p

ns aodv.tcl ; #一次NS运行

nawk -v outfile=$1.2.temp -v scr=$i -f getRatio2.awk $1.tr

done

nawk -v outfile=$1.1.data -v time=$j -f average.awk $1.1.temp

rm $1.1.temp



nawk -v outfile=$1.2.data -v time=$j -f average.awk $1.2.temp

rm $1.2.temp

done



echo "#'!'/bin/sh" >> $1.plot

echo "set terminal gif small x255255255" >> $1.plot

echo "set output \"$1.gif\"" >> $1.plot

echo "set ylabel \"Ratio(%)\"" >> $1.plot

echo "set xlabel \"Settle Times(s)\"" >> $1.plot

echo "set key left top box" >> $1.plot

echo "set title \"AODV Ratio result\"" >> $1.plot

echo "plot \"$1.1.data\" title \"$1-cbr 10\" with linespoints, \"$1.2.data\" title \"$1-cbr 20\" with linespoints" >> $1.plot



gnuplot $1.plot

(3)其中计算平均awk脚本average.awk代码如下:

BEGIN{

average=0.0;

}

{

if($1=="1"){

average=average + $2;

}

if($1=="2"){

average=average + $2;

}

if($1=="3"){

average=average + $2;

}

if($1=="4"){

average=average + $2;

}

if($1=="5"){

average=average + $2;

}

}

END {

printf "%d %.4f \n",time, (average/5) >> outfile;

}



实验步骤:

在路径~/ns-allinone-2.33/ ns-2.33/AODV/testfile/下输入命令:

sh run aodv



其中aovd为运行shell代码文件run的参数。这里要运行很长一段时间。

运行完毕之后,会得到aodv.1.data、aodv.2.data、aodv.jpg与aodv.plot三个文件。aodv.jpg就是我们需要的分组投递率曲线。



图1 aodv.jpg

上图与参考文献中的图1相对应,注意上图的纵坐标与参考文献中的图1中的有差异,就不改了。



路由发起频率、归一化路由开销、平均时延的对比与上面计算分组投递率对比的实验过程是相似的。这里只介绍方法,具体实验步骤和结果有空再补上吧。





参考文献:

[1]马崇霄,吴长奇.基于网络仿真器NS2的Adhoc网络路由协议仿真[J].电子测量技术,2008(5):75-79





 

 posted on 2012-02-13 14:35  Fuzzy Joke  阅读(2171)  评论(2编辑  收藏  举报