Mininet实验 多个数据中心的拓扑网络实现
实验目的
- 掌握多数据中心网络拓扑的构建
- 掌握多数据中心数据交换过程
实验原理
主机间发送消息上报给交换机,交换机对收到的报文信息进行分析判断,如果交换机中存在此消息相对应的流表,则交换机直接下发流表,将报文消息转发给目的主机;如果交换机中没有相对应的流表,交换机将此发送消息给控制器,控制器根据消息分析关键字段内容,进行流表下发决策,交换机再将消息发送给目的主机,实现主机间通信的目的。
实验任务
创建一个虚拟网络,虚网中包括一台floodlight虚拟机和Mininet虚拟机,使用Mininet设计模拟一个多数据中心网络,主要是用Mininet中的OpenFlow交换机和floodlight控制器进行测试,帮助在真实数据中心和仿真测试床数据中心提供有用的信息评估不同数据中心的网络应用性能。
一个简单的基于两个数据中心的网络拓扑,如下图所示:

图中c1和c2为核心交换机,a1-a4为聚合交换机,e1-e4为边缘交换机,h1-h8为主机。本实验主要测试及验证交换机下挂主机间的连通性以及主机间通信收发数据包的速度。Mininet中自带的iperf性能测试工具可以测试不同主机间通信的性能带宽质量,在此例中,主要是对相同边缘交换机下的主机间、相同聚合交换机下不同边缘交换机间、相同核心交换机不同聚合交换机下的主机间进行测试。
实验内容
启动Floodlight
之前已经安装过floodlight,是通过java来启动。
java -jar targer/floodlight.jar
然后终端会出现一大堆的信息,然后打开浏览器,输入http://localhost:8080/ui/index.html(这里我在本地,依然localhost使用127.0.0.1) 得到下图:

创建数据中心
在mininet目录中,创建一个fattree.py的测试脚本,
关于fattree(胖树拓扑结构)
该拓扑网络分为三个层次:如之前的图,自下而上分别为边缘层(edge),汇聚层(aggregate)以及核心层(core),其中汇聚层交换机与边缘层交换机构成一个pod(一种数据结构)。该实验的fattree拓扑为一个二叉胖树。
mininet脚本
#!/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):
"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
for i in range(L1):
sw = self.addSwitch('c{}'.format(i + 1))
c.append(sw) # add aggregation ovs
for i in range(L2):
sw = self.addSwitch('a{}'.format(L1 + i + 1))
a.append(sw) # add edge ovs
for i in range(L3):
sw = self.addSwitch('e{}'.format(L1 + L2 + i + 1))
e.append(sw) # add links between core and aggregation ovs
for i in range(L1):
sw1 = c[i]
for sw2 in a[i // 2::L1 // 2]:
self.addLink(sw2, sw1) # add links between aggregation and edge ovs
for i in range(0, L2, 2):
for sw1 in a[i:i + 2]:
for sw2 in e[i:i + 2]:
self.addLink(sw2, sw1) # add hosts and its links with edge ovs
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())}
原sdnlab上的代码有一些问题,首先先调整好原本代码的tab缩进的问题。原sdnlab上的代码运行完会报错:

