实验1:SDN拓扑实践

1. 使用Mininet可视化工具,生成下图所示的拓扑

 


2. 生成3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。

 

3. 生成3台主机,每个主机都连接到同1台交换机上

 

4. 在上一步基础上,Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。

 

5. 修改后的python代码及运行结果

  • 代码
#!/usr/bin/env python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call

def myNetwork():

    net = Mininet( topo=None,
                   build=False,
                   ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    c0=net.addController(name='c0',
                      controller=Controller,
                      protocol='tcp',
                      port=6633)

    info( '*** Add switches\n')
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch)

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None,cpu=0.5)
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(h1, s1, bw=10, delay='5ms',max_queue_size=1000, loss=10, use_htb=True)
    net.addLink(h2, s1)
    net.addLink(s2, h4)
    net.addLink(h3, s2)
    net.addLink(s1, s2)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')
    net.get('s1').start([c0])
    net.get('s2').start([c0])

    info( '*** Post configure switches and hosts\n')

    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()

 

  • 运行结果

6. 进阶代码及结果

  • 代码

!/usr/bin/python

from curses.panel import top_panel
from mininet.topo import Topo

class MyTopo(Topo):

    def build(self):
           
            L1 = 2
            L2 = L1 * 2 
            L3 = L2 * 2
            c = []
            a = []
            e = []
            
            # add core ovs  
            for i in range( L1 ):
                    sw = self.addSwitch( 'c{}'.format( i + 1 ) )
                    c.append( sw )
    
            # add aggregation ovs
            for i in range( L2 ):
                    sw = self.addSwitch( 'a{}'.format( L1 + i + 1 ) )
                    a.append( sw )
    
            # add edge ovs
            for i in range( L3 ):
                    sw = self.addSwitch( 'e{}'.format( L1 + L2 + i + 1 ) )
                    e.append( sw )
    
            # add links between core and aggregation ovs
            for i in range( L1 ):
                    sw1 = c[int(i)]
                    for sw2 in a[int(i/2)::int(L1/2)]:
                    # self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
                                    self.addLink( sw2, sw1 )
    
            # add links between aggregation and edge ovs
            for i in range( 0, int(L2), 2 ):
                    for sw1 in a[int(i):int(i+2)]:
                            for sw2 in e[i:i+2]:
                                    self.addLink( sw2, sw1 )
    
            #add hosts and its links with edge ovs
            count = 1
            for sw1 in e:
                    for i in range(2):
                            host = self.addHost( 'h{}'.format( count ) )
                            self.addLink( sw1, host )
                            count += 1

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

  • 结果

 

 

 

感想

posted @ 2022-09-12 23:53  刘宇旗  阅读(14)  评论(0编辑  收藏  举报