实验1: SDN拓扑实践
1. 使用Mininet可视化工具,生成下图所示的拓扑

2. 生成3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。

3. 生成3台主机,每个主机都连接到同1台交换机上

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

5. 修改后的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, cup=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(h2, s1)
net.addLink(s2, s1)
net.addLink(h3, s2)
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()
- 运行结果
![]()
6. 进阶代码及结果
- 代码
#!/usr/bin/python
#创建网络拓扑
"""Custom topology example
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
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 ):
Topo.__init__( self )
L1 = 2
L2 = 4
L3 = 8
c = []
a = []
e = []
for i in range( L1 ):
sw = self.addSwitch( 's{}'.format( i + 1 ) )
c.append( sw )
for i in range( L2 ):
sw = self.addSwitch( 's{}'.format( L1 + i + 1 ) )
a.append( sw )
for i in range( L3 ):
sw = self.addSwitch( 's{}'.format( L1 + L2 + i + 1 ) )
e.append( sw )
for i in range( L1 ):
sw1 = c[i]
for sw2 in a[0::2]:
self.addLink( sw2, sw1 )
for i in range( 0, L2, 2 ):
for sw1 in a[i:i+2]:
for sw2 in e[i*2:i*2+4]:
self.addLink( sw2, sw1 )
count = 1
for sw1 in e:
for i in range(2):
host = self.addHost( 'h{}'.format( count ) )
self.addLink( sw1, host )
count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }
- 结果


感想
本次实验难度普通。通过本次实验,初步接触了mininet的使用,并通过分别通过可视化、命令行两种方法设计模拟不同网络数据中心拓扑;比如线性拓扑(Linear)、树形拓扑(Tree)。还可以通过各种命令来检测拓扑连通性,比如links,pingall等等。也可以使用python脚本来构建SDN拓扑,有直接执行python文件或者利用Mininet CLI的custom参数两种方法。
在使用python循环生成拓扑时,由于python基础不够牢固,遇到了各种各样的语法错误,进展缓慢。写完python后,生成拓扑时总是会遇到缩进问题,最后按照报错位置一一解决了。
成功生成拓扑后,在使用pingall指令时却出现了h1 -> X X X X X的情况,请教别人后得出不应使用sudo mn --custom 032002423_fattree.py --topo mytopo --mac而要用sudo mn --custom 032002423_fattree.py --topo mytopo --switch ovsbr,stp=1这行指令,最后也成功解决。


浙公网安备 33010602011771号