EMANE实战:自组网仿真从配置到压测全流程
简介EMANEExtendable Mobile Ad-Hoc Network Emulator用户培训PDF面向无线网络研究者、仿真工程师及自组织网络开发人员系统讲解这个开源仿真框架的核心机制与典型应用尤其适合刚接触网络仿真、需要快速理解模块化设计思路的读者。资源包为单个PDF文档大小约3.82MB内容凝练便于离线阅读或培训分享。文档从网络仿真基本概念切入详细展开模块化设计、多通道网关支持、模型配置与控制消息、仿真环境与非仿真组件桥接等关键特性并配有EMANE异构网络部署示意及NEM平台服务器架构图能帮助读者快速建立从物理层、MAC层到应用/仿真边界transport的整体认知对跨平台部署与大规模测试场景也有直接说明其中控制消息、事件服务等内容对研究者自定义仿真行为很有帮助。预览中还可看到不同虚拟机的导入示例对打算搭建EMANE实验环境的人有参考价值。目前已有225人学习/下载无论用于实验室验证还是真实测试床搭建都能为无线网络仿真实践提供有效指引。1. 为什么我劝你别急着买真机做自组网测试某次给客户做 20 节点自组网协议压测真机方案一跑就想退货场地按天租节点一多日志全乱同一个场景想复现三次结果只有一次能对上。后来把整套评估搬到 EMANE 上一台 Linux 服务器就能把几十个虚拟节点、射频干扰、移动轨迹同时推演真正要接的实体设备只剩边缘几个终端。EMANE 全称 Extendable Mobile Ad-hoc Network Emulator是移动自组网协议验证常用的开源仿真平台战术电台、mesh 回传、网络运维压测都用得上。“EMANE User Training.pdf”这份训练文档对应的正是这个平台从安装、分层、配置射频到采集数据的完整落地路径。这篇笔记就按培训思路带你把流程走通。2. 先懂分层再碰参数EMANE 的核心理念与选型2.1 一个节点一个 NEM仿真器只建到第三层以下拿到 EMANE 第一件事别急着下配置文件先建立分层概念。EMANE 并不是把整台路由器搬进一个进程里它只仿真 OSI 第三层以下的网络效应物理层的信号强度、误码、时间占用链路层的发包收包和排队。第三层以上的 IP 路由、ARP、TCP 拥塞控制全部交给宿主机真实协议栈去跑。每个被仿真的节点叫 NEMNetwork Emulator它其实是一个进程内的逻辑对象对外对应一个虚拟网络接口。你在 Linux 里ip link能看到类似e0.1、e0.2这样的接口每个接口背后就是一个 NEM。上层应用不感知自己跑在仿真里它只看到自己有一块网卡而这块网卡的收发行为完全由 EMANE 的射频模型决定。这种设计的价值在于被测路由协议 OSPF、OLSR、BATMAN 不需要任何改动原样跑在真实协议栈上结果比纯离散事件模拟器可信得多。每个 NEM 必须有全局唯一 ID。ID 不只是编号它决定了事件服务把移动轨迹、收发统计归到谁头上也决定了 transport 模块怎么寻址。我见过有人把两个节点都写成 id1最后日志里所有统计乱成一团定位了半小时才发现是配置笔误。ID 一旦定下整个实验周期里不要改否则历史数据和新的数据对不上。2.2 射频、传输、事件服务三个子模块的分工一个 NEM 内部有三个互相独立又协作的子模块理解了它们后面排错就顺了。第一个是射频模型radio model。它回答“谁能听到谁”的问题发射功率、接收灵敏度、路径损耗、同频干扰、带宽占用时间都在这层计算。射频模型决定数据的“能不能通”不关心数据内容是什么。第二个是传输模块transport。它回答“仿真包怎么送到对端”的问题EMANE 本身是网络仿真器但多个 NEM 之间要传递信息总得走一条真实的承载通道。常见三种传输方式transudp把 NEM 间流量封装成 UDP 报文在服务器真实网络接口上跑。单机仿真、跨机器分布式仿真都用它也是训练手册默认传输方式。transraw绑定一块真实网卡把虚拟 NEM 和真实射频设备桥接起来。这种模式能让仿真场景与真实电台混搭适合半实物测试。transvirtual把数据吐到字符设备给外部程序当串口或特殊接口用适合对接自定义硬件。第三个是事件服务events service。它负责注入仿真过程里的外部信息节点位置、移动轨迹、遮挡物、链路状态变化。物理世界里的“节点从 A 点走到 B 点”在 EMANE 里不是手动改配置而是通过事件服务在运行期间把位置信息下发给对应 NEM。事件服务的监听地址就是 platform 配置里的platform.endpoint默认通常是一台机器上的 UDP 端口。这三个模块的配置位置也不同射频参数写在 radio 块传输参数写在 transport 块事件服务参数写在 platform 顶层。用训练手册排错时先看报错来自哪个块再往对应参数里找原因效率会高很多。2.3 三种常用射频模型怎么选RF-PIPE、Flat、802.11EMANE 自带多组射频模型但训练手册里出现频率最高的是下面三个。选错模型是新手最常见的翻车点这里给一张决策表模型物理层建模粒度适合场景调参重点RF-PIPE频带 功率 路径损耗不做符号级解调广域电台、自组网协议趋势评估bandwidth、frequency、txpower、noisemodeFlat Fading平坦衰落信道带简化多径中继、慢移动、城市遮挡场景delaySpread、multipath、shadowingIEEE 802.11模拟 CSMA/CA 接入竞争更细但更慢WiFi 协议机制验证、接入层对比时隙、退避参数、重传上限选型的第一原则是看实验目标。如果你要评估路由协议在 30 个节点下的收敛时间选 RF-PIPE参数少、结果稳定跑一轮只花几分钟。如果你要验证 CSMA/CA 的隐藏终端问题就必须上 802.11 模型否则射频层不会产生信道竞争结果没有参考价值。用 RF-PIPE 去证明“介质访问机制导致吞吐暴跌”本质上是在用一个不具备该能力的模型证明一个它解释不了的现象。RF-PIPE 里两个关键参数是rfpipe.frequency和rfpipe.bandwidth。frequency 决定载波频率bandwidth 决定信道宽度。两个 NEM 若频率不一致射频模型直接判定为不同信道物理上就收不到。bandwidth 影响的是频谱占用和时间占用某些协议对信道宽度敏感调宽后丢包率明显变化。默认单位要写清楚频率用M后缀表示 MHz2400M和2.4G在解析器里是两回事。2.4 为什么在这个场景下 EMANE 优于纯模拟器或真机你可能想问有 ns-3、有 mininet、也有真机为什么偏偏要学 EMANE我的判断是ns-3 物理层建模精度高但它的协议栈是内部实现的想跑一个标准 OLSR 往往要装补丁、写适配工作量大mininet 强在有线网络拓扑和流量控制但它对无线信道、干扰、移动轨迹的支持太弱不适合 MANET真机最真实但无法控制几十公里范围的路径损耗也无法在同一条件下重复实验。EMANE 处在中间地带物理层建模不算最细但足以表现丢包、时延、遮挡、同频干扰这些影响协议决策的关键现象上层又全部是真实协议栈被测代码是什么样仿真里就是什么样。对于“协议评估、参数扫描、回归测试”这类网络运维场景这是性价比最高的路线。还有一个常见误解有人把 EMANE 当“虚拟 WiFi 路由器”以为它会像真机一样转发无线帧。实际上 EMANE 不携带真实无线报文它把物理层网络效应折算成发射成功、丢包、时延、吞吐这些统计量再通过虚拟接口交给上层。所以读统计结果时要把它当成一个带信道损耗的黑匣子而不是逐 bit 还原空口过程。2.5 用日志验证分层关系第一个实战小操作装好 EMANE 后我习惯先跑一个官方示例然后开两个终端分别看日志和接口确认分层关系真的在运转。启动后留意emane进程输出里的两行字符一行标识射频模型初始化一行标识 transport 绑定端口。如果射频模型加载失败日志里会出现unable to load library之类的字样这时不是改 XML 参数能解决的要回到安装环节检查模型库是否装全。另一个验证技巧是把虚拟接口e0.1抓包看有没有 ARP 请求发出来。能发出 ARP说明传输模块和虚拟接口链路是通的收不到回复问题才轮到射频模型去查。这个由下往上的排查顺序比盯着配置文件乱猜有效得多。3. 从安装到跑通最小场景两条命令和三个配置文件3.1 安装 EMANE先查源再编译不要盲目 make常见做法是优先用系统包管理器安装省去依赖匹配的麻烦。Debian/Ubuntu 系下我一般这样装# 先检查源里有没有包 apt-cache search emane # 有就直接装emane-dev 提供头文件和示例 sudo apt install emane emane-dev emane-gui如果源里没有再去拿源码编译。编译前建议先看 README 里的依赖清单常见依赖是 libpcap、libxml2、boost 相关库。编译步骤用 CMaketar xzf emane-*.tar.gz cd emane-* mkdir build cd build cmake ../ -DCMAKE_INSTALL_PREFIX/usr/local make -j$(nproc) sudo make install这里的参数不用改动太多。CMAKE_INSTALL_PREFIX默认在/usr/local安装后如果emane命令找不到去/usr/local/bin看一眼把路径加进PATH。源码包名字里的通配符只是示例实际下载后改成对应版本目录名。编译报错最常见的是缺 boost 头文件属于依赖问题别死磕代码先把包补齐再编。装完验证一下版本和核心命令是否存在emane --version which emane emane-statsemane-stats是后面采集统计数据的工具如果which结果为空说明只装了运行时没装开发包或工具包回看安装步骤。3.2 最小 platform.xml两个 NEM 的场景骨架训练手册一般会建议你先从官方示例的 platform.xml 改起别从头手写 XML。演示一个最小结构只有两个 NEM模型用 RF-PIPE?xml version1.0 encodingUTF-8? platform param nameplatform.endpoint value127.0.0.1:40000/ param nameplatform.nemcount value2/ nem id1 param namenem.mac value00:00:00:00:00:01/ transport nametransudp/ radio namerfpipe param namerfpipe.frequency value2400M/ param namerfpipe.bandwidth value1M/ param namerfpipe.txpower value23/ /radio /nem nem id2 param namenem.mac value00:00:00:00:00:02/ transport nametransudp/ radio namerfpipe param namerfpipe.frequency value2400M/ param namerfpipe.bandwidth value1M/ param namerfpipe.txpower value23/ /radio /nem /platform参数说明platform.endpoint事件服务监听地址和端口。单机仿真用127.0.0.1:40000分布式仿真时从机要能通过网络访问到这个 UDP 端口。platform.nemcount声明 NEM 数量。这个值和实际 nem 块数量不一致时启动会报错属于最基础但最高频的笔误。nem.mac虚拟接口的 MAC 地址全局唯一。两个 NEM 若 MAC 相同上层协议栈会因地址冲突丢弃数据包链路层看起来是通的实际业务不通。rfpipe.frequency、rfpipe.bandwidth、rfpipe.txpower射频三要素频率和带宽必须一致才能互通发射功率影响信号覆盖半径。注意不同版本对 radio 子块的标签写法略有差异有的版本写成modual有的要求带library属性。遇到“rfpipe 不识别”的报错先打开训练手册参数表确认当前版本的模型名和库名不要硬套旧写法。3.3 nemdef.xml把模型参数和拓扑分离实验场景一大所有射频参数都堆在 platform.xml 里会很难维护。常见做法是单独建一个 nemdef.xml把射频模型参数集中定义platform.xml 只保留 NEM ID 和接口属性nemdef nem id1 radio namerfpipe param namerfpipe.bandwidth value1M/ param namerfpipe.frequency value2400M/ param namerfpipe.txpower value23/ param namerfpipe.rxthreshold value-92/ /radio /nem nem id2 radio namerfpipe param namerfpipe.bandwidth value1M/ param namerfpipe.frequency value2400M/ param namerfpipe.txpower value23/ param namerfpipe.rxthreshold value-92/ /radio /nem /nemdef这里的rfpipe.rxthreshold是接收灵敏度门限单位 dBm。信号强度低于这个值就判定为不可解调。门限设得太低会出现一个现象节点已经远得超过物理常识了链路还能通协议测试结果虚高。设得太高则多跳拓扑容易分裂仿真场景不稳定。我建议把 model 参数全放 nemdefplatform 只放 ID、MAC、transport。这样想扫描不同发射功率时只需改一个文件还能用脚本批量生成多组 nemdef 文件做对照实验。3.4 启动仿真并快速验证两个节点是否互通配置文件准备好后启动命令很简单emane /path/to/platform.xml --log-level info 21 | tee emane.log启动后观察日志尾部出现初始化完成的标志再继续。另一个终端里做两件事ps aux | grep emane ip link | grep e0正常情况能看到两个e0.x虚拟接口。给接口配 IP 前先确认它们处于 UP 状态sudo ip link set e0.1 up sudo ip addr add 192.168.10.1/24 dev e0.1 sudo ip link set e0.2 up sudo ip addr add 192.168.10.2/24 dev e0.2配完地址先别急着 ping先查 ARP 表。RF-PIPE 默认按路径损耗计算信号两个节点都在原点时距离为 0链路是通的但协议栈的 ARP 可能因为虚拟接口状态或 MAC 没有正确映射而失败。手动触发一次ping -I e0.1 192.168.10.2 -c 3如果不通立即抓包看有没有 ARP 请求sudo tcpdump -i e0.1 -c 10能看到 ARP 请求发出但没回复问题在射频模型或对端接口连 ARP 请求都没有问题在 transport 或接口状态。这个二分法能帮你快速缩小排查范围。3.5 结束仿真后随手清理接口kill 掉 emane 进程虚拟接口不会自动消失会变成残留状态。下次再启动时接口名冲突会让新实例起不来。我一般这样清理sudo killall emane for f in /sys/class/net/e0.*; do sudo ip link del ${f##*/} done这段脚本扫出所有e0.开头的残留接口并删除。别怕误删EMANE 创建的接口都是这种命名前缀普通物理网卡不会中招。这份训练 PDF 我始终放在手边当配置字典遇到unknown parameter报错直接去 PDF 的参数表里搜参数名确认当前版本是否支持、取值单位是什么比上网乱查快得多。版本差异导致的参数名变化很常见别靠记忆硬写。4. 让仿真贴近真实移动轨迹、路径损耗和事件注入4.1 用事件文件驱动节点移动而不是改配置重启真实 MANET 里节点时刻在动EMANE 的做法不是修改 XML 让节点“重启后到新位置”而是通过事件服务在运行中下发位置轨迹。事件文件通常叫 eel 文件每一行描述一条事件格式大致是“时间戳、NEM 编号、事件类型、参数”。不同版本的解析器对事件名的要求不完全一致动手前先翻一下训练手册里 WAYPOINT 事件的样例确认字段顺序。下面用 Python 生成一组两节点的移动轨迹#!/usr/bin/env python3 # generate_eel.py def emit_waypoint(nem, t, x0, y0, x1, y1, speed): # 时间戳使用启动后的秒数事件参数按起点X 起点Y 起点Z 终点X 终点Y 终点Z 速度排列 print(f{t:.6f} NEM{nem} WAYPOINT {x0} {y0} 0 {x1} {y1} 0 {speed}) # 节点1从(0,0)走到(500,500)速度10m/s emit_waypoint(1, 0.0, 0, 0, 500, 500, 10) # 节点2从(300,300)走到(800,100)速度8m/s emit_waypoint(2, 0.0, 300, 300, 800, 100, 8)脚本里的注释特意把字段顺序写出来因为 WAYPOINT 事件的参数顺序是高频踩坑点。不同版本对“速度”的解析单位也可能不同有的按 m/s有的按 km/h跑出来结果差异巨大。训练手册的事件参数表就是为这个准备的写脚本时逐字段对照一遍。生成文件后通过事件服务加载emane-eel --eventservice-uri 127.0.0.1:40000 --file waypoints.eel--eventservice-uri必须和 platform 配置里的platform.endpoint一致。加载成功的标志是工具输出event accepted没有任何输出或直接退出的多半是端口没通或事件格式解析失败。4.2 路径损耗模型和噪声模式把“信号好不好”从玄学变成参数RF-PIPE 模型里节点间能不能通是由路径损耗和接收门限算出来的不是随便设一个“覆盖范围”。训练手册参数表里常用的几项我整理成初始参考值参数作用我常用的初值rfpipe.pathloss.model路径损耗模型freespacerfpipe.pathloss.freespace.distance进入远场分界距离100rfpipe.pathloss.nlos是否计非视距损耗falserfpipe.noise.mode噪声叠加模式additiverfpipe.txpower发射功率23 dBmrfpipe.antennagain天线增益0 dBirfpipe.rxthreshold接收灵敏度门限-92 dBmfreespace 是最基础的视距损耗模型适合开阔场景用来跑协议性能上限。tworay 模型加入了地面反射路径适合节点贴近地面、收发天线高度较低的场景结果会比 freespace 更悲观。shadowing 模型在路径损耗上叠加随机阴影衰落适合模拟城市遮挡但同一场景重复跑结果会有波动要固定随机种子才能复现。rfpipe.noise.mode这里要单独拎出来说。none模式表示接收端完全忽略同频干扰只要信号强度高于门限就能正常接收additive模式则把同频干扰线性叠加入噪声多节点同时发射时即使单链路信号强度足够接收端也可能因干扰抬升而无法解调。自组网测试只要场景里存在多节点并发传输就必须用additive否则会得到“全网都能同时通信”的虚假结论。调参完成后我习惯用统计工具确认当前链路实际接收信号强度而不是等协议跑完再看结果。某项指标突然恶化时先确认是不是参数本身让链路物理上就断了避免把参数问题误判成协议问题。4.3 移动事件和真实时间对齐别让加速模式毁掉定时器协议EMANE 支持虚拟时间加速仿真速度可以比真实时间快很多。但有一个前提你运行的是不是对时间敏感的真实协议栈。OLSR、OSPF 这类路由协议有 hello 间隔、dead 间隔这些定时器按真实秒计算。把仿真加速到 10 倍速协议定时器不会跟着加速结果就是邻居以 10 倍速度超时、路由表反复震荡。我的一般做法是评估时延、收敛时间这种真实性能指标时保持默认实时模式让协议行为和物理层时延都在同一时间轴上只有做宏观拓扑演进的趋势分析且协议本身对 hello 间隔不敏感时才打开虚拟时间加速。加速跑出来的数据不能拿去和实时模式的结果直接对比时间基准都不同。另一个和真实时间相关的坑是事件文件的时间戳。eel 文件里第一列是相对启动时间的秒数不是绝对时钟时间。启动 emane 后如果过了 10 秒才加载事件文件而文件里第一个事件时间戳写的是 0这个事件会被当作历史事件丢弃。正确做法是让事件加载工具和 emane 同时启动或者把事件文件时间戳留出足够余量。4.4 固定随机种子让重复实验不再像抽奖shadowing 模型和某些噪声模型会引入随机数。同一个场景跑两遍丢包率差 10 个百分点不是仿真器坏了是随机种子没固定。训练手册里通常有一张“全局配置参数”表种子参数就在其中。把随机种子写进实验记录和把拓扑、轨迹、射频参数放在一起记录。以后做协议对比时最怕的就是两组实验之间“除了被测协议以外什么都不一样”。种子不统一连 baseline 都解释不了报告自然经不起复现。5. EMANE 常见问题排查5 个让仿真翻车的坑5.1 两个 NEM 明明同频为什么互相看不见现象platform.xml 里两个 NEM 频率、带宽、功率完全一致IP 也配了但 ping 不通emane 日志没有任何收包记录。原因最常见的是两个 NEM 的 MAC 地址写成了同一个。虚拟接口发出 ARP 请求对端接口收包后交给协议栈协议栈发现源 MAC 是自己直接丢弃。第二个常见原因是没有给 NEM 设置初始位置。RF-PIPE 计算路径损耗依赖距离两个节点都停在默认原点时距离为 0 反而能通但如果手动添加过位置事件其中一个节点被移到远处链路自然断开。解决先确认nem.mac全局唯一再用抓包确认链路层行为sudo tcpdump -i e0.1 -c 10看到 ARP 请求发出但没有回复说明传输和虚拟接口正常问题定位到射频模型。这时检查两个 NEM 的rfpipe.frequency和rfpipe.rxthreshold不要凭日志猜直接用抓包证据锁定哪一层失效。5.2 移动轨迹注入后节点位置乱飘现象eel 文件成功加载但节点位置在一段时间后跳到离谱坐标或者所有邻居在同一时刻全部掉线。原因WAYPOINT 事件里坐标和速度的顺序写错。训练手册里事件参数是按“起点坐标 终点坐标 速度”排列有人把速度填到坐标位置解析器不报错但计算出来的位置完全不符合预期。另一个原因是事件文件里逗号和空格混用某些解析器严格按空白符切分500,500会被当成一个非法数字。解决先用 awk 把分隔符统一成空格awk {gsub(/,/, ); print} raw_move.txt waypoints.eel再逐一核对事件参数表确保坐标、速度、时间戳的单位和字段顺序与当前版本一致。加载时看工具输出是否有accepted关键字没有就一条条检查。5.3 吞吐量虚高或虚低噪声模式没选对现象仿真里 30 个节点同时发送吞吐量反而接近单链路极限或者 20 Mbps 的信道带宽只跑出 1 Mbps怎么调都不对。原因前者通常是noise.mode设成了none射频模型不累计同频干扰所有节点可以“无干扰并发”与真实无线网络的行为完全不符。后者可能是bandwidth设得太窄再加上收发转换开销有效容量被物理层配置卡死。解决自组网并发密集的场景把rfpipe.noise.mode改为additive让同频干扰参与接收判定。再看rfpipe.bandwidth和rfpipe.datarate两个参数带宽决定了频谱资源数据速率决定了最高可用码率两者要匹配不然会出现带宽很宽但速率很低的不合理组合。调完后先跑一组单节点对传确认吞吐量合理再放开并发节点。5.4 多实例仿真时日志全是端口绑定失败现象第二台机器上启动 emane日志报cannot bind socket第一台机器运行正常。原因多台机器共用了同一份 platform.xml每台的platform.endpoint都是相同的 UDP 端口同一个主机上端口被占用进程起不来。分布式仿真里事件服务端口是全局资源每台机器必须分配不同端口。解决把主节点事件端口定为 40000从节点依次改为 40001、40002并确认从节点配置里的platform.endpoint指向主节点地址和对应端口。启动前先查占用ss -ulpn | grep 40000确认端口没被其他 emane 实例占用再继续。这个坑几乎每次多机联调都会遇到训练手册开头就强调端口规划但真正动手时最容易忘。5.5 图形界面里拖出的拓扑跑起来和 GUI 完全对不上现象用 emane-gui 画了 20 个节点节点位置、连线都清晰但实际仿真跑出来的邻居关系和 GUI 里显示的两码事。原因GUI 里的节点坐标主要服务于场景编辑和可视化不会自动写入 RF-PIPE 的路径损耗计算。射频模型看到的节点位置来自事件服务下发的位置事件或配置里的默认位置。如果只画了 GUI 没注入位置事件所有节点都在原点附近路径损耗为零拓扑和 GUI 展示自然不一致。解决把 GUI 当作拓扑编辑器和结果查看器所有移动和位置信息统一用 eel 文件注入。更稳妥的做法是轨迹先用脚本生成文本再通过事件服务下发最后用 GUI 校验轨迹是否正确。这样脚本和 GUI 维护同一份事实避免两边数据打架。我现在的习惯是 GUI 只用来“看”不承担“设”的职责。6. 把仿真数据变成可信结论统计输出与自动化对比仿真跑完不算结束能把数据变成可对比的结论才算落地。EMANE 自带统计工具把每个 NEM 的收发数量、吞吐和丢包按事件时间戳导出来我一般这样用emane-stats --eventservice-uri 127.0.0.1:40000 -c emane.log stats.csv输出行里带 NEM 编号和时间戳喂给 pandas 做聚合很方便。如果统计工具版本不同命令名类似训练手册命令行附录里都有说明核心参数是--eventservice-uri指定事件源-c指定日志补充信息。批量参数扫描时不要手动改 XML用脚本生成多组配置再跑for p in 10 20 30; do sed s/rfpipe.txpower\ value\[0-9]*\/rfpipe.txpower\ value\${p}\/ platform.xml platform_${p}.xml timeout 60 emane platform_${p}.xml emane_${p}.log 21 emane-stats --eventservice-uri 127.0.0.1:40000 -c emane_${p}.log stats_${p}.csv for f in /sys/class/net/e0.*; do sudo ip link del ${f##*/}; done done循环里每个步骤都有讲究timeout 60保证仿真跑到固定时长就结束避免进程滞留跑完立刻清理虚拟接口避免下一轮启动时接口冲突。用 sed 改 XML 只适合参数值替换复杂结构调整建议直接让 Python 生成配置别在 shell 里做字符串手术。最后做一次端到端验证一个 NEM 上打流另一个 NEM 上抓包用报文时间差计算单向时延# 节点1 侧打 UDP 流 iperf3 -c 192.168.10.2 -u -b 1M -t 30 -i 5 # 节点2 侧抓包 sudo tcpdump -i e0.2 -n udp port 5566 -ttt抓到的丢包率和统计工具的丢包率能对上说明整条链路可信。数据对不上时先怀疑自己的配置而不是仿真器——这几乎是我在 EMANE 上踩坑后唯一的结论。经历了几轮“真机场地难约、夜间测试不可控”之后我现在做协议评估的固定流程是先跑 freespace 出性能基线再切 shadowing 看参数敏感度轨迹和随机种子全部写进实验记录最后用统计工具和抓包交叉验证。这份 EMANE 训练手册我当字典用真正形成判断力的还是从这些坑里爬出来的经验。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →