
在软件定义网络(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会话。
Mininet在初始化时,如果未明确指定controller参数,它会默认使用DefaultController(通常是一个内部的简单控制器)或不预设任何控制器类型。当后续通过net.addController()添加一个RemoteController实例时,这个实例本身会被创建并启动,但Mininet拓扑中的交换机(尤其是Open vSwitch, OVS)在启动时,可能并不知道要连接到哪个控制器,或者它们尝试连接到错误的默认控制器类型。
与此不同的是,sudo mn --controller=remote,ip=127.0.0.1,port=6633这样的命令行参数,会指示Mininet在构建拓扑时,将所有创建的交换机默认配置为连接到指定的远程控制器。这种“全局”的默认配置确保了交换机能够正确地发现并连接到远程ODL实例。
解决此问题的关键在于,在Mininet构造函数中显式地指定默认的控制器类型和交换机类型。通过将controller=RemoteController和switch=OVSSwitch作为参数传递给Mininet类,我们可以确保Mininet在创建拓扑时,其内部的交换机能够正确地被配置为连接到远程OpenDaylight控制器。
修改后的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()为什么这个修改有效?
在运行Mininet脚本之前,请确保您的OpenDaylight控制器已正确启动并运行。
./bin/karaf
feature:install odl-l2switch-switch odl-restconf odl-dlux-all
sudo python your_mininet_script.py
通过在Mininet构造函数中显式地指定controller=RemoteController和switch=OVSSwitch,我们可以确保Mininet模拟器中的交换机在启动时能够正确地与本地运行的OpenDaylight控制器建立OpenFlow连接。这种方法提供了比简单地添加控制器实例更健壮和明确的配置,解决了自定义Python脚本在本地集成Mininet与OpenDaylight时常见的连接问题,为SDN实验和开发奠定了坚实的基础。
以上就是Mininet与OpenDaylight本地控制器连接教程:脚本化集成实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号