当前位置:首页 >> 计算机软件及应用 >>

mininet 简单的自定义拓扑


# CustomTopo.py ''' Coursera: - Software Defined Networking (SDN) course -- Module 3 Programming Assignment Professor: Nick Feamster Teaching Assistant: Muhammad Shahbaz ''' frommininet.topo import Topo from mininet.net import Mininet frommininet.node import CPULimitedHost frommininet.link import TCLink frommininet.util import irange,dumpNodeConnections from mininet.log import setLogLevel classCustomTopo(Topo): "Simple Data Center Topology" "linkopts - (1:c1, 2:aggregation, 3: edge) parameters" "fanout - number of child switch per parent switch" def __init__(self, linkopts1, linkopts2, linkopts3, fanout=2, **opts): # Initialize topology and default options Topo.__init__(self, **opts) # Add your logic here ... self.fanout = fanout core = self.addSwitch('c1') for i in irange(1, fanout): aggregation = self.addSwitch('a%s' %i) self.addLink(core, aggregation, **linkopts1) for j in irange(1, fanout): edge = self.addSwitch('e%s' %(fanout*(i-1)+j)) self.addLink(aggregation, edge, **linkopts2) for k in irange(1, fanout): host = self.addHost('h%s' %((fanout*(fanout*(i-1)+j-1))+k)) self.addLink(edge, host, **linkopts3) topos = { 'custom': ( lambda: CustomTopo() ) } defsimpleTest(): "Create and test a simple network" linkopts1 = dict(bw=10, delay='3ms', use_htb=True)

linkopts2 = dict(bw=8, delay='4ms', loss=1, max_queue_size=900, ) linkopts3 = dict(bw=6, delay='5ms', loss=1, max_queue_size=800) topo = CustomTopo(linkopts1, linkopts2, linkopts3, fanout=2) net = Mininet(topo, host=CPULimitedHost, link=TCLink) net.start() print "Dumping host connections" dumpNodeConnections(net.hosts) print "Testing network connectivity" net.pingAll() net.stop()

真实的 SDN 网络需要很多 OpenFlow 设备包括控制器、交换机、功能虚拟化等一系列设 备共同依赖来搭建并应用, 但因条件有限, 每一位实验者不可能有这样真实的环境来验证或 者实验,此文将主要介绍在没有 OpenFlow 硬件设备下模拟搭建通过 Mininet 基于不同数据 中心的网络拓扑。使用 Mininet 设计模拟不同网络数据中心拓扑,可以用来分析网络的总流 量,而且除此之外,还可以通过负载均衡策略来保证数据中心的可用性。不同数据中心网络 拓扑管理设计,主要是基于胖树(Fat-Tree)拓扑创建网络,胖树网络的好处是具有一个多 层次的树状拓扑结构固有的容错能力。 1 Mininet 实例模拟 1.1 实验目的 1. 掌握多数据中心网络拓扑的构建; 2. 掌握多数据中心数据交换过程。 1.2 实例介绍 基于树型拓扑类创建弹性的树状网络能够展现多层次的树型拓扑结构固有的容错能力。 假设每层具有不同的级别,具体分为:核心层、汇聚层、边缘层,每一层都只含有交换机。 因此,一个简单的交换机/主机层网络可以由核心交换机、汇聚交换机、边缘交换机以及主 机组成,也可以根据扇出大小来配置不同的数据中心网络拓扑。在该拓扑中,一个或多个核 心交换机构成根;汇聚交换机的一层或多层位于树的中间;终端主机连接至顶端交换机,形 成了树的叶子(边缘) 。 当拓扑创建完成后, 本实例的主要目的是实现交换机下挂主机间的连通。 实现过程如下: 主机间发送消息上报给交换机, 交换机对收到的报文信息进行分析判断, 如果交换机中存在 此消息相对应的流表,则交换机直接下发流表,将报文消息转发给目的主机;如果交换机中 没有消息相对应的流表,交换机将此发送消息给控制器,控制器根 net 据消息分析关键字段 内容,进行流表下发决策,交换机再将消息发送给目的主机,实现主机间达到通信的目的。 1.3 实例模拟拓扑 使用 Mininet 设计模拟一个多数据中心网络。 用 Mininet 模拟仿真测试, 主要是用 Mininet 中的 OpenFlow 交换机和自己提供的 POX 控制器进行测试, 帮助在真实数据中心和仿真测试 床数据中心提供有用的信息评估不同数据中心的网络性能应用性能。 一个简单的基于两个数 据中心的网络拓扑,如图所示:

图基于两个数据中心的网络拓扑 具体主要测试及验证交换机下挂主机间的连通性以及主机间通信收发数据包的速度。 Mininet 中自带的 iperf 性能测试工具可以测试不同主机间通信的性能带宽质量,在此例中, 主要是对相同边缘交换机下的主机间、 相同聚合交换机下不同边缘交换机间、 相同核心交换 机不同聚合交换机下的主机间进行测试。 1.2 实例代码 在此实验中,使用 Mininet 通过 python 自定义拓扑编写脚本创建两个数据中心的网络 拓扑,且使用已准备的 POX 控制器(IP 地址为 192.168.5.104)进行管控。 应用 Mininet 创建两个数据中心的网络拓扑设计的脚本代码如下: # FatTree.py """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. """ frommininet.topo import Topo classMyTopo( Topo ): "Simple topology example." def __init__( self ): "Create custom topo." # Initialize topology Topo.__init__( self )

