ns-3Network 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,TcpSocketTCP/UDP 协议栈多种 TCP 拥塞控制算法网络层Ipv4,Ipv6,Icmp,Rip,GlobalRoutingIP 协议、静态/动态路由链路层PointToPoint,Csma,Wifi,Lte,Wimax各种链路技术物理层Spectrum,Propagation,Mobility,Energy频谱、传播模型、移动性、能耗辅助模块FlowMonitor,AnimationInterface,NetAnim流量监控、动画可视化三、核心概念详解1. 节点NodeNode是网络中的基本实体代表一台主机或路由器PtrNodenodeCreateObjectNode();节点本身不包含任何网络功能需通过协议栈聚合添加。2. 网络设备NetDeviceNetDevice代表网络接口卡NIC绑定到节点和信道// 创建点对点链路设备NetDeviceContainer devicespointToPoint.Install(nodes);常见设备类型PointToPointNetDevice点对点链路CsmaNetDevice以太网CSMA/CDWifiNetDevice802.11 无线LteNetDevice4G LTEFdNetDevice连接真实网络设备3. 信道ChannelChannel是传输媒介的抽象连接多个 NetDevicePtrPointToPointChannelchannelCreateObjectPointToPointChannel();4. 协议栈安装通过InternetStackHelper一键安装完整 TCP/IP 协议栈InternetStackHelper stack;stack.Install(nodes);// 为所有节点安装 IPv4/IPv6 TCP/UDP 路由5. IP 地址分配Ipv4AddressHelper address;address.SetBase(10.1.1.0,255.255.255.0);Ipv4InterfaceContainer interfacesaddress.Assign(devices);6. 应用层ApplicationApplication是运行在节点上的进程分客户端和服务端// 服务端UDP Echo ServerUdpEchoServerHelperechoServer(9);// 端口 9ApplicationContainer serverAppsechoServer.Install(nodes.Get(1));serverApps.Start(Seconds(1.0));serverApps.Stop(Seconds(10.0));// 客户端UDP Echo ClientUdpEchoClientHelperechoClient(interfaces.GetAddress(1),9);echoClient.SetAttribute(MaxPackets,UintegerValue(1));echoClient.SetAttribute(Interval,TimeValue(Seconds(1.0)));echoClient.SetAttribute(PacketSize,UintegerValue(1024));ApplicationContainer clientAppsechoClient.Install(nodes.Get(0));clientApps.Start(Seconds(2.0));clientApps.Stop(Seconds(10.0));7. 离散事件调度器Schedulerns-3 的核心是事件驱动Simulator::Schedule(Seconds(5.0),MyFunction,arg1,arg2);Simulator::Run();// 启动事件循环Simulator::Destroy();// 清理资源事件按时间戳排序跳跃式执行无需模拟空闲时间。四、完整示例点对点链路#includens3/core-module.h#includens3/network-module.h#includens3/internet-module.h#includens3/point-to-point-module.h#includens3/applications-module.husingnamespacens3;intmain(intargc,char*argv[]){// 1. 创建节点NodeContainer nodes;nodes.Create(2);// 2. 配置链路属性PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute(DataRate,StringValue(5Mbps));pointToPoint.SetChannelAttribute(Delay,StringValue(2ms));// 3. 安装设备到节点NetDeviceContainer devicespointToPoint.Install(nodes);// 4. 安装协议栈InternetStackHelper stack;stack.Install(nodes);// 5. 分配 IPIpv4AddressHelper address;address.SetBase(10.1.1.0,255.255.255.0);Ipv4InterfaceContainer interfacesaddress.Assign(devices);// 6. 安装应用UdpEchoServerHelperechoServer(9);ApplicationContainer serverAppsechoServer.Install(nodes.Get(1));serverApps.Start(Seconds(1.0));serverApps.Stop(Seconds(10.0));UdpEchoClientHelperechoClient(interfaces.GetAddress(1),9);echoClient.SetAttribute(MaxPackets,UintegerValue(1));echoClient.SetAttribute(Interval,TimeValue(Seconds(1.0)));echoClient.SetAttribute(PacketSize,UintegerValue(1024));ApplicationContainer clientAppsechoClient.Install(nodes.Get(0));clientApps.Start(Seconds(2.0));clientApps.Stop(Seconds(10.0));// 7. 运行仿真Simulator::Run();Simulator::Destroy();return0;}编译运行使用waf或cmake./waf--runscratch/my-first-simulation五、高级特性1. 属性系统Attribute Systemns-3 使用对象属性实现参数配置支持运行时修改// 命令行参数覆盖CommandLine cmd;cmd.Parse(argc,argv);// 对象属性配置Config::SetDefault(ns3::TcpSocket::SegmentSize,UintegerValue(1000));2. 追踪与统计机制用途示例Ascii Tracing文本日志AsciiTraceHelperPcap TracingWireshark 兼容抓包PcapHelperGnuplot绘图Gnuplot2dDatasetFlowMonitor端到端流量统计FlowMonitorHelper// 启用 Pcap 抓包pointToPoint.EnablePcapAll(my-simulation);// FlowMonitor 统计FlowMonitorHelper flowmon;PtrFlowMonitormonitorflowmon.InstallAll();monitor-CheckForLostPackets();PtrIpv4FlowClassifierclassifierDynamicCastIpv4FlowClassifier(flowmon.GetClassifier());FlowMonitor::FlowStatsContainer statsmonitor-GetFlowStats();3. 可视化NetAnim#includens3/netanim-module.hAnimationInterfaceanim(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 节点与真实网络通信TapBridgeHelper tapBridge;tapBridge.SetAttribute(Mode,StringValue(UseBridge));tapBridge.SetAttribute(DeviceName,StringValue(tap0));tapBridge.Install(nodes.Get(0),devices.Get(0));5. 直接代码执行DCEDCE 允许在 ns-3 中运行未经修改的真实 Linux 网络应用如内核 TCP/IP 栈、Quagga 路由守护进程DceManagerHelper dceManager;dceManager.SetNetworkStack(ns3::LinuxSocketFdFactory);dceManager.Install(nodes);DceApplicationHelper dce;dce.SetBinary(ping);dce.SetStackSize(120);dce.ResetArguments();dce.ParseArguments(10.0.0.2);ApplicationContainer appsdce.Install(nodes.Get(0));六、扩展模块生态ns-3 拥有丰富的contrib 模块模块领域ns3::ns3-ai强化学习集成与 Python AI 框架交互ns3::ns3-gymOpenAI Gym 接口ns3::lenaLTE/EPC 蜂窝网络ns3::nr5G NR 新空口ns3::satellite卫星网络DVB-RCS2ns3::ndnSIM命名数据网络NDNns3::clickClick 模块化路由器集成ns3::openflowSDN/OpenFlowns3::mpi并行分布式仿真七、与 ns-2 的区别特性ns-2ns-3语言OTcl C纯 C Python 绑定架构混合脚本/编译纯 C 对象模型真实代码执行有限DCE 支持完整 Linux 栈可视化NamNetAnim维护状态基本停止活跃开发学习曲线OTcl 门槛高C 更直观八、典型应用场景TCP 拥塞控制算法研究对比 CUBIC, BBR, Vegas 等5G/6G 网络架构验证gNB 调度算法、毫米波传播数据中心网络Fat-Tree, DCTCP, ECN, PFC卫星互联网Starlink 类星座拓扑、星间链路车联网V2X802.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 源码没有黑盒。这对于需要深入协议内部机制的研究者来说至关重要。
ns-3 网络仿真简介
ns-3Network 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,TcpSocketTCP/UDP 协议栈多种 TCP 拥塞控制算法网络层Ipv4,Ipv6,Icmp,Rip,GlobalRoutingIP 协议、静态/动态路由链路层PointToPoint,Csma,Wifi,Lte,Wimax各种链路技术物理层Spectrum,Propagation,Mobility,Energy频谱、传播模型、移动性、能耗辅助模块FlowMonitor,AnimationInterface,NetAnim流量监控、动画可视化三、核心概念详解1. 节点NodeNode是网络中的基本实体代表一台主机或路由器PtrNodenodeCreateObjectNode();节点本身不包含任何网络功能需通过协议栈聚合添加。2. 网络设备NetDeviceNetDevice代表网络接口卡NIC绑定到节点和信道// 创建点对点链路设备NetDeviceContainer devicespointToPoint.Install(nodes);常见设备类型PointToPointNetDevice点对点链路CsmaNetDevice以太网CSMA/CDWifiNetDevice802.11 无线LteNetDevice4G LTEFdNetDevice连接真实网络设备3. 信道ChannelChannel是传输媒介的抽象连接多个 NetDevicePtrPointToPointChannelchannelCreateObjectPointToPointChannel();4. 协议栈安装通过InternetStackHelper一键安装完整 TCP/IP 协议栈InternetStackHelper stack;stack.Install(nodes);// 为所有节点安装 IPv4/IPv6 TCP/UDP 路由5. IP 地址分配Ipv4AddressHelper address;address.SetBase(10.1.1.0,255.255.255.0);Ipv4InterfaceContainer interfacesaddress.Assign(devices);6. 应用层ApplicationApplication是运行在节点上的进程分客户端和服务端// 服务端UDP Echo ServerUdpEchoServerHelperechoServer(9);// 端口 9ApplicationContainer serverAppsechoServer.Install(nodes.Get(1));serverApps.Start(Seconds(1.0));serverApps.Stop(Seconds(10.0));// 客户端UDP Echo ClientUdpEchoClientHelperechoClient(interfaces.GetAddress(1),9);echoClient.SetAttribute(MaxPackets,UintegerValue(1));echoClient.SetAttribute(Interval,TimeValue(Seconds(1.0)));echoClient.SetAttribute(PacketSize,UintegerValue(1024));ApplicationContainer clientAppsechoClient.Install(nodes.Get(0));clientApps.Start(Seconds(2.0));clientApps.Stop(Seconds(10.0));7. 离散事件调度器Schedulerns-3 的核心是事件驱动Simulator::Schedule(Seconds(5.0),MyFunction,arg1,arg2);Simulator::Run();// 启动事件循环Simulator::Destroy();// 清理资源事件按时间戳排序跳跃式执行无需模拟空闲时间。四、完整示例点对点链路#includens3/core-module.h#includens3/network-module.h#includens3/internet-module.h#includens3/point-to-point-module.h#includens3/applications-module.husingnamespacens3;intmain(intargc,char*argv[]){// 1. 创建节点NodeContainer nodes;nodes.Create(2);// 2. 配置链路属性PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute(DataRate,StringValue(5Mbps));pointToPoint.SetChannelAttribute(Delay,StringValue(2ms));// 3. 安装设备到节点NetDeviceContainer devicespointToPoint.Install(nodes);// 4. 安装协议栈InternetStackHelper stack;stack.Install(nodes);// 5. 分配 IPIpv4AddressHelper address;address.SetBase(10.1.1.0,255.255.255.0);Ipv4InterfaceContainer interfacesaddress.Assign(devices);// 6. 安装应用UdpEchoServerHelperechoServer(9);ApplicationContainer serverAppsechoServer.Install(nodes.Get(1));serverApps.Start(Seconds(1.0));serverApps.Stop(Seconds(10.0));UdpEchoClientHelperechoClient(interfaces.GetAddress(1),9);echoClient.SetAttribute(MaxPackets,UintegerValue(1));echoClient.SetAttribute(Interval,TimeValue(Seconds(1.0)));echoClient.SetAttribute(PacketSize,UintegerValue(1024));ApplicationContainer clientAppsechoClient.Install(nodes.Get(0));clientApps.Start(Seconds(2.0));clientApps.Stop(Seconds(10.0));// 7. 运行仿真Simulator::Run();Simulator::Destroy();return0;}编译运行使用waf或cmake./waf--runscratch/my-first-simulation五、高级特性1. 属性系统Attribute Systemns-3 使用对象属性实现参数配置支持运行时修改// 命令行参数覆盖CommandLine cmd;cmd.Parse(argc,argv);// 对象属性配置Config::SetDefault(ns3::TcpSocket::SegmentSize,UintegerValue(1000));2. 追踪与统计机制用途示例Ascii Tracing文本日志AsciiTraceHelperPcap TracingWireshark 兼容抓包PcapHelperGnuplot绘图Gnuplot2dDatasetFlowMonitor端到端流量统计FlowMonitorHelper// 启用 Pcap 抓包pointToPoint.EnablePcapAll(my-simulation);// FlowMonitor 统计FlowMonitorHelper flowmon;PtrFlowMonitormonitorflowmon.InstallAll();monitor-CheckForLostPackets();PtrIpv4FlowClassifierclassifierDynamicCastIpv4FlowClassifier(flowmon.GetClassifier());FlowMonitor::FlowStatsContainer statsmonitor-GetFlowStats();3. 可视化NetAnim#includens3/netanim-module.hAnimationInterfaceanim(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 节点与真实网络通信TapBridgeHelper tapBridge;tapBridge.SetAttribute(Mode,StringValue(UseBridge));tapBridge.SetAttribute(DeviceName,StringValue(tap0));tapBridge.Install(nodes.Get(0),devices.Get(0));5. 直接代码执行DCEDCE 允许在 ns-3 中运行未经修改的真实 Linux 网络应用如内核 TCP/IP 栈、Quagga 路由守护进程DceManagerHelper dceManager;dceManager.SetNetworkStack(ns3::LinuxSocketFdFactory);dceManager.Install(nodes);DceApplicationHelper dce;dce.SetBinary(ping);dce.SetStackSize(120);dce.ResetArguments();dce.ParseArguments(10.0.0.2);ApplicationContainer appsdce.Install(nodes.Get(0));六、扩展模块生态ns-3 拥有丰富的contrib 模块模块领域ns3::ns3-ai强化学习集成与 Python AI 框架交互ns3::ns3-gymOpenAI Gym 接口ns3::lenaLTE/EPC 蜂窝网络ns3::nr5G NR 新空口ns3::satellite卫星网络DVB-RCS2ns3::ndnSIM命名数据网络NDNns3::clickClick 模块化路由器集成ns3::openflowSDN/OpenFlowns3::mpi并行分布式仿真七、与 ns-2 的区别特性ns-2ns-3语言OTcl C纯 C Python 绑定架构混合脚本/编译纯 C 对象模型真实代码执行有限DCE 支持完整 Linux 栈可视化NamNetAnim维护状态基本停止活跃开发学习曲线OTcl 门槛高C 更直观八、典型应用场景TCP 拥塞控制算法研究对比 CUBIC, BBR, Vegas 等5G/6G 网络架构验证gNB 调度算法、毫米波传播数据中心网络Fat-Tree, DCTCP, ECN, PFC卫星互联网Starlink 类星座拓扑、星间链路车联网V2X802.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 源码没有黑盒。这对于需要深入协议内部机制的研究者来说至关重要。