RYU构建FatTree拓扑(各主机之间能够ping通)

SDN第二次作业

要求

Create a Fat Tree (k=4) datacenter topology and test it, including:

(1) display all the nodes and links;

(2) let h1 ping h16 for 10 times;

(3) let each pair of host ping each other with pingall;

(4) test bandwidth with iperf.

Hand in a report in pdf or word format with screenshots, and the code for topology.

实验内容概述

本次实验内容主要分为四个步骤完成:

1. 完成拓扑的构建

2. 手动添加流表项

3. 对添加的流表项进行优化

4. 使用ovsbr交换机

内容

构建topo

首先我们需要在mininet中创建FatTree的拓扑。在这之前我们需要弄清FatTree拓扑的特点。其中k是FatTree中一个很重要的参数。k决定了FatTree中各类交换机和主机的数量。其中交换机分类三类,边界交换机(Edge),聚合交换机(Aggregation),核心交换机(Core)。同时每个FatTree中有k个pod。每个pod中有 个边界交换机和聚合交换机。每个边界交换机又和主机相连。每个聚合交换机和个核心交换机相连。因此,通过以上的分析可以得出各类交换机和主机的数量。其中边缘交换机(Edge)的数量为,聚合交换机的数量和边缘交换机的数量一致。核心交换机的数量为,主机的数量为 。然后我们可以观察各个交换机的之间的连接规律,便可以写出FatTree的拓扑结构。由于规律比较简单,这里就不再赘述,详情可以见代码。

 

 

值得注意的是,对于交换机的名字,不能太长,否则mininet在生成拓扑的时候会报错,还有就是如果有中文注释的话,因在代码开始时申明编码规则。代码最终产生的是一个dict,其中key是拓扑的名字,value是产生拓扑的函数。在使用mininet生成topo时,– topo后面的参数应和返回的key值一样,否则会报错。下面是拓扑中的nodes和连接。

图1 nodes

图2 links

主要过程

建立好拓扑之后开始后面的工作。刚开始直接使用命令:

图3 1_ping_16_1

然后我又试了Host1 ping Host2,因为这两个在一个交换机上,于是得到了下面的结果:

图4 1_ping_2

这个结果是出乎我的意料的,因为按照以前所学习的知识,一个交换机上所连的主机必然是可以相互通信的。通过查阅相关资料后了解到,出现这种情况的原因是交换机中没有流表。即交换机收到数据包之后不知道该怎么处理这个数据包。这就导致了同一个交换机上的主机都ping不通的现象。

在知道原因之后,开始想办法解决问题。其中最先想到的就是有没有什么方法能够让交换机自己获得流表。于是开始尝试使用pox控制器。因为这个是mininet镜像中自带的一个控制器。不需要再安装,也比较简单。在尝试了forwarding中所有提供的所有模块还是没法ping通后,遂放弃。于是开始尝试手动添加流表。手动添加流表时,因考虑到环路的问题。观察Fat Tree的拓扑可以发现。对于边缘交换机(Edge)和聚合交换机(Aggregation),凡是从端口3,4进入的,都应该从端口1,2出,这就可以有效的防止回路的产生。其次,对于核心层交换机,可以采用广播的方式,由于前面边缘交换机和聚合交换机的限制,即使采用广播也不会产生回路。设置流表的代码如下:

F:\QQ聊天记录and其他\2847218411\Image\Group\2]_BI1N21R(UU0QS1$Q3A(G.jpg 图5 Fat Tree拓扑及交换机端口分布

 

 

其中前四条指令对所有交换机起作用,后面几条只对响应的核心交换机起作用。

于是开始了pingall和iperf。得到了一下的结果:

图6 1_ping_16_2

从图中可以看出,虽然能ping通,但是收到了很多重复的包,虽然解决了回路的问题,但是并没有解决收到重复包的问题。出现这个问题的原因是边缘交换机和聚合交换机的转发数据时向核心交换机层转发了很多重复的包。

图7 pingall_1

从图中可以看出,所有的结点主机之间都是可以相互ping通。

图8 iperf_1

从图中可以看出,不同主机之间的带宽差距较大,并没有得到理想的结果。我觉得出现这一现象的主要原因时因为你链路中存在这大量的重复的包,导致了链路的利用率下降。

改进

F:\QQ聊天记录and其他\2847218411\Image\Group\2]_BI1N21R(UU0QS1$Q3A(G.jpg 出现上述问题的根本原因是核心交换机层,和聚合交换机层转发了很多重复的数据包。如何避免这个问题。就是采用新的流表。也就额是新的转发规则。

图9 Fat Tree topo, Switch port

其中,边缘交换机和聚合交换机的转发规则为:

in_port out_port
1 2,3
2 1,4
3,4 1,2

表1 转发规则

核心交换机依然采用广播的方式,保证各个pod之间的连通性。

于是有了一下命令:

//第二种方案

 

 

使用上述转发规则之后,得到以下结果:

图9 pinall_2

可以看到,各个主机之间都能ping通。

图10 1_ping_16_3

从上图中可以看出,本次ping并没有产生重复得包,得到了比较理想得结果。接下来看iperf测试。

图11 iperf_2

从上图所示结果可以看出,连接在同一个交换机,同一个pod,不同pod得主机之间得带宽并没有太大得差别,基本等同于连接在同一个交换机上得主机。这也得到了理想中得效果。

综上,采用了上述流表设置之后,链路中不会再出现重复包。同时由于各链路中不再有重复包,使得各个主机之间得带宽得到了很大得提升。至此,该实验已经可以告一段落了。

使用ovsdr交换机

在QQ群看到唐老师的方法后打算试一下能不能实现。于是在Ubuntu上安装了新版的Mininet.然后执行如下命令:

sudo mn –custom FatTerr.py –topo fattree –switch ovsdr,stp=1

然后执行pingall指令,得到如下结果:

图12 pingall_4

执行Host1 ping -c10 Host16得到如下结果:

图13 1_ping_16_3

执行iperf执行,测试不通主机之间的带宽得到如下结果:

图14 iperf_2

从图中可以看出,各个主机之间的带宽没有太大的差距。和手动添加流表表现差不多。

下面我们来查看一下各个交换机的流表:

图15 流表

可以看到,这个交换机的流表项与手动添加的存在较大的差距,每个交换机只有一条流表项。目前还没弄清楚他的工作原理。

图16 topo图

上图是根据dump,和links的输出产生的结果利用Mininet提供的工具http://demo.spear.narmox.com/app/?apiurl=demo#!/mininet 绘制的。

以上便是本次实验的全部内容。

Leave a Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注

本站所有文章均为原创,若需转载,请注明出处©twn29004 | 陕ICP备 20000896

总访问量:8667120    今日访问量:929    您是今天第:929 个访问者