0

0

Mininet与OpenDaylight本地控制器连接教程:脚本化集成实践

霞舞

霞舞

发布时间:2025-10-03 09:38:22

|

273人浏览过

|

来源于php中文网

原创

Mininet与OpenDaylight本地控制器连接教程:脚本化集成实践

本教程旨在解决Mininet模拟器与OpenDaylight控制器在同一本地环境中,通过Python脚本进行连接时遇到的常见问题。文章深入分析了为何直接使用mn命令可以成功连接,而自定义脚本可能失败的原因,并提供了一个精确的解决方案。核心在于Mininet初始化时,需显式指定RemoteController作为默认控制器类型和OVSSwitch作为默认交换机类型,以确保网络拓扑的正确构建和控制器通信的顺畅进行。

1. 理解Mininet与OpenDaylight本地连接的挑战

在软件定义网络(sdn)的实践中,mininet作为轻量级网络模拟器,常与opendaylight(odl)等控制器配合使用,以构建和测试网络拓扑及控制逻辑。当mininet和odl都在同一台本地机器上运行时,我们通常期望通过python脚本自动化拓扑的创建和连接。然而,一个常见的问题是,尽管通过命令行直接运行sudo mn --controller=remote,ip=127.0.0.1,port=6633可以成功连接控制器,但使用自定义python脚本时,却可能无法建立连接。

以下是一个典型的Mininet脚本示例,它尝试连接一个远程控制器:

from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.cli import CLI
from mininet.log import info, setLogLevel

setLogLevel('info')

def create_topology():
    # 初始尝试:将控制器添加到已创建的网络中
    net = Mininet(controller=None) # 此时Mininet尚未指定默认控制器类型

    info('*** Adding controller\n')
    # 显式添加一个远程控制器实例
    c0 = net.addController('c0', controller=RemoteController, ip='127.0.0.1', port=6633)

    info('*** Adding hosts and switches\n')
    s1 = net.addSwitch('s1')
    s2 = net.addSwitch('s2')
    h1 = net.addHost('h1')
    h2 = net.addHost('h2')
    h3 = net.addHost('h3')
    h4 = net.addHost('h4')

    info('*** Creating links\n')
    net.addLink(h1, s1)
    net.addLink(h2, s2)
    net.addLink(h3, s1)
    net.addLink(h4, s2)
    # 链接交换机到控制器 (虽然通过addController已指定,但这里是逻辑上的拓扑连接)
    # 注意:Mininet的addLink通常用于主机和交换机之间,或交换机之间。
    # 交换机到控制器的连接是由交换机自身配置的OpenFlow协议完成。
    # net.addLink(s1, c0) # 这行在Mininet中通常是不必要的,因为交换机通过OpenFlow协议连接控制器
    # net.addLink(s2, c0) # 同上

    return net

if __name__ == '__main__':
    topo = create_topology()
    info('*** Starting network\n')
    # 启动控制器实例
    topo.controllers[0].start()
    topo.start()

    info('*** Running CLI\n')
    CLI(topo)

    info('*** Stopping network\n')
    topo.controllers[0].stop()
    topo.stop()

上述脚本的问题在于,尽管我们通过net.addController添加了一个RemoteController实例,但在Mininet(controller=None)初始化时,Mininet并没有被告知其拓扑中的交换机应该默认连接哪种类型的控制器。这可能导致交换机在启动时无法正确地与远程控制器建立OpenFlow会话。

2. 问题根源分析:Mininet默认行为与控制器类型

Mininet在初始化时,如果未明确指定controller参数,它会默认使用DefaultController(通常是一个内部的简单控制器)或不预设任何控制器类型。当后续通过net.addController()添加一个RemoteController实例时,这个实例本身会被创建并启动,但Mininet拓扑中的交换机(尤其是Open vSwitch, OVS)在启动时,可能并不知道要连接到哪个控制器,或者它们尝试连接到错误的默认控制器类型。

