You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OMNeT++ 6.0.1中获取丢包率、吞吐量与端到端延迟统计?

OMNeT++ 6.0.1(INET 4.5)UDP视频流仿真统计问题

问题描述

在OMNeT++ 6.0.1搭配INET 4.5环境下开展UDP视频流仿真,尝试通过@statistic[nameOfStatistic]统计丢包率,但结果并未出现在.anf文件中,不清楚该如何计算该指标。同时希望获取每个节点的丢包率、吞吐量与端到端延迟数据,请问应使用何种模块过滤器或结果名称过滤器?

附上当前NED与.ini配置代码:

.NED 文件

import inet.networklayer.configurator.ipv4.Ipv4NetworkConfigurator;
import inet.node.ethernet.EthernetSwitch;
import inet.node.inet.StandardHost;
import inet.node.inet.WirelessHost;
import inet.node.wireless.AccessPoint;
import inet.physicallayer.wireless.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.visualizer.common.IntegratedVisualizer;
import ned.DatarateChannel;
//WIRED-SCENARIO
network GiB
{
    parameters:
        @display("bgb=1986.9299,976.53595");
        @statistic[endToendDelay](title="end-to-end delay"; source="messageAge(rcvdPk)"; unit=s; record=vector);
        @statistic[throughput](title="throughput"; unit=bps; source="throughput(rcvdPk)"; record=vector);
   
        int numHosts;
        int numWHosts;
    types:
        channel Ether1000m extends DatarateChannel
        {
            datarate = 1000Mbps;
            delay = 0.1us;
        }
    submodules:
        standardHost[numHosts]: StandardHost;
        standardHost1[numHosts]: StandardHost;
        server: StandardHost {
            @display("p=985.446,69.498;i=device/server");
        }
        configurator: Ipv4NetworkConfigurator {
            @display("p=263.675,820.875");
        }
        centerSwitch: EthernetSwitch {
            @display("p=985.446,276.21");
        }
        ethernetSwitch1: EthernetSwitch {
            @display("p=518.562,441.936");
        }
        ethernetSwitch2: EthernetSwitch {
            @display("p=760.914,488.26797");
        }
        wirelessHost[numWHosts]: WirelessHost {
            @display("p=265.518,185.328");
        }
        wirelessHost1[numWHosts]: WirelessHost {
            @display("p=115.829994,367.09198");
        }
        accessPoint: AccessPoint {
            @display("p=504.306,276.21");
        }
        accessPoint1: AccessPoint {
            @display("p=311.85,422.33398");
        }
        radioMedium: Ieee80211ScalarRadioMedium {
            @display("p=450.2375,818.3875");
        }
        visualizer: IntegratedVisualizer {
            @display("p=114.424995,820.875");
        }
        ethernetSwitch3: EthernetSwitch {
            @display("p=1044.252,497.17798");
        }
        ethernetSwitch4: EthernetSwitch {
            @display("p=1309.77,506.08798");
        }
        ethernetSwitch5: EthernetSwitch {
            @display("p=1564.596,543.51");
        }
        standardHost2[numHosts]: StandardHost;
        standardHost3[numHosts]: StandardHost;
        standardHost4[numHosts]: StandardHost;
    connections:
        server.ethg++ <--> Ether1000m <--> centerSwitch.ethg++;
        ethernetSwitch1.ethg++ <--> Ether1000m <--> centerSwitch.ethg++;
        ethernetSwitch2.ethg++ <--> Ether1000m <--> centerSwitch.ethg++;
        centerSwitch.ethg++ <--> Ether1000m <--> ethernetSwitch3.ethg++;
        centerSwitch.ethg++ <--> Ether1000m <--> ethernetSwitch4.ethg++;
        centerSwitch.ethg++ <--> Ether1000m <--> ethernetSwitch5.ethg++;
        for i=0..numHosts-1 {
            ethernetSwitch1.ethg++ <--> Ether1000m <--> standardHost[i].ethg++;
            standardHost1[i].ethg++ <--> Ether1000m <--> ethernetSwitch2.ethg++;
            ethernetSwitch3.ethg++ <--> Ether1000m <--> standardHost2[i].ethg++;
            ethernetSwitch4.ethg++ <--> Ether1000m <--> standardHost3[i].ethg++;
            ethernetSwitch5.ethg++ <--> Ether1000m <--> standardHost4[i].ethg++;
        }
        ethernetSwitch1.ethg++ <--> Ether1000m <--> accessPoint1.ethg++;
        ethernetSwitch2.ethg++ <--> Ether1000m <--> accessPoint.ethg++;
}

