求助:如何在Mininet中连接3个POX控制器?现有方法仅支持两个
解决Mininet连接3个POX控制器并实现L2转发的问题
嘿,我明白你的困扰了!默认的forwarding.l2_pairs组件确实只针对单控制器或主备双控制器场景设计,没法直接支持3个控制器的连接。不过我们可以通过调整Mininet配置、自定义POX组件或者采用分布式转发逻辑来解决这个问题,下面是具体的可行方案:
方案一:多控制器直连+自定义L2转发组件
这个方案让3个控制器平等连接到交换机,各自处理转发逻辑,适合需要分布式控制的场景。
1. 启动多个POX控制器实例
分别打开3个终端窗口,每个窗口启动一个POX实例,监听不同端口,同时加载基础OpenFlow组件和我们自定义的转发逻辑:
终端1(控制器1,端口6633):
./pox.py openflow.of_01 --port=6633 openflow.discovery my_l2_forwarding
终端2(控制器2,端口6634):
./pox.py openflow.of_01 --port=6634 openflow.discovery my_l2_forwarding
终端3(控制器3,端口6635):
./pox.py openflow.of_01 --port=6635 openflow.discovery my_l2_forwarding
2. 编写自定义转发组件my_l2_forwarding.py
把这个文件放到POX的ext目录下,它能兼容多控制器环境,处理交换机连接和数据包转发:
from pox.core import core import pox.openflow.libopenflow_01 as of log = core.getLogger() class MyL2Forwarding(object): def __init__(self, connection): self.connection = connection connection.addListeners(self) self.mac_to_port = {} # 存储MAC地址到端口的映射 def _handle_PacketIn(self, event): packet = event.parsed # 更新MAC地址映射表 self.mac_to_port[packet.src] = event.port if packet.dst in self.mac_to_port: # 下发流表项实现转发 msg = of.ofp_flow_mod() msg.match = of.ofp_match.from_packet(packet) msg.idle_timeout = 10 msg.hard_timeout = 30 msg.actions.append(of.ofp_action_output(port=self.mac_to_port[packet.dst])) msg.data = event.ofp self.connection.send(msg) else: # 未知MAC地址则泛洪 msg = of.ofp_packet_out() msg.data = event.ofp msg.actions.append(of.ofp_action_output(port=of.OFPP_FLOOD)) self.connection.send(msg) def launch(): def start_switch(event): log.debug("Controlling switch %s" % (event.connection,)) MyL2Forwarding(event.connection) core.openflow.addListenerByName("ConnectionUp", start_switch) log.info("Custom L2 Forwarding component running")
3. 启动Mininet并连接3个控制器
在新终端执行命令,指定拓扑和三个控制器的地址:
sudo mn --topo linear,3 --controller remote,127.0.0.1:6633,remote,127.0.0.1:6634,remote,127.0.0.1:6635 --switch ovsk,protocols=OpenFlow10
这里用linear,3创建3主机2交换机的拓扑,你可以根据需求替换成其他拓扑(比如tree,depth=2,fanout=3)。
方案二:主从控制器模式(主决策+从备份)
如果不需要3个控制器都主动处理转发,只想让主控制器负责决策,另外两个作为备份,可采用这种模式:
1. 启动主控制器(端口6633)
加载原生的forwarding.l2_pairs负责转发逻辑:
./pox.py openflow.of_01 --port=6633 forwarding.l2_pairs
2. 启动两个从控制器(端口6634、6635)
加载基础组件监听主控制器状态,主控制器故障时自动接管:
# 从控制器1 ./pox.py openflow.of_01 --port=6634 openflow.discovery openflow.controller # 从控制器2 ./pox.py openflow.of_01 --port=6635 openflow.discovery openflow.controller
3. 启动Mininet连接3个控制器
sudo mn --topo single,3 --controller remote,127.0.0.1:6633,remote,127.0.0.1:6634,remote,127.0.0.1:6635 --switch ovsk
关键注意事项
- 所有POX实例要使用相同的OpenFlow版本(比如都用1.0或1.3),避免兼容性问题。
- 如果用OpenFlow1.3,可通过
ofp_role_request消息设置控制器角色(主/从/平等),实现更灵活的分布式控制。 - 测试时可以用
pingall命令验证主机连通性,同时在POX终端查看日志确认控制器正常工作。
内容的提问来源于stack exchange,提问作者Fawad Shah
相关产品推荐
相关产品推荐

