使用CMU工具配置一个随机场景实验
Posted sno-w-olf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CMU工具配置一个随机场景实验相关的知识,希望对你有一定的参考价值。
参考自《无线网络攻防原理与实践 第2版》易平 主编 清华大学出版社
原理
- 创建一个网络环境,由n个节点围成一个圆,n由用户输入。使用DSR协议,从圆一端的节点向另一端的节点建立一个连接,产生CBR应用的流量发送,观察发送情况并分析trace文件。
- 为了简化操作,便于调试和使用,编写一个文件脚本run.tcl,将应用工具程序的调用和运行NS模拟的命令都写入这个文件。这样,只需输入ns run.tcl命令就可以进行这个随机场景的模拟。
- 实验需要随机种子,编写RandomNumber.cc来获得随机种子。
- 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实验代码,已满分)