NS3整体介绍
目录结构
src目录是ns-3的源代码目录,其目录结构基本和ns-3模块相对应
这些模块目录的子目录都是固定的。
- bindings/ 绑定python语言的
- doc/ 帮助文档
- examples/ 应用该模块的示例代码
- helper/ 模块对应的helper类源文件
- model/ 模块代码的.cc和.h文件
- test/ 模块设计者编写的模块测试代码
- wscript
一些常用模块
模块 | 用途 |
---|---|
core | ns3内核模块,实现了ns-3的基本机制,智能指针,属性,回调,随机变量,日志,追踪,事件调度等 |
network | 网络数据分组模块,一般仿真都会使用 |
Internet | 实现了TCP/IP相关的协议族,IP, ARP, UDP, TCP等 |
applications | 几种常见的应用层协议 |
mobility | 移动模型模块,为节点添加移动属性 |
status | 统计框架模块,方便对仿真数据的收集、分析和统计 |
tools | 统计工具,作图工具gunplot |
netanim | 动画演示工具 |
visualizer | 可视化界面工具 |
几种典型的网络模块
模块 | 用途 |
---|---|
point-to-point | 点对点网络 |
CSMA | 实现基于IEEE802.3的以太网网络,包括MAC层,物理层和媒体信道 |
Wi-Fi | 实现基于IEEE802.11a/b/g的无线网络,也可以是有基础设施的ad hoc网络 |
mesh | 实现基于IEEE802.11s的无线mesh网络 |
wimax | 实现基于IEEE802.16标准的无线城域网络 |
几种ad hoc网络路由协议模块 :aodv, dsdv, olsr。
这些模块当中,core,network,internet和status是ns-3的基础模块,学习和开发其它模块首先要掌握这几个基础模块。
ns3 关键概念
节点
ns-3中的基本计算设备被抽象为节点。此节点是一个可以添加各种功能的计算机。当然仅仅是个计算机,要想使它工作,还需要添加网卡,协议栈,应用程序。
在ns-3中节点用Node类来描述,下面两行代码会创建两个节点对象,它们在仿真中代表计算机
NodeContainer nodes;
nodes.Create(2);
应用
计算机软件中通常分为系统软件和应用软件。应用软件完成用户工作,系统软件管理计算机中的内存,CPU,硬盘,网络等各种资源。在ns-3中并没有正常的操作系统的概念,但是用应用程序的概念。在ns-3中,需要被仿真的用户程序被抽象为应用。在C++中用Application类描述。
bulk-send-application
on-off-application
udp-client/server
udp-echo-client/server
信道
通常把网络中数据流过的媒介称作为信道,在ns-3中,节点需要连接到信道上来进行数据交换,在C++中用Channel类来描述,一个信道实例可以模拟一条简单的线缆,也可以是一个复杂的巨型以太网交换机,甚至是一个无线网络中充满障碍物的三维空间。
CsmaChannel
PointToPointChannel
Wi-FiChannel
网络设备
把计算机连接到网络上,必须用网线连接到网卡上。现在计算机出厂的时候都已经配置了网卡,所以用户一般看不到这些模块。一张网卡只是个外围设备,设备需要驱动软件来控制,如果缺少软件驱动它还是不能工作的。在ns-3中,网络设备这一抽象概念相当硬件设备和软件驱动的总和。网络设备安装在节点上,然后节点之间通过信道和其他节点通信。这个网络和信道是相对应的,就像无线网卡不能连接网线,只能在在无线环境中使用。C++中用NetDevice类来描述网络设备。
CsmaNetDevice
PointToPointNetDevice
Wi-FiNetNevice
搭建网络仿真场景和搭建真实网络类似
首先要有网络节点(Node),节点需要有网络设备(NetDevice),网络设备需要通过传输媒体(Channel)连接
仿真脚本的编写
脚本编写一般都是经过以下步骤
步骤 | 实例 |
---|---|
1. 创建节点 | NodeContainer |
2. 创建链路类型 | XxxDeviceHelper |
3. 安装链路类型,生成网卡 | XxxDeviceContainer=XxxDeviceHelper.install(NodeContainer) |
4. 安装协议栈 | XxxStack.install(NodeContainer) |
5. 配置IP地址 | XxxAddressHelper.setBase(“IP”,“NETMASK”) |
6. 生成网络接口 | XxxInterfaceContainer = XxxAddressHelper.Assign(NetDeviceContainer ) |
7. 安装应用 | ApplicationContainer = XxxHelper.Install(NodeContainer); |