ns-3 入门 1:介绍与安装

根据官方教程 Getting Started 一章写成。

介绍

ns-3 是一个离散网络事件模拟器。不难理解这个描述:比如改变拥塞窗口大小,发出数据包,都是离散事件。将这些离散事件按发生时间顺序模拟,就能得到这个系统在一段时间内的运行过程。因为计算机网络(也有其他一些类似系统)的运行过程是离散的,而不像往水池里倒水那样连续的,所以这种模拟方法是合理的。

ns-3 本质上是一组库,可以在 C++(或 Python,但之后忽略)程序中导入,也就是自己写代码把 ns-3 提供的工具串成一个完整的模拟程序。通过手动导入头文件和链接库,当然也可以直接利用 ns-3 编译出需要的程序,但 ns-3 也提供了 ns3 命令行工具,以构建并运行模拟源代码。

下载

ns-3 的分发形式是源代码,无论发行版是否有打包,都推荐使用源代码安装。以下仅以 Linux 为例,Windows 用户自觉去装 WSL2。

如果你使用 Ubuntu,则可以参考官方文档的对应部分1先按需安装好依赖;如果你和我一样使用的是 Arch Linux,那么有一个 ns3 AUR 包。但个人不建议你直接装它,因为上文提到的 ns3 命令行工具会留在源代码目录里,无法直接引用。所以可以利用 AUR 装依赖。Arch Linux 的 cppyy (用于写 Python 仿真程序)已更新至 3.x,ns-3 还没跟上支持,如有需要请注意。

然后从官网下载 最新源码包,解压,进入里面的 ns-3.xx 目录。下文均基于 3.40 版本,此处暂时不提另外两种使用 Bake 和 Git 的方法。

编译

官方在文档里给了三种编译方式:

  • 使用 build.py:比较简单,但不太自由
  • 使用 CMake:能自定义编译的模块,以及一些额外的选项
  • 使用 Bake:好处就是可以包揽从下载到安装

个人需要在之后将 ns-3 安装至系统目录,而其限定只能用第二种方法,所以下面只写第二种。

ns3 命令行工具也可以作为 CMake 的一个 wrapper。在 ns-allinone-3.xx/ns-3.xx 目录中,运行以下命令:

bash
1
2
3
./ns3 clean
./ns3 configure --enable-tests --enable-examples --prefix=/usr/local
./ns3 build

其中 configure 的前两个参数是一起编译测试和示例,--prefix 指定之后的安装路径。完整的参数列表可以使用 ./ns3 configure --help 查看。

还需要注意 configure 完成后显示的 build profile。如果在之后使用时需要使用 GDB 调试,则需确保其为 debug (加入 -d debug参数并重新编译),如不需调试,则可以使用默认的 optimized

只要不是缺少非必需的依赖,编译都会正常进行。CMake 也会输出各个模块是否会被编译,以及不被编译的原因(如果有;如缺少依赖,或用户指定不编译)。官方文档中有示例的编译输出,可以结合来看。

编译完成后,可以运行测试:

bash
1
./test.py

到这里编译过程就结束了。由于 ns3 命令行工具的存在,写程序时不需要太关注库和头文件的位置,同时为了防止多个 ns-3 版本共存冲突,开发者声称大部分人并不需要安装了:

Most users do not install ns-3 libraries to typical system library directories; they instead just leave the libraries in the build directory, and the ns3 Python program will find these libraries.

安装

虽然 ns3 命令行工具能够帮助构建系统找到头文件和链接库,但麻烦的是 IDE 并不这么认为(clangd 自定义就比较麻烦),所以我决定将其安装到系统目录中。前面提到我添加了 --prefix=/usr/local,在这一步 ns-3 的头文件和链接库就会被分别安装到 /usr/local/include/ns3/usr/local/lib

根据文档,安装也需使用 ns3 命令行。但是 ns3 命令行工具会故意阻止以 root 权限执行,确有需要的可以编辑其约 1400 行处,删掉对 refuse_run_as_root() 的调用2。但也有副作用,比如之后每次构建运行仿真程序都要输入密码。在此希望读者也能够对自己的目的和行为有明确的认知。

然后,执行 ./ns3 install 即可将 ns-3 的头文件和链接库安装至 prefix 指定的位置。

如果只是为了 IDE 识别,当然也有另外一种方法,仅把头文件复制到系统目录中。头文件就在 build/include/ns3 目录中。

安装完成后,下一篇将顺着官方教程的脉络,认识一个仿真程序的示例。