前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件定义网络协议:OpenFlow SDN 协议标准

软件定义网络协议:OpenFlow SDN 协议标准

作者头像
通信行业搬砖工
发布2023-09-06 14:04:58
5910
发布2023-09-06 14:04:58
举报
文章被收录于专栏:网络虚拟化

OpenFlow SDN 协议发展历程

OpenFlow 是一种 SDN 协议,全称为 OpenFlow Switch Specification,由 ONF(Open Networking Foundation,开放网络基金会)组织开发和维护。

  • ONF 官方网站:https://www.opennetworking.org

OpenFlow 协议的发展演进一直都围绕着 2 个核心方面:

  1. 控制面增强:让 SDN Controller 的功能更丰富、更灵活。
  2. 数据面增强:让 OpenFlow Switch 可以匹配更多的数据包字段、执行更多的动作、以及更高效的匹配策略。

每一个后续的 OpenFlow 协议版本都在前一版本的基础上进行了或多或少的改进,下面是 OpenFlow 协议发展历程的概要。

OpenFlow v1.0(2009 年 12 月发布)

规定了每个 OpenFlow Switch 中都存在一张 Flow Table,用于对数据包执行匹配、处理和转发。一张 Flow Table 由多个 Flow Entries 组成,每个 Flow Entry 就是一个转发规则,由 Header Domain(包头域)、Action(动作)和 Counter(计数器)组成。并且只能与同一个 Controller 控制器进行通信,负责 Flow Entries 的维护。

  • 支持匹配数据包的 srcMAC、dstMAC、srcIP、dstIP、TCP/UDP Port 等字段。
  • 支持基于 Flow Classify(流量分类)的 Flow Table,每个 Flow Table 可以包含多个 Flow Entries(流表项)。
  • 支持 Action Set(动作集),包括:转发,丢弃,修改数据包头部等。
  • 支持有限的 Statistic(统计信息),如:每个 Flow 的数据包计数和字节数。

OpenFlow v1.1(2011 年 2 月发布)

规定了每一台 OpenFlow Switch 能够拥有 Multi-level Flow Tables(多级流表),最多 256 级,可以将 Flow Table Matching(流表匹配过程)分解成多个 Steps(步骤),形成 Multi Table Pipeline(多表流水线)处理方式。以此更好地应用了交换机 ASIC 转发芯片的多表特性,同时也避免了 Single Table 过度膨胀的问题。

  • 支持匹配数据包的 VLAN ID,IPv4 DSCP(QoS),MPLS Label(标签)等字段。
  • 支持 Multi Table Pipeline(多表流水线),可以被组织成多个 Multi-level Flow Tables,每个 Table 执行特定的功能。
  • 支持 Group Table(组表),用于将多个 Flow Entries 组成一个 Logical Group(逻辑组),并对同一个 Group 内的数据包应用相同的 Action,简化了流表的维护。
  • 支持更多的 Statistic,如:每个 Flow 的延迟,丢包率等。

OpenFlow v1.2(2011 年 12 月发布)

Controller 和 Switch 之间采用新的 TLV(Type-Length-Value)Flow Rule(流规则)数据编码格式来替代了原有的固定长度格式,称为 OXM(OpenFlow Extensible Match)。TLV 将要传输的数据分为 3 部分:

  1. Type:指定数据的类型。
  2. Length:指定数据的长度。
  3. Value:指定数据的实际内容,其长度由 Length 指定。

通过 TLV 编码格式,Controller 可以更灵活的下发 Flow Rule,支持一次性下发更多的数据包匹配字段。另外,OpenFlow v1.2 支持多个 Controller 对同一台 Switch 进行连接和管理,增强了控制面的可靠性。

  • 支持匹配数据包的 IPv6 和 IPv6 Flow Label(流标签)协议。
  • 支持 Metadata Table,可以在 Flow Table 匹配时附加额外的信息。
  • 支持 IP 子网聚合,可以将多个 NETMASK 小的 Subnets 合并成一个 NETMASK 更大的 Subnet,并在匹配时使用。
  • 支持可编程的隧道,可以在数据平面中创建和管理隧道。

OpenFlow v1.3(2012 年 6 月发布)

