ns-3的统计模块——Statistical Framework
ns-3的统计模块stats为用户提供了一个数据收集的统计框架,不仅可以方便用户使用,还可以提高仿真性能。
1.目标
统计框架的主要目标:
- 提供记录、计算和呈现数据和统计数据的功能,以便对网络模拟进行分析。
- 通过减少为收集数据而生成大量跟踪日志的需要,提高了模拟性能。
- 通过在线统计启用模拟控制,例如终止、模拟或重复试验。
衍生子目标和其他目标的特征:
- 与现有的NS-3跟踪系统集成,作为内部模拟引擎的基本仪器框架,例如网络堆栈、网络设备和通道。
- 允许用户使用统计框架而不需要使用跟踪系统。
- 帮助用户在多个测试中创建、汇总和分析数据。
- 支持用户创建的工具,例如特定于应用程序的事件和度量。
- 当分组不使用时,减小内存和CPU开销。
- 尽可能利用现有的分析和输出工具。该框架可能提供一些基本的统计数据,但重点是收集数据并使其可在已建立的工具中进行操作。
2.概述
统计框架包括以下功能:
- 核心框架和两个基本的数据收集器:一个计数器和一个最小/最大/平均/总观察者。
- 随着时间和数据分组的变化很容易扩展。
- 为OMNET++格式化的纯文本输出。
- 数据库输出使用SQLite,一个独立的、轻量级的、高性能的SQL引擎。
- 强制性和开放式元数据来描述工作运行。
后面要提到的一个基于概念性实验、研究了ns-3的默认ad hoc WiFi的性能的例子包括以下内容:
- 构造一个双节点的ad hoc WiFi网络,每个节点之间有一个参数化的距离。
- UDP流量源和接收器应用程序相比较,stock类稍有不同。
- 通过现有跟踪信号从ns-3核心收集数据,尤其是在数据帧上传输和WiFi MAC对象上接收的数据。
- 通过将新的跟踪信号连接到统计模块以及通过直接更新来检测自定义应用程序。记录有关发送和接收的数据包总数、传输的字节数和端到端延迟的信息。
- 一个简单的控制脚本,它在不同的距离上运行大量实验,并查询结果数据库,以使用GNUPlot生成一个图。
3.方法
该框架基于以下核心原则:
- 模拟程序的一个实例进行一次试验试验,无论是并行还是串行。
- 控制脚本执行模拟实例,根据需要更改参数。
- 使用外部脚本和现有工具收集和存储数据,以便进行绘图和分析。
- 通过将stat框架连接到现有跟踪信号,可以在ns-3核心内采取措施。
- 跟踪信号或框架的直接操作可用于仪器自定义模拟代码。
框架的基本组件及其相互作用如下图所示。
4.实例
这部分将在框架中构建一个实验,并从中生成用于分析的数据(图),同时演示结构和API。
1)问题
ns-3的无线网络设备WiFi NetDevices(使用默认设置)的(模拟)性能如何?
在模拟中,无线节点之间的距离有多远才能实现可靠的通信?”
- 假设:基于现实生活的常识,至少100m内的节点可以很好地进行交流,超过200米的通信应该是不可行的。
2)仿真程序
首先要做的是开发仿真程序。这个例子中的代码可以在examples/stats/wifi-example-sim.cc中找到。它主要有以下几个步骤。
①声明参数和使用ns3::CommandLine解析命令行。
double distance = 50.0;
string format ("omnet");
string experiment ("wifi-distance-test");
string strategy ("wifi-default");
string input;
string runID;
{
stringstream sstr;
sstr << "run-" << time (NULL);
runID = sstr.str ();
}
// Set up command line parameters used to control the experiment.
CommandLine cmd;
cmd.AddValue ("distance", "Distance apart to place nodes (in meters).",
distance);
cmd.AddValue ("format", "Format to use for data output.",
format);
cmd.AddValue ("experiment", "Identifier for experiment.",
experiment);
cmd.AddValue ("strategy", "Identifier for strategy.",
strategy);
cmd.AddValue ("run", "Identifier for run.",
runID);
cmd.Parse (argc, argv);
if (format != "omnet" && format != "db") {
NS_LOG_ERROR ("Unknown output format '" << format << "'");
return -1;
}
#ifndef STATS_HAS_SQLITE3
if (format == "db") {
NS_LOG_ERROR ("sqlite support not com