在Mininet网络定义中使用各种不同的控制器。Mininet提供了对多种控制器的支持,可以根据自己的需求选择合适的控制器。
根据mininet官网的知识:https://mininet.org/api/classmininet_1_1net_1_1Mininet.html
中对于
def init (self, topo=None, switch=OVSKernelSwitch, host=Host, controller=DefaultController, link=Link, intf=Intf, build=True, xterms=False, cleanup=False, ipBase=‘10.0.0.0/8’, inNamespace=False, autoSetMacs=False, autoStaticArp=False, autoPinCpus=False, listenPort=None, waitConnected=False)
使用mininet定义网络时,其可以定义以上的参数,如没有定义,将采用默认值方式,如果将采用独立的第三方控制器(如ryu控制器),可以在启动命令的时候以携带参数的方式进行,详见:2SDN(软件定义网络)环境测试实验(ryu+mininet+wireshark)
sudo mn --controller=remote,ip=127.0.0.1,port=6633 --switch=ovs
一般来说目前ryu的现有版本中,当ryu运行后我可以通过命令查看,6653 6633两个端口都是处于监听可连接的状态
但我们项目如果采用mininet库进行环境定义时,如何使用python直接启用呢。那就需要把控制器写入代码中:
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.node import RemoteController
class MyTopology(Topo):
def build(self):
# 创建交换机,同时进行交换机的协议配置,使用build()
switch = self.addSwitch('s0', protocols='OpenFlow13')
# 创建主机
host1 = self.addHost('h0')
host2 = self.addHost('h1')
# 创建链路
self.addLink(host1, switch)
self.addLink(host2, switch)
topo = MyTopology()
# 指定控制器的IP地址和端口
controller_ip = '127.0.0.1'
controller_port = 6633
# 创建Mininet网络,并指定控制器和OpenFlow协议版本
net = Mininet(topo, controller=RemoteController)
net.addController('controller', controller=RemoteController, ip=controller_ip, port=controller_port,protocols='OpenFlow13')
net.start()
CLI(net)
net.stop()
把以上代码保存为topo_mininet.py
然后切换到当前路径下直接运行:root@zmq-virtual-machine:/mnt/hgfs/vmshare# python3 topo_mininet.py
效果如下图所示(注意,运行本文件之前要先把对应的RYU控制器打开)
扩展:在进行RYU控制器中,上文使用的打开命令是root@zmq-virtual-machine:/usr/lib/python3/dist-packages/ryu/app# ryu-manager simple_switch.py
采用的默认的端口6633或6653,但是在实际中可以手动指定ryu启动后所使用的端口,如6654,命令如下:
ryu-manager --ofp-tcp-listen-port=6654 simple_switch_13.py
注意的是,在mininet连接控制器时要把对应的端口参数改为6654