.ini 文件

[General]
network = GiB
sim-time-limit = 3600s

#**.numHosts = ${5..25 step 10}
**.numHosts = ask
**.numWHosts = ask

**.channel.throughput.statistic-recording = true
**.channel.throughput.result-recording-modes = all
**.*.vector-recording = true
**.*.vector-recording-intervals = 0..900
**.*.scalar-recording = true

**.standardHost[*].numApps = 1
**.standardHost[*].app[*].typename = "UdpVideoStreamClient"
**.standardHost[*].app[*].serverAddress = "server"
**.standardHost[*].app[*].serverPort = 1000

**.constraintAreaMinX = 0m
**.constraintAreaMinY = 0m
**.constraintAreaMinZ = 0m
**.constraintAreaMaxX = 800m
**.constraintAreaMaxY = 500m
**.constraintAreaMaxZ = 0m

**.standardHost1[*].numApps = 1
**.standardHost1[*].app[*].typename = "UdpVideoStreamClient"
**.standardHost1[*].app[*].serverAddress = "server"
**.standardHost1[*].app[*].serverPort = 1000

**.standardHost2[*].numApps = 1
**.standardHost2[*].app[*].typename = "UdpVideoStreamClient"
**.standardHost2[*].app[*].serverAddress = "server"
**.standardHost2[*].app[*].serverPort = 1000

**.standardHost3[*].numApps = 1
**.standardHost3[*].app[*].typename = "UdpVideoStreamClient"
**.standardHost3[*].app[*].serverAddress = "server"
**.standardHost3[*].app[*].serverPort = 1000

**.standardHost4[*].numApps = 1
**.standardHost4[*].app[*].typename = "UdpVideoStreamClient"
**.standardHost4[*].app[*].serverAddress = "server"
**.standardHost4[*].app[*].serverPort = 1000

**.server.numApps = 1
**.server.app[*].typename = "UdpVideoStreamServer"
**.server.app[*].localPort = 1000
**.server.app[*].sendInterval = 0.001s
**.server.app[*].packetLen = 1400B
**.server.app[*].videoSize = 1Gb

**.addDefaultRoutes = false

#Assigning SSID to access point and configuring wireless hosts

*.accessPoint.numApps = 1
*.accessPoint.numWlanInterfaces = default
*.accessPoint.wlan[*].mgmt.ssid = "AP"
*.accessPoint1.numApps = 1
*.accessPoint1.numWlanInterfaces = default
*.accessPoint1.wlan[*].mgmt.ssid = "AP1"

*.wirelessHost[*].numApps = 1
*.wirelessHost[*].wlan[*].agent.defaultSsid = "AP"
*.wirelessHost[*].app[*].typename = "UdpVideoStreamClient"
*.wirelessHost[*].app[*].serverAddress = "server"
*.wirelessHost[*].app[*].serverPort = 1000

*.wirelessHost1[*].numApps = 1
*.wirelessHost1[*].wlan[*].agent.defaultSsid = "AP1"
*.wirelessHost1[*].app[*].typename = "UdpVideoStreamClient"
*.wirelessHost1[*].app[*].serverAddress = "server"
*.wirelessHost1[*].app[*].serverPort = 1000

解决方案

1. 丢包率统计问题修复与计算方式

