OpenFlow:简述对OpenFlow协议的认识
OpenFlow:简述OpenFlow协议的演进
OpenFlow:简述对OpenFlow协议1.0的认识
OpenFlow:简述对OpenFlow协议1.3的认识
OpenFlow1.3和 OpenFlow1.0的区别较大,也是当前商业上广泛使用的 Open Flow版本之一。
OpenFlow1.3增如了多级流表(流水线结构)、组表、度量(Meter,此结构体主要用来做流量,定义转发的性能), 修改了数据包特征匹配的描述方法(main方法,更具拓展性),还增加了数据包处理的动作类型,加强了多控制器的支持,提供更安全的连接和辅助连接。
Open Flow1.3交换机的主要组件主要由一到多个流表、一个组表、一个连接到外部控制器的Open Flow通道组成。流表和组表执行数据包查找和转发功能。
一、流表(FlowTable)
每个流表包含一个流表项的集合。每个流表项由一个匹配域、一个计数器、一个待作用到匹配的数据包的指令( Instructions)集、一个超时时间、一个 cookie组成。一个流表项的结构如下所示:
Open Flow1.3的流表与 Open Flow1.0的流表最大的不同是原来的行为( Actions)变成了指令( Instructions),可以在流表之间进行跳转。
1.1 匹配
Open Flow1.0定义了12个匹配的元组,Open Flow1.3定义了40个匹配的元组。但并非Open Flow1.3的匹配全部需要包含这40个元组,只需要包含必备的13个元组(进入端口,以太网源地址、以太网目标地址、以太网类型、IP协议<IPV6或ⅣP4>、IPV4源地址、IPV4目标地址、IPV6源地址、IPV6目标地址、TCP源端口地址、TCP目标端口地址、UDP源端口地址、UDP目标端口地址),再加入其他所需的可选匹配元组即可。 Open Flow13的匹配域是变长的。
1.2 指今( Instructions)
一个指令要么修改流水处理(如将数据包指向另一个流表),要么包含一个待加入操作集( Action Set)的操作集合,要么包含一个立即在数据包上生效的操作列表。其中操作集( Action Set)与数据包相关的操作集合在报文被每个表处理的时候可以累加,在指令集指导报文退出处理流水线的时候这些行动会被执行.
当报文匹配上流表项时,执行表项包含的指令集。指令集类型如下所示:
指令 | 说明 | 可选/必选 |
---|---|---|
Write-Action | 添加指定动作到动作集 | 必选 |
GoTo-Table | 转到另一个流表处理 | 必选 |
Meter | 指示报文关联指定的Meter流表项 | 可选 |
Apply-Actions | 应用动作列表中的动作 | 可选 |
Clear-Actions | 清空动作集 | 可选 |
Write-Metadata | 写入元数据 | 可选 |
当流表项的指令集中不包含GoTo-Table时,立即执行相关联的动作集。动作集类型如下所示:
动作类型 | 说明 | 可选/必选 |
---|---|---|
Output | 将报文转发到特性的OpenFlow端口 | 必选 |
Drop | 满足条件时丢弃 | 必选 |
Group | 将报文转交组表处理,动作由组表类型定义 | 必选 |
Set-Queue | 将报文指定队列ID,用于实施QOS | 可选 |
Push-Tag/Pop-Tag | 适用于对VLAN头,MPLS头,PBB头进行操作 | 可选 |
Set-Field | 识别匹配字段类型并修改字段的值 | 可选 |
Change-TTL | 修改IPV4,IPV6,MPLS中的TTL | 可选 |
二、组表(GroupTable)
组表( Group Table)是一个行为桶的列表和选择其中一个或多个桶以应用到一个包基础上的方法。一个流表项的结构如下图所示:
其中组类型包括以下几项。
- indirect:只包含一个 Action列表的组表,转发效率更高,可以用于路由聚合。
- all:执行 action buckets中的所有动作,可以用于组播。
- select:随机执行 action buckets中的一个动作,可以用于多径传播。
- fast failover:如两端点间有N条路径,可写入 action buckets,之后随机选择其中一条路径。
三、计量表(MeterTable)
Open Flow1.3还包括一个计量表( Meter Table),用以定义 Open Flow交换机对数据包转发的性能参数,能起限速的作用。计量表的结构如下图所示:
其中Meter带(Meter Band)的结构如下图所示:
与 Open Flow1.0计数器相比, Open Flow13计数器有了扩展,特别是增加了很多可选项目。OpenFlow13计数器如下表所示:
计数器1【每一流表】 | 位(比特) | 必选或可选 |
---|---|---|
Reference Count(Active Entries) | 32 | 必选 |
Packet Lookups | 64 | 可选 |
Packet Matches | 64 | 可选 |
计数器2【每一流表项flow】 | 位(比特) | 必选或可选 |
---|---|---|
Received Packets | 64 | 可选 |
Received Bytes | 64 | 可选 |
Duration(Seconds) | 32 | 必选 |
Duration(NanoSeconds) | 32 | 可选 |
计数器3【每一端口】 | 位(比特) | 必选或可选 |
---|---|---|
Collisions | 64 | 可选 |
Received Packets | 64 | 必选 |
Received Bytes | 64 | 可选 |
Received Drops | 64 | 可选 |
Received Errors | 64 | 可选 |
Transmit Packets | 64 | 必选 |
Transmit Bytes | 64 | 可选 |
Transmit Drops | 64 | 可选 |
Transmit Errors | 64 | 可选 |
Receive CRC Errors | 64 | 可选 |
Receive Overrun Errors | 64 | 可选 |
Receive Frame Alignment Errors | 64 | 可选 |
Duration(Seconds) | 32 | 必选 |
Duration(NanoSeconds) | 32 | 可选 |
计数器4【每一队列】 | 位(比特) | 必选或可选 |
---|---|---|
Transmit Packets | 64 | 必选 |
Transmit Bytes | 64 | 可选 |
Transmit Overrun Errors | 64 | 可选 |
Duration(Seconds) | 32 | 必选 |
Duration(NanoSeconds) | 32 | 可选 |
计数器5【每一组】 | 位(比特) | 必选或可选 |
---|---|---|
Reference Count(Active Entries) | 32 | 可选 |
Packet Count | 64 | 可选 |
Byte Count | 64 | 可选 |
Duration(Seconds) | 32 | 必选 |
Duration(NanoSeconds) | 32 | 可选 |
计数器6【每一组桶(Group Bucket)】 | 位(比特) | 必选或可选 |
---|---|---|
Packet Count | 64 | 可选 |
Byte Count | 64 | 可选 |
计数器7【每一计量】 | 位(比特) | 必选或可选 |
---|---|---|
Flow Count | 32 | 可选 |
Input Packet Count | 64 | 可选 |
Input Byte Count | 64 | 可选 |
Duration(Seconds) | 32 | 必选 |
Duration(NanoSeconds) | 32 | 可选 |
计数器8【每一计量带(Meter Band)】 | 位(比特) | 必选或可选 |
---|---|---|
In Band Packet Count | 64 | 可选 |
In Band Byte Count | 64 | 可选 |
四、Open FLow1.3流表的流水线处理
Open Flow1.3交换机接收到一个数据包后,以流水线的方式匹配多个流表。交换机将匹配域从数据包中提取出来,之后交换机从第一个流表开始查询可匹配的流表项,依次处理至最后一个流表。流表之间是可以跳转的(根据流表项的指定跳转),流表项的匹配过程与 Open Flow1.0类似,每一个流表必须支持能处理 table-miss的流表项。 table-miss表项指定在流表中如何处理与其他流表项未匹配的数据包,比如数据包发送到控制器,丢弃数据包或直接将包扔到后续的表。
流表中的处理可以分成三步:
- 找到最高优先级匹配的流表项。
- 应用指令:
①修改数据包并更新匹配域(应用操作指令)。
②更新操作集(清除操作和或写入操作指令)。
③更新元数据。 - 将匹配数据和操作集发送到下一个流表。
五、Open FLow1.3流表的匹配
Open Flow1.3流表的匹配流程与 OpenFlow1.0相比,数据包进入交换机增加一个需要匹配的信息:一个一层的输入端口 In_Port、数据包头(二层、三层、四层的信息)、元数据(64比特的数据,在流表协议转换的时候携带控制器自定义的一些额外的信息)。