OpenFlow v1.3 是一个 ONF 长期支持的稳定版本,支持的 Flow Entry Matching Fields 已经增加到 40 个,足以满足大部分网络应用的需要。该版本的发布也标志着 OpenFlow 开始在实际网络环境中得到广泛的应用。

  • 支持匹配数据包的 IPv6 Extend Header(扩展头部)协议。
  • 支持 Meter Table(计量表),用于控制建立关联的 Flow Table 的数据包的传送速率和流量计量。
  • 支持 Flow Priority(流优先级),可以为 Flow Entry 指定 Priority 数值。
  • 支持流迁移,可以在交换机之间移动流,将一个流从一个交换机移动到另一个交换机,而不是将流重定向到控制器。

OpenFlow v1.4(2013 年 4 月发布)

OpenFlow v1.4 在数据面没有太大的变化,主要是增加了一种 Flow Table 同步机制,多个 Flow Tables 可以共享相同的 Matching Fields(匹配字段),同时又可以定义不同的 Action。

  • 支持匹配数据包的 ICMPv6 和 SCTP 协议字段。
  • 支持 Multi-Path(多路径流),可以将一个流分成多个子流,并在不同的路径上传输。
  • 支持对数据包执行多个 Action。
  • 支持对多个 Meter Table 进行归一化(叠加),使得多个 Meter Tables 的计量单位相同。

OpenFlow v1.5(2014 年 8 月发布)

  • 支持匹配数据包的 IPv6 ND 和 ARP 协议字段。
  • 支持多级流分类(多级流水线处理),可以将流分类成多个级别,并为每个级别指定不同的流表。
  • 支持动态改变 Flow Table 的 Size(大小),允许动态添加或删除 Flow Entries。
  • 支持虚拟化,允许多个虚拟网络共享同一个物理网络。

OpenFlow v1.6(2016 年 4 月发布)

  • 支持匹配数据包的 GRE 协议字段。
  • 支持可编程的数据平面,允许在数据平面上执行自定义的计算和转发逻辑。
  • 支持对控制器的访问控制,可以限制哪些控制器可以连接到交换机。
  • 支持流复制,可以将一个流复制到多个目的地。

OpenFlow v1.7(2017 年 3 月发布)

  • 支持匹配数据包的 IPv6 FRAG 和 TCP flags 字段。
  • 支持混合表,可以在同一流表中混合匹配域和动作。
  • 支持移动节点的 IP 地址,可以在节点漫游时自动更新其 IP 地址。
  • 支持对控制器的流量控制,可以限制控制器接收的流量大小。
  • 支持对控制器的访问控制,可以限制哪些控制器可以连接到交换机。

OpenFlow v1.8(2017 年 11 月发布)

  • 支持匹配数据包的 PBB 标签。
  • 支持数据平面交换机间的多路径协调,以便实现负载平衡和高可用性。
  • 支持控制平面的网络拓扑发现和状态感知功能。
  • 支持对控制器的负载平衡和故障转移,以便实现高可用性。
  • 支持对数据平面的安全性和可靠性进行评估和控制。

实际上,在 OpenFlow v1.5 以后,OpenFlow 协议的发展就陷入缓慢。因为,OpenFlow 在实践后证实存在一些显著的限制和局限性,例如:只能覆盖有限的网络功能、需要依赖硬件支持等等。使得 ONF 开始考虑更加灵活、且硬件可编程的数据平面替代方案,例如 P4、eBPF 等。

所以,尽管 OpenFlow v1.5 后仍有一些更新和改进,但它已经不是当前网络编程和网络创新的唯一选择。但退一步说,作为 SDN 开发从业者,对 OpenFlow 仍然是必备的一种基本技能。

OpenFlow v1.5.1 标准

本文以 OpenFlow v1.5.1 为基础展开。

  • v1.5.1 规范:https://opennetworking.org/wp-content/uploads/2014/10/openflow-switch-v1.5.1.pdf

主要关注 OpenFlow 的 7 大部分:

  1. OpenFlow Switch 系统架构
  2. OpenFlow Port 类型
  3. OpenFlow Flow Table 定义
  4. OpenFlow Group Table 定义
  5. OpenFlow Meter Table 定义
  6. OpenFlow Cannel
  7. OpenFlow 协议消息类型