你之前在网络NED里定义的@statistic没生效,是因为统计源没绑定到具体的模块事件(比如客户端的接收、服务器的发送)。丢包率需要基于服务器发送的包数和客户端接收的包数计算,公式为:
丢包率 = 1 - (客户端接收包数 / 服务器对应客户端的发送包数)

配置方式二选一:

方式一:在NED中为客户端/服务器添加统计

修改网络的parameters块,添加针对客户端的丢包率统计:

@statistic[packetLossRate](
    title="Packet Loss Rate";
    source="(count(sentPk) - count(rcvdPk)) / count(sentPk)";
    record=scalar,vector;
    unit=ratio;
    module="*.standardHost[*].app[*],*.standardHost1[*].app[*],*.standardHost2[*].app[*],*.standardHost3[*].app[*],*.standardHost4[*].app[*],*.wirelessHost[*].app[*],*.wirelessHost1[*].app[*]";
)

这里module指定了所有客户端模块,统计每个客户端自身的发送/接收差与发送数的比值。

方式二:在.ini中全局配置统计

在.ini的[General]块添加:

# 统计每个客户端的接收包数
**.*Host[*].app[*].rcvdPk.statistic-recording = true
# 统计服务器的发送包数
**.server.app[*].sentPk.statistic-recording = true

# 定义丢包率统计
**.*Host[*].app[*].@statistic[packetLossRate].source = "1 - (count(rcvdPk) / count(sentPk))"
**.*Host[*].app[*].@statistic[packetLossRate].record = scalar,vector
**.*Host[*].app[*].@statistic[packetLossRate].unit = ratio

2. 每个节点的指标过滤配置

要获取每个节点的三个指标,需要在结果分析时使用以下过滤器:

模块过滤器(针对节点)

  • 所有客户端(合并):**.*Host[*].app[*]
  • 有线客户端单独筛选:**.standardHost[*].app[*],**.standardHost1[*].app[*],**.standardHost2[*].app[*],**.standardHost3[*].app[*],**.standardHost4[*].app[*]
  • 无线客户端单独筛选:**.wirelessHost[*].app[*],**.wirelessHost1[*].app[*]

结果名称过滤器(针对指标)

  • 端到端延迟:*endToendDelay*
  • 吞吐量:*throughput*
  • 丢包率:*packetLossRate*

简化的.ini统计配置(覆盖所有指标)

替换你现有.ini中的统计相关配置,改为:

# 启用所有客户端的核心统计
**.*Host[*].app[*].statistic-recording = true
**.*Host[*].app[*].result-recording-modes = all

# 端到端延迟:客户端接收包时记录消息年龄
**.*Host[*].app[*].@statistic[endToendDelay].source = "messageAge(rcvdPk)"
**.*Host[*].app[*].@statistic[endToendDelay].record = scalar,vector
**.*Host[*].app[*].@statistic[endToendDelay].unit = s

# 吞吐量:基于接收包计算
**.*Host[*].app[*].@statistic[throughput].source = "throughput(rcvdPk)"
**.*Host[*].app[*].@statistic[throughput].record = scalar,vector
**.*Host[*].app[*].@statistic[throughput].unit = bps

# 丢包率:基于发送/接收包数计算
**.*Host[*].app[*].@statistic[packetLossRate].source = "1 - (count(rcvdPk) / count(sentPk))"
**.*Host[*].app[*].@statistic[packetLossRate].record = scalar,vector
**.*Host[*].app[*].@statistic[packetLossRate].unit = ratio

3. 结果验证

仿真结束后,在OMNeT++的结果分析工具中:

  1. 选择模块过滤器为**.*Host[*].app[*]
  2. 选择结果名称过滤器为endToendDelay|throughput|packetLossRate
  3. 即可查看每个客户端节点的对应指标数据,这些数据会自动写入.anf文件。

内容的提问来源于stack exchange,提问作者nisar007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:17:02