实验1:SDN拓扑实践
一、实验目的
- 能够使用源码安装Mininet;
- 能够使用Mininet的可视化工具生成拓扑;
- 能够使用Mininet的命令行生成特定拓扑;
- 能够使用Mininet交互界面管理SDN拓扑;
- 能够使用Python脚本构建SDN拓扑。
二、实验环境
- 下载虚拟机软件Oracle VisualBox 或 VMware;
- 在虚拟机中安装Ubuntu 20.04 Desktop amd64;
三、实验要求
(一)基本要求
-
在Ubuntu系统的home目录下创建一个目录,目录命名为学号。
-
在创建的目录下,完成Mininet的源码安装。
Mininet的安装路径
-
使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py。
-
打开Mininet可视化工具
-
使用左侧图标直接点击建立拓扑图
-
选择Export Level 2 Script
-
保存为学号.py
-
pingall查看连通状况
- 使用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的使用技巧。相比只是传统地传授理论知识,本课程通过创新实践的方式,让我们加深了对于所学知识的理解,能够让我们的思考更有深度。 这次实验也让我深刻体会到了可视化工具的好处,利用可视化工具可以无门槛、更加便捷地建立拓扑,效率得到了提高。