OpenFlow Switch 系统架构

  • OpenFlow Controller:SDN 网络将传统的网络结构划分成了 Control Plane 和 Data Plane 两部分,OpenFlow Controller 属于 Control Plane 部分,通过约定的 OpenFlow 协议来远程管理 OpenFlow Switch,包括:增加、删除、修改 Switch 中的 Flow Tables 和 Flow Entries。
  • OpenFlow Switch:实现了 OpenFlow Protocol 的软/硬件交换机。基于多个 Flow Tables 和一个 Group Table 转发数据包,通过 OpenFlow Channel 与 OpenFlow Controller 进行通信。OpenFlow Switch 也可以将数据包转发至 Controller,由 Controller 来判断如何处理数据包。有以下 2 种类型:
    1. OpenFlow-only Switch(纯粹的 OpenFlow Switch):所有的网络包只能通过 OpenFlow Pipeline 的处理。
    2. OpenFlow-hybrid Switch(混合型的 OpenFlow Switch):同时支持传统网络协议栈和 OpenFlow Pipeline 的交换机。
  • OpenFlow Channel:OpenFlow Switch 对外开放的接口,接受来自于 Remote Controller 的通信协议,进而来操纵 OpenFlow Switch。
  • OpenFlow Protocol:一种通信协议规范,用于 Remote Controller 和 OpenFlow Switch 之间的消息交换。
  • Flow Table:包含多个 Flow Entry 记录,控制数据包的流向。
  • Group Table:相对于 Flow Table,控制着数据包更高级的转发特性,比如:Flooding、Multi-Path、Fast Reroute、Link Aggregation 等。
  • Meter Table:对匹配 Flow Entry 的数据包执行 QoS 和计量策略。
  • Pipeline:由多个 Flow Table 链接而成,控制数据包的一系列行为。

OpenFlow Port 类型

一台 OpenFlow Switch 最多可以配置 65280 个 Ports,如下图可分为 3 大类型:

  1. 物理端口(Physical Ports):即物理设备上可见的端口。
  2. 逻辑端口(Logical Ports):在物理端口基础上抽象出来的逻辑端口,例如:Tunnel Port 或 Link Aggregation Port 等逻辑端口。
  3. 预留端口(Reserved Ports):属于 OpenFlow 自定义的预留端口,用于执行一些特殊的动作,例如:广播。
  • 其中 Reserved Ports 又可细分为 8 种类型,如下图。其中后 3 种为 Optional(非必需)类型,只在 OpenFlow-hybrid Switch 中有效。
  • OpenFlow 通过 16bits 来标记这 8 个自定义端口类型,如下图。

OpenFlow Flow Table 定义

Multi-level Flow Tables

从 OpenFlow v1.1 开始,每一台 OpenFlow Switch 能够拥有 Multi-level Flow Tables(多级流表),最多 256 级,从 0 依次编号排列。

Multi-level Flow Tables 可以将 Flow Table Matching(流表匹配过程)分解成多个 Steps(步骤),形成 Multi Table Pipeline(多表流水线)处理方式。以此更好地应用了交换机 ASIC 转发芯片的多表特性,同时也避免了 Single Table 过度膨胀的问题。

Flow Entries

Flow Table 用于对数据包执行匹配、处理和转发。一张 Flow Table 由多个 Flow Entries 组成,每个 Flow Entry 就是一个转发规则,由 Match Domain(匹配域)、Action(动作)和 Counter(计数器)组成。

OpenFlow Controller 与 OpenFlow Switch 交换 Flow Entry 具有 2 种模式:

  1. Proactive(预先发送模式):Controller 预先以 Packet-out Msg Type 向 Switch 发送 Entries。
  2. Reactive(滞后反应模式):当 Switch 接收到未知数据包(没有匹配到任何 Entries)时,以 Packet-In Msg Type 将数据包转发至 Controller,交由 Controller 作出判断。

更具体的一条 Flow Entry 由以下部分组成:

  • MatchFields(匹配字段):指定要 Switch 匹配数据包的字段。
  • Preority(匹配优先级):0 表示最低优先级,Switch 依据优先级从大到小匹配 Entries。
  • Counters(计数器):用于统计匹配该 Entry 的数据包数量和字节数。
  • Instructions(执行指令):匹配 Entry 后,需要执行的指令集。
    • apply-actions {actions}:直接执行 Actions,而不是放到 Action Set 中最后再执行。
    • clear-actions:清空 Action Set。
    • write-actions {actions}:将 Actions 添加到 Action Set 中。
    • write-metadata {metadata/mask}:将使用掩码处理的 Metadata 写入 Metadata field 中。
    • goto-table {next-table-id}:跳至指定的 Flow Table 来处理数据包。
  • Timeout(超时时间):指定 Entry 的老化时间,具体有 2 个 Timeout:
    • hard_timeout(硬超时):Entry 从添加开始持续了该时间后,移除。
    • idle_timeout(空闲超时):Entry 从最后一次匹配后持续了该时间后,移除。
  • Cookie:Controller 用于标识和区分一个 Entry,由 Controller 来设定,Switch 不使用该值。
  • Flags(标记):指定管理 Entry 的行为。