L1 = 2 L2 = L1 * 2 L3 = L2 c = [] a = [] e = [] # add core ovs fori in range( L1 ): sw = self.addSwitch( 'c{}'.format( i + 1 ) ) c.append(sw ) # add aggregation ovs fori in range( L2 ): sw = self.addSwitch( 'a{}'.format( L1 + i + 1 ) ) a.append(sw ) # add edge ovs fori in range( L3 ): sw = self.addSwitch( 'e{}'.format( L1 + L2 + i + 1 ) ) e.append(sw ) # add links between core and aggregation ovs fori in range( L1 ): sw1 = c[i] for sw2 in a[i/2::L1/2]: # self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True) self.addLink( sw2, sw1 ) # add links between aggregation and edge ovs fori in range( 0, L2, 2 ): for sw1 in a[i:i+2]: for sw2 in e[i:i+2]: # self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True) self.addLink( sw2, sw1 ) #add hosts and its links with edge ovs count = 1 for sw1 in e: fori in range(2): host = self.addHost( 'h{}'.format( count ) ) self.addLink( sw1, host ) count += 1 topos = { 'mytopo': ( lambda: MyTopo() ) } 在代码中可以通过 L1 变量扩来改变核心交换机的数量,继而改变整个数据中心的网络 拓扑, 使之交换机数量改变后, 边缘交换机数量也会改变, 主机个数也随之改变, 应用 Mininet 的易用可扩展性,生成多个不同数据中心的网络拓扑,可以实现更好更高效率的全局统配。 拓扑创建代码完成后,可以在 Mininet 命令行操作界面通过 ping 操作和 iperf 命令进一

步验证主机间的连通性以及性能带宽分析,也可以通过编写测试脚本应用 Mininet 的操作命 令进行全自动化测试连通性及性能带宽质量,代码如下: defsimpleTest(): "Create and test a simple network" topo = MyTopo() net = Mininet( topo, controller=RemoteController, host=CPULimitedHost, link=TCLink ) net.addController( 'c0', controller=RemoteController, ip='192.168.5.104', port=6633 ) net.start() print "Dumping host connections" dumpNodeConnections(net.hosts ) print "Testing network connectivity" net.pingall() print "Testing bandwidth between h1 with h2, h3, h5" h1, h2 = net.get( 'h1', 'h2' ) net.iperf( ( h1, h2 ) ) h1, h3 = net.get( 'h1', 'h3' ) net.iperf( ( h1, h3 ) ) h1, h5 = net.get( 'h1', 'h5' ) net.iperf( ( h1, h5 ) ) net.stop() if __name__ == '__main__': # Tellmininet to print useful information setLogLevel( 'info' ) simpleTest() self.addLink( Switch1, Switch2 ) 通过测试脚本,验证所有主机的连通性测试以及各主机间的带宽性能测试。使用 iperf 指定特定两个主机进行测试并显示测试结果。 1.3 实验结果 本次实验中应用 Mininet 模拟不同数据中心的网络拓扑,如上述拓扑所示,除上面的测 试脚本外,也可以通过 Mininet 命令控制台进行手动输入命令测试验证或通过实例开发中的 测试脚本进行主机间的连通性及性能带宽进行验证,测试结果如下: 通过 Mininet 手动操作命令创建拓扑: sudomn--custom ~/mininet/custom/FatTree.py --topomytopo–controller=remote,ip=192.168.5.104,port=6633 1.同一交换机内部的主机间连通性及通信带宽测试: h1 和 h2 之间进行 ping 操作,经 验证主机间能够 ping 通。当操作 iperf h1 h2 命令时,h1 和 h2 的带宽性能测试结果为:测 试 TCP 带宽发送数据的速率为 102 Mbit/s,接收数据的速率为 102 Mbit/s。 2.相同汇聚交换机下不同机架的主机间测试: h1 和 h3 之间进行 ping 操作,经验证, 两主机间能够通信。h1 和 h3 的带宽性能测试结果为:测试 TCP 带宽发送数据的速率为 49.9 Mbit/s,接收数据的速率为 49.9 Mbit/s。 3.相同核心交换机不同汇聚交换机下的主机间测试:h1 和 h5 主机在相同汇聚同核心交 换机不同汇聚交换机下,h1 和 h5 之间进行 ping 操作,经验证,两主机间能够通信。h1 和 h5 的带宽性能测试结果为: 测试 TCP 带宽发送数据的速率为 40.1Mbit/s, 接收数据的速率为 40.1Mbit/s。

本文来源于 SDNLAB,可点击此阅读原文。如果您对本文感兴趣,可参与以下互动方式 与作者近距离交流。


相关文章:
计算机网络mininet实验课设
2.6 自定义拓扑结构:通过 PythonAPI 可以很简单的来定义拓扑结构。这个例子直接连接两 台交换机,每个交换机带有一台主机。(命令: sudo mn --custom ~/mininet/...
基于Mininet的胖树SDN网络仿真_图文
龙源期刊网 http://www.qikan.com.cn 基于 Mininet 的胖树 SDN 网络仿真 ...通常采用层次性多根网络拓扑,其中胖树(Fat-tree)结构因其简单易用而得到 广泛...
链路伪造攻击
链路伪造攻击 - 将目前几种主流控制器与 Mininet 一起搭建测试组网,Mininet 负责构造网络拓扑。针对 SDN 存在的链路伪造安全问题,如下图, 通过侵入主机 h1 向...
更多相关标签: