原创 微风无尘[本人已经做部分修改,可以照着做]
版本 V1.1+
实验环境说明:
1.版本:Ubuntu10.04; ns2.35。
【这里建议大家之前安装ns的时候,将ns-allinone-2.35文件夹重命名为ns,这样在打命令时候可以少打一些字符】
2.cbrgen.tcl文件在路径:~/ns-allinone-2.35/ns-2.35/indep-utils/cmu-scen-gen/。
3. setdest路径:~/ns-allinone-2.35/ ns-2.35/indep-utils/cmu-scen-gen/setdest/。
4. AODV协议测试文件路径:~/ns-allinone-2.35/ ns-2.35/AODV/testfile/。
[需要自己新建AODV以及testfile文件夹或者新建AODV文件夹之后偷懒将实验代码文件夹复制进去]
需要放进去的文件有9个,分别是:1aodc.tcl,2average.awk,3delay.awk,4frequency.awk,5getRatio.awk,6load.awk,7getRatio2.awk,8cbrgen.tcl,9run
实验目的:
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
前面几个步骤是让大家熟悉原理。
真正做的时候,在其他东西设置好的情况下,可以直接运行run,得到结果的。
一、场景测试
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.35/ns-2.35/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.35/ ns-2.35/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.35/ns-2.35/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.35/ ns-2.35/AODV/testfile/)。
步骤四:
在终端输入~/ns-allinone-2.35/ ns-2.35/AODV/testfile/路径下输入命令:
ns aodv.tcl
按照参考文献[1]所给的代码运行到这步的时候可能出现的错误及其对应的解决方法见:
http://peilie-coolboy.blog.163.com/blog/static/23952371201241710531592/
改正并无错误之后,显示(不同的测试显示的具体内容可能不一样,其中数据会有一定随机性):
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
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
【本人终端显示为 cbr s:4994 r:4881, r/s Ratio:0.9774, f:6024 】
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 【本人终端显示为 0.5533 】
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 【本人终端显示为 l:8202,nload:1.6804】
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 【本人终端显示为 0.0412】
三、绘制图表并进行性能分析
参考文章[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.35/ ns-2.35/AODV/testfile/下输入命令:
sh run aodv
【注意没有.tcl】
其中aodv为运行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
文档在代码压缩文件加中。