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

求助:如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:59:26