与此不同的是,sudo mn --controller=remote,ip=127.0.0.1,port=6633这样的命令行参数,会指示Mininet在构建拓扑时,将所有创建的交换机默认配置为连接到指定的远程控制器。这种“全局”的默认配置确保了交换机能够正确地发现并连接到远程ODL实例。

3. 解决方案:显式配置Mininet构造器

解决此问题的关键在于,在Mininet构造函数中显式地指定默认的控制器类型和交换机类型。通过将controller=RemoteController和switch=OVSSwitch作为参数传递给Mininet类,我们可以确保Mininet在创建拓扑时,其内部的交换机能够正确地被配置为连接到远程OpenDaylight控制器。

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载

修改后的Mininet初始化代码如下:

from mininet.net import Mininet
from mininet.node import RemoteController, OVSSwitch # 引入OVSSwitch
from mininet.cli import CLI
from mininet.log import info, setLogLevel

setLogLevel('info')

def create_topology_fixed():
    # 关键修改:在Mininet初始化时,显式指定默认控制器类型和交换机类型
    net = Mininet(controller=RemoteController, switch=OVSSwitch)

    info('*** Adding controller\n')
    # 此时,Mininet会自动创建并管理一个RemoteController实例
    # 如果需要自定义IP/Port,可以通过addController方法,但通常Mininet会根据默认参数进行配置
    # 更好的做法是让Mininet自动处理,或者在Mininet构造器中直接指定控制器参数
    # 如果Mininet构造器中已指定controller=RemoteController,则可以省略addController,
    # 或者用addController来覆盖默认行为或添加多个控制器。
    # 对于单个本地控制器,通常Mininet会自动将其配置为127.0.0.1:6653 (或6633)
    # 为确保与ODL的6633端口匹配,我们仍可显式添加或确保Mininet的默认端口设置。
    # 这里的addController仍然有效,它会添加一个控制器实例并可能覆盖Mininet的默认配置
    c0 = net.addController('c0', controller=RemoteController, ip='127.0.0.1', port=6633)


    info('*** Adding hosts and switches\n')
    s1 = net.addSwitch('s1')
    s2 = net.addSwitch('s2')
    h1 = net.addHost('h1')
    h2 = net.addHost('h2')
    h3 = net.addHost('h3')
    h4 = net.addHost('h4')

    info('*** Creating links\n')
    net.addLink(h1, s1)
    net.addLink(h2, s2)
    net.addLink(h3, s1)
    net.addLink(h4, s2)
    # 交换机到控制器的连接由OpenFlow协议处理,无需在Mininet中显式添加链接
    # net.addLink(s1, c0) # 移除或注释掉
    # net.addLink(s2, c0) # 移除或注释掉

    return net

if __name__ == '__main__':
    topo = create_topology_fixed()
    info('*** Starting network\n')
    # 启动控制器实例
    topo.controllers[0].start() # 确保RemoteController实例被启动
    topo.start()

    info('*** Running CLI\n')
    CLI(topo)

    info('*** Stopping network\n')
    topo.controllers[0].stop()
    topo.stop()

为什么这个修改有效?

  • controller=RemoteController: 当Mininet在初始化时被告知所有交换机都应连接到RemoteController类型时,它会相应地配置这些交换机。具体来说,它会指示Open vSwitch(OVS)实例尝试连接到RemoteController的默认地址和端口(通常是127.0.0.1:6633或6653,取决于Mininet版本和配置)。
  • switch=OVSSwitch: 明确指定使用OVSSwitch作为交换机类型,确保Mininet使用Open vSwitch,这是与OpenDaylight控制器交互的标准交换机。虽然Mininet通常默认使用OVS,但显式声明可以避免潜在的兼容性问题。
  • net.addController('c0', controller=RemoteController, ip='127.0.0.1', port=6633):这一行仍然很重要,它定义了具体要连接的远程控制器的IP地址和端口。即使在Mininet构造器中指定了RemoteController,仍需要此行来提供控制器的具体连接参数。

