SDN实验1:SDN拓扑实践
实验目的
- 能够使用源码安装Mininet;
- 能够使用Mininet的可视化工具生成拓扑;
- 能够使用Mininet的命令行生成特定拓扑;
- 能够使用Mininet交互界面管理SDN拓扑;
- 能够使用Python脚本构建SDN拓扑。
实验环境
- 下载虚拟机软件VMware;
- 在虚拟机中安装Ubuntu 20.04 Desktop amd64;
实验要求
基本要求
- 在Ubuntu系统的home目录下创建一个目录,目录命名为学号,在创建的目录下,完成Mininet的源码安装
如图给出mininet的安装路径:
- 使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py
配置各主机ip,控制器保持默认配置,edit preferences将CLI以及所有的openflow都选中
进行连通性测试
保存的拓扑文件名为学号.py
-
使用Mininet的命令行生成如下拓扑:
-
a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线
-
b) 3台主机,每个主机都连接到同1台交换机上
-
- 在b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性
- 编辑(一)中第3步保存的Python脚本,添加如下网络性能限制,生成拓扑:
- a) h1的cpu最高不超过50%;
- b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50。
使用vim在.py文件中对代码直接进行修改(也可以直接用gedit打开,这样就不用下载vim了),修改的内容包括
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None, cpu=0.5)
net.addLink(h1, s1, bw=10, delay='5ms',max_queue_size=1000, loss=50, use_htb=True)
进阶要求
编写Python脚本,生成如下数据中心网络拓扑,要求:
- 编写.py拓扑文件,命名为“学号_fattree.py”;
- 必须通过Mininet的custom参数载入上述文件,不得直接使用miniedit.py生成的.py文件;
- 设备名称必须和下图一致;
- 使用Python的循环功能实现,不得在代码中手工直接添加设备和链路。
根据要求编写代码
#!/usr/bin/env python
from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
#初始化拓扑
Topo.__init__(self)
switchList = []
hostList = []
for i in range(1, 15):
switchName = "s" + str(i)
self.addSwitch(switchName)
switchList.append(switchName)
for i in range(1, 17):
hostName = "h" + str(i)
self.addHost(hostName)
hostList.append(hostName)
#连接s1,s2和s3,s4,s5,s6
for i in range(1, 3):
switchName0 = "s" + str(i)
for j in range(3, 7):
switchName1 = "s" + str(j)
self.addLink(switchName0, switchName1)
#连接s3,s4和s7,s8,s9,s10
for i in range(3, 5):
switchName0 = "s" + str(i)
for j in range(7, 11):
switchName1 = "s" + str(j)
self.addLink(switchName0, switchName1)
#s5,s6和s11,s12,s13,s14
for i in range(5, 7):
switchName0 = "s" + str(i)
for j in range(11, 15):
switchName1 = "s" + str(j)
self.addLink(switchName0, switchName1)
#把主机和交换机连起来
for i in range(7, 15):
switchName = "s" + str(i)
for j in ((i - 6) * 2 - 1, (i - 6) * 2):
hostName = "h" + str(j)
self.addLink(switchName, hostName)
topos = {'mytopo': (lambda: MyTopo())}
执行以下命令
sudo mn --custom 031902141_fattree.py --topo mytopo
将拓扑运行起来:
查看网络连接状态:
个人总结
遇到的问题及部分解决方法
在打开miniedit时出现了"python":没有那个文件或目录的报错,解决方法是执行sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1000
,之后再次执行打开miniedit的命令,就会出现miniedit的页面了
虽然按照h1 ping h3这样的格式进行连通性测试是没问题的,都可以ping通,但是如果执行的是pingall命令,显示出来的结果会是100%丢包,按照搜索结果,可能是因为安装的ubuntu中文版本的格式问题。
在运行fattree的py文件时,出现关于file exists的报错,执行sudo mn -c
后即可解决
执行sudo mn -c
后:(原因在于mininet退出时,未将之前定义的拓扑文件清除干净,导致出现重复的拓扑)
总结
出了许多奇怪的报错和一些无法ping通的问题,再次意识到自己的bug体质…学到了除了vim以外的文件处理方法:touch+文件名可以创建文件,gedit可以查看并编辑文件,体验起来比vim舒适一些。同时体验了下python在mininet中的使用,miniedit的可视化图形界面对用户友好。还有一些尚未解决的问题和不太清楚原理的地方,需要进一步学习。最后,处理报错等问题的速度还需要提高。