ns-3基础
Table of Contents
关键概念
节点
在ns-3中, 基本计算设备被抽象为节点.
可将其设想成是一台可添加各种功能的计算机, 为了使一台计算机有效工作, 可以给它添加应用程序, 协议栈, 外设卡, 驱动程序等.
如果使用C++开发, 则节点使用Node类来表示. NodeContainer类用于追踪一组节点指针.
应用
在ns-3中, 需要被仿真的用户程序被抽象为应用.
如果使用C++开发, 则应用使用Application类来表示. 这个类提供了管理仿真时用户层应用的各种方法. UdpEchoClientApplication和UdpEchoServerApplication是Application类的两个实例. 这两个类包含了一个C/S应用来发送和响应仿真网络中的数据分组. XX应用一般由XXHelper类管理, 该类的执行才初始化了XX应用. 应用对象需要一个时间参数来"开始"和"结束"数据通信.
信道
在现实中, 通常把网络中数据流流过的媒介称为信道. 在ns-3中, 基本的通信子网被抽象成信道.
如果使用C++开发, 则信道使用Channel类来表示. Channel类提供了管理通信子网对象和把节点连接至它们的各种方法.
CsmaChannel信道模拟了一个可以用于实现载波侦听多路访问通信子网中的媒介, 这个信道具有和以太网相似的功能. PointToPointChannel信道模拟一个简单的点对点信道.
网络设备
在ns-3中, 通常把硬件设备和软件驱动的总和抽象成网络设备. 一个节点可以通过多个网络设备同时连接到多条信道上.
如果使用C++开发, 则网络设备使用NetDevice类来描述. NetDevice类提供了管理连接其他节点和信道对象的各种方法. CsmaNetDevice被设计成在CSMA信道中工作, PointToPointNetDevice在PointToPoint信道中工作.
拓扑帮助
在大型仿真网络中, 我们需要在节点, 网络设备和信道之间部署许多连接. 既然把网络设备连接到节点、信道、配置IP地址等在ns-3中是很普遍的任务, 于是ns-3直接提供了一个叫"拓扑帮助"的东西来使这项工作变得尽可能容易.
如TopologyReaderHelper类, 可以让我们更容易配置和使用通用的TopologyReader. InternetStackHelper类是一个安装PointToPointHelper对象和点到点网络设备的网络协议栈的拓扑生成器类, 它会为每一个节点容器中的节点安装一个网络协议栈.
优化技术
在模拟过程中, 数据跟踪与采集的方法有很多, 大体上可以分为两类: 直接将执行过程显示在命令行中(Logging系统); 将采集到的数据直接存放在一个文件中, 以便后期的处理与分析(Tracing系统). 后者更为常用.
Logging系统
该系统用来向用户及时反馈命令的执行情况或者系统的运行状况. Logging系统包括7个等级:
- LOG_ERROR: 错误, 等价于LOG_LEVEL_ERROR, 下同
- LOG_WARN: 警告
- LOG_DEBUG: 调试
- LOG_INFO: 程序相关信息
- LOG_FUNCTION: 函数调用信息
- LOG_LOGIC: 对于整体逻辑的描述
- LOG_ALL: 包含以上所有
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
LogComponentEnable()
函数的作用是使记录模块有用, 第一个参数是类名称, 第二个参数为显示等级, 等级越高, 得到的信息越详细, 如果把等级改成 LOG_LEVEL_FUNCTION
, 则除了显示 LOG_LEVEL_INFO
会显示的信息外, 还会显示函数调用等信息. 但不是等级越高就越好, 因为等级越高, 信息越多, 处理起来越复杂, 较难找到所需信息.
通过环境变量修改记录系统等级
如果每次调整Logging等级都要修改代码则比较繁琐, ns-3可以通过修改环境变量的方法来修改记录系统等级. 如:
export 'NS_LOG=UdpEchoClientApplication=level_all: =UdpEchoServerApplication=level_all'
注: 建议使用超级权限修改环境变量.
添加附加前缀
自定义Logging代码
在 first.cc
文件中, 有一句代码如下:
NS_LOG_COMPONENT_DEFINE("FirstScriptExample")
作用是向ns-3系统注册一个名为 FirstScriptExample
的记录组件, 只有定义了记录组件, 都能在仿真脚本中使用Logging系统来自定义输出语句.
然后如果要使用自定义Logging代码, 还要先激活它:
LogComponentEnable("FirstScriptExample", LOG_LEVEL_INFO); // 或 export NS_LOG=FirstScriptExample=info
最后都能使用:
NS_LOG_INFO("Creating Topology");
命令行参数
Tracing系统
ASCII Tracing
ASCII Tracing的意思就是以ASCII格式的信息输出.
在 first.cc
文件的 Simulator::Run()
前添加如下代码:
AsciiTraceHelper ascii; pointTOPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));
EnableAsciiAll()
函数的作用是通知helper将所有的关于point-to-point设备的仿真信息都打印成ASCII Tracing格式.
PCAP Tracing
pointToPoint.EnablePcapAll("myfirst");
Generated by Emacs 25.x(Org mode 8.x)
Copyright © 2014 - Pinvon - Powered by EGO