
在软件定义网络(sdn)的实验环境中,mininet作为一款流行的网络模拟器,常与opendaylight(odl)等控制器配合使用。用户在使用mininet命令行工具(如sudo mn --controller=remote,ip=127.0.0.1,port=6633)时,通常能顺利将模拟网络连接到本地运行的opendaylight控制器。然而,当尝试通过自定义python脚本构建mininet拓扑时,即使在脚本中指定了远程控制器信息,也可能遇到连接失败的问题。
这一差异的根本原因在于Mininet命令行工具会根据提供的参数自动推断并配置默认的控制器和交换机类型,例如,当指定--controller=remote时,它会默认使用RemoteController,并且通常会将交换机类型设置为OVSSwitch。而当使用Python脚本时,如果没有显式指定,Mininet构造函数可能会使用其默认的控制器和交换机类型(例如OVSKernelSwitch或UserSwitch),这可能与OpenDaylight期望的OpenFlow协议版本或连接机制不完全兼容,导致连接无法建立。
解决此问题的关键在于在Mininet脚本中,明确地在Mininet构造函数中指定所使用的控制器和交换机类型。具体而言,需要将controller参数设置为RemoteController,并将switch参数设置为OVSSwitch。
controller=RemoteController的必要性 尽管您可能在net.addController()方法中再次指定了controller=RemoteController,但Mininet构造函数本身的controller参数决定了拓扑中所有未明确指定控制器的交换机将尝试连接到哪种类型的控制器。将其设置为RemoteController,确保Mininet在初始化时就为远程控制器连接做好了准备。
switch=OVSSwitch的重要性OVSSwitch是Mininet中基于Open vSwitch的交换机实现,它通常支持更广泛的OpenFlow版本(如OpenFlow 1.3),并且与OpenDaylight控制器具有良好的兼容性。默认的Mininet交换机类型可能无法提供OpenDaylight所需的特定OpenFlow特性或连接行为。显式指定OVSSwitch可以确保交换机以ODL期望的方式运行。
以下是根据上述解决方案修改后的Mininet脚本示例:
from mininet.net import Mininet
from mininet.node import RemoteController, OVSSwitch # 导入OVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
def create_topology():
setLogLevel('info') # 设置日志级别,便于调试
info('*** Creating network\n')
# 关键修改:在Mininet构造函数中显式指定控制器和交换机类型
net = Mininet(controller=RemoteController, switch=OVSSwitch)
info('*** Adding controller\n')
# 这里的addController定义了远程控制器的具体连接信息
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)
# 交换机与控制器的连接通常由Mininet在启动时自动处理,
# 尤其是当在Mininet构造函数中指定了controller类型后。
# 这里的addLink(s1, c0)和addLink(s2, c0)通常不是必需的,
# 并且在某些情况下可能导致行为不预期。
# 移除这两行通常是更推荐的做法,让Mininet自动将交换机连接到其默认控制器。
# 如果需要精细控制,可以在addSwitch时指定controller参数。
# net.addLink(s1, c0) # 建议移除
# net.addLink(s2, c0) # 建议移除
return net
if __name__ == '__main__':
topo = create_topology()
info('*** Starting network\n')
topo.start() # 调用start()方法会启动控制器并连接交换机
# 在Mininet启动后,可以通过CLI进行交互和验证
info('*** Running CLI\n')
CLI(topo)
info('*** Stopping network\n')
topo.stop()
注意: 原始脚本中net.addLink(s1, c0)和net.addLink(s2, c0)这两行通常不是必需的,因为当Mininet构造函数中指定了controller=RemoteController后,Mininet会自动尝试将所有交换机连接到默认的远程控制器。在某些情况下,显式添加这些链接可能会导致重复连接或不预期行为。因此,在上述修正后的代码中,已将这两行注释掉,推荐的做法是让Mininet自动处理交换机与控制器的连接。
启动OpenDaylight控制器: 在运行Mininet脚本之前,请确保您的OpenDaylight控制器实例已在本地运行,并且其OpenFlow插件已激活。通常,您可以通过进入OpenDaylight Karaf根目录并执行以下命令来启动它:
./bin/karaf
进入Karaf CLI后,安装必要的OpenFlow特性(如果尚未安装):
feature:install odl-restconf odl-l2switch-switch odl-dlux-all
等待所有特性加载完成。
运行Mininet脚本: 打开一个新的终端窗口,导航到保存上述Python脚本的目录,并使用sudo权限执行脚本:
sudo python your_script_name.py
验证连接:
在自定义Mininet脚本中连接本地OpenDaylight控制器时,核心在于显式配置Mininet构造函数中的controller=RemoteController和switch=OVSSwitch。这一修改确保了Mininet模拟网络能够以OpenDaylight期望的方式初始化和连接,从而避免了因默认配置不匹配而导致的连接失败。通过遵循本文提供的步骤和注意事项,您可以成功搭建一个稳定且功能完善的SDN实验环境。
以上就是Mininet脚本连接本地OpenDaylight控制器教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号