实验1:SDN 拓扑实践
实验1:SDN 拓扑实践
一、实验目的
- 能够使用源码安装 Mininet;
- 能够使用 Mininet 的可视化工具生成拓扑;
- 能够使用 Mininet 的命令行生成特定拓扑;
- 能够使用 Mininet 交互界面管理SDN拓扑;
- 能够使用 Python 脚本构建 SDN 拓扑。
二、实验环境
- 下载虚拟机软件 Oracle VisualBox 或 VMware;
- 在虚拟机中安装 Ubuntu 20.04 Desktop amd64;
三、实验要求
(一)基本要求
-
在 Ubuntu 系统的 home 目录下创建一个目录,目录命名为学号。
- 在终端用 mkdir 指令新建文件夹
-
在创建的目录下,完成 Mininet 的源码安装。
-
在终端用 git clone https://github.com/mininet/miniedit.git 下载 mininet 源码
-
用 sudo ./util/install.sh -a 安装脚本
-
-
使用 Mininet 可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py。
- 手动移动控制器,交换机,主机进行拓扑连接。连接后在 File 中选 Export Level 2 Script 进行保存。
-
使用 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(h4,s1)
-
编辑(一)中第3步保存的Python脚本,添加如下网络性能限制,生成拓扑:
a) h1的cpu最高不超过50%;
b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50。由于文件是只读的,而我们需要修改其中代码,所以要在在终端中输入指令
sudo chmod -R 777 031902106.py
让文件可写
如图所示修改代码
再次运行并进行性能检测
(二)进阶要求
编写Python脚本,生成如下数据中心网络拓扑,要求:
-
编写 .py 拓扑文件,命名为“学号_fattree.py”;
-
必须通过 Mininet 的 custom 参数载入上述文件,不得直接使用 miniedit.py 生成的.py文件;
-
设备名称必须和下图一致;
-
使用Python的循环功能实现,不得在代码中手工直接添加设备和链路。
- 在终端中输入指令
touch 031902106_fattree.py
可以新建一个脚本文件
- 在终端中输入指令
- 文本编辑器中如下
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 )
layer1 = 2
layer2 = 4
layer3 = 8
layer1_sw = []
layer2_sw = []
layer3_sw = []
hosts = []
# add 14 switches
for i in range( layer1 ):
sw = self.addSwitch( 's{}'.format( i+1 ) )
layer1_sw.append( sw )
for i in range( layer2 ):
sw = self.addSwitch( 's{}'.format( layer1+i+1 ) )
layer2_sw.append( sw )
for i in range( layer3 ):
sw = self.addSwitch( 's{}'.format( layer1+layer2+i+1 ) )
layer3_sw.append( sw )
# add links between switches
for i in range( layer1 ):
sw1 = layer1_sw[i]
for sw2 in layer2_sw:
self.addLink( sw2 , sw1 )
for i in range( 0,int(layer2/2) ):
sw1 = layer2_sw[i]
for sw2 in layer3_sw[0:int(layer3/2)]:
self.addLink( sw2 , sw1 )
for i in range( int(layer2/2),layer2 ):
sw1 = layer2_sw[i]
for sw2 in layer3_sw[int(layer3/2):layer3]:
self.addLink( sw2 , sw1 )
# add hosts and their links with switches in layer3
count = 1
for sw in layer3_sw:
for i in range( 2 ):
host = self.addHost( 'h{}'.format( count ) )
self.addLink( sw , host )
count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }`
- 连通性检测
四、个人总结
- 学会了一些 linux 指令的使用。
- 在 ubuntu 中,不要使用右键删除文件这种方法,这种方法删不干净,有时使用指令 ls 往往还能看到残留文件。删除文件要在终端使用指令的方式比如 rm -rf 来干净地删除文件。
- 使用 Mininet 工具建立拓扑结构比较直观。用代码写拓扑结构需要使用像 links 之类的指令来判断交换机之间、交换机与主机之间的连通性。在终端中可以用一行代码建立简单的拓扑结构,但增加交换机和主机得用 addSwitch、addHost、addLink 等指令,比较繁琐,这时候用 python 脚本编写会更好些。
- 写 python 脚本时,可以在 windows 下用 python 的 IDE 写,写好了在复制进 ubuntu的文本编辑器里。在ubuntu 里的文本编辑器写代码不会报错,写完改语法错误的过程非常艰辛。