• 实验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的安装路径

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

    • 打开Mininet可视化工具

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

    • 选择Export Level 2 Script

    • 保存为学号.py

    • pingall查看连通状况

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

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

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

      sudo mn --topo=linear,3,1
      

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

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

      sudo mn --topo=single,3
      

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

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

    • 查看4b)连接状况

      mininet> net
      

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

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

    • 查看新增后连接状况

    • 完整过程

    测试新拓扑的连通性

    h1,h2,h3可以互相ping通

    h4无法ping通h1,h2,h3

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

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

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

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

    • 运行得出结果

    (二)进阶要求

    编写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.问题: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的使用技巧。相比只是传统地传授理论知识,本课程通过创新实践的方式,让我们加深了对于所学知识的理解,能够让我们的思考更有深度。 这次实验也让我深刻体会到了可视化工具的好处,利用可视化工具可以无门槛、更加便捷地建立拓扑,效率得到了提高。

  • 相关阅读:
    java基础
    JAVASE 安装步骤
    MySQL 45道练习题
    MySQL 多表查询
    2018-08-07JDBC连接MySQL+增删改表格+SQL注入问题及其预处理对象PreparedStatement解决方案
    2018-08-06Java中的异常捕获和Throw详细细节
    2018-08-03List接口方法+LinkedList方法+Vector集合+Set接口下HashSet和LinkedHashSet集合+HashCode()+equals()方法对于Set接口判断重复的详细细节
    2018-08-01集合Collection+Iterator迭代器+泛型+增强For循环
    2018-07-31包装类与基本数据类型String的转换+System类详细知识+Arrays类+大数据(BigInteger+BigDecimal)运算
    2018-07-27Final+Static+匿名对象+3中代码块
  • 原文地址:https://www.cnblogs.com/beyondzones/p/15246554.html
Copyright © 2020-2023  润新知