NS3拓扑安装traffic-control层实现节点0单qdisc入流量统计咨询
NS3 单节点多网卡统一配置单个qdisc实现全局入站流量统计方案
现象原因
默认调用TrafficControlHelper::Install方法时,NS3会为节点的每个NetDevice单独绑定一个出站方向的根qdisc,你看到node0上生成两个qdisc,就是node0连接node1、node2的两个p2p网卡对应的出站队列,仅管控node0向外发送的流量,和你需要统计的入站流量属于不同方向。
实现步骤
要实现单个qdisc统计所有node1、node2发往node0的入站流量,可通过共享ingress qdisc的方式实现:
- 先创建你需要的统计用qdisc实例,并挂载统计回调,示例使用
PfifoFastQueueDisc:
// 自定义统计回调,可按需统计包数、字节数、流信息等 void EnqueueTrace(Ptr<const QueueDiscItem> item) { // 此处添加你的统计逻辑 } // 创建全局共享的统计qdisc Ptr<QueueDisc> globalStatQdisc = CreateObject<PfifoFastQueueDisc>(); // 按需配置qdisc参数,例如调大队列长度避免统计过程丢包 globalStatQdisc->SetAttribute("MaxSize", QueueSizeValue(QueueSize("2000p"))); // 挂载入队trace实现流量统计 globalStatQdisc->TraceConnectWithoutContext("Enqueue", MakeCallback(&EnqueueTrace));
- 将该qdisc设置为node0所有网卡的共享入站qdisc:
// 获取node0的流量控制层实例 Ptr<TrafficControlLayer> tcLayer = node0->GetObject<TrafficControlLayer>(); // 遍历node0的所有网卡,绑定同一个ingress qdisc for (uint32_t devIdx = 0; devIdx < node0->GetNDevices(); devIdx++) { Ptr<NetDevice> dev = node0->GetDevice(devIdx); tcLayer->SetIngressQueueDisc(dev, globalStatQdisc); }
可选配置
如果你不需要默认的出站qdisc,可以在安装流量控制层时关闭自动安装逻辑,避免生成多余的qdisc实例:
TrafficControlHelper tcHelper; // 关闭自动为每个网卡安装出站根qdisc的逻辑 tcHelper.SetInstallRoot(false); tcHelper.Install(node0);
内容的提问来源于stack exchange,提问作者Trường Cấn
相关产品推荐
相关产品推荐

