ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OPNET TDMA仿真建模与参数调优实战指南

OPNET TDMA仿真建模与参数调优实战指南 简介OPNET TDMA仿真工程包聚焦时分多址协议在Windows平台上的建模与验证适合通信工程、网络仿真方向的学生与研究人员用于理解帧结构、时隙分配、多路复用及碰撞避免等核心机制。压缩包共57个文件约314KB涵盖.c/.pr.c源码、.ah/.ac配置、.ef事件函数、.dll驱动、.m模型文件及.lib/.obj等编译产物配套OBJ、PDB和日志文件可辅助追踪模型构建与调试过程。已有303人学习下载。工程中同时包含自定义管道模型、带延迟的接收端处理及bent pipe透明传输逻辑配合TDMA单双时隙变体构成一套可直接加载运行的仿真环境。通过调整参数并观察吞吐量、延迟、丢包率等指标可深入掌握OPNET下TDMA协议实现细节为无线网络协议优化与项目开发提供参考。1. 从 vcjrk.zip 说起这套 OPNET TDMA 仿真到底要解决什么问题如果你的 Windows 电脑上刚解压了一个名为 vcjrk.zip 的 OPNET 工程包第一反应通常是双击打开工程文件然后点运行仿真。真这么干十有八九会在进程模型编译或无线参数匹配那一关卡住。OPNET 里的 TDMA 仿真不是搭好节点就能跑它需要你把帧结构、时隙编号和自中断调度一并写进 MAC 进程才能让每个节点在不同的时隙发送并且接收端还得能正确识别这些包。这里换一条更稳的路先拆 TDMA 在 OPNET 里的建模逻辑再从空工程开始组装出一个可运行的 TDMA 仿真接着讲时隙长度、保护间隔、随机种子这些参数怎么调最后给出验证结果是否可信的三种手段。适合正在做无线 MAC 协议对比、课程设计或者只是想把一个老工程在 Windows 上重新跑起来的人。按这个顺序走你至少能少踩一半的坑。2. 在 OPNET 里搭 TDMA 之前先把协议模型拆清楚2.1 为什么 TDMA 值得专门做仿真时隙、冲突与公平性TDMA 的基本思想是按时间划分时隙每个节点独占其中一个或多个时隙发送数据时不会与其他节点发生碰撞。它和 CSMA/CA 这类随机接入协议的最大区别是把冲突从物理层问题变成了时隙分配问题。谁在什么时候发发送前就已经确定因此单跳时延有上界公平性也更可控。这些特性让 TDMA 更适合对时延敏感的业务比如语音调度或工业控制。仿真 TDMA 并不是为了证明它没有冲突而是想回答几个工程问题时隙长度设成多大能兼顾吞吐量和时延节点数量增加时帧长应该线性扩展还是另加控制时隙同步误差到多少毫秒会让丢包率明显上升。这些问题靠公式只能算平均值靠 OPNET 才能把包级别的事件顺序、队列堆积和无线信道效应一起纳进来。OPNET 里做 TDMA 仿真比用网络计算器算平均吞吐量更接近真实系统的原因是它包含无线信道模型、接收功率阈值、传播时延以及队列行为。你可以在同一个网络拓扑里把 MAC 模块从 CSMA 换成 TDMA然后对比端到端时延。TDMA 仿真需要关注的性能指标包括平均排队时延、端到端丢包率、吞吐量、时隙利用率。其中时隙利用率最敏感只要某个节点没有按分配的时隙发送利用率就会下降曲线一眼能看出来。具体到进程模型TDMA 的决定性行为是“收到自中断后判断当前时隙号决定发送还是等待”。这意味着不像以太网模型那样只要载波侦听了就能发TDMA 必须有一个全网统一的时隙计数基准。在 OPNET 中这个基准通常由汇聚节点周期性广播帧起始信标或者干脆用全局统计量模拟理想同步。多数课程设计和工程复现采用后者即认为同步是理想状态所有节点共享同一个帧边界因此在仿真里只需要每个节点各自维护自己的时隙计数即可。为了后续搭建时不会把概念和模块搞混可以先把 TDMA 要素映射到 OPNET 对象时隙长度对应 MAC 进程模型里的 slot_duration 参数帧长对应总时隙数乘以时隙长度节点自己的时隙编号对应 MAC 节点的 my_slot 属性保护间隔对应进程模型在发送前额外延时或缩短发送窗口随机种子影响包到达时刻不影响协议本身。映射清楚后后面设置参数才有依据。2.2 OPNET 三层模型与 TDMA 进程状态机的对应关系OPNET 的建模体系分三层网络模型层放子网和节点节点模型层放模块和连接进程模型层用有限状态机和 Proto-C 代码描述行为。TDMA 的协议逻辑放在节点模型里的 MAC 模块进程模型中与上层的业务源和下层的无线收发模块剥离开。这样做的优点是业务源可以按固定间隔或泊松分布产生包MAC 模块只负责时隙调度无线收发模块只负责比特速率与信道属性替换其中一层不会影响另外两层。一个简洁的 TDMA 进程状态机通常包含四个状态INIT、WAIT_TICK、TX、WAIT_RX。INIT 完成变量初始化和第一个自中断调度WAIT_TICK 是主状态每次收到自中断后更新时隙计数TX 在当前时隙属于本节点时发送WAIT_RX 处理来自物理层的接收完成中断。用自中断而不是真实硬件定时器是 OPNET 进程模型的标准做法。无论是离散事件驱动的底层机制还是需要统计事件间隔的仿真目标都依赖 op_intrpt_schedule_self 这个 API。下面是一段简化但能直接贴进进程模型的 Proto-C 代码它完成了固定时隙发送。代码分两部分先在 Header Block 里声明宏和常量再把状态变量写到 State Variables 块。/* Header Block */ #include opnet.h #define MAX_SLOT_NUM 5 /* 帧内时隙总数 */ #define SLOT_DURATION 0.001 /* 每个时隙 1ms */ #define FRAME_DURATION (MAX_SLOT_NUM * SLOT_DURATION)/* State Variables */ int slot_index; /* 当前帧内时隙编号 */ int my_slot_id; /* 本节点占用时隙由属性传入 */ double tick_time; /* 下一个自中断时刻 */然后在 INIT 状态里写/* INIT 状态执行代码 */ my_slot_id op_ima_sim_attr_get_int (op_id_self (), my_slot); slot_index 0; tick_time op_sim_time () FRAME_DURATION; op_intrpt_schedule_self (tick_time, TDMA_TICK);而在 WAIT_TICK 状态入口写/* WAIT_TICK 状态执行代码 */ if (op_intrpt_type () OPC_INTRPT_SELF op_intrpt_code () TDMA_TICK) { if (slot_index my_slot_id) { /* 构造数据包并发送到 radio_tx */ Packet* pkt op_pk_create (tdma_data); op_pk_send (pkt, OPC_PKOPC_DESTINATION_STRM, 0); } slot_index (slot_index 1) % MAX_SLOT_NUM; tick_time op_sim_time () SLOT_DURATION; op_intrpt_schedule_self (tick_time, TDMA_TICK); }逻辑说明INIT 先把 op_ima_sim_attr_get_int 从节点属性中读取 my_slot再设置初始帧起点。第一次自中断安排在帧边界保证所有节点在一个仿真时刻的整数倍上开始计数。后面每次收到自中断就检查 slot_index 是否等于本节点时隙号相等就创建包并发送到目的地流 0然后更新计数并安排下一个时隙中断。需要注意的是上面的代码是一个极简版本没有处理接收、丢包、保护间隔和时隙调整如果想用于真实 OPNET 工程建议在 WAIT_TICK 后面再挂一个 WAIT_RX 状态。参数说明MAX_SLOT_NUM 必须大于网络中最大节点数否则两个节点会占用同一个时隙SLOT_DURATION 要与发射比特速率、包长算出的传输时间匹配TDMA_TICK 是自定义中断码需要在进程模型接口里为有效中断定义枚举值通常放在 Header Block 里。还要注意 op_pk_send 的流索引 0 必须和节点模型里 MAC 模块到 radio_tx 模块的包流序号一致否则包会发给错误的相邻模块。这段代码没有接入属性编辑器如果不同节点需要不同 my_slot应在进程模块属性定义里添加 my_slot 属性然后从节点编辑器里覆盖而不是直接改宏。接收侧通常是另一个进程或同一进程的另一个状态radio_rx 在收到完整包后产生一个包到达中断MAC 进程进入 WAIT_RX读取包里的源时隙号如果帧号或时隙号不符合预期就丢弃否则交给上层业务模块。这个检查在 TDMA 仿真里很重要因为理想同步并不等于接收机不会收到来自相邻时隙的迟到包尤其是在没有设置保护间隔的情况下。你可以把这个逻辑理解为“发送侧负责守规矩接收侧负责验货”。很多工程直接在无线收模块后面接统计收集省掉了校验过程短期看曲线很漂亮但一旦加入传播时延错误的包也会被当作有效业务统计导致结果虚高。另外OPNET 的数据集和统计量收集模块比如 throughput、delay都是挂在包流上的。TDMA 进程里创建的 Packet必须加上时隙号和帧号的包格式字段仿真结束后才能在 DES Analysis 里按字段过滤。如果包没有字段只能统计到包的到达时间分析粒度就少了一截。我一般会在创建包后写进 my_slot_id 和当前帧号接收侧用这两个字段做校验这样后续排查时能把“迟到包”和“错时隙包”区分开。在做 OPNET TDMA 仿真时我一般先假设理想同步也就是各节点能同时感知帧边界。这个假设不增加复杂度但能先验证时隙调度逻辑是否正确。若要加入同步开销就要额外建模一个信标时隙并在每个节点里引入时钟偏移变量。这样做之后TDMA 仿真才能回答真正的工程问题同步误差达到多少毫秒会让协议不可用。3. Windows 上跑通 OPNET TDMA 的最小工程从空工程到出第一个统计量3.1 环境准备OPNET/Riverbed Modeler 在 Windows 上的启动检查并不一定非要拿到 vcjrk.zip 才能开始从空工程新建一个 TDMA 工程更能看清每一条连线。但如果你手里确实有老工程包先做三件事解压路径清理、安装目录检查、环境变量设置。在 Windows 上OPNET 的旧版本对中文路径和带空格路径特别敏感例如 C:\Users\默认用户\Desktop\vcjrk 会导致外部编译器找不到头文件。解压后应放在 C:\work\vcjrk 这样的纯英文路径下并且路径里不要有空格。安装目录通常默认在 C:\Program Files\OPNET 下但这个路径带空格所以许多工程模板在构建时反而会出问题。我习惯把 OPNET 装到 C:\OPNET\Modeler然后用 PowerShell 确认可执行文件和目录结构存在。$opnetPath C:\OPNET\Modeler if (Test-Path $opnetPath) { Get-ChildItem $opnetPath -Recurse -Filter *.exe | Select-Object -First 20 FullName } else { Write-Host not found: $opnetPath }这段代码的作用是判断安装目录是否存在然后递归找出前 20 个 exe 文件。如果输出里能看到模型编辑器或仿真内核的可执行文件说明安装基本完整。如果 not found说明安装路径不是这个或者注册表信息已被清理。接下来检查系统环境变量 OPNET_HOMEOPNET 在编译 Proto-C 代码时需要根据它定位 include 目录[System.Environment]::GetEnvironmentVariable(OPNET_HOME,Machine)输出为空时需要手动把 OPNET_HOME 加到系统环境变量里。这一步在很多 Windows 教程里被一笔带过但实际运行外部编译器时特别关键。设置完后必须重新打开 OPNET 才能生效。环境检查通过后再双击工程文件或新建工程。如果你用的是较新的 Windows 10 或 Windows 11OPNET 老版本的安装程序有时会提示缺少 C 运行时组件。常见的做法是安装 VC 可再发行包让系统里存在编译器所需的环境。这些都确认后再打开模型否则会看到进程模型编译错误或外部仿真内核无法启动。这一步虽然不是 TDMA 协议本身的内容但属于 Windows 编程环境下绕不过去的前置条件。3.2 节点模型与进程模型怎么搭mac 层和物理层的接线新建一个节点模型从组件面板拖入 source、mac、radio_tx、radio_rx 四个模块。source 用自带的 simple_source 或自己写一个产生进程mac 使用上一章的 TDMA 进程radio_tx 和 radio_rx 使用无线收发模块。模块之间要连两种线包流和统计线。source 的包输出口连接到 mac 的包输入口mac 的包输出口连接到 radio_tx 的包输入口radio_rx 的包输出口连接到 mac 的另一个包输入口。统计线则从 radio_tx 的 channel state 输出口连到 mac 的统计输入口让 MAC 可以读取信道状态。经常翻车的点是包流口编号。OPNET 中模块每个接口的流索引是从 0 开始按创建顺序排列的。上一章代码里 op_pk_send(pkt, OPC_PKOPC_DESTINATION_STRM, 0) 用的是流 0如果 mac 到 radio_tx 的包流在节点模型里实际上是流 1包就会发到错误的口上。因此在跑仿真前双击 mac 模块查看它的收发包流映射确认发送流的索引。接着给无线模块设置公共参数。下面的表给出一个起点值实际工程要根据你的数据速率和包长换算。模块属性建议值说明sourcepacket inter-arrival time0.0005 s比时隙短制造排队sourcepacket size1000 bytes决定单包传输时间macmy_slot0/1/2/3/4每节点不同macslot_duration0.001 s与进程模型宏保持一致radio_txdata rate8 Mbps1000B/1ms 有余量radio_txfrequency2.4 GHz收发一致radio_rxfrequency2.4 GHz收发一致说明data rate 如果是 8Mbps传输 1000 字节需要 1ms正好等于时隙长度留的余量不够推荐提到 16Mbps或把包长降到 500 字节。op_ima_sim_attr_get_int 读取的 my_slot 属性实际上是 mac 模块的属性需要在节点编辑器的 Attribute 里用 Integer 类型定义并允许从网络层覆盖这样同一个节点原型可以被多个节点实例使用。3.3 配置 TDMA 参数并运行仿真网络模型里新建一个星型拓扑一个汇聚节点5 个终端节点终端节点在同一信道内互相可见。双击每个终端节点将 mac 的 my_slot 分别设为 0~4汇聚节点的 mac 进程可以设置为接收专用状态。保存工程。然后在 Configure/Run Discrete Event Simulation 窗口里设置仿真时长。对 TDMA 场景仿真时长不能只跑一两个帧至少要设置 60 秒仿真时间相当于 6000 个 10ms 帧。统计量选择端到端时延、吞吐量和丢包。第一次运行建议开起动画把 visibility 设置为 slow便于观察时隙是否错开。运行时盯住 Event Trace 面板里面每一条记录都有仿真时间和模块路径。如果你发现同一个时间点出现多个节点同时发包先暂停检查它们的 my_slot 是否重复。第一次跑通后把动画关闭换成 5 个随机种子分别运行记录输出。这一步结束后你已经得到一个可复现的 TDMA 基线工程。仿真运行完毕后在 Project 菜单下打开 DES Analysis 对话框选择收集到的 delay 和 throughput 统计量。如果曲线是阶跃式上升大概率是数据包没有被 MAC 收到而是一直在 source 队列里等待。这时回头检查 mac 进程是否调用了 op_pk_accept 或相应接收函数因为 OPNET 的包流默认不会自动把包送进进程队列MAC 模块必须在输入中断里主动接收包。这个小细节在 Windows 版 OPNET 里更容易被忽略因为节点模型能正常编译但运行时没有事件被触发。4. TDMA 仿真参数的 4 个必调项时隙长度、保护间隔、帧同步、仿真时长4.1 时隙长度和帧长怎么定吞吐量 vs 时延时隙长度的下限由“发射一个数据包所需时间 处理余量”决定。公式是 T_data 包长(bit) / 数据速率(bps)。如果包长是 1000 字节数据速率是 1MbpsT_data 就是 8ms时隙长度至少 8ms否则一个时隙发不完包。实际工程通常会在 T_data 上增加 10%~20% 余量因为还要考虑 MAC 层封装的帧头、尾部校验和收发切换时间。帧长等于时隙长度乘以总时隙数。总时隙数不小于节点数但通常还会加一个广播信标时隙或控制时隙。节点数从 5 增加到 20 时帧长随之翻倍每个节点的重传周期变长端到端时延会明显增加。这正好是 TDMA 与 CSMA 对比时最常见的拐点节点少时 TDMA 的时延优势明显节点多时帧长过长空闲时隙浪费带宽吞吐量反而下降。仿真中扫描时隙长度时建议每次只改一个变量比如固定包长和数据速率在 1ms、2ms、4ms 三个档位各跑一组种子记录时延和吞吐量。下面给出一组典型计算数据速率包长单包传输时间时隙长度建议1 Mbps1000 B8 ms10 ms8 Mbps1000 B1 ms2 ms16 Mbps1000 B0.5 ms1 ms4.2 保护间隔、传播时延和帧同步最容易低估的坑TDMA 时隙之间不是紧贴着的必须留保护间隔。保护间隔的作用是吸收不同节点的传播时延差异和时钟漂移。在一个 1000m 半径的网络里最大传播时延约 3.3us如果考虑收发切换时间 10us保护间隔至少 20us。这个数值远小于时隙长度但如果不设置接收端的包就可能重叠。OPNET 的进程模型里保护间隔可以这样实现在每个时隙的中断处理中不立即调用发送而是先用 op_intrpt_schedule_self 安排一个延迟为 GUARD_DURATION 的发送中断。出于简单很多代码会直接把它放在 tick 中断里 sleep 一下这在离散事件仿真里是错误的因为 OPNET 的模型不能阻塞必须用自中断实现延时时序。帧同步的实现方式也会影响保护间隔设计。OPNET 里可以在汇聚节点周期性地发送一个长度为 0 的 beacon 包其他节点收到后重置帧起点。但是广播 beacon 会占用一个时隙这个开销要计入帧长。如果不做 beacon直接用全局理想时钟则需要用全局属性传入帧号避免节点运行到不同步。这里没有绝对正确的方法取决于你更在意模型复杂度还是仿真真实性。4.3 随机种子与仿真时长的统计收敛做法TDMA 仿真中的随机性主要来自业务源产生包的间隔如果业务源是泊松分布那么不同随机种子会得到不同的包序列。只看一次运行结果很容易被偶然性误导。常见做法是每个参数点跑 3~5 个种子取平均值并输出置信区间。OPNET 的仿真配置里可以设置 Global Attributes 下的 simulation seed 列表多个种子会自动生成多个 DES 输出文件。仿真时长同样影响收敛。TDMA 帧长是 10ms 时60s 仿真时间包含 6000 帧数据点足够。但如果业务源到达间隔很长比如 5s60s 只产生 12 个包统计方差很大。此时要增大仿真时长或缩短到达间隔使得统计样本数不少于几百个包。还要留足预热时间一般在前 10 个帧长里收到的数据不计入统计可以在统计量里设置 watermark。为了看懂收敛性我常做一个小实验同一个参数集用 1、11、21、31、41 五个种子跑然后把吞吐量曲线叠加。如果曲线逐渐贴近同一条均值线说明统计已经收敛如果到了 41 号种子还在上下大幅摆动说明业务负载太轻或仿真时长不足而不是模型写错。在 Configure/Run 窗口的 Inputs 页面可以把需要扫描的参数比如 slot_duration、my_slot、seed设置为 Input File 或使用 DES 中的 Parameter Study 功能。Parameter Study 允许你指定起始值、终止值和步长批量生成多个仿真场景。Windows 版 OPNET 打开多个场景时如果内存不够建议一次只运行三个场景避免仿真内核崩溃。运行完成后在 Compare Results 窗口里选择 Box Plot 或 Confidence Interval 来观察差异。这些功能都在 DES 菜单下不用额外写脚本。5. OPNET TDMA 仿真的 5 条踩坑记录与排查建议从空工程搭出来的 TDMA 仿真第一次往往不会顺利。下面这 5 条是我在 Windows 环境里最常遇到的踩坑记录每一条都按现象、原因、解决三个层次展开供你对照排查。5.1 坑一所有节点都在同一时隙发送动画像撞车现象打开仿真动画看到多个节点在完全相同的时刻发送数据包没有任何错开。这不是因为 TDMA 失效而是因为 my_slot 属性没有真正被赋值。原因在进程模型代码中把 my_slot 定义成常量或者节点原型里属性默认值相同网络编辑器的节点实例没有覆盖。解决在节点原型中把 mac 模块的 my_slot 定义为整数属性并把这个属性提升到节点级别。然后在网络编辑器里选择所有终端节点分别输入 0、1、2、3、4。我一般还会在代码里加一条调试打印启动时输出当前时间和 my_slot_id运行后看 DES Log 就一目了然。5.2 坑二仿真能跑但吞吐量永远是 0现象运行完成delay 统计有值但 throughput 一直为 0。发送端业务源在发包目的端没收到。原因最常见是无线收发参数不匹配。radio_tx 的 data rate、frequency、bandwidth 与 radio_rx 不一致导致接收能量不足以成功收包。另一个原因是 MAC 模块没有对接收包调用接收函数包到达了 radio_rx 但不会继续沿包流传递。解决先在节点模型里把 radio_tx 和 radio_rx 的信道属性做成完全一致的命名属性频率、带宽、数据速率保持相同。然后在 mac 进程里增加接收处理状态每次 radio_rx 在包流口产生流中断时调用 op_pk_get 取出包再交给上层统计。如果确认接收逻辑没问题就在无线模块里打开接收功率统计看收到包时的功率是否高于接收阈值。低于阈值就把发射功率从 1W 调到 5W或把节点距离缩短。5.3 坑三Windows 路径含空格导致外部文件读不进来现象工程能正常打开但运行到某一步提示找不到文件或编译进程模型时提示 cannot open include file。原因Windows 上把工程放在包含空格或中文的目录下OPNET 在调用编译器和读取外部 C 文件时路径解析失败。解决把工程解压到 C:\work\vcjrk 这种无空格、纯英文路径下。同时检查系统临时目录如果 TEMP 路径含中文用户名最好在系统设置里把临时目录改到 D:\temp。这个问题在 Linux 上不存在Windows 编程环境的坑往往不是代码本身而是路径解析规则。5.4 坑四仿真结果发散换随机种子差别巨大现象同一组 TDMA 参数seed1 时吞吐量是 500kbpsseed2 时只有 150kbps曲线形状也相差明显。原因包到达服从随机分布时如果平均到达间隔远大于时隙长度那么一段时间内可能某个节点只发出 1~2 个包统计样本太少。仿真时长不够也是原因之一。解决把业务源到达间隔调到 TDMA 帧长的一半以下使每个帧的每个时隙至少有一个排队包吞吐量才接近协议上限。同时将仿真时长扩展到至少包含几千个帧的仿真时间再多 seed 并行运行。如果调整后仍然发散检查是否在代码里用了随机变量却没有设置 seedOPNET 默认 seed 与外部文件无关。5.5 坑五进程模型编译报错——状态变量没有声明现象编译过程中出现 error C2065: slot_counter : undeclared identifier或 op_intrpt_schedule_self 函数找不到。原因把状态变量写在了头块里而不是进程模型编辑器中的 State Variables 表。Proto-C 编译器只对状态变量表里的变量做自动实例化头块里的变量在多个进程实例之间共享且不会明确初始化。解决在进程模型编辑器里用 State Variables 编辑器逐一添加变量函数声明和宏定义放在 Header Block。op_intrpt_schedule_self 所依赖的 opnet.h 要在 Header Block 里通过 #include opnet.h 引入。修改后重新生成进程模型的 C 代码再编译。这个坑在我第一次从教程抄代码进 OPNET 时也踩过后来习惯是先看编译信息指向的行号再回进程模型里找对应位置而不是盲目改代码。6. 验证 TDMA 仿真正确性的三个技巧从统计量反推协议行为6.1 用 Event Trace 验证时隙秩序不要只看最终的吞吐量曲线那是协议行为经过大量平均之后的结果。第一次验证建议打开 Event Trace过滤出发送数据包的事件按时间排序。理想 TDMA 下每个节点的发送事件应严格落在各自的时隙区间内不同节点的事件不重叠。如果看到同一仿真时刻有两个节点都在发送先停下来修复 my_slot 或帧同步逻辑再继续往下调参数。6.2 用包到达间隔验证帧边界接收侧统计包到达时间后计算连续两包到达的时间差。在恒定负载下来自同一个节点的两个包之间的时间差应接近帧长来自不同节点的相邻包之间的时间差应接近时隙长度。这个验证可以暴露保护间隔是否够用。如果时间差出现小于零或非常小的值说明接收侧收到了乱序包多半是保护间隔不足或同步基准漂移。6.3 做一轮参数敏感性测试把时隙长度从 1ms 扫到 2ms、4ms记录饱和吞吐量。如果 TDMA 模型正确吞吐量会在时隙足够容纳单包传输时达到平台之后继续增加时隙长度只提高时延不提高吞吐量。如果这个关系不符合说明你的业务源包长、数据速率或时隙长度至少有一个设置不自洽。这种敏感性测试通常只需要 3 个场景却能很快定位模型里“假成功”的情况。我自己的习惯是每改一次参数先跑一遍 Event Trace 再跑统计曲线。前几次总因为依赖统计曲线而浪费了大量时间后来发现从事件和包间隔反推协议行为远比盯着一张平均曲线更可靠。希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进