Mininet–topo类型-py创建自定义拓扑网络

  • Post author:
  • Post category:其他


Mininet网络划分

Minnet可以创建多种拓扑网络,主要分为两类,一类是自动型,是指Mininet自带的拓扑类型, 通过–topo参数来指定,分别是linear、minimal、reversed、single、torus以及tree共六种;另一类是自定义型,是指通过py文件自定义拓扑类型,通过–custom和–topo两个参数搭配指定。下面分别说下两类的功能以及使用。

Mininet自动创建网络拓扑

1.liner 单一拓扑

single定制的拓扑里只有一个交换机,主机数量自由指定,呈放射状,通过如下命令创建拓扑:

#--topo=single,5: 指定拓扑类型以及主机数量
#--controller=remote,ip=192.168.0.2 : 指定接管这个网络的控制器

root@ubuntu:~# sudo mn --topo=single,5 --controller=remote,ip=192.168.0.2
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.0.2:6653
*** Adding hosts:
h1 h2 h3 h4 h5 
*** Adding switches:
s1 
*** Adding links: #可以发现,每个host都和交换机s1相连
(h1, s1) (h2, s1) (h3, s1) (h4, s1) (h5, s1) 
*** Configuring hosts
h1 h2 h3 h4 h5 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> nodes
available nodes are: 
c0 h1 h2 h3 h4 h5 s1 #可以发现我们这里只有一个交换机s1,5个host
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
h3 h3-eth0:s1-eth3
h4 h4-eth0:s1-eth4
h5 h5-eth0:s1-eth5
s1 lo:  s1-eth1:h1-eth0 s1-eth2:h2-eth0 s1-eth3:h3-eth0 s1-eth4:h4-eth0 s1-eth5:h5-eth0
c0

拓扑图如下:



2.minimal最小化拓扑

只有一个交换机,交换机下面连接两个主机,是默认的拓扑方式,通过如下命令创建拓扑:

#--topo=minimal 才有最小化拓扑模型,只需要指定模型参数
root@ubuntu:~# sudo mn  --controller=remote,ip=192.168.0.2
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.0.2:6653
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) (h2, s1) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> nodes
available nodes are: 
c0 h1 h2 s1 #只有一个交换机,两个host
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo:  s1-eth1:h1-eth0 s1-eth2:h2-eth0
c0

拓扑如下:

3.line线性拓扑

交换机连接呈线形排列,且每一个交换机下只能挂一个主机,通过如下命令创建拓扑:

#--topo=linear,3,2 :拓扑模型,交换机个数,每个交换机下的主机数
root@ubuntu:~# sudo mn --topo=linear,3,2 --controller=remote,ip=192.168.0.2
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.0.2:6653
*** Adding hosts:
h1s1 h1s2 h1s3 h2s1 h2s2 h2s3  #主机
*** Adding switches:
s1 s2 s3 #交换机
*** Adding links:
(h1s1, s1) (h1s2, s2) (h1s3, s3) (h2s1, s1) (h2s2, s2) (h2s3, s3) (s2, s1) (s3, s2) 
*** Configuring hosts
h1s1 h1s2 h1s3 h2s1 h2s2 h2s3 
*** Starting controller
c0 
*** Starting 3 switches
s1 s2 s3 ...
*** Starting CLI:
mininet> nodes
available nodes are: 
c0 h1s1 h1s2 h1s3 h2s1 h2s2 h2s3 s1 s2 s3
mininet> net
h1s1 h1s1-eth0:s1-eth1
h1s2 h1s2-eth0:s2-eth1
h1s3 h1s3-eth0:s3-eth1
h2s1 h2s1-eth0:s1-eth2
h2s2 h2s2-eth0:s2-eth2
h2s3 h2s3-eth0:s3-eth2
s1 lo:  s1-eth1:h1s1-eth0 s1-eth2:h2s1-eth0 s1-eth3:s2-eth3
s2 lo:  s2-eth1:h1s2-eth0 s2-eth2:h2s2-eth0 s2-eth3:s1-eth3 s2-eth4:s3-eth3
s3 lo:  s3-eth1:h1s3-eth0 s3-eth2:h2s3-eth0 s3-eth3:s2-eth4
c0

