使用CMU工具配置一个随机场景实验

参考自《无线网络攻防原理与实践 第2版》易平 主编 清华大学出版社

原理

  1. 创建一个网络环境,由n个节点围成一个圆,n由用户输入。使用DSR协议,从圆一端的节点向另一端的节点建立一个连接,产生CBR应用的流量发送,观察发送情况并分析trace文件。
  2. 为了简化操作,便于调试和使用,编写一个文件脚本run.tcl,将应用工具程序的调用和运行NS模拟的命令都写入这个文件。这样,只需输入ns run.tcl命令就可以进行这个随机场景的模拟。
  3. 实验需要随机种子,编写RandomNumber.cc来获得随机种子。
  4. RandomScene.tcl构建随机网络环境。

1. Tcl脚本文件run.tcl代码

set seed [exec ./RandomNumber.out] ; #获得随机数作为种子
puts "seed is $seed"
puts "creating 50 random nodes"

exec /home/liang/ns-allinone-2.35/ns-2.35/indep-utils/cmu-scen-gen/setdest/setdest -n 50 -p 0 -M 200 -t 50 -x 900 -y 900 > RandomDest.txt;
#通过setdest创建50个随机节点,输出到文件RandomDest.txt文件;路线取决于不同的计算机。

puts "creating nodes done"
puts "creating random cbr stream"

exec ns /home/liang/ns-allinone-2.35/ns-2.35/indep-utils/cmu-scen-gen/cbrgen.tcl -type cbr -nn 50 -mc 30 -rate 1.5 -seed $seed > RandomCbr.txt;
#通过cbrgen.tcl创建50个节点的随机cbr流,输出到文件RandomCbr.txt;路线取决于不同的计算机。

puts "creating cbr stream done\n"
puts "-------------Simulation-------------"
source RandomScene.tcl ; #运行模拟器

2. gawk脚本代码analysis.awk

BEGIN {
#设置初始变量
num_D = 0;	#丢包数
num_s = 0;	#发送包数
num_r = 0	;	#收到包数

rate_drop = 0;	#丢包率
sum_delay = 0;	#总延迟时间
average_delay = 0;	#平均延迟时间

}
{
	#读取trace文件记录
	event = $1;	#第一列为包的操作(s为发送包,r为接收包)
	time = $2;	#第二列为操作时间
	node = $3;	#第三列为节点号
	trace_type = $4;	#第四列为操作层
	flag = $5;	#第五列为标志位
	uid = $6;	#第六列为节点标识
	pkt_type = $7;	#第七列为包类型
	pkt_size = $8;	#第八列为包的大小

#操作
	if (event == "s" && trace_type == "AGT" && pkt_type == "cbr")
	{	send_time[uid] = time;	#创建数组记录发包时间
		num_s++;		#记录发送包总数
	}
	if (event == "r" && trace_type == "AGT" && pkt_type =="cbr")
	{	delay[uid] = time - send_time[uid];	#创建数组记录延迟时间
		num_r++;		#记录收到包总数
	}
	if (event == "D" && pkt_type == "cbr")
		delay[uid] = -1;	#-1表示包丢失,该包不会记入延迟时间
}

END {
	#计算丢包数和丢包率
	num_D =num_s-num_r;	#丢包总数
	rate_drop = num_D / num_s * 100.0;	#计算丢包率
	
	#计算延迟
	for ( i = 0; i < num_s; i++)
		{if (delay[i] >= 0)
			sum_delay += delay[i];
		}#总延迟时间
	average_delay = sum_delay / num_r;	#平均延迟时间

	#打印结果
	printf("number of packets droped: %d \n",num_D);
	printf("number of packets sent: %d \n",num_s);
	printf("drop rate: %.3f%% \n",rate_drop);
	printf("average delay time: %.9f \n",average_delay);
}

3. RandomNumber.cc

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand( time(0) ); //使用time(0)作为种子
    int num = rand() % 10000 + 1; //获得一个1~10000的随机数
    cout<<num<<endl;
    return 0;
}

4. RandomScene.tcl

Phy/WirelessPhy set RXThresh_ 2.28289e-11 ;# 设置有效无线连接距离为500米

set val(chan) Channel/WirelessChannel ;# 通道类型
set val(prop) Propagation/TwoRayGround ;# 无线电传播模型
set val(netif) Phy/WirelessPhy ;# 网络接口类型
set val(mac) Mac/802_11 ;# MAC类型
set val(ifq) CMUPriQueue ;# 接口队列类型
set val(ll) LL ;# 链路层类型
set val(ant) Antenna/OmniAntenna ;# 天线型号
set val(ifqlen) 50 ;# ifq中的最大数据包
set val(nn) 50 ;# 移动节点数
set val(rp) DSR ;# 路由协议
set val(x) 900 ;# 地形的X轴尺寸
set val(y) 900 ;# 地形的Y轴尺寸
set val(ncbr) 25 ;# cbr流数

#设置模拟器的全局实例
set ns_ [new Simulator]

#打开文件以记录仿真结果
set tracefd [open RandomScene.tr w]

$ns_ trace-all $tracefd
set namtracefd [open RandomScene.nam w]
$ns_ namtrace-all-wireless $namtracefd $val(x) $val(y)

#在proc finish中调用的函数,用于分析跟踪和打印结果
proc analysis { } {
    puts "\n-------------Analysis-------------"
    puts "analyzing trace"
    set analysis [exec gawk -f analysis RandomScene.tr] ; #运行分析程序分析跟踪
    puts "analysis report:"
    puts $analysis
}


#在模拟结束时调用的函数,用于关闭记录文件并显示动画
proc finish { } {
    global ns_ tracefd namtracefd
    $ns_ flush-trace
    close $tracefd
    close $namtracefd
    exec nam RandomScene.nam &
    analysis ; #调用分析工具
    exit 0
}

#设置随机场景的地形
set topo [new Topography]

$topo load_flatgrid $val(x) $val(y)

#建立上帝的全局实例
set god_ [create-god $val(nn)]

#使用开始时初始化的变量配置仿真中的所有节点
$ns_ node-config -addressType def \
        -adhocRouting $val(rp) \
        -llType $val(ll) \
        -macType $val(mac) \
        -ifqType $val(ifq) \
        -ifqLen $val(ifqlen) \
        -antType $val(ant) \
        -propType $val(prop) \
        -phyType $val(netif) \
        -channelType $val(chan) \
        -topoInstance $topo \
        -agenttrace ON \
        -routertrace ON \
        -mactrace OFF \
        -movementtrace OFF

#设置节点并禁用其随机运动功能
for {set i 0} {$i<$val(nn)} {incr i} {
    set node_($i) [$ns_ node]
    $node_($i) random-motion 0
}
source RandomDest.txt
source RandomCbr.txt

#停止所有cbr流生成数据包
for {set i 0} {$i < $val(ncbr)} {incr i} {
    $ns_ at 50.0 "$cbr_($i) stop"
}

#重置所有节点
for {set i 0} {$i<$val(nn)} {incr i} {
    $ns_ at 50.0 "$node_($i) reset"
}

#调用函数“finish”关闭文件并显示动画
$ns_ at 60.0 "finish"

#运行仿真
$ns_ run

5. 实现结果

(1)nam模拟结果如下图所示:



(2)gawk分析结果如下图所示:



分析:

由于数据流发送频率较低,使得网络通信流畅,因此丢包数和丢包率都为0。

猜你喜欢

转载自www.cnblogs.com/Sno-W-olF/p/13382923.html