实验1:SDN拓扑实践

  • 2022 年 9 月 18 日
  • 筆記

1.基础要求
a) 第1步Mininet运行结果截图

b) 第2步的执行结果截图



c) 第3步提交修改过的“学号.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')
    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=50)
    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)
    net.addLink(s1, h3)
    net.addLink(s1, s2)
    net.addLink(s2, h2)
    net.addLink(s2, h4)
    net.addLink(h1, s1, bw=10, delay='5ms', max_queue_size=100, loss=50, use_htb=True)

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


2.进阶要求

#!/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.node import RemoteController,CPULimitedHost
from mininet.util import dumpNodeConnections
from mininet.link import TCLink
from mininet.net import Mininet

class MyTopo( Topo ):


    def __init__( self ):


        # 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 ) #在列表末尾追加新的sw对象

        # add edge ovs
        for i in range( L3 ):
                sw = self.addSwitch( 's{}'.format( L1 + L2 + i + 1 ) )
                e.append( sw )

	# add links core aggregation ovs
        for i in range( L1 ):
                sw1 = c[i]
        for sw2 in a[i//2::L1//2]:#整除用//
                self.addLink( sw2, sw1 )

        # add links  aggregation edge ovs
        for i in range( 0, L2, 2 ):
            for sw1 in a[i:i+2]:
                for sw2 in e[i*2:i*2+4]: #aggregation连4台edge
                    self.addLink( sw2, sw1 )

        #add hosts edge 添加主机以及主机和边缘交换机的链路
        count = 1
        for sw1 in e:
            for i in range(2):
                host = self.addHost( 'h{}'.format( count ) ,ip='10.0.0.{}'.format( count ),defaultRoute=None)
                self.addLink( sw1, host )
                count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }




3.个人总结
a)实验感想
这次实验的基础部分难度不大,按照老师给的pdf教程来就可以完成。中间有遇到一些问题,经过网页上的查找已将其解决。完成基础实验部分后,对mininet的相关操作有了进一步的了解,学会了用mininet的可视化工具来生成拓扑以及用mininet的命令行生成特定拓扑等方法。但在操作过程中,意识到了还有很多命令和零碎知识点是我不熟悉且还未掌握的,日后要加强这方面的学习和探索。在进阶实验部分,对python的掌握基础不牢固,大部分是按照参考资料敲出来的,略微细节上进行了变动。排错过程中认识到了编辑缩进格式之严谨。之前学过的Python知识大部分都忘记了,要抽空补上这部分的知识空缺。
b)实验过程中问题及解决办法

  • 在对第一步保存的拓扑文件211802351.py修改后要保存时出错。
    E505: “211802351.py” is read-only (add ! to override)
    这个是因为该文件权限为只读文件,所以不能直接对其进行修改。
    解决方法:(1)用”sudo vi 文件名”进入文件修改界面进行修改(2)用”sudo chmod 777 文件名”将权限修改为可读可写可执行
  • 增加一台主机后仅增加了相应链路和主机的命令导致部分链路ping不通

    解决方法:要在原来的交换机上配置新增端口命令以及新增的主机要为其配置ip地址
  • 在为其配置ip地址的时候,一开始用的是以下命令

    但后来发现,这样配置会出现仅是h4获得了IP地址,而未与网络沟通,结果是h4可以ping其他主机,其他主机不能ping通h4。
    解决方法:如下图,但还有些不理解为何此配置就可以pingall都行
  • 由于python的格式缩进问题产生的出错

    解决方法:缩进格式要统一。要不都用tab键,要不都用空格,不能混用。
  • 进阶部分进行主机互ping时,发现ping不通

    搜索资料后发现是应为该拓扑中存在太多环路,容易产生广播风暴,所以要启用抑制环路产生的stp生成树协议,可以在执行命令的时候加上swtich的指定和属性。
    解决方法:生成拓扑使用此命令sudo mn –custom 211802351_fattree.py –topo mytopo –switch ovsbr,stp=1