Mininet实验 多个数据中心的拓扑网络实现

摘要:
实验任务创建了一个虚拟网络,其中包括泛光灯虚拟机和Mininet虚拟机。Mininet用于设计和模拟多数据中心网络,主要使用Mininet中的OpenFlow开关和泛光灯控制器进行测试,以帮助在真实数据中心和模拟试验台数据中心中提供有用的信息,以评估不同数据中心的网络应用性能。Mn启动mininet命令。

实验目的

  • 掌握多数据中心网络拓扑的构建
  • 掌握多数据中心数据交换过程

实验原理

主机间发送消息上报给交换机,交换机对收到的报文信息进行分析判断,如果交换机中存在此消息相对应的流表,则交换机直接下发流表,将报文消息转发给目的主机;如果交换机中没有相对应的流表,交换机将此发送消息给控制器,控制器根据消息分析关键字段内容,进行流表下发决策,交换机再将消息发送给目的主机,实现主机间通信的目的。


实验任务

创建一个虚拟网络,虚网中包括一台floodlight虚拟机和Mininet虚拟机,使用Mininet设计模拟一个多数据中心网络,主要是用Mininet中的OpenFlow交换机和floodlight控制器进行测试,帮助在真实数据中心和仿真测试床数据中心提供有用的信息评估不同数据中心的网络应用性能。

一个简单的基于两个数据中心的网络拓扑,如下图所示:

Mininet实验 多个数据中心的拓扑网络实现第1张

图中c1和c2为核心交换机,a1-a4为聚合交换机,e1-e4为边缘交换机,h1-h8为主机。本实验主要测试及验证交换机下挂主机间的连通性以及主机间通信收发数据包的速度。Mininet中自带的iperf性能测试工具可以测试不同主机间通信的性能带宽质量,在此例中,主要是对相同边缘交换机下的主机间、相同聚合交换机下不同边缘交换机间、相同核心交换机不同聚合交换机下的主机间进行测试。


实验内容

启动Floodlight

之前已经安装过floodlight,是通过java来启动。

1 java -jar targer/floodlight.jar

然后终端会出现一大堆的信息,然后打开浏览器,输入http://localhost:8080/ui/index.html(这里我在本地,依然localhost使用127.0.0.1) 得到下图:

Mininet实验 多个数据中心的拓扑网络实现第2张

创建数据中心

在mininet目录中,创建一个fattree.py的测试脚本,

关于fattree(胖树拓扑结构)

该拓扑网络分为三个层次:如之前的图,自下而上分别为边缘层(edge),汇聚层(aggregate)以及核心层(core),其中汇聚层交换机与边缘层交换机构成一个pod(一种数据结构)。该实验的fattree拓扑为一个二叉胖树。

mininet脚本

 1 #!/usr/bin/python
 2 # 创建网络拓扑
 3 """Custom topology example
 4 Adding the 'topos' dict with a key/value pair to generate our newly defined
 5 topology enables one to pass in '--topo=mytopo' from the command line.
 6 """
 7 
 8 from mininet.topo import Topo
 9 from mininet.net import Mininet
