Mininet实战之Fattree拓扑创建和iperfmulti功能

本文介绍了如何使用Mininet搭建Fat-tree数据中心网络拓扑,并拓展iperf的multi功能。首先,文章阐述了数据中心网络研究的重要性,特别是Fat-tree架构在其中的角色。接着,详细展示了如何创建Fat-tree拓扑的Python脚本,包括核心、聚合和边缘层交换机的生成。此外,还讲解了如何修改Mininet源码以实现iperf_multi功能,该功能能随机选取主机对进行多对多的iperf UDP流量测试。最后,文章提到了实验过程中的学习体会,强调了团队协作和知识分享的价值。

        编者按:众所周知,数据中心是目前网络研究的一个热门领域。随着云计算的兴起与发展,会对数据中心网络提出更多的需求,也为学术研究提供了更多的课题。

本篇博文将讲述1)如何搭建fatree网络拓扑和2)如何在mininet中拓展iperfmulti功能。


    众所周知,数据中心是目前网络研究的一个热门领域。随着云计算的兴起与发展,会对数据中心网络提出更多的需求,也为学术研究提供了更多的课题。TETraffic Engineering)是网络研究中最基础的研究之一,在TELoad balance是比较主要的研究内容之一。 然而由于数据中心网络的流量走势与传统网络不同,导致数据中心网络与传统网络的架构有所不同。在传统网络中上下行流量在总流量中占据很大比重,而相比之下,数据中心的流量分类中,横向流量的比重要远远大于传统网络架构的比重。为了更好解决数据中心网络流量问题,数据中心架构的设计就变得非常重要,在众多网络架构中,Fat-tree架构是比较出名和成功的。

    SDN兴起于校园网,盛开于数据中心,这是一种比较准确的描述。目前SDN的研究领域内,数据中心占据了一席之地。所以很多的研究者都试图通过在控制器开发应用以及使用mininet模拟网络来进行网络实验。博主最近也做了一个关于Fat-tree的实验,在实验过程中,碰到了许多问题,深深觉得这一方面的知识在互联网中还比较缺乏。特此记录下来,分享出去,首先是作为自己的笔记,备忘,其次也给其他同样研究这方面的同学一些帮助。我掉过的坑,我不愿意别人继续掉。

    科学的发展是需要许多人奠定基础,才能逐步发展。而只有分享经验,传递知识,才能让后人能站在前人的基础之上继续前进。重复劳动力在一些基础的无关紧要的环节,是整个社会资源的浪费。特此感谢乐于分享的各种网络中的老师,特别是为人十分和蔼,温和,良师益友@地球-某某老师。

Fattree topo

    这个python文件最初的原型是参考了roan's Blog的博文SDN Lab 2$ Use Mininet create Fat Tree Topology中给出的代码。并在次基础上做了一些修改。在此感谢台湾的小伙伴的分享。

在此基础上我进行了修改,可点击fattree源码获取代码。

Fattree特征

    Fattree中,K是一个很重要的参数。如K=8,则core节点个数为(K/2)^2,pod个数为K,每一个PODK个交换机,每一个交换机有Kinter link(内部链路)。aggregation层有K^2/2=64/2=32个交换机,同理 edge也是K^2/2=32个交换机。host可以是K/2host,也可以任意指定。在我写的脚本中,Khost density都是可以设置的参数。

部分源码:

class Fattree(Topo):

    logger.debug("Class Fattree")

    CoreSwitchList = []

    AggSwitchList = []

    EdgeSwitchList = []

    HostList = []

    def&nbs

Mininet实现Fat-Tree拓扑结构,可以通过编写自定义的Python脚本完成。Fat-Tree是一种专为数据中心设计的网络拓扑结构,其特点在于具有良好的可扩展性带宽利用率。该拓扑通常分为三个层次:核心层(core)、汇聚层(aggregate)边缘层(edge),且每个层次中的交换机数量根据参数k来确定[^1]。 ### 实现步骤 #### 1. 定义Fat-Tree类 首先需要定义一个继承自`Topo`类的`FatTreeTopo`类,重写其构造方法以构建所需的网络结构。 ```python from mininet.topo import Topo class FatTreeTopo(Topo): def __init__(self, k=4): super(FatTreeTopo, self).__init__() # 核心交换机数量 core_switches = (k // 2) ** 2 # 每个pod内的汇聚交换机数 agg_switches_per_pod = k // 2 # 每个pod内的边缘交换机数 edge_switches_per_pod = k // 2 # pods的数量 pods = k # 主机数量 per pod hosts_per_edge = k // 2 # 创建核心交换机 self.core_switches = [self.addSwitch('c{}'.format(i+1)) for i in range(core_switches)] # 创建汇聚交换机边缘交换机连接到相应的pod for pod in range(pods): aggs = [self.addSwitch('a{}_{}'.format(pod+1, i+1)) for i in range(agg_switches_per_pod)] edges = [self.addSwitch('e{}_{}'.format(pod+1, i+1)) for i in range(edge_switches_per_pod)] # 连接汇聚交换机与核心交换机 for i, agg in enumerate(aggs): start_idx = i * (k // 2) end_idx = start_idx + (k // 2) for core_idx in range(start_idx, end_idx): self.addLink(agg, self.core_switches[core_idx]) # 连接边缘交换机与汇聚交换机 for edge in edges: for agg in aggs: self.addLink(edge, agg) # 添加主机连接到边缘交换机 for j, edge in enumerate(edges): for h in range(hosts_per_edge): host = self.addHost('h{}_{}_{}'.format(pod+1, j+1, h+1)) self.addLink(host, edge) ``` #### 2. 使用自定义拓扑启动Mininet 创建拓扑后,可以使用以下命令启动Mininet CLI: ```bash sudo mn --custom fattree.py,FatTreeTopo,k=4 --topo FatTreeTopo --controller remote ``` 这里假设你的脚本文件名为`fattree.py`,且你想要创建一个k=4的Fat-Tree拓扑。此外,`--controller remote`选项表示将使用远程控制器,比如Floodlight等[^2]。 #### 3. 配置控制器 确保已经正确配置了如Floodlight这样的SDN控制器,且它正在运行。然后,在Mininet启动时指定正确的IP地址端口来连接控制器。 ```bash sudo mn --custom fattree.py,FatTreeTopo,k=4 --topo FatTreeTopo --controller=remote,ip=<controller_ip>,port=6653 ``` 请替换`<controller_ip>`为你实际使用的控制器服务器的IP地址。 #### 4. 测试网络 一旦Mininet环境建立起来,你可以利用内置命令测试主机间的连通性,例如使用`pingall`检查所有主机是否能够互相通信。 ```bash mininet> pingall ``` 通过以上步骤,就可以成功地在Mininet实现一个基于给定参数k的Fat-Tree网络拓扑结构。这种设置非常适合进行关于数据中心网络的研究,尤其是针对流量工程、负载均衡等方面的研究[^3]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值