实验1:SDN拓扑实践

发布时间 2023-09-19 22:25:11作者: Q·K

一、实验目的

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目录下创建一个目录,目录命名为学号。
2.在创建的目录下,完成Mininet的源码安装。

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

4.编辑保存的Python脚本,添加如下网络性能限制,生成拓扑:
a) h1的cpu最高不超过50%;
b) h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50。

首先用命令讲上锁python文件解锁
sudo chmod 777 filename
再打开python文件进行如下图代码修改

修改后完整代码为:

点击查看代码
#!/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=50,use_htb=True)

    net.addLink(s1, s2)

    net.addLink(s2, h3)

    net.addLink(h2, s1)

    net.addLink(s2, h4)



    info( '*** Starting network\n')

    net.build()

    info( '*** Starting controllers\n')

    for controller in net.controllers:

        controller.start()



    info( '*** Starting switches\n')

    net.get('s1').start([c0])

    net.get('s2').start([c0])

    

    info( '*** Post configure switches and hosts\n')



    CLI(net)

    net.stop()

    

if __name__ == '__main__':

    setLogLevel('info')

    myNetwork()
测试连通性: ![](https://img2023.cnblogs.com/blog/2467319/202309/2467319-20230912165901239-1344344036.png) 测试带宽: ![](https://img2023.cnblogs.com/blog/2467319/202309/2467319-20230912165954278-2103886261.png)

(二)进阶要求

  • 编写Python脚本,生成如下数据中心网络拓扑,要求:
  • 编写.py拓扑文件,命名为“学号_fattree.py”;
  • 必须通过Mininet的custom参数载入上述文件,不得直接使用miniedit.py生成的.py文件;
  • 设备名称必须和下图一致;
  • 使用Python的循环功能实现,不得在代码中手工直接添加设备和链路。

首先在文件夹内创建py文件,然后在里面编写创建topo图代码

点击查看代码
#!/usr/bin/env python

from mininet.topo import Topo



class MyTopo(Topo):

	def __init__(self):



	#初始化

		Topo.__init__(self)



    	#添加host

		for i in range(1,9):

			self.addHost("h"+str(i))



	#添加switch

		for i in range(1,11):

			self.addSwitch("s"+str(i))



	#将s1-2与s3-6连接

		for i in range(1,3):

			for j in range(3,7):

				self.addLink("s"+str(i),"s"+str(j))



	#将s3-4与s7-8连接,将s5-6与s9-10连接

		for i in range(3,5):

			for j in range(7,9):

				self.addLink("s"+str(i),"s"+str(j))



		for i in range(5,7):

			for j in range(9,11):

				self.addLink("s"+str(i),"s"+str(j))



	#将s7-s10分别与下面两个主机连接

		for i in range(7,11):

			for j in range((i-6)*2-1,(i-6)*2+1):

				self.addLink("s"+str(i),"h"+str(j))



topos = {'mytopo': (lambda: MyTopo())}

运行后,发现没有ping通:
根据网络资料查询到有两个可能原因:
1.流表信息不全(根据排查不为这个原因)
2.拓扑中有环路,将命令修改为:
sudo mn --custom 031902239_fattree.py --topo mytopo --switch ovsbr,stp=1
不知道为什么第二次就可以成功了

三、实验总结

  • 遇到的困难及解决方法:
  1. 在配置环境的时候github网站不稳定,每次都下载到一半就断掉,然后要删除掉原本有的openflow文件重新下载,很是复杂啦。
    2.在原本搭建的拓扑图生成的.py文件没有办法从可视化保存成完整的py文件,并且文件上锁了。查询解决方案并没有一个很好的解决方案,所以我选择将py文件解锁后补齐完整代码,然后再运行以及后续的操作。
    3.在完成进阶作业的时候,对于拓扑的建立本来用非常麻烦的一个个点创建,然后再同学们的帮助下,简化了写法。在编写python脚本生成拓扑后,使用sudo mn --custom 102101608_fattree.py --topo mytopo命令后续pingall无法ping通。查找资料得知是因为拓扑中存在环,想要解决可以使用STP生成树协议。将命令改为使用sudo mn --custom 102101608_fattree.py --topo mytopo --switch ovsbr,stp=1,在pingall就可ping通,但使用一次pingall并不能完全ping通,这让我很疑惑。
  • 个人感想
    第一次上机实验,很是生疏所以碰到了挺多困难,但是静下心来就能解决每一个问题。