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

Posted sno-w-olf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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
"
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 
",num_D);
	printf("number of packets sent: %d 
",num_s);
	printf("drop rate: %.3f%% 
",rate_drop);
	printf("average delay time: %.9f 
",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 "
-------------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。








以上是关于使用CMU工具配置一个随机场景实验的主要内容,如果未能解决你的问题,请参考以下文章

CMU15-445 PROJECT #1 - BUFFER POOL(实验代码,已满分)

CMU15-445 PROJECT #1 - BUFFER POOL(Fall2020实验代码,已满分)

CMU15-445 PROJECT #1 - BUFFER POOL(Fall2020实验代码,已满分)

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

CMU 15445 9. 排序和聚合算法

播放随机声音而不重复