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默认会泛洪未知单播数据包,我们可以通过抓包验证:
- 在Mininet CLI中打开h2和h3的终端:
h2 xterm、h3 xterm - 在h2和h3的终端启动tcpdump抓包:
tcpdump -i h2-eth0 -n ip tcpdump -i h3-eth0 -n ip
- 在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
相关产品推荐
相关产品推荐

