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

Mininet数据包优先级配置与泛洪展示实现教程问询

搭建支持优先级数据包的Mininet拓扑并展示泛洪效果

Hey there!作为Mininet新手,想要实现带优先级数据包的拓扑+泛洪效果展示,我来给你一步步拆解实操方案~

一、先创建基础Mininet拓扑

先从简单的单交换机多主机拓扑入手,你可以选CLI快速创建或者自定义Python脚本(后者更灵活):

方法1:Mininet CLI快速启动

打开终端,直接输入命令启动拓扑:

mn --topo single,3 --mac --switch ovsk --controller remote

参数说明:

  • --topo single,3:单交换机连接3台主机的拓扑
  • --mac:让主机/交换机的MAC地址更易读(比如00:00:00:00:00:01)
  • --switch ovsk:使用Open vSwitch作为交换机
  • --controller remote:预留远程控制器接口(默认会启动内置控制器,也可以替换成RYU/POX等自定义控制器)

方法2:自定义Python脚本(可扩展)

创建priority_topo.py文件,内容如下:

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import OVSSwitch, RemoteController
from mininet.cli import CLI
from mininet.log import setLogLevel

class PriorityTopo(Topo):
    def build(self):
        # 创建核心交换机
        s1 = self.addSwitch('s1')
        # 创建3台测试主机
        h1 = self.addHost('h1')
        h2 = self.addHost('h2')
        h3 = self.addHost('h3')
        # 连接主机与交换机
        self.addLink(h1, s1)
        self.addLink(h2, s1)
        self.addLink(h3, s1)

if __name__ == '__main__':
    setLogLevel('info')
    topo = PriorityTopo()
    net = Mininet(topo=topo, switch=OVSSwitch, controller=RemoteController)
    net.start()
    CLI(net)
    net.stop()

运行脚本:sudo python3 priority_topo.py

二、配置数据包优先级

Mininet里主要通过**DSCP标记(网络层)或802.1p VLAN优先级(数据链路层)**实现数据包分级,这里给你两种常用配置方式:

1. 主机端用tc标记DSCP优先级

DSCP通过IP头的TOS字段标记,范围0-63,我们可以给主机的出口流量绑定不同优先级队列:

  • 在Mininet CLI中打开h1的终端:h1 xterm
  • 在h1的终端里执行以下命令:
# 清除现有队列规则
tc qdisc del dev h1-eth0 root
# 添加HTB队列框架,设置默认优先级类
tc qdisc add dev h1-eth0 root handle 1: htb default 30
# 创建三个不同优先级的流量类(prio值越小,优先级越高)
tc class add dev h1-eth0 parent 1: classid 1:10 htb rate 1000mbit prio 0
tc class add dev h1-eth0 parent 1: classid 1:20 htb rate 1000mbit prio 1
tc class add dev h1-eth0 parent 1: classid 1:30 htb rate 1000mbit prio 2
# 绑定DSCP标记到对应优先级类
tc filter add dev h1-eth0 parent 1: protocol ip prio 0 u32 match ip dsfield 0x10 0xfc flowid 1:10
tc filter add dev h1-eth0 parent 1: protocol ip prio 1 u32 match ip dsfield 0x08 0xfc flowid 1:20

解释:0x10对应DSCP值16(高优先级),0x08对应DSCP值8(中优先级),默认流量走低优先级类。

2. OpenFlow控制器配置优先级流表

如果你用RYU控制器,可以写一个简单的应用,让交换机识别不同优先级的数据包并执行泛洪:

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3

class PriorityFloodController(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(PriorityFloodController, self).__init__(*args, **kwargs)

    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        datapath = ev.msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser

        # 高优先级DSCP(0x10):设置流表优先级10,执行泛洪
        match = parser.OFPMatch(ip_dscp=0x10)
        actions = [parser.OFPActionOutput(ofproto.OFPP_FLOOD)]
        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
        mod = parser.OFPFlowMod(datapath=datapath, priority=10, match=match, instructions=inst)
        datapath.send_msg(mod)

        # 中优先级DSCP(0x08):设置流表优先级5,执行泛洪
        match = parser.OFPMatch(ip_dscp=0x08)
        actions = [parser.OFPActionOutput(ofproto.OFPP_FLOOD)]
        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
        mod = parser.OFPFlowMod(datapath=datapath, priority=5, match=match, instructions=inst)

        # 默认规则:所有未匹配的数据包泛洪,流表优先级0
        match = parser.OFPMatch()
        actions = [parser.OFPActionOutput(ofproto.OFPP_FLOOD)]
        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
        mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=match, instructions=inst)
        datapath.send_msg(mod)

这个控制器会让不同优先级的数据包都被泛洪,且高优先级的流表规则会优先匹配。

三、展示数据包泛洪效果

Open vSwitch默认会泛洪未知单播数据包,我们可以通过抓包验证:

  1. 在Mininet CLI中打开h2和h3的终端:h2 xterm、h3 xterm
  2. 在h2和h3的终端启动tcpdump抓包:
tcpdump -i h2-eth0 -n ip
tcpdump -i h3-eth0 -n ip
  1. 在h1的终端发送不同优先级的ping包:
# 高优先级(DSCP 0x10)
ping -Q 0x10 10.0.0.2
# 中优先级(DSCP 0x08)
ping -Q 0x08 10.0.0.2
# 默认低优先级
ping 10.0.0.2

你会看到h2和h3的tcpdump里都能抓到这些ping包,说明数据包被交换机泛洪到了所有端口,同时可以通过抓包结果里的tos字段看到对应的优先级标记(比如tos 0x10就是高优先级)。

四、验证优先级调度生效

如果想验证优先级的实际调度效果,可以给交换机端口限制带宽:

# 在Mininet CLI中,给s1连接h1的端口设置带宽限制
s1 tc qdisc add dev s1-eth1 root handle 1: htb default 30
s1 tc class add dev s1-eth1 parent 1: classid 1:10 htb rate 80mbit prio 0
s1 tc class add dev s1-eth1 parent 1: classid 1:20 htb rate 50mbit prio 1
s1 tc class add dev s1-eth1 parent 1: classid 1:30 htb rate 20mbit prio 2

然后用iperf测试流量:

# 在h2启动iperf服务:h2 iperf -s
# 在h1发送高优先级流量:h1 iperf -c 10.0.0.2 -t 10 -Q 0x10
# 在h1发送低优先级流量:h1 iperf -c 10.0.0.2 -t 10 -Q 0x00

你会看到高优先级的流量能获得更多带宽,直观验证优先级配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:33:30