拓扑如下:

4. tree 树形拓扑

交换机的连接呈树形,且每个交换机下可以挂多个交换机,通过如下命令创建拓扑:

#--topo=tree,3,2:拓扑模型,交换机的深度或者层数,每层交换机下连接的主机或者交换机个数
#--topo=tree,3,2: 三层,第一层一个交换机,第二层2个交换机,第三层4个交换,主机:4 x 2 = 8
#--topo=tree,3,3: 三层,第一层一个交换机,第二层3个交换机,第三层9个交换, 主机:9 x 3 = 27
#--mac 使主机mac尽量简单
root@ubuntu:~# sudo mn --topo=tree,3,2 --controller=remote,ip=192.168.0.2 --mac
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.0.2:6653
*** Adding hosts:
h1 h2 h3 h4 h5 h6 h7 h8 
*** Adding switches:
s1 s2 s3 s4 s5 s6 s7 
*** Adding links:
(s1, s2) (s1, s5) (s2, s3) (s2, s4) (s3, h1) (s3, h2) (s4, h3) (s4, h4) (s5, s6) (s5, s7) (s6, h5) (s6, h6) (s7, h7) (s7, h8) 
*** Configuring hosts
h1 h2 h3 h4 h5 h6 h7 h8 
*** Starting controller
c0 
*** Starting 7 switches
s1 s2 s3 s4 s5 s6 s7 ...
*** Starting CLI:
mininet> nodes
available nodes are: 
c0 h1 h2 h3 h4 h5 h6 h7 h8 s1 s2 s3 s4 s5 s6 s7
mininet> net
h1 h1-eth0:s3-eth1
h2 h2-eth0:s3-eth2
h3 h3-eth0:s4-eth1
h4 h4-eth0:s4-eth2
h5 h5-eth0:s6-eth1
h6 h6-eth0:s6-eth2
h7 h7-eth0:s7-eth1
h8 h8-eth0:s7-eth2
s1 lo:  s1-eth1:s2-eth3 s1-eth2:s5-eth3
s2 lo:  s2-eth1:s3-eth3 s2-eth2:s4-eth3 s2-eth3:s1-eth1
s3 lo:  s3-eth1:h1-eth0 s3-eth2:h2-eth0 s3-eth3:s2-eth1
s4 lo:  s4-eth1:h3-eth0 s4-eth2:h4-eth0 s4-eth3:s2-eth2
s5 lo:  s5-eth1:s6-eth3 s5-eth2:s7-eth3 s5-eth3:s1-eth2
s6 lo:  s6-eth1:h5-eth0 s6-eth2:h6-eth0 s6-eth3:s5-eth1
s7 lo:  s7-eth1:h7-eth0 s7-eth2:h8-eth0 s7-eth3:s5-eth2

拓扑如下:

5.reversed反向拓扑

这种拓扑类型与single单一拓扑类型相同,通过如下命令创建拓扑:

#--topo=reversed,4:拓扑类型,主机数(只有一个交换机)
#--mac 使主机mac尽量简单
root@ubuntu:~# sudo mn --topo=reversed,4 --controller=remote,ip=192.168.0.2 --mac
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.0.2:6653
*** Adding hosts:
h1 h2 h3 h4 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) (h2, s1) (h3, s1) (h4, s1) 
*** Configuring hosts
h1 h2 h3 h4 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> nodes
available nodes are: 
c0 h1 h2 h3 h4 s1
mininet> net
h1 h1-eth0:s1-eth4
h2 h2-eth0:s1-eth3
h3 h3-eth0:s1-eth2
h4 h4-eth0:s1-eth1
s1 lo:  s1-eth1:h4-eth0 s1-eth2:h3-eth0 s1-eth3:h2-eth0 s1-eth4:h1-eth0
c0

拓扑如下:

6.turse环形拓扑

个人不是很理解也很少用到,这里不做介绍,有兴趣可以百度自查。

