实验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目录下创建一个目录,目录命名为学号。
    实验1:SDN拓扑实践

  2. 在创建的目录下,完成Mininet的源码安装。
    实验1:SDN拓扑实践

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

  • 使用可视化工具生成拓扑
    实验1:SDN拓扑实践
  • 由可视化工具生成的拓扑py文件
    实验1:SDN拓扑实践
  1. 使用Mininet的命令行生成如下拓扑:

    a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。
    实验1:SDN拓扑实践
    实验1:SDN拓扑实践

    b) 3台主机,每个主机都连接到同1台交换机上。
    实验1:SDN拓扑实践

  2. 在4 b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。
    实验1:SDN拓扑实践
    进行相关配置后,尝试用主机h1 ping 主机h4,检测连通后,接着使用pingall检查整体连通性
    实验1:SDN拓扑实践

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

    编辑py文件界面
    实验1:SDN拓扑实践
    运行编辑好的py文件
    实验1:SDN拓扑实践
    使用iperf工具进行性能测试
    实验1:SDN拓扑实践
    另一种使用iperf工具的方法
    实验1:SDN拓扑实践

(二)进阶要求

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

python代码

#!/usr/bin/env python
#创建网络拓扑
 
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController,CPULimitedHost
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
 
class MyTopo( Topo ):
 
    def __init__( self ):
        # Initialize topology
        Topo.__init__( self )
        L1 = 2
        L2 = L1 * 2 
        L3 = L2 * 2
        s = []
          
        # add core ovs  
        for i in range( L1 ):
                sw = self.addSwitch( ‘s{}‘.format( i + 1 ) )
                s.append( sw )
    
        # add aggregation ovs
        for i in range( L2 ):
                sw = self.addSwitch( ‘s{}‘.format( L1 + i + 1 ) )
                s.append( sw )
    
        # add edge ovs
        for i in range( L3 ):
                sw = self.addSwitch( ‘s{}‘.format( L1 + L2 + i + 1 ) )
                s.append( sw )
 
        # add links between core and aggregation ovs
        for i in range( L1 ):
                sw1 = s[i]
                for sw2 in s[L1:L1+L2]:
                               self.addLink( sw2, sw1 )
 
        # add links between aggregation and edge ovs
        for i in range( 0, L2, 2 ):
                for sw1 in s[L1+i:L1+i+2]:
	                for sw2 in s[L1+L2+2*i:L1+L2+2*i+4]:
	                        self.addLink(sw2,sw1)
	                
        #add hosts and its links with edge ovs
        count = 1
        for sw1 in s[L1+L2::1]:
                for i in range(2):
                	host = self.addHost( ‘h{}‘.format( count ) )
                	self.addLink( sw1, host )
                	count += 1
topos = { ‘mytopo‘: ( lambda: MyTopo() ) }

上述Python代码保存在031902522_fattree.py文件内
实验1:SDN拓扑实践
在终端上运行031902522_fattree.py
实验1:SDN拓扑实践
第一次pingall的时候有的地方ping不通
实验1:SDN拓扑实践
第二次pingall的时候全部成功ping通
实验1:SDN拓扑实践

四、实验心得

本次实验对我来说难度较为适中。说实话,虽然对于虚拟机的概念,之前我也略有耳闻,但真正接触时,还是会感觉很陌生。好在老师给出的虚拟机安装及之后的实验环境配置等指南足够详细,让我一个小白也能顺利地安装好实验环境。最开始做实验时,由于不熟悉linux系统终端的命令行指令,在很多地方感觉很不顺手,不过百度还是很好用的,把linux几个基本指令熟悉之后,实验进行地就比较顺畅了。实验内容中的基础要求部分并不难。只要做实验过程中够细心不急躁,按照老师给的实验指导书,按部就班,基本能顺利完成实验要求。让我感觉到困难的是进阶要求部分。这部分要求手动编写py脚本,同时需要使用Python的循环代码来实现。对于没怎么接触过Python的我来说自然是当头一棒。后面我找到了实验指南参考材料里的样例代码,试着边看边查询Python的相关语法,还边画示意图。好不容易看懂后才自己写出了一份符合题目要求的代码。接着在运行py脚本时又出了问题,上网找了不少资料,最终才解决了问题。这次实验让我认识到,自己动手上网查找资料解决问题的能力还是非常重要的,同时要有耐心不急不躁,这样对顺利完成所分配的任务是非常有帮助的。

实验1:SDN拓扑实践

上一篇:Spring IOC和AOP 原理彻底搞懂(转)


下一篇:leetcode python 1. 两数之和 88. 合并两个有序数组