在这里插入图片描述

MatchFields

下图中列出了部分 MatchFields,更详细的请查阅标准文档。

Actions

Action Set 中的主要 Actions 包括:

  • output {port_no}:将数据包转发到指定的 Port。
  • drop:直接丢弃数据包。
  • set-field {field_type} {value}:修改数据包头。
  • push-tag / pop-tag {ether_type}:添加 / 去除以太网协议类型。
  • group {group_id}:使用 Group Table 中指定的 Entry 来处理数据包。
  • 等。

其中,set-field Action 具有以下类型:

Examples

每一条 Flow Entry 的 MatchFields 中可以根据数据包的 L2、L3、L4 等 Header 中的任意字段进行匹配。

  • Layer 1:Tunnel ID、In Port、QoS Priority、skb mark 等。
  • Layer 2:MAC Address、VLAN ID、Ethernet type 等。
  • Layer 3:IPv4/IPv6 fields、ARP 等。
  • Layer 4:TCP/UDP、ICMP、ND 等。

Popeline Processing

OpenFlow Popeline Processing 是 OpenFlow Switch 最终实现的数据包处理方式。

当数据包进入 OpenFlow Switch 后,必须从 Flow Table 0 开始依次匹配。同一个 Flow Table 中的 Entires 根据各自的 Priority 数值进行先后匹配。当数据包成功匹配了某一条 Flow Entry 之后,首先更新该 Entry 的 Counter(计数器),记录成功匹配数据包总数和总字节数,然后执行相应的 Instructions/Actions,例如:跳转至编号更大的某一个 Flow Table 继续处理、或者修改数据包、或者至某一个端口、或者直接丢弃等。

如果数据包在一个 Flow Table 中匹配失败了,且 Flow Table 存在 Table-miss Entry(无匹配流表项),那么就按照该 Entry 执行指令。通常是将数据转发给 Controller、Drop 或前往下一个 Flow Table 继续匹配。如果没有 Table-miss Entry 则默认丢弃。

注意,Entry 可以使用 goto 语句按次序从小到大越级跳转,但不能倒序跳转。

更进一步的 Popeline Processing 细分为 Ingress Processing 和 Egress Processing,分别对应收包和发包的处理流程。

一个完整的 Popeline Processing 如下图所示:

OpenFlow Group Table 定义

每个 OpenFlow Switch 除了拥有多个 Flow Tables 之外,还具有一个 Group Table,可以在不同的 Flow Entries 中通过 group {group_entry_id} Action 来关联 Group Entry,实现对数据包执行相同的动作。以此简化了流表的维护。例如:当多个 Flow Entries 处理相同时,可以指向同一个 Group Entry,这样修改这些 Flows 的处理逻辑时,就只需要修改一次 Group Entry 即可。

一条 Group Entry 有以下部分组成:

  • Group Indentifier:唯一标识。
  • Group Type(类型):决定如何处理数据包。
  • Counters(计数器):用于统计。
  • Action Buckets:一个有序的 Action Bucket Set,每个 Action Bucket 就是一个 Action Set,又包含多个 Action 及其参数。以便在一次性执行多个动作。

在这里插入图片描述

其中,最关键的是 Group Type 字段,控制了数据包的处理方式,具有以下 4 个类型:

  1. all(全部):该类型中的数据包都会执行 Action Buckets 中的动作,常用于多播和广播。
  2. select(选择):据算法进行选择执行某一个 Action Bucket,常用于负载均衡功能实现。
  3. indirect(间接):强制指定执行某一个 Action Bucket。
  4. fast failover(快速故障切换):每个 Action Bucket 和一个 Port 关联。按 Action Bucket 的顺序,执行第一个处于 Live 状态的 Action Bucket,常用于提高可靠性和高可用。

在这里插入图片描述

OpenFlow Meter Table 定义

Meter Table 在 OpenFlow v1.3 版本中引入,用于支持 QoS 和计量功能。

Flow Entry 可以关联到一个 Meter Entry,由以下部分组成:

  • Meter identifier:唯一标识。
  • Meter Bands:一个无序的 Meter Band Set,每个 Meter Band 都指明了带宽速率以及处理数据包的行为。
    • Bands Type:定义了数据包的处理行为。包含 Drop 和 IPv4 DSCP remark 类型。
    • Rate:定义了 Band 可以应用的最低速率。
    • Counters:用于统计。
    • Type Specific arguments:指定 Meter Band 的一些额外参数。
  • Counters:用于统计。

