NS-3说明文档第一章主要内容:一、配置二、下载ns-3三、建立ns-3项目四、测试ns-3五、运行一个脚本一、配置本次的使用环境是linux/Ubuntu。
在安装ns-3之前,需要输入以下命令,进行事先的配置。
1、如果对C++组件的需求比较少,输入以下命令:sudo apt-get install gcc g++ python如果对python组件的需求比较少,输入以下命令:sudo apt-get install gcc g++ python python-dev以上命令二者选一。
之后的命令依次输入。
2、sudo apt-get install mercurial3、sudo apt-get install bzr4、sudo apt-get install gdb valgrind5、sudo apt-get install gsl-bin libgsl0-dev libgsl0ldbl6、sudo apt-get install flex bison libfl-dev7、sudo apt-get install g++-3.4 gcc-3.48、sudo apt-get install tcpdump9、sudo apt-get install sqlite sqlite3 libsqlite3-dev10、sudo apt-get install libxml2 libxml2-dev11、sudo apt-get install libgtk2.0-0 libgtk2.0-dev12、sudo apt-get install vtun lxc13、sudo apt-get install uncrustify14、sudo apt-get install doxygen graphviz imagemagick15、sudo apt-get install texlive texlive-extra-utils texlive-latex-extra16、sudo apt-get install python-sphinx dia17、sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas libgoocanvas-dev18、sudo apt-get install libboost-signals-dev libboost-filesystem-dev19、sudo apt-get install openmpi*二、下载ns-3最简单的下载方法是,在linux下输入以下命令:cdmkdir tarballscd tarballswget /releases/ns-allinone-3.13.tar.bz2tar xjf ns-allinone-3.13.tar.bz2如果进入虚拟机中ns-allinone-3.13文件夹中,可以看到以下文件:build.py ns-3.13/ pybindgen-0.15.0.795/ util.pyconstants.py nsc-0.5.2/ README那么ns-3已经下载成功,并解压完毕。
三、建立ns-3项目最简单的建立方法是使用build.py文件。
从根目录进入到包含有build.py文件的路径下。
输入以下命令:./build.py --enable-examples --enable-tests会经过一段时间,出现一大段安装代码,但最后会显示‘build’finished successfully(2m30.586s)。
于是就建立成功了。
四、测试ns-3从根目录下进入到ns-3.13下,运行./test.py文件。
使用如下命令:./test.py –c core这个命令通常被用来快速地验证ns-3是否被正确地安装。
如果出现以下报告,说明安装成功:92 of 92 tests passed(92 passed, 0 failed, 0 failed, 0 crashed, 0 valgrind errors)五、运行一个脚本从根目录进入到ns-3.13目录下,运行以下命令:./waf --run hello-simulator输出结果为Hello Simulator。
第二章主要内容:一、核心的概念二、点对点通信代码三、实际运行一、核心的概念1、Node 节点在ns-3中,用一个抽象的节点node来表示基本的计算设备。
在C++中,用一个类Node来定义节点的概念。
在仿真中,我们可以在节点上添加功能,例如应用、协议栈、具有驱动的外围设备等等。
2、Application应用在ns-3中,用一个抽象的概念application来仿真实际的用户进程产生的活动。
在C++中,用一个类Application来定义这个概念。
3、Channel信道在ns-3中,用一个抽象的概念channel来表示基本的通信子网,用来连接节点node。
在C++中,用一个类Channel来定义这个概念。
4、Net Device网络设备在ns-3中,net device这个抽象概念包括了硬件和它们相应的驱动程序。
在仿真中,net device 被“安装”于节点node中,通过信道channel与其它的节点node进行通信。
在C++中,用一个类NetDevice来定义这个概念。
5、Topology Helper构建一个通信网络,需要用大量的操作来完成将Net Devices连接到Nodes上,将Net Devices 与Channels连接起来,并分配IP地址等工作。
在ns-3中,可以通过Topology Helper将这些操作结合到一个统一的模块中,方便操作。
二、点对点通信代码(目的:熟悉操作流程)根据前面的安装步骤,可以在目录tarballs/ns-allinone-3.13/ns-3.13/examples/tutorial找到文件。
运行这个脚本可以仿真一个简单的点到点链路。
除去开始的声明,该程序由以下几个部分组成:1、Modules Include#include "ns3/core-module.h"#include "ns3/network-module.h"#include "ns3/internet-module.h"#include "ns3/point-to-point-module.h"#include "ns3/applications-module.h"上面每一个include files在tarballs/ns-allinone-3.13/ns-3.13/build/ns-3.13下。
对头文件不做过多的介绍。
2、NS-3 namespaceusing namespace ns3;在C++的命名空间里,ns-3的项目使用名称ns3。
在这个组中的声明在全域命名空间(global namespace)的范围之外,这样的目的是使得ns3的代码可以方便的与其它代码结合起来。
3、LoggingNS_LOG_COMPONENT_DEFINE ("FirstScriptExample");声明一个记录组件,可以调用它的名字“FirstScriptExample”来决定是否记录控制信息。
4、Main Functionintmain (int argc, char *argv[]){与C++一样,定义一个主函数。
Ns-3的脚本实际上就是一个C++ 程序。
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);上面两行代码的目的是,建立两个记录组件分别安装在EchoClient和EchoServer应用中。
记录组件分为不同的等级,对应于记录信息的详尽程度。
这一点,在后文会提到。
在这里,记录的等级是INFO。
5、Topology HelpersNodeContainerNodeContainer nodes;nodes.Create (2);创建两个节点。
PointToPointHelperPointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));在实际中,外围的物理设备与信道有一种紧密相连的关系,例如无线网卡和无线信道。
所以,在ns-3中,使用可以利用同一个Topology Helper同时定义这两个对象,并将它们连接起来。
以上代码,将PointToPointNetDevice的属性DateRate设置为5Mbps,将PointToPointChannel 的属性Delay设置为2ms。
值得注意的是,在此时并没有真正地创建这两个对象,在这里实际上是事先的定义。
NetDeviceContainerNetDeviceContainer devices;devices = pointToPoint.Install (nodes);在上文中,我们已经定义了两个节点,并使用PointToPointHelper在两个节点之间定义了PointToPointNetDevice和PointToPointChannel。
在这里,才真正创建了以上两个对象。
PointToPointHelper中的函数Install以nodes为参数,用前文已经设置好的参数,为每个节点建立了一个PointToPointNetDevice,并且用PointToPointChannel连接起来。
InternetStackHelperInternetStackHelper stack;stack.Install (nodes);为每个节点安装互联网协议栈,例如TCP、UDP、IP等。
Ipv4AddressHelperIpv4AddressHelper address;address.SetBase ("10.1.1.0", "255.255.255.0");代码的目的是为节点里的设备分配IP地址。