1-3 mininet中使用python API直接拓扑定义以及启动方式对比

作为SDN网络中搭建拓扑非常重要的仿真平台,我们可以使用mininet默认的库内拓扑文件,也可以使用python语言进行自定义拓扑。使用python进行拓扑定义时,不同的定义方式将导致其启动的方式由所不同。
一、采用最原始的命令启动方式:
sudo mn --custom --topo mytopo
sudo mn --custom --topo mytopo 的意思是,以超级用户权限运行 Mininet 命令行工具,使用自定义拓扑文件 来创建一个名为 mytopo 的拓扑,例如官网中的
脚本例子(官网)topo_3.py:

"""Custom topology example

Two directly connected switches plus a host for each switch:

 host --- switch --- switch --- host

Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""

from mininet.topo import Topo

class MyTopo( Topo ): # 用类继承的方式定义
  "Simple topology example."

  def build( self ):
      "Create custom topo."

      # Add hosts and switches
      leftHost = self.addHost( 'h1' )
      rightHost = self.addHost( 'h2' )
      leftSwitch = self.addSwitch( 's3' )
      rightSwitch = self.addSwitch( 's4' )

      # Add links
      self.addLink( leftHost, leftSwitch )
      self.addLink( leftSwitch, rightSwitch )
      self.addLink( rightSwitch, rightHost )

topos = { 'mytopo1': ( lambda: MyTopo() ) }  

在这个示例代码中,定义了继承自Topo的自定义拓扑类 MyTopo。最后的topos字典中定义相应的键值对,其中键是拓扑的名称,而值是一个函数。这个函数就是执行创建拓扑对象。在sudo mn 中使用mytopo1拓扑时,Mininet会调用lambda函数来创建MyTopo对象,并使用该对象来构建网络。如图1
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第1张图片
图1 原始启动方式
二、使用简化的sudo mn方式启动
每次都调用 sudo mn --custom --topo mytopo 比较麻烦,可以将代码改为如下,使用 sudo mn --custom
式,具体的命令修改如下topo_31.py:“”"Custom topology example


Two directly connected switches plus a host for each switch:

   host --- switch --- switch --- host

Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""

from mininet.topo import Topo
from mininet.net import Mininet  # 引入net模块

class MyTopo( Topo ):
    "Simple topology example."

    def build( self ):
        "Create custom topo."

        # Add hosts and switches
        leftHost = self.addHost( 'h1' )
        rightHost = self.addHost( 'h2' )
        leftSwitch = self.addSwitch( 's3' )
        rightSwitch = self.addSwitch( 's4' )

        # Add links
        self.addLink( leftHost, leftSwitch )
        self.addLink( leftSwitch, rightSwitch )
        self.addLink( rightSwitch, rightHost )
#topos = { 'mytopo1': ( lambda: MyTopo() ) }
topo = MyTopo()  #
net = Mininet(topo)  #启动topo

因为在代码中已经把创建的拓扑传递给net模块,所以不用带–topo 参数,如下图1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第2张图片
上一篇博文1-2 Mininet启动参数以及应用实践我们价绍了使用python脚本定义拓扑,然后把定义好的拓扑py文件使用sudo mn --custom 拓扑文件 的方式进行启用。当然我们也可以直接使用python3 接口调用,当然我们需要在原来代码的基础上进行优化,如果直接改成python3 进行调用,会出错
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第3张图片

三、 使用python代码创建mininet网络并直接进入mininet CLI
修改代码 topo_32.py


from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI #导入模块

class MyTopology(Topo):
  def build(self):
      # 创建交换机
      switch = self.addSwitch('s1')

      # 创建主机
      host1 = self.addHost('h1')
      host2 = self.addHost('h2')

      # 创建链路
      self.addLink(host1, switch)
      self.addLink(host2, switch)

topo = MyTopology()
net = Mininet(topo)
net.start() #会自动启用mininet内置的控制器
CLI(net)  #调用cli
net.stop()

1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第4张图片
这种采用python直接运行的方式,需要在代码中进行拓扑说明和mininet
中CLI函数启用(需要引入相应的模块)
值得注意的是,在遵循脚本语法规则的前提下,我们也可以直接用函数定义的方式进行(没有引用Topo类,使用net模块直接定义)
如:

#mininet_ovs_mac_0.py
from mininet.net import Mininet
from mininet.node import Controller, OVSSwitch
from mininet.cli import CLI
#from mininet.log import setLogLevel
def mininet_ovs_mac():
  net = Mininet(controller=Controller, switch=OVSSwitch)
  c0 = net.addController('c0')
# 添加三个交换机和三个主机
  s1 = net.addSwitch('s1')
  s2 = net.addSwitch('s2')
  h1 = net.addHost('h1',ip='10.0.0.10')
  h2= net.addHost('h2',ip='10.0.0.20')
  h3= net.addHost('h3',ip='10.0.0.30')
# 连接交换机和主机
  net.addLink(h1, s1,port2=1)
  net.addLink(h2, s2,port2=1)
  net.addLink(h3, s2,port2=2)
#net.addLink(h4, s3,port2=2) #s3用端口2与h4连接
# 连接交换机
  net.addLink(s1, s2,port1=4,port2=4)#s1的4端口与s2的4端口连接
  net.build()
  c0.start()
  s1.start([c0])
  s2.start([c0])
  #net.start()

#以上四句启动的命令也可以直接用net.start(),表示一键启动net中的所有节点
  CLI(net)  #决定了使用python3启动 而不是使用mn启动,否则会嵌套mn出错
  net.stop()
if __name__ == '__main__':
  #setLogLevel('info')
  mininet_ovs_mac()

如果没有CLI(net),直接用python3启动则无法打开mininet CLI在这里插入图片描述
注意当在py代码中没有启用CLI(net)代码进行mininet CLI启用时,只能用 sudo mn --custom +py文件方式(如下图)
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第5张图片
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第6张图片

总结:
使用py编写的拓扑脚本依据代码中的模块调用不同,其对应的启动方式也不同:
1 在代码中对hosts,switchs,links网络拓扑的元素进行定义,没有对mininet的其他调用说明,则必须使用sudo mn --custom --topo mytopo1
2 使用Topo类定义的只是逻辑拓扑,仍需要把拓扑传递给net模块启动(分配资源运行),Topo类可以更加详细设计拓扑
3使用net创建的是直接运行的网络环境。
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第7张图片

mininet拓扑的main class
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第8张图片
1-3 mininet中使用python API直接拓扑定义以及启动方式对比_第9张图片

你可能感兴趣的:(软件定义安全,python,php,服务器)