ns3在Ubuntu下搭建

1,466 阅读7分钟

安装环境

  • Ubuntu 20.04(保证至少40GB存储空间)
  • Ns3.38

依赖下载

强烈推荐方式

使用脚本进行所有依赖的下载,就不需要自己一条条指令输入了。 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

开始安装

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配置

image.png

  • 触发Cmake缓存刷新:
  • 可用目标列在下拉框中,点击锤子即可

image.png

开始入门

打开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;
}

如何运行自己的项目

  1. 把自己的.cc文件放到./scratch里面
  2. 输入指令./ns3 build
  3. 输入指令./ns3 run scratch/myfile.cc

添加可视化

  1. 在头文件包含的地方加上
#incldue "ns3/netanim-module.h"
  1. Simulator::Run()之前加上:
AnimationInterface anim("文件名.xml");
  1. 接着在控制台./ns3 run了之后就会在ns3同级文件夹里面生成.xml后缀的文件,就可以在NetAnim中查看了