10 from mininet.node import RemoteController, CPULimitedHost
11 from mininet.link import TCLink
12 from mininet.util import dumpNodeConnections
13 
14 
15 class MyTopo(Topo):
16     "Simple topology example."
17 
18     def __init__(self):
19         "Create custom topo."
20 
21         # Initialize topology
22         Topo.__init__(self)
23         L1 = 2
24         L2 = L1 * 2
25         L3 = L2
26         c = []
27         a = []
28         e = []
29 
30         # add core ovs  
31         for i in range(L1):
32             sw = self.addSwitch('c{}'.format(i + 1))
33             c.append(sw)
34 
35         # add aggregation ovs
36         for i in range(L2):
37             sw = self.addSwitch('a{}'.format(L1 + i + 1))
38             a.append(sw)
39 
40         # add edge ovs
41         for i in range(L3):
42             sw = self.addSwitch('e{}'.format(L1 + L2 + i + 1))
43             e.append(sw)
44 
45         # add links between core and aggregation ovs
46         for i in range(L1):
47             sw1 = c[i]
48             for sw2 in a[i // 2::L1 // 2]:
49                 self.addLink(sw2, sw1)
50 
51         # add links between aggregation and edge ovs
52         for i in range(0, L2, 2):
53             for sw1 in a[i:i + 2]:
54                 for sw2 in e[i:i + 2]:
55                     self.addLink(sw2, sw1)
56 
57         # add hosts and its links with edge ovs
58         count = 1
59         for sw1 in e:
60             for i in range(2):
61                 host = self.addHost('h{}'.format(count))
62                 self.addLink(sw1, host)
63                 count += 1
64 
65 topos = {'mytopo': (lambda: MyTopo())}

原sdnlab上的代码有一些问题,首先先调整好原本代码的tab缩进的问题。原sdnlab上的代码运行完会报错:

Mininet实验 多个数据中心的拓扑网络实现第3张

对于该问题,是由于使用python进行矩阵操作,分片操作时候,内部含有除法,产生错误。例如:

1 for sw2 in a[i / 2::L1 / 2]:

利用/自动产生的类型是浮点型,会出现上述的错误,将/改成//就可以解决问题。

1 for sw2 in a[i // 2::L1 // 2]:

修改完脚本问题之后用命令:

1 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指定加载拓扑的名字

Mininet实验 多个数据中心的拓扑网络实现第4张

连通性以及通信带宽测试

1.测试同一交换机内部主机间的宽带

Mininet实验 多个数据中心的拓扑网络实现第5张

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

Mininet实验 多个数据中心的拓扑网络实现第6张

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

Mininet实验 多个数据中心的拓扑网络实现第7张

4.测试所有主机的连通性验证和宽带测试

添加下列代码进脚本 

 1 #在开头补充
 2 from mininet.log import setLogLevel
 3 #测试连通性代码部分
 4 def simpleTest():
 5     "Create and test a simple network"
 6     topo = MyTopo()
 7     net = Mininet( topo, controller=None, host=CPULimitedHost, link=TCLink )
 8     net.addController( 'c0', controller=RemoteController, ip='127.0.0.1', port=6633 )
 9     net.start()
10     print ("Dumping host connections")
11     dumpNodeConnections(net.hosts )
12     print ("Testing network connectivity")
13     net.pingAll()
14     print ("Testing bandwidth between h1 with h2, h3, h5")
15     h1, h2 = net.get( 'h1', 'h2' )
16     net.iperf( ( h1, h2 ) )
17     h1, h3 = net.get( 'h1', 'h3' )
18     net.iperf( ( h1, h3 ) )
19     h1, h5 = net.get( 'h1', 'h5' )
20     net.iperf( ( h1, h5 ) )
21     net.stop()
22  
23 if __name__ == '__main__':
24     # Tellmininet to print useful information
25     setLogLevel( 'info' )
26     simpleTest()

在floodlight web页面中查看网络拓扑信息

Mininet实验 多个数据中心的拓扑网络实现第8张

Mininet实验 多个数据中心的拓扑网络实现第9张

免责声明:文章转载自《Mininet实验 多个数据中心的拓扑网络实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue pc端支付宝支付md5sum 和 sha256sum用于 验证软件完整性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WireX:Android智能手机组成的DDoS僵尸网络

阿里聚安全小编曾多次报道了官方应用市场出现恶意软件的事件,让大家在下载APP的时候三思而后行。 最近多家安全公司组成的安全研究小组发现了一个新的、传播广泛的僵尸网络,它是由成千上万的Android智能手机组成。 该僵尸网络名为WireX,被杀毒工具检测识别为“Android Clicker”,主要包括运行从谷歌Play商城下载的数百个恶意软件的Andro...

围观微博网友发起的美胸比赛学习爬取微博评论内容

网友:看看胸女:滚 网友:美胸比赛女:[图片消息] ​​​​ 继上次知乎话题 拥有一副好身材是怎样的体验? 解析了知乎回答内容之后,这次我们来解析一下微博内容,以微博网友发起的美胸大赛为例: https://m.weibo.cn/detail/4367970740108457 https://m.weibo.cn/detail/434802252095...

Akka源码分析-Remote-收消息

上一遍博客中,我们分析了网络链接建立的过程,一旦建立就可以正常的收发消息了。发送消息的细节不再分析,因为对于本地的actor来说这个过程相对简单,它只是创立链接然后给指定的netty网路服务发送消息就好了。接收消息就比较麻烦了,因为这对于actor来说是透明的,netty收到消息后如何把消息分发给指定的actor呢?这个分发的过程值得研究研究。 之前分析过...

Win32编程day01 学习笔记

Win32 Windows编程  1 Windows编程基础 2 Windows文字的编码 3 窗口程序 4 窗口消息 5 菜单和加速键 6 绘图 7 对话框 8 基本控件  ..... 一 Windows编程基础  1 Win32应用程序的基本类型    1.1 控制台程序      不需要完善的Windows窗口,可以使用DOS窗口      的方式显...

ELK+Kafka 企业日志收集平台(一)

背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项;所以最近将Redis换成了专业的消息信息发布订阅系统Kafka, Kafka的更多介绍大家可以看这里:传送门  ,关于ELK的知识网上有很多的哦, 此篇博客主要是总结一下目前线...

wpf mvvm模式下 在ViewModel关闭view

本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息   1 public UserView() 2 { 3 this.DataContext = new UserViewModel(); 4 InitializeComponent();...