实验1:SDN拓扑实践

实验1:SDN拓扑实践

1.创建目录

  • 在Ubuntu系统的home目录下创建一个目录,目录命名为学号

2.Mininet安装

  • 在创建的目录下,完成Mininet的源码安装。

如图,已将Mininet安装至/home/yjs/031902226

image-20210908152158229

3.可视化拓扑生成

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

image-20210908170454157

image-20210908153059310

image-20210908153136005

输入命令pingall,查看网络连通性

image-20210908175100920

4.命令行拓扑生成

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

命令行输入

sudo mn --topo linear,3

image-20210908161142306

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

命令行输入:

sudo mn --topo single,3

image-20210908171744655

5.新增主机

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

创建一个主机h4,将h4的连接到s1,输入:

py net.addHost('h4')
py net.addLink(s1, h4)
py h4.setIP("10.0.0.4", 8)

再次输入net查看现在网络

image-20210908171925464

看到h4已经连接到s1交换机上

image-20210908171941600

测试连通性,发现新增主机无法ping通其他主机

image-20210909121538018

6.性能限制拓扑

  • 编辑(一)中第3步保存的Python脚本,添加如下网络性能限制,生成拓扑:
    a) h1的cpu最高不超过50%;
    b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50。

打开第三步中的代码进行修改

主要修改:

h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None, cpu=0.5)

net.addLink(h1, s1, bw=10, delay='5ms',max_queue_size=1000, loss=50, use_htb=True)

全部代码:

#!/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',
        host=CPULimitedHost,
        link=TCLink
    )

    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=50, use_htb=True)
    net.addLink(h2, s1)
    net.addLink(h3, s2)
    net.addLink(s2, h4)
    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()

测试联通

image-20210908200216431

可以看到,各主机与和h1有一定几率无法ping通

image-20210908200832862

检测h1和h2的带宽,可以看到在10Mbits/sec左右

进阶要求

编写Python脚本,生成如下数据中心网络拓扑,要求:

  • 编写.py拓扑文件,命名为“学号_fattree.py”
  • 必须通过Mininet的custom参数载入上述文件,不得直接使用miniedit.py生成的.py文件;
  • 设备名称必须和下图一致
  • 使用Python的循环功能实现,不得在代码中手工直接添加设备和链路。

img

对应要求编写代码

#!/usr/bin/env python
from mininet.topo import Topo

class MyTopo(Topo):
    def __init__(self):
        # initilaize topology
        Topo.__init__(self)
        switchList = []
        hostList = []
        for i in range(1, 15):
            switchName = "s" + str(i)
            self.addSwitch(switchName)
            switchList.append(switchName)

        for i in range(1, 17):
            hostName = "h" + str(i)
            self.addHost(hostName)
            hostList.append(hostName)

            # connect s1,s2 to s3,s4,s5,s6
        for i in range(1, 3):
            switchName1 = "s" + str(i)
            for j in range(3, 7):
                switchName2 = "s" + str(j)
                self.addLink(switchName1, switchName2)

            # connect s3,s4 to s7,s8,s9,s10
        for i in range(3, 5):
            switchName1 = "s" + str(i)
            for j in range(7, 11):
                switchName2 = "s" + str(j)
                self.addLink(switchName1, switchName2)

            # connect s5,s6 to s11,s12,s13,s14
        for i in range(5, 7):
            switchName1 = "s" + str(i)
            for j in range(11, 15):
                switchName2 = "s" + str(j)
                self.addLink(switchName1, switchName2)

            # connect switch and host
        for i in range(7, 15):
            switchName = "s" + str(i)
            for j in ((i - 6) * 2 - 1, (i - 6) * 2):
                hostName = "h" + str(j)
                self.addLink(switchName, hostName)

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

输入命令行:

sudo mn --custom 031902226_fattree.py --topo mytopo

image-20210908232127542

查看网络连接状态

image-20210908232152043

研究发现,因为网络存在回路,需要使所有主机之间ping通,要开启STP生成树协议,所以更改启动命令

sudo mn --custom 031902226_fattree.py --topo mytopo  --switch ovs,failMode=standalone,stp=1

image-20210909112420462

感想

第一次实验是关于熟悉mininet这个工具的使用,可视化界面下的Mininet使用相对方便,在实验中遇到较为困难的部分是通过命令行和Python代码操作拓扑,在操作上遇到了麻烦,尽管最后实现拓扑的连接生成,但是在ping通各个主机上还有问题,在进阶要求中出现了主机可以ping通拓扑中的所有交换机,但是不能ping通其他主机,交换机没有进行转发。发现可能的原因是网络存在环路,需要交换机采用STP生成树协议,在研究Mininet的STP协议功能后,开启,但是发现仍然不能ping通,存在一定的丢包,思考后发现由于交换机有一个学习链路的过程,所以再次执行pingall,发现可以ping通整个链路。

在安装Mininet的过程中,遇到的最大的困难是github的网络问题,由于某些原因,对于GitHub的连接经常使得安装失败,最终通过修改install.sh中,git clone 命令后的协议名,将https改为git,避免因为https产生的ssl验证导致的无法与github连接问题

posted @ 2021-09-08 23:33  骇人的籽  阅读(286)  评论(0编辑  收藏  举报