实验1:SDN拓扑实践

一、基本要求

1. 使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py,运行结果

Mininet运行结果截图:

可视化编辑拓扑运行结果

2. 使用Mininet的命令行生成如下拓扑:

a) :3台交换机,每个交换机连接1台主机,3台交换机连接成一条线

b):3台主机,每个主机都连接到同1台交换机上

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

4. 编辑'1'中第1步保存的Python脚本,添加如下网络性能限制,生成拓扑

要求: 1)h1的cpu最高不超过50%; 2)h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50

a) 修改过的 “学号.py” 代码


  #!/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')
    h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
    h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None, cpu = 0.5)
    h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)

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

    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()

b) Mininet运行结果

二、进阶

1. 学号_fattree.py代码


  #!/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( 'c{}'.format( L1 + i + 1 ) )
                        a.append( sw )
        
                # add edge ovs
                for i in range( L3 ):
                        sw = self.addSwitch( 'c{}'.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)]:

                # 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() ) }

2. 运行结果

三、个人总结

在做实验之前有去学习mininet的一些基础操作,以及利用mininet可视化工具生成拓扑、命令行生成特定拓扑、mininet CLI的使用和通过python编程构建SDN拓扑并通过mininet运行,了解这些后实验过程比较顺利。实验中也有遇到一些问题 a)在运行虚拟机的时候无法联网,在查阅一些博客和官方资料后直接通过命令重置网络,问题成功解决。b)python文件运行出错,通过阅读mininet/custom/md,topo-2sw-2host.py,将python文件内的__init__删了,直接创建build函数(),运行成功。在实验过程中,处理ubuntu系统环境问题较多,使得对ubuntu环境更加熟悉。在实验过程中了解和学习到了python在mininet的使用,进一步加深了软件定义网络的思想。在完成进阶部分时刚开始不知道如何下手编程,通过阅读一些代码,学习mininet第三方库的一些基本方法的使用,后能够简单使用这些工具编写一些SDN拓扑。最后在建立博客的同时也熟悉了markdown的相关语法。

posted @ 2022-09-12 13:35  GIPV  阅读(45)  评论(0编辑  收藏  举报