SDN原理 OpenFlow协议 -3
问题4:流表匹配
OF1.1版本
这是OF1.1版本的操作,引入了多流表,1.0版本并没有多流表。
- 多流表的匹配称为 流水线处理:交换机从流表0开始查找,按照流表序号从小到大匹配。
- 每个包按照优先级去匹配流表中的表项,优先级高的先进行匹配;一旦匹配成功则刷新计数器和执行动作,倘若没有找到匹配的表项则转发给控制器。
OF1.3版本及之后版本 关键词:叠加执行
OF1.3版本的流表匹配相比OF1.1版本,改变了很多:
(1)当匹配到流表项的时候,首先更新计数器,然后查看指令集(之前有提过,指令是从动作层抽象出来的层次,便于管理动作),由指令决定动作是立即执行,或者是添加到地址集中;然后查看指令集中是否有 Goto-Table 选项,有的话继续查找下一个表,没有的话执行动作集中的动作。
(2)没有匹配到流表项的时候,查看表内是否有 Table-miss 选项,有的话也查看它的指令集,如果没有直接丢弃。
一个简单的流程:匹配到流表项 -> 看指令集,更新计数器 -> 动作马上执行/加入动作集 -> 查找下一个表/执行动作集;
没有匹配到流表项 -> 有没有 Table-miss 表项 -> 有,查看指令集,接下来和前面的内容类似 / 没有,丢弃。
- 1.3及之后的流表匹配,除了多流表操作之外,引入了 Table-miss 和 Action-set动作集 的处理。
- 之前的版本,当交换机没有匹配到流表项的时候,直接交给控制器处理;那么现在 Table-miss 用于解决 未匹配的流的转发和丢弃问题,通过 Table-miss 的参数,可以对数据流进行转发,丢弃,交给控制器的操作。
- 多流表操作中,每个表都有独立的指令,这些指令(执行动作)可以在查表的时候执行动作,也可以通过指令将动作添加到 Action-set 再叠加执行。
单表时,只有 Action 动作;多表环境中,多个 Action 累积成 action-set;决定 action-set 如何工作的,是表项的指令Instructions:指令可以将动作写入,添加修改到 Action-set 中,也可以直接在读表的时候进行。
至此,流表的问题结束了,那么···
问题来了,如何生成这些表?
传统网络中,在OSPF/BGP/RIP这些路由协议中,是通过分布式的交互来进行路由汇聚,生成表项的,这是动态路由。这是一种P2P架构(双方对等)。
那么,在SDN中,是由控制层的Controller控制器,直接下发流表。
交换机A,B,C,D将链路信息统一告诉Controller,Controller在执行完计算之后,统一下发流表给交换机。
这是一种 Client/Server 架构(C/S架构)。