实验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的源码安装。

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

  • 可视化生成拓扑:
  • 保存拓扑文件:
  • 测试连通性
  1. 使用Mininet的命令行生成如下拓扑:
    a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。

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

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

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

  • 对py文件可读性的修改
    chmod 777 file #user、gourp、other三个用户都能读取、写入、执行
    

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

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

(二)进阶要求

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

  • 编写.py拓扑文件,命名为“学号_fattree.py”
  • 必须通过Mininet的custom参数载入上述文件,不得直接使用miniedit.py生成的.py文件;
  • 设备名称必须和下图一致;
  • 使用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 ):
        "Simple topology example."
    
        def __init__( self ):
            "Create custom topo."
    
            # Initialize topology
            Topo.__init__( self )
            L1 = 2
            L2 = L1 * 2 
            L3 = L2 * 2
            s = []
    
            
            # add ovs  
            for i in range( L1+L2+L3 ):
                    sw = self.addSwitch( 's{}'.format( 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[i+L1:i+L1+2]:
                        for sw2 in s[L1+L2+i*2:L1+L2+(i+2)*2]:
                      	  self.addLink( sw2, sw1 )
    
            #add hosts and its links with edge ovs
            count = 1
            for sw1 in s[L1+L2:L1+L2+L3]:
                    for i in range(2):
                  	  host = self.addHost( 'h{}'.format( count ) )
                  	  self.addLink( sw1, host )
                  	  count += 1
    topos = { 'mytopo': ( lambda: MyTopo() ) }
    
    • 执行结果
  • 参考资料
    [Mininet多个数据中心的拓扑网络实现]https://www.sdnlab.com/15128.html
    [利用Python脚本完成一个Fat-tree型的拓扑]https://www.cnblogs.com/fjlinww/p/11763313.html

四、实验心得

  • 收获总结
    1. 出现此报错是由于没有更改Python的软链接
    • 解决办法
      • 查看现有python的软链接指向的版本
        -l /usr/bin | grep python
        
      • 删除旧的软链接
        sudo rm python2 
        #如果写python而不是python2将报错
        
      • 建立新的软链接
        sudo ln -s python3.8 python
        
      • 查看软链接版本
        python -V
        
    1. 在使用工具化生成拓扑时需要注意权限
      sudo ./031902443/mininet/examples/miniedit.py
      #一开始没有加上sudo导致画完图之后由于没有权限而不能运行
      
    2. 第5小题:在4 b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。
    • 一开始只是建立新主机和新链路而没有为交换机新增接口和给新主机分配IP地址导致无法ping通;
      后来参考了某位同学的博客才解决了:
      py net.addHost('h4')
      py s1.attach('s1-eth4')
      py net.addLink(s1,h4,4,0)
      py h4.setIP('10.0.0.4')
      
    1. 在终端输入命令新建一个python文件

    • 在终端编辑python脚本文件按esc键并输入:wq可退出编辑
    • 或采用文本编辑器编辑python脚本
  • 心得
    通过这次的实验,我对虚拟机有了更深入的了解,并且能够通过简单指令来实现相关功能。除了一开始的安装花费了一些时间以外,实验过程中也有产生小错误,但大都通过搜集资料解决了,并且也在解决这些错误的过程中有不少的学习收获。
    花费时间最多的还是第二部分的附加题,一开始不懂python语法也看不懂python脚本,也产生了放弃不做的想法。我试着去看了一下参考资料的代码,并准备对其加以改造,但并不懂得该如何下手。转机是我在百度搜集资料的时候看见老师所写的利用Python脚本完成一个Fat-tree型的拓扑,我发现它和附加题的差别只在于多加了一排的交换机,这让我产生了信心,通过解读老师的代码,且在遇到不会的函数和语法时及时查找,我终于看懂了并且有了修改的灵感,最后也顺利完成了,有了小小的进步。
posted @ 2021-09-11 13:58  POOH_BEAR  阅读(298)  评论(0编辑  收藏  举报