实验1:SDN拓扑实践

实验1:SDN拓扑实践

一、实验目的

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

二、实验环境

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

三、实验要求

(一)基本要求

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

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

  • Mininet的安装路径

    实验1:SDN拓扑实践

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

    实验1:SDN拓扑实践

  • 使用左侧图标直接点击建立拓扑图

    实验1:SDN拓扑实践

  • 选择Export Level 2 Script

    实验1:SDN拓扑实践

  • 保存为学号.py

    实验1:SDN拓扑实践

  • pingall查看连通状况

    实验1:SDN拓扑实践

  1. 使用Mininet的命令行生成如下拓扑

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

  • 输入建立满足题意的拓扑:

    sudo mn --topo=linear,3,1
    

    实验1:SDN拓扑实践

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

  • 输入建立满足题意的拓扑:

    sudo mn --topo=single,3
    

    实验1:SDN拓扑实践

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

在Mininet交互界面上新增1台主机并且连接到交换机上

  • 查看4b)连接状况

    mininet> net
    

    实验1:SDN拓扑实践

  • 创建主机h4,并且建立主机h4与交换机s1的链接

    mininet> py net.addHost('h4')
    mininet> py net.addLink(s1, h4, 4, 0)
    
    

    实验1:SDN拓扑实践

    实验1:SDN拓扑实践

  • 查看新增后连接状况

    实验1:SDN拓扑实践

  • 完整过程

    实验1:SDN拓扑实践

测试新拓扑的连通性

h1,h2,h3可以互相ping通

h4无法ping通h1,h2,h3

实验1:SDN拓扑实践

6.编辑(一)中第3步保存的Python脚本,添加如下网络性能限制,生成拓扑:

a) h1的cpu最高不超过50%;

b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50。

  • 打开之前保存的031902218.py,如下更改:

    实验1:SDN拓扑实践

  • 运行得出结果

    实验1:SDN拓扑实践

(二)进阶要求

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

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

    #!/usr/bin/python
    #创建网络拓扑
     
    from mininet.topo import Topo
    from mininet.net import Mininet
    from mininet.node import RemoteController,CPULimitedHost,Controller
    from mininet.link import TCLink
    from mininet.util import dumpNodeConnections
     
    class MyTopo(Topo):
     
        def __init__(self):
     
            # 初始化拓扑
            Topo.__init__(self)
            L1 = 2
            L2 = L1 * 2 
            L3 = L2 * 2
            c = []
            a = []
            e = []
            
            # 添加第一行交换机  
            for i in range(L1):
                    sw = self.addSwitch('s{}'.format(i + 1))
                    c.append(sw)
        
            # 添加第二行交换机
            for i in range(L2):
                    sw = self.addSwitch('s{}'.format(L1 + i + 1))
                    a.append(sw)
        
            # 添加第三行交换机
            for i in range(L3):
                    sw = self.addSwitch('s{}'.format(L1 + L2 + i + 1))
                    e.append(sw)
    
            # 建立第一行交换机和第二行交换机的链接
            for i in range(L1):
                    sw1 = c[i]
                    for sw2 in a[i//2::L1//2]:
                        self.addLink(sw2, sw1)
    
            # 建立第二行交换机和第三行交换机的链接
            for i in range(0, L2, 2):
                    for sw1 in a[i:i+2]:
    	                for sw2 in e[i:i+2]: 
                                self.addLink(sw2, sw1)
     
            # 建立第三行交换机和主机之间的链接
            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())}
    
  • 利用custom参数加载py文件建立拓扑

    $ sudo mn --custom 031902218_fattree.py --topo mytopo
    

    实验1:SDN拓扑实践

四、个人总结

  • 实验难度:适中

  • 实验过程遇到的困难:

    1.问题:VMware Tools未被正常安装,无法实现虚拟机和外部宿主机之间要复制粘贴文本和文件

    解决方法:根据官方文档安装VMware Tools(在 Linux 虚拟机中手动安装 VMware Tools

    2.问题:在安装Mininet过程中,执行 git clone https://github.com/mininet/mininet.git 或者在执行util 子目录下的 install.sh 安装脚本时,出现fatal: unable to access ‘https://github xxxxxxxxx‘的错误

    解决方法:将https改成git

  • 个人感想:

    通过这次实验,我学会了使用Mininet构建拓扑、创建并使用虚拟机以及一些Ubuntu的使用技巧。相比只是传统地传授理论知识,本课程通过创新实践的方式,让我们加深了对于所学知识的理解,能够让我们的思考更有深度。 这次实验也让我深刻体会到了可视化工具的好处,利用可视化工具可以无门槛、更加便捷地建立拓扑,效率得到了提高。

上一篇:SDN第二次上机实验


下一篇:SDN第三次上机实验