Mininet自定义拓扑–custom

现在有这样一个网络拓扑需求,如下:

很显然,这个网络拓扑并不能用Mininet自动创建网络拓扑模型,只能通过自己定制网络拓扑模型,定制py脚本如下:

#!/usr/bin/python
 
from mininet.topo import Topo
 
class MyTopo( Topo ):

    def __init__( self ):
 
       "Create custom topo."
 
       # Initialize topology
       Topo.__init__( self )
 
       # 生成所需要的主机和交换机
       h1 = self.addHost( 'h1' )
       h2 = self.addHost( 'h2' )
       h3 = self.addHost( 'h3' )
       h4 = self.addHost( 'h4' )
       h5 = self.addHost( 'h5' )

       sw1= self.addSwitch( 'sw1' )
       sw2 = self.addSwitch( 'sw2' )
       sw3= self.addSwitch( 'sw3' )
       sw4= self.addSwitch( 'sw4' )
       sw5= self.addSwitch( 'sw5' )
       sw6= self.addSwitch( 'sw6' )

 
       # 添加连线,交换机和交换机之间,交换机和主机之间
       self.addLink( sw1, sw2)
       self.addLink( sw1, sw3)
       self.addLink( sw2, sw4)
       self.addLink( sw2, h2)
       self.addLink( sw3, sw5)
       self.addLink( sw3, sw6)
       self.addLink( sw4, h1)
       self.addLink( sw5, h3)
       self.addLink( sw5, h4)
       self.addLink( sw6, h5)

#实例化类
topos = { 'mytopo': ( lambda: MyTopo() ) }
#注意:‘mytopo’这个参数必须和命令行--topo的参数一致,如果不一致,运行时报“Exception: Invalid topo name mytopo2”

一般定制化的py脚本主要就是实例化一个继承Topo的类,上述脚本的这个类就是:MyTopo

下面通过命令行利用上述脚本创建网络模型,如下:

#--custom ./mytopo_test.py :py文件
#--topo mytopo: py文件中实例化对象时指定的参数
root@ubuntu:~# sudo mn --controller=remote,ip=192.168.0.2 --custom ./mytopo_test.py --topo mytopo --mac
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.0.2:6653
*** Adding hosts:
h1 h2 h3 h4 h5 
*** Adding switches:
sw1 sw2 sw3 sw4 sw5 sw6 
*** Adding links:
(sw1, sw2) (sw1, sw3) (sw2, h2) (sw2, sw4) (sw3, sw5) (sw3, sw6) (sw4, h1) (sw5, h3) (sw5, h4) (sw6, h5) 
*** Configuring hosts
h1 h2 h3 h4 h5 #5个host
*** Starting controller
c0 
*** Starting 6 switches
sw1 sw2 sw3 sw4 sw5 sw6 ...#6个交换机
*** Starting CLI:
mininet> nodes
available nodes are: 
c0 h1 h2 h3 h4 h5 sw1 sw2 sw3 sw4 sw5 sw6
mininet> net
h1 h1-eth0:sw4-eth2
h2 h2-eth0:sw2-eth3
h3 h3-eth0:sw5-eth2
h4 h4-eth0:sw5-eth3
h5 h5-eth0:sw6-eth2
sw1 lo:  sw1-eth1:sw2-eth1 sw1-eth2:sw3-eth1
sw2 lo:  sw2-eth1:sw1-eth1 sw2-eth2:sw4-eth1 sw2-eth3:h2-eth0
sw3 lo:  sw3-eth1:sw1-eth2 sw3-eth2:sw5-eth1 sw3-eth3:sw6-eth1
sw4 lo:  sw4-eth1:sw2-eth2 sw4-eth2:h1-eth0
sw5 lo:  sw5-eth1:sw3-eth2 sw5-eth2:h3-eth0 sw5-eth3:h4-eth0
sw6 lo:  sw6-eth1:sw3-eth3 sw6-eth2:h5-eth0
c0

拓扑图如下:

经对比,同我们的定制需求拓扑相同。



版权声明:本文为wuliangtianzu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。