Pinvon's Blog

所见, 所闻, 所思, 所想

ns-3基础

关键概念

节点

在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'

注: 建议使用超级权限修改环境变量.

添加附加前缀

  • prefix_func

    可以为每一条信息显示其产生函数:

    export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
                                   =UdpEchoServerApplication=level_all|prefix_func'
    
  • prefix_time

    可以为每一条信息显示其产生时间:

    export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_time:
                                   =UdpEchoServerApplication=level_all|prefix_time'
    

自定义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");

编写脚本

Comments

使用 Disqus 评论
comments powered by Disqus