5.OpenFlow实现示例之中继器HUB

实验原理

OpenFlow的流表项主要由3部分组成,分别是用于数据分组匹配的分组头域(Head Field),用于保存与条目相关统计信息的计数器(Counter),还有匹配表项后需要对数据分组执行的动作表(Action)。分组头域是数据分组匹配流表项时参照的依据,作用上类似于传统交换机进行二层交换时匹配数据分组的MAC地址,路由器进行三层路由时匹配的IP地址。流表项中的计数器用来统计相关“流”的一些信息,例如查找次数、收发分组数、生存时间等。另外,OpenFlow针对每张表、每个流表项、每个端口、每个队列也都会维护它们相应的计数器。动作表指定了OpenFlow交换机处理相应“流”的行为。相比于传统网络设备对数据分组只能进行较为单一的转发操作,流表项根据指定动作字段来指导OF交换机如何处理“流”。动作表可以包含0个或多个动作,交换机会按照这些动作的先后顺序依次执行,如果其中不包含转发(Forward)动作的话,数据分组就会被丢弃掉,如果包含转发动作,数据分组会得到相应的转发处理,但是OpenFlow v1.0无法保证不同的数据分组的转发顺序。动作可以分为两种类型:必选动作(Required Action)和可选动作(Optional Action)。必选动作是默认支持的,而交换机需要通知控制器它支持的可选动作。另外,当流表项中存在OpenFlow交换机不支持的动作时将向控制器返回错误消息。在SDN网络中,控制器下发流表主要有两种模式,分别是reactive模式和proactive模式。

传统交换机参照MAC地址转发,路由器参照IP地址转发,通过定制ASIC芯片可以实现高速工作。而OpenFlow将网络协议栈扁平化,协议栈各层次对于转发设备而言不再具有明确的界限,各个网络字段都可作为流表中的匹配域,通过通配符掩码实现任意字段的组合。相比于传统网络,这种做法无疑大大提高了网络灵活性,但付出的代价是硬件设备为了适应这种通配的匹配方式,一般来说需要采用TCAM(Ternary Content Addressable Memory)来设计流表,但是TCAM的成本要高出很多,这就极大地限制了流表的规模,也就限制了SDN的规模。如果按照很多客户的要求,动辄要几十KB甚至上百KB的流表要求,至少需要20Mbit的TCAM,远远超过目前市场上容量最大的交换芯片的TCAM大小。为了克服TCAM表较小的问题,SDN先驱们提出采用reactive的方式来编写TCAM。
1.png
在reactive模式下,OpenFlow交换机接收到未知数据包时,会向控制器发送一条packet_in消息询问控制器如何处理该数据包。控制器接收到packet_in消息后,计算路径并发送一条flow_mod消息指示交换机如何处理该数据包。并且,当老化定时器超时后就可以删除与该数据包相关的流表项。如此一来,OpenFlow交换机无需维护全部流表,只有当未知数据包到达交换机时才会触发reactive模式,可以有效的节省TCAM的空间。但是reactive模式缺点就是交换机无法即时地处理未知数据包,需要依赖控制器的决策,虽然在一定程度上解决了TCAM较小带来的问题,但是也让SDN控制器成为系统扩展的瓶颈,随着网络规模的不断扩大,SDN控制器无法处理大规模的网络流量,SDN控制器的性能就会限制网络规模的扩展。

OpenFlow交换机和OpenFlow控制器之间的通道建立后,由OpenFlow控制器向OpenFlow交换机预先发送流表项方式称之为proactive模式。proactive模式的设置不是必须在控制器与交换机建立连接后立刻下发流表,可以在连接建立后的任意时间下发流表。proactive模式的主要特点是“主动”,控制器主动下发流表给交换机,随后交换机可以直接根据流表进行转发。proactive模式下控制器的压力会大大减轻,不过TCAM造成的局限性也尤为明显。

实验拓扑

拓扑.png

创建实验

步骤1 登录交换机,检查网络连通性。执行以下命令:

ovs-vsctl show

出现“is_connected: true”,表明控制器与交换机连接成功。

步骤2 登录主机,查看主机IP。

登录交换机,查看交换机mac地址。