在这里插入图片描述

OpenFlow Cannel(通信通道)

OpenFlow Cannel 是 Controller 和 Switch 之间的通信信道,支持 TLS 安全加密、多连接(主连接和辅助连接)等特性。当 Switch 启动后即可向 Controller 发起 Cannel 连接建立请求,默认端口为 TCP 6633。建立连接后,Controller 可以通过 LLDP(Link Layer Discovery Protocol,链路层发现协议)来完成 OpenFlow 网络的拓扑检测。

在这里插入图片描述

OpenFlow 消息类型

在 OpenFlow 规范的最后一部分,主要详细定义了各种 OpenFlow 消息的类型和数据结构,例如:OpenFlow 协议的消息头等。Controller 和 Switch 之间通过 Cannel 来传递这些 Message,继而完成 Cannel 连接的建立,流表的下发和信息的交换。

下图为 OpenFlow 消息类型的概览。本文中仅介绍消息机制,不涉及具体的消息类型,更具体的可以参考 OpenFlow 的源代码 openflow.h 头文件中关于各种数据结构的定义。

在这里插入图片描述

下图展示了 Controller 和 Switch 之间一次典型的消息交换过程:

在这里插入图片描述

OpenFlow Message Header

在这里插入图片描述

在这里插入图片描述

OpenFlow Message Type

OpenFlow 具有 3 大 Message Type,每一种类型又都有多个子类型。

在这里插入图片描述

Controller/Switch Message

是指由 Controller 发起、Switch 接收并处理的消息,主要包括下列消息。这些消息主要由 Controller 用来对 Switch 进行状态查询和修改配置等操作。

  • Features – switch needs to request identity
  • Configuration – set and query configuration parameters
  • Modify-State – also called ‘flow mod’, used to add, delete and modify flow/group entries
  • Read-States – get statistics
  • Packet Outs – controller send message to the switch, either full packet or buffer ID.
  • Barrier – Request or reply messages are used by controller to ensure message dependencies have been met, and receive notification.
  • Role-Request – set the role of its OpenFlow channel
  • Asynchronous-Configuration – set an additional filter on asynchronous message that it wants to receive on OpenFlow Channel
Asynchronous Message

异步消息,是由 Switch 发送给 Controller、用来通知 Switch上 发生的某些异步事件的消息,主要包括下列等。例如,当某一条规则因为超时而被删除时,Switch 将自动发送一条 Flow-Removed 消息通知 Controller,以方便 Controller 作出相应的操作,如重新设置相关规则等。

  • Packet-in – transfer the control of a packet to the controller
  • Flow-Removed – inform controller that flow has been removed
  • Port Status – inform controller that switch has gone down
  • Error – notify controller of problems
Symmetric Message

对称消息,顾名思义,这些都是双向对称的消息,主要用来建立连接、检测对方是否在线等,包括下列三种消息。

  • Hello – introduction or keep-alive messages exchanged between switch and controller
  • Echo – sent from either switch or controller, these verify liveness of connection and used to measure latency or bandwidth
  • Experimenter – a standard way for OpenFlow switches to offer additional functionality within the OpenFlow message type space.
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 通信行业搬砖工 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenFlow SDN 协议发展历程
    • OpenFlow v1.0(2009 年 12 月发布)
      • OpenFlow v1.1(2011 年 2 月发布)
        • OpenFlow v1.2(2011 年 12 月发布)
          • OpenFlow v1.3(2012 年 6 月发布)
            • OpenFlow v1.4(2013 年 4 月发布)
              • OpenFlow v1.5(2014 年 8 月发布)
                • OpenFlow v1.6(2016 年 4 月发布)
                  • OpenFlow v1.7(2017 年 3 月发布)
                    • OpenFlow v1.8(2017 年 11 月发布)
                    • OpenFlow v1.5.1 标准
                      • OpenFlow Switch 系统架构
                        • OpenFlow Port 类型
                          • OpenFlow Flow Table 定义
                            • Multi-level Flow Tables
                            • Flow Entries
                            • Popeline Processing
                          • OpenFlow Group Table 定义
                            • OpenFlow Meter Table 定义
                              • OpenFlow Cannel(通信通道)
                                • OpenFlow 消息类型
                                  • OpenFlow Message Header
                                  • OpenFlow Message Type
                              相关产品与服务
                              负载均衡
                              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档