实验1:SDN拓扑实践

一、实验目的

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


二、实验环境

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


三、实验要求

(一)基本要求

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

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

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

成功搭建要求拓扑:

保存为要求文件名

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

  • 按题目要求,生成拓扑应为参数为3的线性拓扑,
  • 成功使用命令行生成要求拓扑:
sudo mn --topo linear, 3

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

  • 按题目要求,生成拓扑应为简单拓扑,
  • 成功使用命令行生成要求拓扑:
sudo mn --topo=single, 3

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

  • 成功添加新主机h4,并将其连接到s1上:
py net.addHost('h4')
py net.addLink(h4, s1)

  • 测试连通性:

    (由于未设置路由表,丢包率较高)

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

  • 通过sudo chmod -R 777 + 文件名令之前的文件可写,直接在脚本内添加
  • 为先前保存Python脚本添加题示网络性能限制:
  • 再次生成拓扑:

(二)进阶要求

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

  • 编写.py拓扑文件,命名为“学号_fattree.py”;

  • 必须通过Mininet的custom参数载入上述文件,不得直接使用miniedit.py生成的.py文件;

  • 设备名称必须和下图一致;

  • 使用Python的循环功能实现,不得在代码中手工直接添加设备和链路。

  • 生成.py文件

  • Python 脚本具体实现
from mininet.topo import Topo

class MyTopo(Topo):
    def __init__(self):
        Topo.__init__(self)
        
        #loop for add hosts
        hosts = []
        for i in range(16):
            h = self.addHost('h'+str(i+1))
            hosts.append(h)
        
        #loop for add switchs
        switchs = []
        for i in range(14):
            s = self.addSwitch('s'+str(i+1))
            switchs.append(s)
        
        #loops for add links
        #s & s
        for i in range(2):
            for j in range(2, 6):
                self.addLink(switchs[i], switchs[j])
        for i in range(2, 4):
            for j in range(6, 10):
                self.addLink(switchs[i], switchs[j])
        for i in range(4, 6):
            for j in range(10, 14):
                self.addLink(switchs[i], switchs[j])
        #s & h
        for i in range(6, 14):
            loca = 2 * ( i - 6 )
            self.addLink(switchs[i], hosts[loca])
            self.addLink(switchs[i], hosts[loca+1])
 
topos = {'mytopo': (lambda: MyTopo())}

  • 最终执行结果:

个人总结

本次实验为软件定义网络(Software Defined Network, SDN)的第一次实践活动。主要任务是搭建Mininet实验环境以及动手尝试通过不同的方式搭建简单的的网络拓扑结构。当然,科学实践没有一帆风顺的。在本次实验实践中,我也在以下方面遇到了一些问题:

1.环境安装方面

本次实验是在基于虚拟机软件的环境下进行的,由于实验之前缺乏对网络管理和虚拟机等方面了解,相关软件的安装与运行还无法十分得心应手。实验提供了两种虚拟机软件,我这里选择了Oracle VisualBox。

  • Q1. 在安装Ubuntu镜像时,系统安装曾一度卡在Checking Disk:67%处,随后报错关闭,使系统安装无法顺利完成。
  • 解决方法:在查阅资料和类似博客后,尝试调换“启动顺序”,问题解决成功。
  • Q2. 在安装Mininet过程中中,执行安装脚本时报错:No module named pip
  • 解决方法:Mininet运行需要Python,目前版本一般要Python3,Ubuntu20.04原有Python默认是Python2。故修改软链,指向Python3。再次运行安装脚本,成功运行,问题解决。

2.系统运行方面

  • Q1.Ubuntu系统&Mininet安装完毕,但是实际在虚拟机系统运行时,卡顿现象相对严重,严重影响实践体验和实验效率
  • 解决方法:调高设置中分配给虚拟机的处理器数量可以有效缓解卡顿 (真的不是因为你电脑配置太拉胯吗?🌚)

3.实践任务方面

  • Q1. 在通过MiniEdit搭建网络拓扑时,实验要求保存拓扑为.py格式文件。然而在通过“保存”,仅能产生.mn格式文件
  • 解决方法:通过“导出模型”方式,即可导出.py格式的Python脚本文件。值得注意的是,.mn格式文件内部保存的是多个键值对, 而.py格式文件内部保存的Python脚本,而这有本质不同。故对于MiniEdit而言, 已经导出的.py文件无法再次直接读取,而只能直接读取.mn文件

总体而言,本次软件定义网络实验实践令我对 何为软件定义网络 以及 何为网络 有了更加直观且全面的认识。同时本次实验依然仍然留下了一些还未解决的问题需要我进一步思考和实践,就例如,如何有效解决在基本要求5中的网络拓扑丢包率高的问题,还有为何进阶要求中我构造出来的网络拓扑连通性不行等等问题,都有待进一步的学习和实验实践来解决与完善。

posted @ 2021-09-08 21:40  Excalibur_Morgan  阅读(117)  评论(0编辑  收藏  举报