实验1:SDN拓扑实践

一、实验目的

能够使用源码安装Mininet;
能够使用Mininet的可视化工具生成拓扑;
能够使用Mininet的命令行生成特定拓扑;
能够使用Mininet交互界面管理SDN拓扑;
能够使用Python脚本构建SDN拓扑。

二、实验环境

Ubuntu 20.04 Desktop amd64
三、实验要求
(一)基本要求

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


使用Mininet的命令行生成如下拓扑:
a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。

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

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


c)提交修改过的“学号.py”代码、Mininet运行结果

#!/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')
              s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
              s1 = net.addSwitch('s1', cls=OVSKernelSwitch)

              info( '*** Add hosts\n')
              h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
              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)
              h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)

              info( '*** Add links\n')
              net.addLink(s2, s1)
              net.addLink(h1, s1)
              net.addLink(s1, h2)
              net.addLink(h3, s2)
              net.addLink(s2, h4)

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

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

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

              CLI(net)
              net.stop()

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

(二)进阶要求

  #!/usr/bin/python
  #创建网络拓扑
  """Custom topology example
  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
  from mininet.node import RemoteController,CPULimitedHost
  from mininet.link import TCLink
  from mininet.util import dumpNodeConnections
   
  class MyTopo( Topo ):
      "Simple topology example."
   
      def __init__( self ):
          "Create custom topo."
   
          # Initialize topology
          Topo.__init__( self )
          L1 = 2
          L2 = L1 * 2 
          L3 = L2 * 2
          c = []
          a = []
          e = []

          #添加交换机
          # add core ovs 
          for i in range( L1 ):
                  sw = self.addSwitch( 's{}'.format( i + 1 ) )
                  c.append( sw )
      
          # add aggregation ovs
          for i in range( L2 ):
                  sw = self.addSwitch( 's{}'.format( L1 + i + 1 ) )
                  a.append( sw )
      
          # add edge ovs
          for i in range( L3 ):
                  sw = self.addSwitch( 's{}'.format( L1 + L2 + i + 1 ) )
                  e.append( sw )
          #添加交换机之间的链路
          # add links between core and aggregation ovs
          for i in range( L1 ):
                  sw1 = c[i]
                  for sw2 in a[i//2::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, L2, 4):
                  for sw1 in a[i:i+2]:
  	                for sw2 in e[i:i+4]:
  	                      self.addLink( sw2, sw1 )
          for i in range( 2, L2, 4):
                  for sw1 in a[i:i+2]:
  	                for sw2 in e[i+2:i+6]:
  	                      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() ) }

四、实验报告
这次实验中我学习使用了Mininet的可视化工具生成拓扑,Mininet的命令行生成特定拓扑,Mininet交互界面管理SDN拓扑,以及Python脚本构建SDN拓扑,更好的了解了SDN拓扑。实验大部分根据ppt上步骤进行。其中有两处问题
一、python不能正常使用时
使用这个方法可以正常使用 后续了解到切换版本可正常使用
二、python脚本是read-only状态无法修改,执行sudo chmod 777 + 文件名 命令可以解锁只读改为可写。

posted @ 2022-09-25 20:39  席大欢一直在  阅读(60)  评论(0)    收藏  举报