实验1:SDN拓扑实践
实验1:SDN拓扑实践
一、实验目的
- 能够使用源码安装Mininet;
- 能够使用Mininet的可视化工具生成拓扑;
- 能够使用Mininet的命令行生成特定拓扑;
- 能够使用Mininet交互界面管理SDN拓扑;
- 能够使用Python脚本构建SDN拓扑。
二、实验环境
- 下载虚拟机软件Oracle VisualBox 或 VMware;
- 在虚拟机中安装Ubuntu 20.04 Desktop amd64;
三、实验要求
(一)基本要求
-
在Ubuntu系统的home目录下创建一个目录,目录命名为学号。
-
在创建的目录下,完成Mininet的源码安装。
-
使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py。
- 使用可视化工具生成拓扑
- 由可视化工具生成的拓扑py文件
-
使用Mininet的命令行生成如下拓扑:
a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。
b) 3台主机,每个主机都连接到同1台交换机上。
-
在4 b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。
进行相关配置后,尝试用主机h1 ping 主机h4,检测连通后,接着使用pingall检查整体连通性
-
编辑(一)中第3步保存的Python脚本,添加如下网络性能限制,生成拓扑:
a) h1的cpu最高不超过50%;
b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50。编辑py文件界面
运行编辑好的py文件
使用iperf工具进行性能测试
另一种使用iperf工具的方法
(二)进阶要求
- 编写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文件内
在终端上运行031902522_fattree.py
第一次pingall的时候有的地方ping不通
第二次pingall的时候全部成功ping通
四、实验心得
本次实验对我来说难度较为适中。说实话,虽然对于虚拟机的概念,之前我也略有耳闻,但真正接触时,还是会感觉很陌生。好在老师给出的虚拟机安装及之后的实验环境配置等指南足够详细,让我一个小白也能顺利地安装好实验环境。最开始做实验时,由于不熟悉linux系统终端的命令行指令,在很多地方感觉很不顺手,不过百度还是很好用的,把linux几个基本指令熟悉之后,实验进行地就比较顺畅了。实验内容中的基础要求部分并不难。只要做实验过程中够细心,不急躁,按照老师给的实验指导书,按部就班,基本能顺利完成实验要求。让我感觉到困难的是进阶要求部分。这部分要求手动编写py脚本,同时需要使用Python的循环代码来实现。对于没怎么接触过Python的我来说自然是当头一棒。后面我找到了实验指南参考材料里的样例代码,试着边看边查询Python的相关语法,还边画示意图。好不容易看懂后才自己写出了一份符合题目要求的代码。接着在运行py脚本时又出了问题,上网找了不少资料,最终才解决了问题。这次实验让我认识到,自己动手上网查找资料解决问题的能力还是非常重要的,同时要有耐心,不急不躁,这样对顺利完成所分配的任务是非常有帮助的。