ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NS-2网络模拟器安装与实战:从有线到无线网络仿真指南

NS-2网络模拟器安装与实战:从有线到无线网络仿真指南 简介本资源是经典网络仿真平台 ns-allinone-2.26 的完整源码发行包面向计算机网络专业师生、协议研究者及仿真实验学习者用于深入理解MAC层与网络层路由工作机制支撑TCP/UDP、无线LAN、AODV、DSDV、SMAC、Diffusion等数十种协议的建模与性能分析。压缩包共5056个文件涵盖664个Tcl脚本场景配置与测试驱动、426个C源文件核心模拟引擎、476个头文件协议接口定义、384个测试用例如test-all-wireless-lan、test-all-tcpvariants等以及Nam可视化文件、trace日志、PDF文档和大量预置拓扑场景如scen-670x670-50-600-20-*系列。包体大小为50.44MB结构完整含编译脚本、安装说明、示例及完整man手册。目前已有108人下载学习开箱即可构建NS-2.26仿真环境支持从基础单跳传输到复杂无线自组织网络的全流程建模、调试与结果分析。1. 项目概述网络模拟的基石工具如果你正在学习计算机网络或者从事网络协议、路由算法、移动自组织网络MANET乃至物联网通信的研究与开发那么“仿真”这个词你一定不陌生。在真实世界里搭建一个大规模网络来测试新协议的成本高得吓人而纯数学理论分析又往往难以应对复杂多变的实际环境。这时候一个靠谱的网络模拟器就成了我们手中的“数字沙盘”。今天要聊的ns-allinone-2.26.tar.gz就是这样一个在学术界和教育界经久不衰的传奇工具——NS-2Network Simulator version 2的一个经典集成发布版本。简单来说NS-2是一个开源的、离散事件驱动的网络模拟器。它允许你通过编写脚本在计算机里虚拟出一个完整的网络世界里面有节点、链路、各种协议栈TCP、UDP、FTP等、数据流甚至还能模拟无线信号传播和节点移动。你可以在其中运行自己的协议算法观察数据包的流动收集丢包率、端到端延迟、吞吐量等关键性能指标所有这一切都在你的个人电脑上完成。ns-allinone-2.26这个包则是将NS-2核心模拟器、其必备的OTcl解释器、NAM网络动画查看器、以及一些常用的工具和示例打包在一起的一个“全家桶”解压后经过一系列配置和编译就能获得一个可用的NS-2环境。尽管如今有更现代、界面更友好的模拟器如NS-3、OMNeT但NS-2因其架构经典、资料丰富尤其是大量经典论文和教材都以它为例、能深入理解网络模拟的底层原理依然是许多高校计算机网络课程和科研入门的重要工具。搞定ns-allinone-2.26不仅仅是学会用一个软件更是理解离散事件模拟、网络协议栈交互和性能评估方法论的一把钥匙。2. 核心组件与架构拆解在动手安装和运行之前我们有必要先搞清楚ns-allinone-2.26这个包里到底有什么以及NS-2独特的“双语言”架构是如何工作的。这能帮助你在后续遇到问题时知道该从哪个方向去排查。2.1 全家桶里有什么解压ns-allinone-2.26.tar.gz后你会看到一系列目录其中最关键的几个是ns-2.26/这是NS-2模拟器的核心源代码目录。里面包含了所有用C编写的网络组件对象如节点、链路、队列、定时器的实现以及事件调度器的核心引擎。这部分负责模拟的高性能运算。tcl8.4.18/与tk8.4.18/Tcl是一种脚本语言Tk是它的图形工具包。NS-2使用OTclObject Tcl面向对象的Tcl作为前端配置和指挥语言。这个目录包含了Tcl/Tk的解释器和库是NS-2运行时必须的环境。otcl-1.13/这就是关键的OTcl解释器本身。它作为“胶水”连接着前端的OTcl脚本和后端的C对象。nam-1.14/NAMNetwork AniMator网络动画器。这是一个独立的可视化工具可以读取NS-2模拟产生的跟踪trace文件以动画形式回放数据包在网络中的流动过程非常直观是调试和演示的神器。xgraph-12.1/一个简单的绘图工具用于将NS-2输出的性能数据绘制成曲线图。这个“allinone”包的好处在于它已经帮你匹配好了这些组件之间兼容的版本避免了你自己单独下载各个部件可能出现的版本冲突问题。2.2 双语言架构OTcl与C的分工这是理解NS-2的核心。它的架构可以形象地比喻为“导演OTcl和演员C”的模式。OTcl导演负责“编排”。你用OTcl编写模拟脚本通常以.tcl结尾。在这个脚本里你创建网络拓扑哪些节点如何连接配置节点属性使用哪种路由协议代理类型定义业务流何时开始FTP传输CBR流速率多大设置模拟事件在某个时刻让节点移动最后启动模拟。OTcl脚本层次高灵活易修改适合快速定义实验场景。C演员负责“表演”。底层用C实现的具体网络对象如TcpAgent,Queue/DropTail,DelayLink等它们执行具体的、计算密集型的操作比如维护拥塞窗口、管理队列缓冲区、计算链路延迟等。这部分代码效率高但修改和重新编译相对麻烦。两者如何沟通呢通过一种叫做“TclCL”的机制在包里的tclcl-1.19/目录中实现。它为每个C类创建了一个对应的OTcl“影子对象”shadow object。当你在OTcl脚本中创建一个Agent/TCP对象时实际上是通过这个影子对象在底层实例化了一个C的TcpAgent类。你的OTcl命令通过TclCL接口被翻译成对C对象方法的调用。提示这种架构带来的一个典型问题是当你查找一个对象的方法或属性时需要分清它是在OTcl层面定义的还是在C层面定义的。文档有时会分散在两处这需要一些时间来适应。3. 在Linux系统上的安装与配置实战虽然NS-2理论上可以在多个平台编译但Linux特别是Ubuntu、Fedora等发行版是其最原生、问题最少的运行环境。以下安装过程以Ubuntu 20.04/22.04为例其他发行版需要调整包管理命令。3.1 安装前的系统准备首先我们需要安装编译NS-2所必需的开发工具和库。打开终端执行以下命令更新软件源并安装基础工具sudo apt update sudo apt upgrade -y sudo apt install build-essential autoconf automake libxmu-dev gcc-7 g-7 -y这里特别说明一下gcc-7和g-7。较新版本的NS-2如2.35可能支持更高版本的GCC但ns-2.26这个版本年代较早使用现代系统默认的GCC如GCC 11编译时可能会因为C语言标准的变化而遇到大量语法错误。主动安装并指定使用GCC 7可以极大提高编译成功率。接下来安装X11开发库和Tcl/Tk所需的库。NAM动画器和一些图形功能需要它们sudo apt install libx11-dev libxt-dev libxmu-dev libxmu-headers libxi-dev libxext-dev libxrender-dev libxfixes-dev libxdamage-dev libxcomposite-dev libxrandr-dev tcl8.6-dev tk8.6-dev -y注意我们安装了tcl8.6-dev但allinone包自带的是tcl8.4。这并不冲突系统安装的8.6版本是为了提供一些基础的库文件路径编译过程还是会优先使用包内自带的8.4版本。3.2 解压与编译步骤详解解压源代码包tar -xzvf ns-allinone-2.26.tar.gz cd ns-allinone-2.26关键步骤修改链接器参数。这是避免编译错误的最重要一步。老版本的代码在链接时对库文件的顺序比较敏感。我们需要编辑ns-2.26/Makefile.in文件注意不是顶层的Makefile。cd ns-2.26 vim Makefile.in找到以LDFLAGS LDFLAGS开头的一行大约在第90行附近将其修改为LDFLAGS LDFLAGS -lm -lpthread即显式地加上-lm数学库和-lpthread线程库。保存退出。指定编译器版本。退回allinone根目录在编译前告诉系统使用我们安装的GCC 7cd .. export CCgcc-7 CXXg-7开始编译。执行安装脚本./install这个过程会比较长10-30分钟取决于机器性能控制台会滚动输出大量的编译信息。你需要耐心等待直到看到最后出现类似“Ns-allinone package has been installed successfully.”的字样。配置环境变量。编译成功后脚本会提示你需要将一些路径添加到环境变量中。通常你需要在你的shell配置文件如~/.bashrc或~/.zshrc末尾添加以下几行export PATH$PATH:/home/你的用户名/ns-allinone-2.26/bin:/home/你的用户名/ns-allinone-2.26/tcl8.4.18/unix:/home/你的用户名/ns-allinone-2.26/tk8.4.18/unix export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/你的用户名/ns-allinone-2.26/otcl-1.13:/home/你的用户名/ns-allinone-2.26/lib export TCL_LIBRARY/home/你的用户名/ns-allinone-2.26/tcl8.4.18/library请务必将/home/你的用户名替换成你实际解压的绝对路径。添加后执行source ~/.bashrc使配置生效。3.3 验证安装是否成功完成以上步骤后进行验证验证ns在终端输入ns然后按回车。如果出现一个百分号提示符%恭喜你NS-2的核心模拟器已经成功启动。输入exit退出。验证nam在终端输入nam应该会弹出一个NAM动画器的空白图形界面。关闭即可。如果ns命令提示找不到或者nam无法启动并报错关于libtk8.4.so等通常是环境变量PATH或LD_LIBRARY_PATH设置不正确请仔细检查路径是否正确、完整并确认已执行source命令。4. 第一个Tcl模拟脚本从简单有线网络开始理论准备和环境搭建完毕现在让我们创建一个最简单的有线网络模拟脚本感受一下NS-2的工作流程。我们将模拟一个两个节点通过一条链路相连节点0向节点1持续发送CBRConstant Bit Rate恒定比特率流量的场景。4.1 脚本代码与逐行解析创建一个新文件命名为simple_wired.tcl内容如下# 创建一个新的模拟器对象 set ns [new Simulator] # 打开一个文件用于记录NAM动画数据 set nf [open out.nam w] $ns namtrace-all $nf # 打开一个文件用于记录网络跟踪数据用于后续分析 set tf [open out.tr w] $ns trace-all $tf # 定义结束过程 proc finish {} { global ns nf tf $ns flush-trace close $nf close $tf # 执行NAM动画查看结果 exec nam out.nam exit 0 } # 创建两个节点 set n0 [$ns node] set n1 [$ns node] # 创建一条双向链路连接两个节点带宽为2Mb延迟为10ms队列类型为DropTail先进先出最大队列长度为10个数据包 $ns duplex-link $n0 $n1 2Mb 10ms DropTail $ns queue-limit $n0 $n1 10 # 在节点n0上创建一个UDP代理并将其附着到节点n0 set udp0 [new Agent/UDP] $ns attach-agent $n0 $udp0 # 在节点n1上创建一个Null代理用于接收UDP数据并将其附着到节点n1 set null0 [new Agent/Null] $ns attach-agent $n1 $null0 # 将UDP代理和Null代理连接起来 $ns connect $udp0 $null0 # 在UDP代理上创建一个CBR流量发生器数据包大小500字节间隔时间0.005秒即速率约800kbps set cbr0 [new Application/Traffic/CBR] $cbr0 attach-agent $udp0 $cbr0 set packetSize_ 500 $cbr0 set interval_ 0.005 # 安排事件在1.0秒时启动CBR流量在4.0秒时停止 $ns at 1.0 $cbr0 start $ns at 4.0 $cbr0 stop # 安排事件在4.5秒时调用finish过程结束模拟 $ns at 4.5 finish # 启动模拟器事件调度 $ns run脚本解析new Simulator创建整个模拟的控制器。namtrace-all和trace-all开启对网络事件的记录分别用于NAM可视化和性能分析。node创建网络节点。duplex-link创建双向链路参数依次是两个节点、带宽、延迟、队列管理类型。Agent/UDP和Agent/NullUDP发送代理和“空”接收代理。UDP是无连接的接收方用Null代理即可。Application/Traffic/CBR应用层流量发生器产生恒定速率的数据包。$ns at安排离散事件。这是NS-2离散事件驱动的核心体现在指定的模拟时间触发相应的动作。$ns run启动事件调度器模拟开始。4.2 运行与结果观察在终端中进入脚本所在目录执行ns simple_wired.tcl如果一切正常脚本运行结束后会自动弹出NAM动画窗口。你可以点击左下角的播放按钮看到两个节点之间有一条链路数据包小圆点从n0流向n1。同时目录下会生成out.nam和out.tr两个文件。out.tr是文本格式的跟踪文件记录了每个数据包在网络上经历的所有事件如发送、到达、丢弃等。它的每一行格式类似 1.000000 0 1 cbr 500 ------- 0 0.0 1.0 0 0 - 1.000000 0 1 cbr 500 ------- 0 0.0 1.0 0 0 r 1.002000 0 1 cbr 500 ------- 0 0.0 1.0 0 0其中第一个字符是事件类型入队-出队r接收后面依次是时间、源节点、目的节点、包类型、包大小等。这个文件是后续用Awk、Perl或Python脚本进行性能分析计算吞吐量、延迟等的数据基础。5. 进阶模拟无线移动场景与AODV路由协议NS-2更强大的功能在于对无线移动网络的支持。我们创建一个简单的无线场景模拟几个移动节点并使用经典的AODVAd hoc On-Demand Distance Vector路由协议。5.1 无线节点配置与移动性建模创建一个新文件wireless_mobile.tcl。无线模拟的配置比有线复杂需要先设置无线信道、无线传播模型、网络接口、MAC层协议、路由协议等参数。set ns [new Simulator] set nf [open wireless.nam w] $ns namtrace-all-wireless $nf 500 500 ;# NAM范围500x500 set tf [open wireless.tr w] $ns trace-all $tf # 设置无线模拟的拓扑边界 set topo [new Topography] $topo load_flatgrid 500 500 ;# 500米 x 500米的平面区域 # 创建God对象General Operations Director用于存储节点的全局状态信息如连通性主要用于一些需要全局知识的路由协议计算。 create-god 3 ;# 参数是节点数量这里是3个节点 # 配置无线节点参数 $ns node-config -adhocRouting AODV \ ;# 使用AODV路由协议 -llType LL \ ;# 链路层类型 -macType Mac/802_11 \ ;# MAC层协议802.11 -ifqType Queue/DropTail/PriQueue \ ;# 接口队列类型 -ifqLen 50 \ ;# 接口队列长度 -antType Antenna/OmniAntenna \ ;# 全向天线 -propType Propagation/TwoRayGround \ ;# 无线传播模型双径地面反射模型 -phyType Phy/WirelessPhy \ ;# 物理层类型 -channelType Channel/WirelessChannel \ ;# 无线信道 -topoInstance $topo \ ;# 拓扑实例 -agentTrace ON \ ;# 跟踪代理层事件 -routerTrace ON \ ;# 跟踪路由层事件 -macTrace OFF \ ;# 不跟踪MAC层事件避免trace文件过大 -movementTrace ON ;# 跟踪移动事件 # 创建3个无线节点 for {set i 0} {$i 3} {incr i} { set node_($i) [$ns node] $node_($i) random-motion 0 ;# 关闭随机移动我们将手动设置移动轨迹 } # 设置节点的初始位置 $node_(0) set X_ 100.0 $node_(0) set Y_ 100.0 $node_(0) set Z_ 0.0 $node_(1) set X_ 200.0 $node_(1) set Y_ 200.0 $node_(1) set Z_ 0.0 $node_(2) set X_ 300.0 $node_(2) set Y_ 100.0 $node_(2) set Z_ 0.0 # 为节点安排移动轨迹单位米秒 $ns at 10.0 $node_(0) setdest 400.0 400.0 15.0 ;# 在10秒时节点0开始以15m/s速度向(400,400)移动 $ns at 15.0 $node_(1) setdest 50.0 450.0 10.0 ;# 在15秒时节点1开始以10m/s速度向(50,450)移动 # 建立UDP/CBR流量从节点0发往节点2 set udp0 [new Agent/UDP] $ns attach-agent $node_(0) $udp0 set null0 [new Agent/Null] $ns attach-agent $node_(2) $null0 $ns connect $udp0 $null0 set cbr0 [new Application/Traffic/CBR] $cbr0 attach-agent $udp0 $cbr0 set packetSize_ 512 $cbr0 set interval_ 0.1 ;# 10 packets/sec $ns at 5.0 $cbr0 start $ns at 40.0 $cbr0 stop # 结束过程 proc finish {} { global ns nf tf $ns flush-trace close $nf close $tf exec nam wireless.nam exit 0 } $ns at 50.0 finish $ns run5.2 运行与分析要点运行这个脚本ns wireless_mobile.tcl。在NAM动画中你会看到三个节点以及节点0和节点1在指定时间开始移动。数据包从节点0发往节点2。关键观察点路由发现当节点0需要向节点2发送数据但不在其直接通信范围内时AODV协议会发起路由发现过程。你可能会在NAM中看到广播的RREQ路由请求包在网络中泛洪。路径变化随着节点移动原有的路由可能会断裂。此时AODV会尝试寻找新路径或通知源节点路由失效你可能看到数据流中断后又恢复。Trace文件分析无线环境的wireless.tr文件包含了更丰富的信息如节点的坐标变化M事件。分析这个文件可以计算端到端延迟、投递率等。由于节点移动可能导致链路中断丢包率会比有线场景高。实操心得无线模拟的参数设置非常关键。propType传播模型、macTypeMAC协议的选择会极大影响模拟结果。例如TwoRayGround模型比简单的FreeSpace模型更能反映地面反射对信号的影响。在对比不同路由协议性能时必须保证除协议本身外的所有参数完全一致。6. 性能数据分析从Trace文件到图表模拟跑完了生成了.tr文件但里面是海量的文本行。如何从中提取出我们关心的性能指标比如端到端延迟、网络吞吐量、丢包率我们需要借助脚本工具进行分析。这里介绍最经典的工具组合Awk和Gnuplot。6.1 使用Awk提取指标假设我们想分析simple_wired.tcl产生的out.tr文件计算从节点0到节点1的CBR流的平均端到端延迟。创建一个Awk脚本calculate_delay.awkBEGIN { total_delay 0 num_packets 0 } { event $1 time $2 from_node $3 to_node $4 pkt_type $5 pkt_size $6 flags $7 flow_id $8 src_addr $9 dst_addr $10 seq_no $11 pkt_id $12 # 只处理CBR数据包且事件是发送或接收 if (pkt_type cbr from_node 0 to_node 1) { if (event ) { # 在发送节点队列入口 send_time[pkt_id] time } if (event r) { # 在接收节点被接收 if (send_time[pkt_id] 0) { delay time - send_time[pkt_id] total_delay delay num_packets # 可以打印每个包的延迟用于检查 # printf(Pkt %d: Delay %f s\n, pkt_id, delay) } } } } END { if (num_packets 0) { avg_delay total_delay / num_packets printf(\n) printf(分析结果CBR流 (Node 0 - Node 1)\n) printf(总接收包数: %d\n, num_packets) printf(总延迟: %f s\n, total_delay) printf(平均端到端延迟: %f s (%f ms)\n, avg_delay, avg_delay*1000) printf(\n) } else { printf(未找到匹配的数据包。\n) } }在终端运行awk -f calculate_delay.awk out.tr即可得到计算结果。类似地你可以编写Awk脚本计算吞吐量一段时间内成功接收的比特数/时间间隔、丢包率(发送包数-接收包数)/发送包数等。6.2 使用Gnuplot绘制性能图表为了更直观地展示性能比如吞吐量随时间的变化我们可以用Gnuplot绘图。首先用Awk将时间戳和瞬时吞吐量处理成两列数据文件。创建一个Awk脚本throughput.awk以每秒为粒度计算吞吐量BEGIN { last_time 0 bits_recv 0 } { event $1 time $2 from_node $3 to_node $4 pkt_type $5 pkt_size $6 # 只处理接收事件且是CBR包从0到1 if (event r pkt_type cbr from_node 0 to_node 1) { # 将数据包大小从字节转换为比特 bits pkt_size * 8 # 按时间窗口例如1秒累加 time_slot int(time) if (time_slot last_time) { # 输出上一个时间窗口的吞吐量 (bps) if (last_time 0) { throughput bits_recv / 1.0 # 1秒间隔 printf(%d %.2f\n, last_time, throughput) } # 重置开始新的时间窗口 bits_recv bits last_time time_slot } else { bits_recv bits } } } END { # 输出最后一个时间窗口 if (last_time 0) { throughput bits_recv / 1.0 printf(%d %.2f\n, last_time, throughput) } }运行awk -f throughput.awk out.tr throughput.dat生成数据文件。然后创建Gnuplot脚本plot_throughput.gpset title CBR Flow Throughput (Node 0 - Node 1) set xlabel Simulation Time (s) set ylabel Throughput (bps) set grid plot throughput.dat using 1:2 with linespoints title Throughput set terminal pngcairo enhanced font Arial,12 set output throughput.png replot运行gnuplot plot_throughput.gp就会生成一张名为throughput.png的图表。注意事项Awk脚本的编写强烈依赖于Trace文件的具体格式。NS-2的Trace格式有几种变体如旧格式、新格式、无线Trace。务必先仔细查看你生成的.tr文件的前几行确认每一列对应的含义。上述脚本基于常见的“旧格式”编写。无线Trace中可能包含更多列如能量等级需要相应调整。7. 常见问题排查与经验技巧在安装和使用NS-2的过程中你几乎一定会遇到各种问题。下面是一些典型问题及其解决方案。7.1 编译安装阶段的“坑”linkstate.h文件中的operator报错现象编译过程中在ls/linkstate.h文件出现 “...的operator问题” 等大量C编译错误。原因GCC编译器版本过高对C代码的规范性检查更严格。解决这是最经典的坑。务必按照前文所述安装gcc-7和g-7并在编译前设置export CCgcc-7 CXXg-7。这是成功率最高的方法。make: *** [all] Error 1现象./install脚本运行中途报错停止。排查仔细查看错误信息最后几行。通常它会告诉你是在编译哪个组件时出错。常见的还有ld: cannot find -lXt缺少X11工具库。确保已安装libxt-dev。tcl.h not foundTcl开发头文件缺失。确保已安装tcl8.6-dev或tcl-dev。解决根据错误信息安装对应的开发包。然后可以尝试进入出错组件的子目录如ns-2.26/手动执行make clean再make看更详细的错误。有时需要回头修改Makefile.in中的链接参数。nam启动报错关于libtk8.4.so现象ns命令可以运行但nam无法启动提示找不到共享库。原因LD_LIBRARY_PATH环境变量未正确设置系统找不到allinone包内自带的Tcl/Tk 8.4库。解决确保你的~/.bashrc中的LD_LIBRARY_PATH包含了/path/to/ns-allinone-2.26/otcl-1.13和/path/to/ns-allinone-2.26/lib并且执行了source ~/.bashrc。可以用echo $LD_LIBRARY_PATH检查。7.2 运行模拟脚本时的错误invalid command name “Agent/XXX”现象运行Tcl脚本时提示找不到代理或应用类型。原因拼写错误或者该代理类型未在NS-2中编译支持。NS-2是模块化的一些较新的或第三方协议需要单独编译并集成。解决检查拼写。常用的代理如Agent/TCP,Agent/UDP,Agent/Null 常用的流量如Application/Traffic/CBR,Application/Traffic/FTP(依附于TCP) 都是内置的。如果确认是内置的却还报错可能是安装不完整尝试重新编译。模拟过程中段错误Segmentation fault现象ns运行脚本时突然崩溃。原因脚本逻辑错误导致内存访问越界是C底层代码的bug。常见于复杂的无线场景或自定义协议代码。排查简化你的脚本逐步添加功能定位引发崩溃的代码行。检查是否有数组越界访问在OTcl中设置数组大小时注意、是否在节点移动前就安排了通信事件等。NAM动画中看不到数据包流动现象NAM能打开有节点和链路但没有数据包动画。排查检查脚本中是否使用了$ns namtrace-all $nf或$ns namtrace-all-wireless。检查流量是否真的被安排了$ns at的时间是否正确流量是否start在脚本末尾finish过程前添加$ns flush-trace确保所有跟踪数据写入文件。直接用文本编辑器打开.nam文件看里面是否有除了节点和链路定义外的其他行如n开头的表示数据包的行。7.3 效率与调试技巧关闭不必要的Trace无线模拟中-macTrace ON和-routerTrace ON会产生巨量的Trace数据严重拖慢模拟速度并生成巨大的.tr文件。在调试初期可以打开正式跑实验时建议关闭只保留-agentTrace ON即可分析应用层性能。使用puts调试OTcl脚本在Tcl脚本中插入puts “Debug: variable value $some_var”来输出变量状态这是最简单的调试方法。分阶段测试脚本不要一次性写完一个复杂脚本。先写拓扑用NAM看看对不对再加代理和基础流量看通不通最后加上移动性和复杂业务。步步为营。利用官方示例ns-allinone-2.26/ns-2.26/tcl/ex/目录下有大量示例脚本从最简单到非常复杂。这是最好的学习资料遇到问题可以先看看类似的例子是怎么写的。NS-2像一位严厉的老师它的学习曲线起初有些陡峭会迫使你去理解很多底层细节。但一旦你征服了它你对网络协议栈、离散事件仿真、性能评估的理解将会非常扎实。这份经历是使用那些“一键仿真”的图形化工具所无法获得的。尽管它已不再是技术前沿但其核心思想和方法论在今天依然闪烁着价值。本文还有配套的精品资源点击获取
返回列表