资料:
- ns-3官网:http://www.nsnam.org/
- ns-3官方开发文档:https://www.nsnam.org/releases/ns-3-34/documentation/
- ns-3维基百科(文档中没有的内容)、FAQ问题解答:https://www.nsnam.org/support/
- ns-3相关文献:https://www.nsnam.org/education/
使用waf配置编译ns-3系统:
测试安装
- 节点
Node类描述节点,提供添加外设卡、驱动程序、协议栈、应用程序等功能。
NodeContainer类,拓扑生成器,用于创建、管理
使用节点,保存一组节点指针。
- 应用
Application类描述。
UdpEchoServerHelper和UdpEchoClientHelper为Application类实例。(动物类->实例:熊猫类) - 信道
Channel类,实例包括:CsmaChannel(模拟了载波侦听多路访问通信子网中的媒介,有以太网的功能)、PointToPointChannel(最多2个点到点连接的网络设备)、WifiChannel(无线信道) - 网络设备(网卡)
NetDevice类,提供连接节点和信道对象的各种方法。实例有:CsmaNetDevice、PointToPointNetDevice、Wi-FiNetDevice。
NetDeviceContainer类存放(类似NodeContainer类)。 - 拓扑帮助
Helper类,用于网络设备配置到节点、连接信道、配置IP地址等。
例如TopologyReaderHelper类可以配置和使用TopologyReader;InternetStackHelper安装PointToPointHelper对象和网络协议栈。
3.2.1 Logging系统
将执行结果输出命令行中(类似cout、printf)。
添加附加前缀
自定义Logging代码(输出自定义信息)
3.2.2 命令行参数
作用:不修改脚本,用命令行传递参数来修改脚本中的变量。
挂钩自定义变量
3.2.3 Tracing系统
- 作用:将执行结果输出一个文件中。
- 3个基本概念:Tracing Sources、Tracing Sink、连接的统一机制。
- Helper类:AsciiTraceHelper生成文档
- ASCII Tracing:以ASCII格式的信息输出
- PCAP Tracing
生成.pacp格式文件,可用于Wireshark工具打开分析。
4.1.1 PyViz 可视化模块
其他信息:http://www/nsnam.org/wiki/index.php/PyViz
4.1.2 NetAnim 动画演示工具
在脚本文件中写入代码,以生成XML记录文件。
运行:
在netanim界面中点击open->first.xml->play
详细信息:http://www.nsnam.org/wiki/index.php/NetAnim
第三方网络数据分组显示和统计分析工具,读取ns-3的trace文件,并进行统计和分析。
4.2.1 TcpDump
TcpDump (dump the traffic on a network),读取pcap文件,截获分组,分析头部,输出
使用方法:
在脚本first.cc中加入代码
在命令行中使用TcpDump
4.2.2 Wireshark
使用方法
- 写脚本
例子:examples/stats/wifi-example-sim.cc
第三方作图工具,有gnuplot类,可产生gnuplot数据,最后由gnuplot读取数据生成图表,从而进行仿真数据统计分析。
详细信息:http://www.gnuplot.info/
ns-3提供了Gnuplot类和GnuplotDataset类
ns-3中使用方法:(例子ns-3.xx/src/tools/examples/gnuplot-example.cc)
方法二:每次独立重复实验时,全局种子不变,每次设置不同的标识。改变标识有几种方式:
a. 调用函数RngSeedManager::SetRun(3)设置不同的运行标识。
b. 修改全局变量NS_GLOBAL_VALUE值来修改运行标识。
c(推荐). 使用命令行传递参数修改运行标识
d. 使用build
随机变量
ns-3中用来声明随机变量的类,都有一个基类RandomVariableStream。其基类有:
- UniformRandomVariable: 最基本的类。给定一个最大值和最小值,按均匀分布方式返回一个随机数。
- ConstantRandomVariable: 返回一个固定的数,默认为0
在C++中还要为成员函数建立成员函数指针、区分成员函数指针和函数指针:
- 什么是回调机制?what
例如调用快排函数,函数参数中有回调函数地址,可以传递自己的比较函数。这种被调用者(快排函数)调用调用者的排序函数(cmp),称为回调。 - 怎么用回调机制?how
ns-3提供了Callback类的API接口:
- 静态函数
- 类成员函数回调
- 面向对象设计
- 对象基类
ns-3提供了3个对象基类:Object、ObjectBase、SimpleRefCount。若每个类继承这种类,就可以包含ns-3提供的特有特性:
- 内存管理与引用计数指针(Ptr类)
ns-3使用引用计数来管理内存 。
- 聚合
- why?
例如ns-3中,Node类在任何网络终端中都使用,但不同网络终端的构建和协议不同,为了创建满足不同网络节点需求,就要使用聚合,将不同构件聚合到节点中。 - what?
- how?
例如,将IPv4协议加入节点中:
- 对象模型:设置实例化模型的参数。
- Object类:多数ns-3类都是继承Object类。所有继承Object的类都可以包含一个叫TypeId的元数据类,用于记录类的元信息(包括唯一标识字符串、子类的基类、子类的构造函数)。
- 例子:Node类,静态成员函数GetTypeId
- 属性系统:管理和组织仿真中内部对象(方便用户访问模拟中内部变量,e.g. cwnd)
- 例如:DropTailQueue类,无符号整型成员变量m_maxPackets(用来控制队列的大小)
在脚本中操纵属性系统中的数据(src/point-to-point/examples/main-attribute-value.cc)
写自己的网络模块:
- 添加现有类的成员变量到元数据系统中
例如TcpSocket类的成员变量:uint32_tm_cWnd。使用TCP模块时想用元数据获得、设置变量的值,而ns-3没有提供这个变量,用户可以在元数据系统中添加声明:
从而可以用指向TcpSocket类的指针执行设置和获取操作。
- 向属性系统中添加自定义类
例如:把自定义的类A加入到系统属性中
作用:追踪某仿真数据。
Tracing系统由三部分构成:Tracing Sources, Tracing Sinks, 连接前两者的方法。
- Tracing Sources提供信息(生产者)。
- Tracing Sinks使用信息做相关事务(消费者)。
- 二者关联。使用到回调。
(1)使用函数TraceConnectWithoutContext将二者关联。
例子:(examples/tutorial/fourth.cc)
(2)使用“配置路径”将Trace Sources和Trace Sink关联起来。
例子:third.cc改写,通过定义一个Trace Sink输出移动节点的位置变化信息。
(3)如何确定Trace Sources
ns3官网->API文档->Modules->C++Constructs Used by All Modules->The list of all trace sources->找到可以直接使用的Trace Sources。