一、实验目的
本实验基于 NS-3 仿真平台,通过多种网络模型建模的设计,使学生掌握信
息网络的 Ad hoc 拓扑建模、移动性建模、信道建模、协议层建模等方法。另外,
本实验借助 Netanim 实现仿真网络的可视化,旨在直观地学习和掌握网络的结构
和变化过程,以更好地理解信息网络建模与仿真的过程。对于仿真结果,可以采
用 stats 或者 trace 文件进行结果分析和统计。最终,用可视化工具呈现仿真过程
以及图形化表征统计结果。
二、题目要求
1. 在上一个实验的基础上,建立 ad hoc 节点拓扑模型,网络中节点均具有路由
转发功能;
2. 进 入~/tarballs/ns-allinone-3.2x/ns-3.2x/examples/wireless$ 目 录 , 在 wireless
文件夹下,有很多 wifi 传输的示例。在 wifi-simple-adhoc-grid.cc 代码基础上
修改,文件拷贝到 scratch 文件夹下,重命名为你的姓名缩写+学号,例如学
生姓名钢铁侠,学号 20191314,c 文件命名为 gtx20191314.cc;
3. 读懂 wifi-simple-adhoc-grid.cc 代码,掌握在 NS-3 中网络拓扑布局,ad hoc
传输方式、网络路由的简单配置等,成功运行 wifi-simple-adhoc-grid.cc;
4. 掌握拓扑建模方法,在 wifi-simple-adhoc-grid.cc 代码中扩展建立到 100 个节
点,节点初始呈现网格布局;
5. 深入研究移动模型建模方法,完成对移动模型参数设置,使得节点移动在可
视化界面更加明显;
6. 深入研究信道模型建模方法,在代码中完成对信道模型的替换,例如 Friis、
LogDistancePropagationLossModel 信道模型。通过射频参数,了解发射机、
路径损耗和接收机间增益的计算方法。可以根据参数配置想要的发射距离;
7. 掌握网路层路由配置方法,可以配置多种 ad hoc 路由模式,例如 OLSR、aodv
等。查阅不同路由协议的工作原理和方法;
8. 掌握统计模型的使用方法,可以统计相应节点的时延、丢包率等重要指标;
9. 掌握能耗模型的使用方法,配置节点能量,设备能量,可以统计节点的能量
消耗;
10. 掌握统计数据作图方法,对于获得的统计数据,图形化的形式得出结果。
三、实验说明
本实验以~ns-3.2x/examples/wireless/wifi-simple-adhoc-grid.cc 为基础,完成
ad hoc 网络的建模、仿真、统计和结果呈现。
3.1 ad hoc 接入方式
上一个实验中,我们了解了两种接入方式:有线接入和无线接入。其中,无
线接入方式,是存在 AP(Access Point)节点的中心接入方式。本次实验中,我
们学习无线接入方式中的另一种方式:ad hoc 组网方式。
ad hoc 网络即为自组织网络。网络中没有中心节点来管理网络中节点的接入、
退出、路由等内容。ad hoc 网络中的节点,一般均具有路由转发功能。ad hoc 路
由方式不再采用静态路由或者动态路由的路由表式方法,而是采用更为动态的自
组网路由方式。
3.2 主要相关代码
1. ~/examples/wireless/wifi-simple-adhoc-grid.cc 程序代码为基本文件,在此基础
上进行修改,包括添加其他模块,头文件等。
2. ~/examples/stats/wifi-example-apps.cc 统计模块函数文件
3. ~/examples/stats/wifi-example-apps.h 统计模块函数文件
4. ~/examples/stats/wifi-simple-sim.cc,统计模块示例文件
5. ~/examples/energy/energy-model-example.cc 能耗模块示例文件
每一个代码的使用方法,详见后文。
四、程序运行
4.1 创建 wifi-simple-adhoc-grid.cc 副本
将 examples/wireless 中的 wifi-simple-adhoc-grid.cc 拷贝到 scratch 目录,重命
名为你的姓名缩写+学号,例如学生姓名钢铁侠,学号 20191314,c 文件命名为
gtx20191314.cc。
用 vim 编辑器打开代码进行编辑,vim 编辑器简单快捷键如下。
1. 修改代码:在命令行模式下进入到输入模式,
i:在光标所在字符前开始插入
a:在光标所在字符后开始插入
o:在光标所在行的下面另起一新行插入
s:删除光标所在的字符并开始插入
I:在光标所在行的行首开始插入 如果行首有空格则在空格之后插入
A:在光标所在你行的行尾开始插入
O:在光标所在行的上面另起一行开始插入
S:删除光标所在行并开始插入
u:撤销上一步的操作
Ctrl+r:恢复上一步被撤销的操作
2. 保存代码:首先使用 esc(键退出)->:(符号输入)->wq(保存退出)
:wq(保存编辑操作退出)
:wq!(保存编辑强制退出)
4.2 程序编译
进行编译./waf --run scratch/gtx20191314,注意这里的命令是编译后文件名
gtx20191314 而不是 c 文件 gtx20191314.cc。
4.3 Netanim 实现可视化
安装好 Netanim 后,在命令行进入 Netanim 文件夹(该文件夹位于 ns 目录下),
在终端输入:
$ ./NetAnim
即可打开 Netanim。命令行会记录 Netanim 的工作状态,如图:
由于 Netanim 是通过打开.xml 文件来实现网络结构的可视化,因此本实验首
先要生成.xml 文件。添加可视化所需的代码,运行 gtx20191314.cc 文件将自动产
生对应的.xml 文件(该文件位于~/ns-3.2x 文件夹)。在 Netanim 中,通过直接
点击可视化窗口左上角的文件夹,即可导入此.xml 文件获得可视化结果。
五、实验任务
5.1 拓扑模型
wifi-simple-adhoc-grid.cc 提供了一个默认网络拓扑结构,包括 25 个 wifi 节点,
n21
n16
n11
n6
n1
如下:
// The default layout is like this, on a 2-D grid.
//
// n20
// n15
// n10
// n5
// n0
//
// the layout is affected by the parameters given to GridPositionAllocator;
// by default, GridWidth is 5 and numNodes is 25.
节点从 n0 到 n24,节点均为 ad hoc 模式,初始呈现网格结构。
n24
n19
n14
n9
n4
n22
n17
n12
n7
n2
n23
n18
n13
n8
n3
根据此范例,我们可以修改节点的数量和位置,实现拓扑模型的改变。
5.1.1 修改数量
修改 xxx.Create()中的数字,即可改变节点数量。
修改定义
uint32_t numNodes = 100;
…
NodeContainer c;
c.Create (numNodes); //建立 100 个节点
// 定义节点数量 100
5.1.2 修改位置和运动模型
在设定坐标系时,可利用 MobilityHelper 类中的 SetPositionAllocator()函数和
ns3::GridPositionAllocator,设定节点位置,其具体步骤如下:
MobilityHelper mobility;
mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
//网格位置分配
"MinX", DoubleValue (0.0),
"MinY", DoubleValue (0.0),
"DeltaX", DoubleValue (distance), //间距
"DeltaY", DoubleValue (distance),
"GridWidth", UintegerValue (10), //一行节
点数量
在可视化界面中可以改变节点的大小,使得节点更为明显(最大为 20)。
"LayoutType", StringValue ("RowFirst"));
在可视化界面中的初始效果如下图所示,
在设置节点位置之后,需要设定节点运动模型,使节点具有移动性:
图 1 网格化节点拓扑
(1) 节点静止
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
(2) 节点运动 RandomWalk2dMobilityModel
NS3 自带的 2d 运动模型,bounds 属性为设置节点移动的边界
mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
"Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
//"Bounds"是设定边界范围,如果过小,将无法分配节点。需要根据节点数量,
估算边界大小,使得边界覆盖节点的运动范围。修改(-50, 50, -50, 50)中的数值。
示例代码默认使用 RandomWalk2dMobilityModel,但是并没有设定游走模型
内部的参数。
5.1.3 实验要求
1. 修改 WiFi 节点的数量和位置,实现 WiFi 的节点数量 100 个;
2. 网格初始化布局;(代码中设置节点初始距离 500m)
3. 查看封装函数,根据传输距离,设定运动模式(mode)、时间(time)、方
向(direction)、距离(distance)、运动速度(speed)、运动边界(bounds)
以至运动效果明显。
说明:原有节点运动,在可视化界面中运动不明显。修改后,要在可视化时
能够明显的体现出节点移动性。
4. 修改不限于 RandomWalk2dMobilityModel,可以用其他运动模型代替,可以
实现明显的移动性即可。
经过一段运动,在可视化界面显示效果参考如下:
图 2 运动会节点拓扑示例
5.2 WiFi 和信道参数设定
5.2.1. 基本组成
Ns-3 的 WifiNetDevice 基于 802.11 标准构建,能够精确执行标准 MAC 和
PHY 层的要求。Ns-3 建立 wifi 节点的过程是模块化的。Ns-3 提供了 Helper 帮助
建立 Wi-Fi 节点。建立 WifiNetDevice 一般要分别设定信道、物理层和 MAC 层
参数:
1 设置信道模型
借助 YansWifiChannelHelper 生成默认信道模型并设置参数,属性设定包括
传播时延和传播损耗。
2 设置物理层模型
借助 YansWifiPhyHelper 生成物理层模型并设置属性,属性包括错误率模型
和移动模型。物理层模型涉及的常用属性有:
TxGain、
TxPowerEnd(最大传输水平,默认为 16.0206dbm)、
TxPowerStart(:最小传输水平,默认为 16.0206dbm)、
EnergyDetectionThreshold(能量检测门限,默认为-96dbm)、
CcaMode1Threshold 9(确定为 CCA busy 状态的门限,默认为-99dbm)、
RxGain 等。
传输 增 益和接收增益 由 TxGain 和 RxGain 分别设 置,接收到的 信号由
EnergyDetectionThreshold 阈值检测,高于阈值即可以在 PHY 层被检测到。信道
衰落在信道部分设置,包括信道的传播时延和传播损耗。调用 wifiPhy.Set 函数
进行属性设定。
加入下段代码,替代原有 wifiPhy.Set 部分 90:
wifiPhy.Set ("RxGain", DoubleValue (0.0)); // Reception gain (dB).
wifiPhy.Set ("TxGain", DoubleValue (0.0)); // Transmission gain (dB)
wifiPhy.Set ("CcaMode1Threshold", DoubleValue (-62.0));
//Clear Channel Assessment,空闲信道评估,判断信道是否空闲。