ns-3(Network Simulator 3),这是一个面向学术研究和网络协议开发的离散事件网络仿真器。
一、ns-3 是什么
ns-3 是一个开源的、面向对象的离散事件网络仿真器,用 C++ 编写,并提供 Python 绑定。它是 ns-2 的完全重写版本,并非向后兼容。
核心定位:
- 学术研究(协议验证、性能评估、新架构探索)
- 教学演示(网络原理可视化)
- 工业预研(5G/6G、卫星网络、数据中心网络等)
关键特性:
- 模块化架构,组件即插即用
- 支持从物理层到应用层的全栈仿真
- 可集成真实网络栈(ns-3 Direct Code Execution, DCE)
- 与真实网络互联(Tap/Emu 设备)
- 丰富的统计与可视化工具
二、架构与核心模块
ns-3 采用分层模块化设计,核心模块包括:
| 层级 | 模块 | 功能 |
|---|---|---|
| 应用层 | BulkSend, OnOff, UdpEcho, PacketSink |
流量生成与接收 |
| 传输层 | TcpL4Protocol, UdpL4Protocol, TcpSocket |
TCP/UDP 协议栈(多种 TCP 拥塞控制算法) |
| 网络层 | Ipv4, Ipv6, Icmp, Rip, GlobalRouting |
IP 协议、静态/动态路由 |
| 链路层 | PointToPoint, Csma, Wifi, Lte, Wimax |
各种链路技术 |
| 物理层 | Spectrum, Propagation, Mobility, Energy |
频谱、传播模型、移动性、能耗 |
| 辅助模块 | FlowMonitor, AnimationInterface, NetAnim |
流量监控、动画可视化 |
三、核心概念详解
1. 节点(Node)
Node 是网络中的基本实体,代表一台主机或路由器:
cpp
Ptr<Node> node = CreateObject<Node>();
节点本身不包含任何网络功能,需通过协议栈聚合添加。
2. 网络设备(NetDevice)
NetDevice 代表网络接口卡(NIC),绑定到节点和信道:
cpp
// 创建点对点链路设备
NetDeviceContainer devices = pointToPoint.Install(nodes);
常见设备类型:
PointToPointNetDevice:点对点链路CsmaNetDevice:以太网(CSMA/CD)WifiNetDevice:802.11 无线LteNetDevice:4G LTEFdNetDevice:连接真实网络设备
3. 信道(Channel)
Channel 是传输媒介的抽象,连接多个 NetDevice:
cpp
Ptr<PointToPointChannel> channel = CreateObject<PointToPointChannel>();
4. 协议栈安装
通过 InternetStackHelper 一键安装完整 TCP/IP 协议栈:
cpp
InternetStackHelper stack;
stack.Install(nodes); // 为所有节点安装 IPv4/IPv6 + TCP/UDP + 路由
5. IP 地址分配
cpp
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign(devices);
6. 应用层(Application)
Application 是运行在节点上的进程,分客户端 和服务端:
cpp
// 服务端:UDP Echo Server
UdpEchoServerHelper echoServer(9); // 端口 9
ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
serverApps.Start(Seconds(1.0));
serverApps.Stop(Seconds(10.0));
// 客户端:UDP Echo Client
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));
clientApps.Start(Seconds(2.0));
clientApps.Stop(Seconds(10.0));
7. 离散事件调度器(Scheduler)
ns-3 的核心是事件驱动:
cpp
Simulator::Schedule(Seconds(5.0), &MyFunction, arg1, arg2);
Simulator::Run(); // 启动事件循环
Simulator::Destroy(); // 清理资源
事件按时间戳排序,跳跃式执行,无需模拟空闲时间。
四、完整示例:点对点链路
cpp
#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"
using namespace ns3;
int main(int argc, char *argv[]) {
// 1. 创建节点
NodeContainer nodes;
nodes.Create(2);
// 2. 配置链路属性
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
pointToPoint.SetChannelAttribute("Delay", StringValue("2ms"));
// 3. 安装设备到节点
NetDeviceContainer devices = pointToPoint.Install(nodes);
// 4. 安装协议栈
InternetStackHelper stack;
stack.Install(nodes);
// 5. 分配 IP
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign(devices);
// 6. 安装应用
UdpEchoServerHelper echoServer(9);
ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
serverApps.Start(Seconds(1.0));
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));
clientApps.Start(Seconds(2.0));
clientApps.Stop(Seconds(10.0));
// 7. 运行仿真
Simulator::Run();
Simulator::Destroy();
return 0;
}
编译运行(使用 waf 或 cmake):
bash
./waf --run "scratch/my-first-simulation"
五、高级特性
1. 属性系统(Attribute System)
ns-3 使用对象属性实现参数配置,支持运行时修改:
cpp
// 命令行参数覆盖
CommandLine cmd;
cmd.Parse(argc, argv);
// 对象属性配置
Config::SetDefault("ns3::TcpSocket::SegmentSize", UintegerValue(1000));
2. 追踪与统计
| 机制 | 用途 | 示例 |
|---|---|---|
| Ascii Tracing | 文本日志 | AsciiTraceHelper |
| Pcap Tracing | Wireshark 兼容抓包 | PcapHelper |
| Gnuplot | 绘图 | Gnuplot2dDataset |
| FlowMonitor | 端到端流量统计 | FlowMonitorHelper |
cpp
// 启用 Pcap 抓包
pointToPoint.EnablePcapAll("my-simulation");
// FlowMonitor 统计
FlowMonitorHelper flowmon;
Ptr<<FlowMonitor> monitor = flowmon.InstallAll();
monitor->CheckForLostPackets();
Ptr<<Ipv4FlowClassifier> classifier = DynamicCast<<Ipv4FlowClassifier>(flowmon.GetClassifier());
FlowMonitor::FlowStatsContainer stats = monitor->GetFlowStats();
3. 可视化:NetAnim
cpp
#include "ns3/netanim-module.h"
AnimationInterface anim("animation.xml");
anim.SetConstantPosition(nodes.Get(0), 10.0, 10.0);
anim.SetConstantPosition(nodes.Get(1), 20.0, 20.0);
用 NetAnim 工具打开 animation.xml 查看动画。
4. 真实网络互联
Tap 设备(Linux TUN/TAP)让 ns-3 节点与真实网络通信:
cpp
TapBridgeHelper tapBridge;
tapBridge.SetAttribute("Mode", StringValue("UseBridge"));
tapBridge.SetAttribute("DeviceName", StringValue("tap0"));
tapBridge.Install(nodes.Get(0), devices.Get(0));
5. 直接代码执行(DCE)
DCE 允许在 ns-3 中运行未经修改的真实 Linux 网络应用(如内核 TCP/IP 栈、Quagga 路由守护进程):
cpp
DceManagerHelper dceManager;
dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory");
dceManager.Install(nodes);
DceApplicationHelper dce;
dce.SetBinary("ping");
dce.SetStackSize(1 << 20);
dce.ResetArguments();
dce.ParseArguments("10.0.0.2");
ApplicationContainer apps = dce.Install(nodes.Get(0));
六、扩展模块生态
ns-3 拥有丰富的contrib 模块:
| 模块 | 领域 |
|---|---|
ns3::ns3-ai |
强化学习集成(与 Python AI 框架交互) |
ns3::ns3-gym |
OpenAI Gym 接口 |
ns3::lena |
LTE/EPC 蜂窝网络 |
ns3::nr |
5G NR 新空口 |
ns3::satellite |
卫星网络(DVB-RCS2) |
ns3::ndnSIM |
命名数据网络(NDN) |
ns3::click |
Click 模块化路由器集成 |
ns3::openflow |
SDN/OpenFlow |
ns3::mpi |
并行分布式仿真 |
七、与 ns-2 的区别
| 特性 | ns-2 | ns-3 |
|---|---|---|
| 语言 | OTcl + C++ | 纯 C++ + Python 绑定 |
| 架构 | 混合脚本/编译 | 纯 C++ 对象模型 |
| 真实代码执行 | 有限 | DCE 支持完整 Linux 栈 |
| 可视化 | Nam | NetAnim |
| 维护状态 | 基本停止 | 活跃开发 |
| 学习曲线 | OTcl 门槛高 | C++ 更直观 |
八、典型应用场景
- TCP 拥塞控制算法研究:对比 CUBIC, BBR, Vegas 等
- 5G/6G 网络架构验证:gNB 调度算法、毫米波传播
- 数据中心网络:Fat-Tree, DCTCP, ECN, PFC
- 卫星互联网:Starlink 类星座拓扑、星间链路
- 车联网(V2X):802.11p / C-V2X 协议
- 物联网能耗分析:LoRa, NB-IoT 低功耗模式
- AI/ML 网络训练:ns3-ai 模块与 PyTorch 联合仿真
九、资源与学习路径
| 资源 | 链接 |
|---|---|
| 官方文档 | https://www.nsnam.org/documentation/ |
| 源码仓库 | https://gitlab.com/nsnam/ns-3-dev |
| 邮件列表 | ns-developers, ns-users |
| 教程 | examples/tutorial/ 目录 |
| 模型库 | https://www.nsnam.org/models/ |
建议学习路径:
- 先跑通
first.cc,second.cc等官方教程 - 理解 Helper 模式、属性系统、回调机制
- 阅读
src/下感兴趣模块的源码 - 尝试修改现有模块或开发新模块
- 结合 DCE 或真实设备验证
ns-3 的优势在于代码即文档------所有模块都是可读的 C++ 源码,没有黑盒。这对于需要深入协议内部机制的研究者来说至关重要。