一、 实验目的
- 能够使用源码安装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台交换机连接成一条线。
- 命令行输入代码:
sudo mn --topo linear,3
b) 3台主机,每个主机都连接到同1台交换机上。
- 命令行输入代码:
sudo mn –-topo=single,3
- 在4 b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。
- 终端输入代码
py net.addHost('h4')
py net.addLink(s1, h4)
主机已经连接到交换机上面,但是添加的主机h4无法ping通其他的主机
- 编辑(一)中第3步保存的Python脚本,添加如下网络性能限制,生成拓扑:
a) h1的cpu最高不超过50%;
b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50
- 需修改代码
net.addHost('h1', cpu=0.5)
net.addLink(h1, s1, bw=10, delay='5ms',max_queue_size=1000, loss=10, use_htb=True)
- 修改后代码如下
#!/usr/bin/env python
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
def myNetwork():
net = Mininet( topo=None,
build=False,
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
c0=net.addController(name='c0',
controller=Controller,
protocol='tcp',
port=6633)
info( '*** Add switches\n')
s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
info( '*** Add hosts\n')
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None,cpu=0.5)
h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
info( '*** Add links\n')
net.addLink(h1, s1,bw=10,delay='5ms',max_queue_size=1000,loss=10,use_htb=True)
net.addLink(h2, s1)
net.addLink(s1, s2)
net.addLink(s2, h3)
net.addLink(s2, h4)
info( '*** Starting network\n')
- 连通性测试
- 性能测试
(二)进阶要求
编写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):
# Initialize topology
Topo.__init__(self)
# addswitch
for i in range(1,15):
self.addSwitch("s"+str(i))
# addhost
host=[]
for i in range(1,17):
self.addHost("h"+str(i))
host.append("h"+str(i))
# add links between core and aggregation ovs
for i in range(1,3):
for j in range(3,7):
self.addLink("s"+str(i),"s"+str(j))
# add links between aggregation and edge ovs
for i in range(3,5):
for j in range(7,11):
self.addLink("s"+str(i),"s"+str(j))
for i in range(5,7):
for j in range(11,15):
self.addLink("s"+str(i),"s"+str(j))
#add hosts and its links with edge ovs
for i in range(7,15):
for j in range((i-6)*2-1,(i-6)*2+1):
self.addLink("s"+str(i),"h"+str(j))
topos = {'mytopo': (lambda: MyTopo())}
- 输入代码
sudo mn --custom 031902227_fattree.py --topo mytopo
使用pingall命令之后,发现结果无法ping通
上网查阅资料后发现,需要将代码修改为如下所示代码
sudo mn --custom 031902227_fattree.py --topo mytopo --switch ovsbr,stp=1
第一次使用pingall命令之后,但是结果是也无法全部ping通
第二次使用pingall命令之后可以全部ping通
四、个人总结
实验难度:适中
实验过程:实验最开始是安装虚拟机和mininet软件,其中我为了图方便把Ubuntu系统的语言设置为中文,导致后续在终端输入命令的过程中路径查询不到,之后将系统语言更改为英语之后实验顺利进行。遇到的第二个问题是在用进阶任务中使用python脚本构建拓扑,我不太熟悉python编程语言,在代码修改方面花费了许多时间。在进行进阶任务的时候在我感叹脚本终于写完了,输入实验文档上的命令之后发现实验结果出现错误,之后在网上查阅了相关的资料,修改了命令,之后实验结果正确了。遇到的第三个问题是写博客,这是我第一次写博客,在写的过程中没有按照实验的要求写实验报告,在写博客的过程中一边写一边改,同时也在网上查阅了markdown的相关使用方法。对,在实验过程中还有就是在命令输入后出现错误结果后可以再次输入命令,说不定第二次就好了。
个人感想:我感觉实验蛮有趣的,利用mininet自己建立一个可视化的网络拓扑,从无到有一步步完成实验环境安装,结束所有实验任务,过程很nice。再一个需要更加主动去学习新的知识,过程中的python就是如此,之前有学过一点,但是不熟练。