SDN实验1:SDN拓扑实践

实验目的

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

实验环境

  • 下载虚拟机软件VMware;
  • 在虚拟机中安装Ubuntu 20.04 Desktop amd64;

实验要求

基本要求

  • 在Ubuntu系统的home目录下创建一个目录,目录命名为学号,在创建的目录下,完成Mininet的源码安装

如图给出mininet的安装路径:

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

配置各主机ip,控制器保持默认配置,edit preferences将CLI以及所有的openflow都选中

进行连通性测试

保存的拓扑文件名为学号.py

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

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

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

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

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

使用vim在.py文件中对代码直接进行修改(也可以直接用gedit打开,这样就不用下载vim了),修改的内容包括

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)

进阶要求

编写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):
        #初始化拓扑
        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)

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

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

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

            #把主机和交换机连起来
        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 031902141_fattree.py --topo mytopo

将拓扑运行起来:

查看网络连接状态:

个人总结

遇到的问题及部分解决方法

在打开miniedit时出现了"python":没有那个文件或目录的报错,解决方法是执行sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1000,之后再次执行打开miniedit的命令,就会出现miniedit的页面了

虽然按照h1 ping h3这样的格式进行连通性测试是没问题的,都可以ping通,但是如果执行的是pingall命令,显示出来的结果会是100%丢包,按照搜索结果,可能是因为安装的ubuntu中文版本的格式问题。

在运行fattree的py文件时,出现关于file exists的报错,执行sudo mn -c后即可解决

执行sudo mn -c后:(原因在于mininet退出时,未将之前定义的拓扑文件清除干净,导致出现重复的拓扑)

总结

出了许多奇怪的报错和一些无法ping通的问题,再次意识到自己的bug体质…学到了除了vim以外的文件处理方法:touch+文件名可以创建文件,gedit可以查看并编辑文件,体验起来比vim舒适一些。同时体验了下python在mininet中的使用,miniedit的可视化图形界面对用户友好。还有一些尚未解决的问题和不太清楚原理的地方,需要进一步学习。最后,处理报错等问题的速度还需要提高。

posted @ 2021-09-09 20:08  瑞图恩灵  阅读(429)  评论(0)    收藏  举报