4. OpenDaylight控制器准备

在运行Mininet脚本之前,请确保您的OpenDaylight控制器已正确启动并运行。

  1. 启动OpenDaylight Karaf: 导航到您的OpenDaylight安装目录,并运行Karaf容器:
    ./bin/karaf
  2. 安装必要功能: 在Karaf命令行中,安装SDN控制器所需的核心功能,例如:
    feature:install odl-l2switch-switch odl-restconf odl-dlux-all
    • odl-l2switch-switch: 提供了基本的二层交换功能,允许控制器学习MAC地址并转发数据包。
    • odl-restconf: 提供RESTful API接口,用于管理和配置控制器。
    • odl-dlux-all: 提供DLUX Web UI,方便可视化管理和监控网络。
  3. 确认端口: OpenDaylight默认监听OpenFlow端口6633(或6653,取决于版本和配置)。请确保此端口没有被其他应用程序占用。您可以通过查看ODL的日志或配置来确认。

5. 操作步骤与验证

  1. 启动OpenDaylight: 按照上述步骤启动ODL Karaf并安装所需功能。等待ODL完全启动,这可能需要几分钟。
  2. 运行Mininet脚本: 打开一个新的终端,导航到您的Mininet脚本目录,并运行:
    sudo python your_mininet_script.py
  3. 验证连接:
    • Mininet CLI: 在Mininet CLI中,输入dpctl show s1或dpctl show s2。您应该能看到交换机已连接到控制器,例如输出中包含is_connected:true和控制器的IP/端口信息。
    • OpenDaylight Karaf日志: 观察ODL Karaf的日志输出,您应该能看到类似“OpenFlow connection received from ...”或“Switch s1 connected”等消息。
    • OpenDaylight DLUX UI: 如果您安装了odl-dlux-all,可以在浏览器中访问http://localhost:8181/dlux/index.html(默认凭据:admin/admin),在“Topology”或“Nodes”视图中,您应该能看到Mininet创建的交换机和主机。
    • Ping测试: 在Mininet CLI中,运行h1 ping h2或net.pingAll()。如果连接成功,ping操作应该能够正常进行,表明控制器正在正确地处理数据包转发。

6. 注意事项与最佳实践

  • 防火墙设置: 确保您的系统防火墙允许OpenDaylight控制器监听的端口(通常是6633)的入站连接。
  • IP地址: 对于本地连接,使用127.0.0.1作为控制器IP地址是推荐的做法。如果Mininet和ODL运行在不同的虚拟机或容器中,则需要使用ODL实例的实际IP地址。
  • Mininet版本: 确保您的Mininet版本与OpenDaylight版本兼容。虽然上述解决方案在大多数Mininet 2.x版本中都适用,但更新的Mininet或ODL版本可能引入新的特性或行为。
  • OpenDaylight功能: 根据您的需求,可能需要安装额外的ODL功能。例如,如果您需要使用特定的路由协议或高级策略,请查阅ODL文档以了解所需的功能。
  • 日志分析: 在遇到连接问题时,仔细检查OpenDaylight Karaf的日志输出和Mininet的日志(使用setLogLevel('debug')获取更详细信息)是诊断问题的最有效方法。

7. 总结

通过在Mininet构造函数中显式地指定controller=RemoteController和switch=OVSSwitch,我们可以确保Mininet模拟器中的交换机在启动时能够正确地与本地运行的OpenDaylight控制器建立OpenFlow连接。这种方法提供了比简单地添加控制器实例更健壮和明确的配置,解决了自定义Python脚本在本地集成Mininet与OpenDaylight时常见的连接问题,为SDN实验和开发奠定了坚实的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

179

2025.11.26

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

441

2024.03.13

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1926

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2395

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

495

2023.11.09

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号