ifconfig |more

根据实验拓扑图、交换机和主机的mac地址,可以判断出交换机eth1连接host1,eth2连接host2,eth3连接host3。

proactive模式

步骤1 Open Daylight控制器与交换机建立连接后,会自动下发初始流表。登录交换机使用下列命令查看初始流表。

ovs-ofctl dump-flows br-sw

如果没有的话重启一下交换机。
2.png
步骤2 登录控制器,在下方的“Application Finder”中搜索“postman”,并打开自带的Postman工具,如下图所示。
3.png
步骤3 获取交换机的id信息。打开Basic Auth页签,Username字段填写admin,Password字段填写admin完成认证。

提交方式为GET,URL地址栏中输入http://127.0.0.1:8080/restconf/operational/opendaylight-inventory:nodes。

步骤4 单击Send按钮,获取交换机id信息,如下图所示。
4.png
步骤5 下发一条流表。

选择提交方式“PUT”。

URL地址栏输入如下形式的地址:http://{controller-ip}:8080/restconf/config/opendaylight-inventory:nodes/node/{node-id}/table/{table-id}/flow/{flow-id}。

其中,{controller-ip}为控制器的ip地址,node-id为上面获取到的交换机id信息,table-id这里为0,flow-id根据下发不同流表变化,可自定义。本实验URL地址栏输入如下地址:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:143226243417414/table/0/flow/14。

填写Headers信息,如下图所示。
5.png
单击Body,Bady格式选择raw—>XML(application/xml)。Body内容如下所示:

匹配条件为ANY,actions为ALL,即将交换机收到的所有数据包转发到除入端口外的所有端口,从而实现中继器HUB的功能。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow xmlns="urn:opendaylight:flow:inventory">
    <priority>35</priority>
    <flow-name>SDN</flow-name>
    <idle-timeout>0</idle-timeout>
    <hard-timeout>0</hard-timeout>
    <match>ANY</match>
    <id>14</id>
    <table_id>0</table_id>
    <instructions>
        <instruction>
            <order>0</order>
            <apply-actions>
                <action>
                       <output-action>
                          <output-node-connector>ALL</output-node-connector>
                       </output-action>
                       <order>0</order>
                </action>
            </apply-actions>
        </instruction>
    </instructions>
</flow>

步骤6 单击Send按钮发送请求,STATUS显示请求发送成功,流表下发成功,如下图所示。
6.png
步骤7 登录交换机查看下发的流表,执行以下命令:

ovs-ofctl dump-flows br-sw

7.png
步骤8 登录主机host1,对主机host2进行ping操作,host2的IP为10.0.0.10,执行以下命令:

ping 10.0.0.10

8.png
步骤9 登录交换机用tcpdump捕获广播到host2和host3数据包。host2对应的端口是eth2,host3对应的端口是eth3,分别捕获这两个端口上的数据包。

(备注:选择不在host3、host2上抓包的原因是:由于当h1 ping h2时,数据包从交换机所有端口output出去后,openstack中的Linux-bridge会根据转发表过滤掉所有目的地址与端口不一致的数据包,因此host3上无法捕获host1与host2之间的数据包。)

tcpdump -i eth2

9.png

tcpdump -i eth3

10.png

reactive模式

reactive模式需要依赖SDN控制器的反应,实现较为复杂,在此仅进行方案介绍,不做实验操作,有兴趣的同学可自行拓展学习。

步骤1 reactive模式的触发机制就是交换机将接收到数据包转发给控制器,交换机转发数据包给控制器的情况有两种:一个是交换机接收到未知数据包;另一个就是流表action要求交换机将数据包转发给控制器。因此设置reactive模式的第一步是下发一条流表,priority设置为最高65535,匹配条件为ANY,actions是将数据包output到controller。
11.png
流表项设置好后,当host1发送数据包时,交换机接收到数据包后会发送packet_in消息给控制器。

步骤2 控制器接收到packet_in消息后对消息中的内容进行判断,计算分析后发送packet_out消息给交换机,告知交换机如何处理该数据包。本实验中控制器会要求交换机将数据包转发到除入端口外的所有端口,从而实验中继器的功能。
12.png