安装环境
- Ubuntu 20.04(保证至少40GB存储空间)
- Ns3.38
依赖下载
- 官方网站:Installation - Nsnam
强烈推荐方式
使用脚本进行所有依赖的下载,就不需要自己一条条指令输入了。 1.打开终端,输入以下命令:
sudo apt update
sudo apt dist-upgrade
(首先更新源,很重要,不进行这一步可能会导致后面没办法安装所有的库)
2 . 安装vim(以便编写脚本)
sudo apt-get install vim
3.创建mysetup脚本
vim mysetup
4.编写setup脚本
sudo apt install g++ python3 cmake ninja-build git -y
sudo apt install ccache -y
sudo python3 -m pip install --user cppyy -y
sudo apt install gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3 -y
sudo apt install g++ python3 python3-dev pkg-config sqlite3 cmake -y
sudo apt install python3-setuptools git -y
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools -y
sudo apt install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev -y
sudo apt install mercurial unzip -y
sudo apt install gdb valgrind -y
sudo apt install clang-format -y
sudo apt install doxygen graphviz imagemagick -y
sudo apt install texlive texlive-extra-utils texlive-latex-extra texlive-font-utils dvipng latexmk -y
sudo apt install python3-sphinx dia -y
sudo apt install gsl-bin libgsl-dev libgslcblas0 -y
sudo apt install tcpdump -y
sudo apt install sqlite sqlite3 libsqlite3-dev -y
sudo apt install libxml2 libxml2-dev -y
sudo apt install cmake libc6-dev libc6-dev-i386 libclang-dev llvm-dev automake python3-pip -y
sudo python3 -m pip install --user cxxfilt -y
sudo apt install libgtk-3-dev -y
sudo apt install vtun lxc uml-utilities -y
5. 保存脚本文件 -> 终端中编译chmod +x mysetup -> 运行安装 ./mysetup
- 对于上面指令对应的依赖在下面解释,可以根据个人需要进行增删
逐个下载
- C++和python
//3.30-3.35
sudo apt install g++ python3
//3.36以上
sudo apt install g++ python3 cmake ninja-build git
- Ccache 是一种编译器缓存优化,它将加快跨多个 ns-3 目录的构建速度,代价是缓存中最多额外使用了 5 GB 的磁盘空间。
sudo apt install ccache
- Python 可视化工具和绑定(ns-3.37 及更高版本)的最低要求: cppyy Python 模块和 Pyviz 依赖项
sudo python3 -m pip install --user cppyy
sudo apt install gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3
- Python API 用户的最低要求(版本 3.30 至 ns-3.36):这是使用已发布的压缩包中的 Python 绑定所需的最小包集。
sudo apt install g++ python3 python3-dev pkg-config sqlite3 cmake
- Python 的其他最低要求(开发): 要使用 ns-3-allinone 存储库(从 Git 克隆),需要额外的软件包来获取并成功安装 pybindgen 和 netanim。
sudo apt install python3-setuptools git
- Netanim anim animator: Netanim animator 需要 qt5 开发工具;
- Qt5工具
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools
- ns-3-pyviz可视化工具的依赖
sudo apt install gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3
- 基于MPI的分布式仿真的依赖
sudo apt install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev
- bake构建工具的依赖:
sudo apt install mercurial unzip
- 调试工具:
sudo apt install gdb valgrind
- 支持 utils/check-style-clang-format.py code style check 程序(从 ns-3.37 开始):
apt install clang-format
- Doxygen和相关的在线文档:
sudo apt install doxygen graphviz imagemagick
sudo apt install texlive texlive-extra-utils texlive-latex-extra texlive-font-utils dvipng latexmk
- ns-3手册和教程使用Sphinx的reStructuredText(doc / tutorial,doc / manual,doc / models)编写,并且图形通常以dia(还需要上面的texlive软件包)编写:
sudo apt install python3-sphinx dia
- GNU科学库(GSL)支持更精确的802.11b WiFi错误模型(OFDM不需要):
sudo apt install gsl-bin libgsl-dev libgslcblas0
- 读取pcap数据包跟踪:
sudo apt install tcpdump
- 数据库对统计框架的支持
sudo apt install sqlite sqlite3 libsqlite3-dev
- 配置存储的基于Xml的版本(需要libxml2>=版本2.7)
sudo apt install libxml2 libxml2-dev
- 支持生成修改后的python绑定
sudo apt install cmake libc6-dev libc6-dev-i386 libclang-dev llvm-dev automake python3-pip
sudo python3 -m pip install --user cxxfilt
- 基于GTK的配置系统
sudo apt install libgtk-3-dev
- 试验虚拟机和ns-3
sudo apt install vtun lxc uml-utilities
- 支持openflow模块(需要一些boost库)官网还要安装libboost-signals-dev,但是无论是ubuntu官网还是网上,都没有有关这个的信息,然后网上说openflow这个可以不安,所以对于libboost-signals-dev,有需要的自行解决
sudo apt install libxml2 libxml2-dev libboost-all-dev
开始安装
- 官方网站ns-3 | a discrete-event network simulator for internet systems (nsnam.org)
- 先进入到要安装到的文件夹中,然后到网站获取到相对应版本的链接后用
wget url命令开始下载,我下载的是3.38版本
wget https://www.nsnam.org/releases/ns-allinone-3.38.tar.bz2
- 然后解压,终端进入到
/ns-allinone-3.38,注意:千万不要用sudo!!!!
./build.py --enable-examples --enable-tests
注意:按照readme文件来说这里的build会一起把ns3构建,如果build之后ns3测试不通过或者打开任意示例文件后代码飘红,就再执行下面三行命令在ns3构建一次
- 再进入到
/ns-3.38
// 如果 ./build.py 构建成功则不需要
./ns3 clean
./ns3 configure --enable-examples --enable-tests
./ns3 build
//编译完成后进行测试
./test.py
./ns3 run first
NetAnim安装与启动(可跳过,暂时不需要)
进入/ns-allinone-3.36.1/netanim-3.108,执行下列命令编译安装
//如果之前直接用的./build.py 则可以直接启动,不需要再次进行NetAnim编译安装
sudo make clean
sudo qmake NetAnim.pro # NetAnim的编译安装
sudo make
sudo ./NetAnim # 启动NetAnim
插一个遇到的其他问题:
如果运行某文件提示没有权限时:
chmod 777 文件名
777表示111,111,111获得可读可写可执行权限.
CLion配置
- 触发Cmake缓存刷新:
- 可用目标列在下拉框中,点击锤子即可
开始入门
打开ns-3.38.1/examples/tutorial/first.cc文件,根据官方的提示,前面有一堆格式约定、版权声明等等的注释,这不是我这个菜鸡应该关注的事情,跳过
接下来依次是头文件,命名空间以及Doxygen日志的设置。
下面直接从main函数开始分析,解释全部写在注释里。
#include "ns3/applications-module.h"
#include "ns3/core-module.h"
#include "ns3/internet-module.h"
#include "ns3/network-module.h"
#include "ns3/point-to-point-module.h"
using namespace ns3;
int
main(int argc, char* argv[])
{
CommandLine cmd(__FILE__);
cmd.Parse(argc, argv);
Time::SetResolution(Time::NS); // 将时间分辨率设为纳秒
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); // 日志设置
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
NodeContainer nodes; // 创建结点类
nodes.Create(2); // 创建2个结点,也就是模拟的计算机终端,一个点对点连接必须有两个结点
PointToPointHelper pointToPoint; // 声明一个点对点连接,可以创建点对点网络设备和点对点信道
pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps")); // 设置其DataRate值为 5Mbps,会对创建 PointToPointNetDevice 对象时生效
pointToPoint.SetChannelAttribute("Delay", StringValue("2ms")); // 将2ms设置为接下来创建的创建 PointToPointChannel 对象的传播延迟
// 关于上述的DataRate和Delay的解释可以在 ns3::PointToPointNetDevice的官方文档中找到
NetDeviceContainer devices; // 用于保存设备的类
devices = pointToPoint.Install(nodes);
// 对于在nodes中的每个结点,都会有一个PointToPointNetDevices对象被创建,并且会有PointToPointChannel对象在他们之间创建
// 现在每个设备都被配置为以5Mbps速率在2ms的信道上传播
InternetStackHelper stack;
stack.Install(nodes); // 为每个结点创建协议栈
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0"); // 从10.1.1.0(不包括)开始分配ip地址,子网掩码为255.255.255.0
// 分配ip地址并且返回ip地址和设备的接口以备以后参考
Ipv4InterfaceContainer interfaces = address.Assign(devices);
UdpEchoServerHelper echoServer(9); //创建并设置server的端口号,可以在之后用SetAttribute()函数设置"Port"属性为别的端口号
ApplicationContainer serverApps = echoServer.Install(nodes.Get(1)); // 为每个结点创建UdpEchoServerApplication,这里只为索引为1的结点创建了server
serverApps.Start(Seconds(1.0)); // 设置开始时间,这里为1秒后启动
serverApps.Stop(Seconds(10.0)); // 设置结束时间(至少会运行的时间)
UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9); // 传入要连接的服务端地址和端口号
echoClient.SetAttribute("MaxPackets", UintegerValue(1)); // 设置发送包的最大数量
echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0))); // 在发送包之间最小要等待时间
echoClient.SetAttribute("PacketSize", UintegerValue(1024)); // 包的大小
ApplicationContainer clientApps = echoClient.Install(nodes.Get(0)); // 把索引为0的结点注册为客户端
clientApps.Start(Seconds(2.0)); // 2s后启动
clientApps.Stop(Seconds(10.0));
Simulator::Run(); // 启动模拟
Simulator::Destroy();
return 0;
}
如何运行自己的项目
- 把自己的
.cc文件放到./scratch里面 - 输入指令
./ns3 build - 输入指令
./ns3 run scratch/myfile.cc
添加可视化
- 在头文件包含的地方加上
#incldue "ns3/netanim-module.h"
- 在
Simulator::Run()之前加上:
AnimationInterface anim("文件名.xml");
- 接着在控制台
./ns3 run了之后就会在ns3同级文件夹里面生成.xml后缀的文件,就可以在NetAnim中查看了