实验1:SDN 拓扑实践

实验1:SDN 拓扑实践

一、实验目的

  1. 能够使用源码安装 Mininet;
  2. 能够使用 Mininet 的可视化工具生成拓扑;
  3. 能够使用 Mininet 的命令行生成特定拓扑;
  4. 能够使用 Mininet 交互界面管理SDN拓扑;
  5. 能够使用 Python 脚本构建 SDN 拓扑。

二、实验环境

  1. 下载虚拟机软件 Oracle VisualBox 或 VMware;
  2. 在虚拟机中安装 Ubuntu 20.04 Desktop amd64;

三、实验要求

(一)基本要求

  1. 在 Ubuntu 系统的 home 目录下创建一个目录,目录命名为学号

    • 在终端用 mkdir 指令新建文件夹

  1. 在创建的目录下,完成 Mininet 的源码安装。

  1. 使用 Mininet 可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py

    • 手动移动控制器,交换机,主机进行拓扑连接。连接后在 File 中选 Export Level 2 Script 进行保存。

  1. 使用 Mininet 的命令行生成如下拓扑:
    a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。

    在终端中输入指令 sudo mn --topo=linear,3

b) 3台主机,每个主机都连接到同1台交换机上。

在终端中输入指令 sudo mn --topo=single,3

  1. 在4 b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。

    在终端中输入指令

    py net.addHost('h4')`
    py net.addLink(h4,s1)
    

  1. 编辑(一)中第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的循环功能实现,不得在代码中手工直接添加设备和链路。
    img

    • 在终端中输入指令 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 里的文本编辑器写代码不会报错,写完改语法错误的过程非常艰辛。
posted @ 2021-09-11 23:52  HuDunYu  阅读(39)  评论(0编辑  收藏  举报