目录
- 一、前言:
- [二、安装 ns-3](#二、安装 ns-3)
-
- 1、安装依赖
- 2、下载源代码
- 3、编译ns-3
-
- [3.1 进入ns-3目录并配置编译选项](#3.1 进入ns-3目录并配置编译选项)
- [3.2 开始编译](#3.2 开始编译)
- [3.3 验证安装](#3.3 验证安装)
- 1、克隆NetAnim仓库
- 2、编译NetAnim
- 四、编写展示网络协议的仿真脚本
- 1、创建一个新的脚本文件
- 2、编写脚本框架
- 3、添加网络拓扑与业务配置
- [4、 配置UDP应用产生流量](#4、 配置UDP应用产生流量)
- 4、动画接口设置
- 5、启用动画接口并启动仿真
- 五、运行与生成动画轨迹
- 六、可视化与录制动画
一、前言:
二、安装 ns-3
ns-3(Network Simulator 3)是一个开源网络模拟器,主要用于网络协议的研究、开发和教学。本节将详细介绍如何在Linux系统上安装ns-3,包括依赖安装、源代码下载和编译配置等完整步骤。
1、安装依赖
在开始安装ns-3之前,需要确保系统已安装必要的开发工具和库文件。这些依赖包涵盖了编译工具链、Python支持、图形界面组件以及ns-3所需的各种库。
bash
sudo apt update
sudo apt install git build-essential autoconf automake libxmu-dev python3 python3-dev pkg-config libboost-all-dev libevent-dev qtbase5-dev qt5-qmake cmake libxml2-dev -y

图:执行依赖安装命令的终端界面
2、下载源代码
- ns-3项目定期发布打包版本,我们可以从官方网站下载最新的稳定版本。这里以ns-3.47为例,这是当前较新的一个版本。
bash
# 下载ns-3.47的完整打包文件
wget https://www.nsnam.org/releases/ns-allinone-3.47.tar.bz2
# 解压下载的压缩包
tar -xjf ns-allinone-3.47.tar.bz2
# 进入解压后的目录
cd ns-3-allinone

图:使用wget下载ns-3源代码

图:解压后ns-3-allinone目录的内容结构
3、编译ns-3
3.1 进入ns-3目录并配置编译选项
ns-3-allinone目录包含多个组件,其中ns-3.47是核心模拟器目录。
bash
# 进入ns-3核心目录
cd ns-3.47
# 配置编译选项
./ns3 configure
配置过程详解:
./ns3 configure命令会检查系统环境,包括:- 编译器版本和兼容性
- 所有依赖库是否已正确安装
- Python绑定支持
- 可选模块的启用状态
- 配置完成后会显示摘要信息,包括:
- 启用的模块列表
- 禁用的模块及原因
- 编译类型(debug或release)
- 安装路径

图:执行./ns3 configure后的配置输出
3.2 开始编译
配置完成后,就可以开始编译ns-3了。编译过程可能需要较长时间,具体取决于计算机性能。
bash
# 开始编译ns-3
./ns3 build
编译过程说明:
- 并行编译:默认使用所有CPU核心进行并行编译,加快速度
- 编译阶段 :
- 编译核心库
- 编译各个模块
- 编译示例程序
- 编译测试套件
- 时间预估:在普通配置的计算机上,完整编译可能需要30-60分钟
- 内存需求:编译过程需要较多内存,建议至少有4GB可用内存
常见问题解决:
- 编译错误:如果出现编译错误,检查依赖是否完整安装
- 内存不足 :可以尝试
./ns3 build -j2减少并行任务数 - 特定模块编译失败:可以禁用该模块重新配置

图:ns-3编译过程中的输出信息
3.3 验证安装
编译完成后,建议运行测试以确保安装正确:
bash
# 运行测试套件(可选)
./test.py
# 运行一个简单的示例程序
./ns3 run first
安装验证要点:
- 测试通过:所有测试应该基本通过(可能有少数非关键测试失败)
- 示例运行:示例程序应该能正常运行并输出结果
- 环境变量:建议将ns-3的bin目录添加到PATH环境变量
- 文档查看 :编译生成的文档位于
doc/html/index.html
后续步骤:
成功安装ns-3后,就可以开始编写和运行网络仿真脚本了。下一节将介绍如何安装NetAnim,这是一个用于可视化ns-3仿真结果的工具。# 三、安装NetAnim
1、克隆NetAnim仓库
c
cd /home/ns-allinone-3.47 # 确保你在ns-3-allinone根目录下
git clone https://gitlab.com/nsnam/netanim.git

2、编译NetAnim
c
cd netanim
mkdir build && cd build
cmake ..
make -j$(nproc)

- 编译完成后,在当前 build 目录下会生成一个名为 netanim 的可执行文件。
四、编写展示网络协议的仿真脚本
1、创建一个新的脚本文件
c
cd ~/ns-3-allinone/ns-3.47 # 进入ns-3源码目录
touch scratch/my-routing-animation.cc
2、编写脚本框架
c
#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 "ns3/ipv4-global-routing-helper.h"
#include "ns3/netanim-module.h" // 包含动画接口
#include "ns3/mobility-module.h" // 可选,用于节点布局
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("MyRoutingAnimation");
int main (int argc, char *argv[])
{
// ... (后续代码在此展开)
}
3、添加网络拓扑与业务配置
c
NodeContainer nodes;
nodes.Create (4);
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer devices01, devices12, devices23;
devices01 = pointToPoint.Install (nodes.Get (0), nodes.Get (1));
devices12 = pointToPoint.Install (nodes.Get (1), nodes.Get (2));
devices23 = pointToPoint.Install (nodes.Get (2), nodes.Get (3));
InternetStackHelper stack;
stack.Install (nodes);
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces01 = address.Assign (devices01);
address.SetBase ("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces12 = address.Assign (devices12);
address.SetBase ("10.1.3.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces23 = address.Assign (devices23);
// 全局路由计算
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
- 这段代码搭建了一个简单的四节点线性拓扑(n0 - n1 - n2 -n3),并为每个节点安装了IP协议栈,配置了不同的IP网段。Ipv4GlobalRoutingHelper::PopulateRoutingTables() 命令会触发 ns-3 进行全局路由计算
4、 配置UDP应用产生流量
c
uint16_t port = 9;
OnOffHelper onoff ("ns3::UdpSocketFactory", InetSocketAddress (interfaces23.GetAddress (1), port));
onoff.SetAttribute ("DataRate", StringValue ("1Mbps"));
onoff.SetAttribute ("PacketSize", StringValue ("1024"));
ApplicationContainer apps = onoff.Install (nodes.Get (0));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (10.0));
PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
apps = sink.Install (nodes.Get (3));
apps.Start (Seconds (0.0));
Simulator::Stop (Seconds (11.0));
4、动画接口设置
c
MobilityHelper mobility;
Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // 节点0的位置
positionAlloc->Add (Vector (100.0, 0.0, 0.0)); // 节点1的位置
positionAlloc->Add (Vector (200.0, 0.0, 0.0)); // 节点2的位置
positionAlloc->Add (Vector (300.0, 0.0, 0.0)); // 节点3的位置
mobility.SetPositionAllocator (positionAlloc);
mobility.Install (nodes);
- 这是为了让NetAnim能正确显示节点位置
5、启用动画接口并启动仿真
c
// 创建动画接口并指定输出文件
AnimationInterface anim ("routing-animation.xml");
// (可选)启用IPv4路由跟踪以深入观察路由表变化
// anim.EnableIpv4RouteTracking ("routing-tracking.xml", Seconds (0), Seconds (11), Seconds (0.5));
Simulator::Run ();
Simulator::Destroy ();
return 0;
}
五、运行与生成动画轨迹
1、编译脚本
c
cd /home/ns-3-allinone-3.47/ns-3.47
./ns3 build
2、运行脚本
c
./ns3 run scratch/my-routing-animation.cc
- 脚本执行成功后,会在 ns-3.47 目录下生成 routing-animation.xml文件。这个文件就是NetAnim进行动画演示所需的关键输入。

六、可视化与录制动画
1、启动NetAnim并加载文件
c
cd /home/ns-allinone-3.47/netanim/build
./netanim
在NetAnim窗口中,点击左上角的 File -> Open,选择/home/ns-allinone-3.47/ns-3.47/routing-animation.xml 打开

2、播放并录制动画
-
点击绿色的 Play 按钮,动画将开始播放数据包的流动过程。

-
点击 Record 按钮,NetAnim会开始将当前的动画界面录制成一系列截图,存放在/home/ns-allinone-3.47/ns-3.47
目录下,文件名类似anim-0.png、anim-1.png 等。后期,你可以使用ImageMagick工具,将png合成为GIF动图