ubuntu下利用ns-3 + NetAnim搭建可视化路由选路过程的方法

目录

一、前言:

二、安装 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

编译过程说明:

  1. 并行编译:默认使用所有CPU核心进行并行编译,加快速度
  2. 编译阶段
    • 编译核心库
    • 编译各个模块
    • 编译示例程序
    • 编译测试套件
  3. 时间预估:在普通配置的计算机上,完整编译可能需要30-60分钟
  4. 内存需求:编译过程需要较多内存,建议至少有4GB可用内存

常见问题解决:

  • 编译错误:如果出现编译错误,检查依赖是否完整安装
  • 内存不足 :可以尝试./ns3 build -j2减少并行任务数
  • 特定模块编译失败:可以禁用该模块重新配置

图:ns-3编译过程中的输出信息

3.3 验证安装

编译完成后,建议运行测试以确保安装正确:

bash 复制代码
# 运行测试套件(可选)
./test.py

# 运行一个简单的示例程序
./ns3 run first

安装验证要点:

  1. 测试通过:所有测试应该基本通过(可能有少数非关键测试失败)
  2. 示例运行:示例程序应该能正常运行并输出结果
  3. 环境变量:建议将ns-3的bin目录添加到PATH环境变量
  4. 文档查看 :编译生成的文档位于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动图

相关推荐
程序员老舅2 小时前
从内核视角,看Linux文件读写过程
linux·服务器·c++·内核·linux内核·vfs·linux内存
李少兄2 小时前
Linux服务器IP地址查询
linux·服务器·tcp/ip
皆圥忈2 小时前
磁盘物理结构与文件系统基础讲解
linux·算法
ting94520002 小时前
SellerClaw 全栈技术深度拆解:基于多智能体集群的跨境电商全链路自动化系统实现
运维·自动化
Yerkes2 小时前
WSL配置可访问Windows本地代理
linux
liulilittle2 小时前
TCP KCC v1.0(卡尔曼拥塞控制)
linux·服务器·网络·tcp/ip·计算机网络·tcp·通信
三雷科技2 小时前
Rsync 命令详解:Linux 文件同步与备份的艺术
linux·运维·服务器
真实的菜2 小时前
Redis 从入门到精通(十三):性能优化与运维实战 —— 慢查询、内存优化、监控与安全
运维·redis·性能优化
j_xxx404_2 小时前
MySQL库操作硬核解析:字符集、校验规则、大小写比较、备份恢复与连接排查
运维·服务器·数据库·人工智能·mysql·ai·oracle