对于该问题,是由于使用python进行矩阵操作,分片操作时候,内部含有除法,产生错误。例如:
for sw2 in a[i / 2::L1 / 2]:
利用/自动产生的类型是浮点型,会出现上述的错误,将/改成//就可以解决问题。
for sw2 in a[i // 2::L1 // 2]:
修改完脚本问题之后用命令:
sudo mn --custom ~/fattree.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633
请根据实际情况将ip为floodlight所在服务器的ip,添加protocols参数指定OpenFlow协议版本。 mn为mininet启动命令。
- --mac指定虚拟主机的mac地址顺序编号,若不带此参数则随机编号
- --controller指定of交换机的控制器
- --switch指定虚拟交换机的类型,ovsk表示虚拟交换机为ovs Kernel mode
- --custom指定自定义拓扑文件
- --topo指定加载拓扑的名字

连通性以及通信带宽测试
1.测试同一交换机内部主机间的宽带

2.测试相同汇聚交换机下不同边缘交换机的主机间测试

3.测试相同核心交换机下不同汇聚交换机下的主机间测试

4.测试所有主机的连通性验证和宽带测试
添加下列代码进脚本
#在开头补充
from mininet.log import setLogLevel
#测试连通性代码部分
def simpleTest():
"Create and test a simple network"
topo = MyTopo()
net = Mininet( topo, controller=None, host=CPULimitedHost, link=TCLink )
net.addController( 'c0', controller=RemoteController, ip='127.0.0.1', 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()
在floodlight web页面中查看网络拓扑信息


Mininet实验 多个数据中心的拓扑网络实现的更多相关文章
- SDN实验---Mininet实验(模拟多数据中心带宽实验)
补充:NameError: name 'buffer' is not defined >>> import sys >>> ,): ... buffer = mem ...
- SDN与NFV技术在云数据中心的规模应用探讨
Neo 2016-1-29 | 发表评论 编者按:以云数据中心为切入点,首先对SDN领域中的叠加网络.SDN控制器.VxLAN 3种重要技术特点进行了研究,接下来对NFV领域中的通用服务器性能.服务链 ...
- [转载] Google数据中心网络技术漫谈
原文: http://www.sdnlab.com/12700.html?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd ...
- MySQL金融应用场景下跨数据中心的MGR架构方案(1)
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0. 内容提纲 运行环境 部署MGR A&B 部署MGR A.B之间的复制通道 几个注意事项 如何在多个数据中心部 ...
- Google数据中心B4网络具体实现
① 背景介绍 Google的网络有两种,一种是数据中心内部网络,另外一种是WAN网,其中WAN网又分为两种:一是数据中心之间的互联网络,属于内部网络(G-Scale Network),另外一种是面向I ...
- 不使用 ASR 将虚机还原到另一个数据中心
背景 在 Azure 上可能会遇到一个场景是将一台虚机搬到另一台数据中心,在不借助 ASR 的情况下我们该如何做? 因为 ASR 在云上更多的场景是用于灾备到异地.对于虚机的相关信息主要的是磁盘和网络 ...
- 透过微软研究院在“数据中心网络”的重大进展看SIGCOMM 2013
2013" title="透过微软研究院在"数据中心网络"的重大进展看SIGCOMM 2013"> 编者按:于8月12日至16日在香港举行的SI ...
- 虚拟化-SDDC软件定义数据中心
一.什么是SDDC? SDDC依赖于虚拟化和云计算技术, SDDC的目标是虚拟化数据中心的一切物理资源,通过虚拟化的技术,构建一个由虚拟资源组成的资源池,不仅是对服务器进行虚拟化,还包括存储虚拟化和网 ...
- 英特尔® 至强® 平台集成 AI 加速构建数据中心智慧网络
英特尔 至强 平台集成 AI 加速构建数据中心智慧网络 SNA 通过 AI 方法来实时感知网络状态,基于网络数据分析来实现自动化部署和风险预测,从而让企业网络能更智能.更高效地为最终用户业务提供支撑. ...
随机推荐
- webuploader的一个页面多个上传按钮实例
借鉴一位大佬的demo 附上他的github地址https://github.com/lishuqi 我把他的cxuploader.js改了不需要预览 直接上传图片后拿到回传地址给img标签显示图 ...
- Git 原理入门
Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些基本命令,到底在做什么,你说得 ...
- 虚拟机(unbutun16.04)设置静态ip
电脑上装了虚拟机,想用xshell连接,无奈按照默认的网络设置方式每次重启了虚拟机后都要修改ip才能访问,这怎么能忍,经过一番折腾终于搞定这个问题了,解决步骤如下: 大步骤分为两步:其一是主机的设置, ...
- Git命令中日常不注意又很重要的坑
引言 简单聊一下Git的常用命令和概念,其中很多命令开发者在使用时用法不当导致出现很多问题: 比如,新创建的分支没有追踪想要追踪的分支,很想看到版本提交的内容 以下是觉得比较好用并且完整的 ...
- php的基础知识(二)
7.系统常量: 常量的定义:常量是程序运行的时候是不可以改变的量 定义格式:define(‘常量名字’,‘常量的值’): 注意: ·不能重复定义 ·常量的名字最好用大写字母. ·常量的值只能是标量. ...
- python中的__all__
在定义一个模块的时候,在开头处加上 “ __all__ = ["xxx1", "xxx2"] ”(xxx可以是方法.类.变量等希望让外界访问的值),那么在外部通 ...
- python--基本类型之集合
set(集合): 定义和创建: 定义:集合是一个无序的,不重复的数据集合,它主要作用1:去重,把一个列表变成集合,就自动去重了2:关系测试,测试两组数据之间的交集,差集,并集等关系 集合:把不同的数据 ...
- 一 Hive安装及初体验
一 .Hive安装及初体验 1 .hive简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 1.1直接使用hadoop面临的问题 ...
- NSNull Crash处理 (NullSafe 的原理)
问题场景 后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串 (1)原始的json串:后端返回 ...
- Putty远程连接Ubuntu14.04
步骤一.在ubuntu系统中安装ssh,可使用如下的命令进行安装: sudo apt-get install openssh-server 步骤二.为了保险起见,安装完成后重启一下ssh服务,命令如下 ...