OpenFlow 起源

  • OpenFlow 的概念最早是由斯坦福大学的 Nick McKeown 教授等于2008 年4 月提出。
  • OpenFlow将控制逻辑从网络设备盒子中分离出来,供研究者对其进行任意的编程从而实现其创新的网络拓扑、协议,而无需改动网络设备本身。
  • OpenFlow 的提出得到各界的广泛关注,目前成为SDN 南向接口协议的主流标准之一。
  • OpenFlow 规范由开放式网络基金会(Open Networking Foundation,ONF)负责发布和管理

OpenFlow 版本

  • 2009 年 12 月 31 日,OpenFlow v1.0 正式发布。
  • 作为协议的第 1 个规范标准,OpenFlow v1.0 中的很多思想都非常重要,是 OpenFlow 后续版本的重要基础。
  • 经过几年的努力,目前已经更新到了 OpenFlow v1.5版本
    • OpenFlow Switch Specification v1.5 [EB/OL]. https://www.opennetworking.org/images/stories/do-wnloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.5.0.pdf,2014-12.
  • 在众多版本中 OpenFlow v1.0,OpenFlow v1.1以及 OpenFlow v1.3最为重要
    • OpenFlow Switch Specification v1.0 [EB/OL]. https://www.opennetworking.org/images/stories/do-wnloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.0.0.pdf,2009-12.
    • OpenFlow Switch Specification v1.1 [EB/OL]. https://www.opennetworking.org/images/stories/do-wnloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.1.0.pdf,2011-2.
    • OpenFlow Switch Specification v1.3 [EB/OL]. https://www.opennetworking.org/images/stories/do-wnloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.0.pdf,2012-6.

image.png

  • OpenFlow v1.0 中有3 个核心组成部分:流表、安全通道和 OpenFlow 协议。
  • 其整体架构如图 2 所示:

image.png

OpenFlow 交换机

  • OpenFlow 交换机作为基本的数据转发单元是数据层的主要网络设备
  • 图 2.4给出了 OpenFlow 交换机的主要功能和其与控制器之间的关系。

image.png

  • OpenFlow 交换机和 OpenFlow 控制器通过安全通道进行通信,通信一般采用安全传输层协议进行加密保护,OpenFlow 协议则定义了控制器与交换机之间传输的特定消息及消息格式。
  • OpenFlow 交换机的核心功能就是把到达某个端口的分组从另一个端口转发出去,图中对应为从端口 2 进入到交换机的分组最终从端口 N 转发出去。
  • 分组进入到交换机的本地入口后首先会进行分组匹配,即与流表中的流表项进行匹配,当分组找到了匹配的表项会进入图中流表右侧的动作盒中
  • 对于收到的分组,OpenFlow 交换机的动作盒在处理时有三种基本选择,动作 1 表示从从本地端口把分组转发出去,动作 2 表示丢弃该分组,动作 3 表示把分组转发到控制器,询问控制器如何处理该分组。

    OpenFlow 流表

  • 流表是 OpenFlow 交换机的核心部分,负责数据包的高速查询和转发,相当于传统网络中的转发表

  • 在传统网络设备中,数据链路层和网络层其各自的转发依据分别为 MAC 地址表和 IP 地址路由表
  • 而在 OpenFlow 中,流表将传统网络中的所有转发表进行了整合,因此,其支持的协议字段更加丰富
  • 流表由流表项构成
  • OpenFlow v1.0 版本规定每条流表项的组成如图所示。

image.png

  • 匹配域(Match Fields)指定了数据包具体的匹配规则如图所示,相当于传统网络中的数据包头

image.png

  • 优先级(Priority)决定了流表项的优先级,优先级高的流表项会优先用来匹配数据包
  • 计数器(Counters)用来统计流表项被匹配查询的次数,用于统计匹配数据包个数,方便流量流量监管
  • 指令(Instruction)用来指示数据包匹配成功后要执行的具体动作,分为必备动作和可选动作
    • 必备动作是指所有 OpenFlow 交换机默认支持的,可选动作是指部分交换机支持的动作
    • 必备动作有两种: 转发和丢弃
    • 可选动作有三种: 转发、排队和修改域
  • 超时(Timeouts)表示流表项最大的超时时间值或者流表项空闲的时间值
  • 缓存(Cookie)用于配合匹配域完成数据包的匹配。

  • 在接收到数据分组时,交换机从标号为 0 的流表开始对数据包头进行匹配

  • 按照流表项的优先级与匹配域中的属性逐条进行比对,直至在流表中匹配到一个流表项
  • 具体的流表匹配流程如图

image.png

  • 交换机从数据包的头中提取用于匹配的字段,匹配字段通常包括各种报头字段,如 MAC 地址、IP 地址、端口号等。
  • 若匹配成功,则将该流表项中计数器、指令集一并进行更新,同时根据指令来决定处理流程是否转移到下一个流表。
  • 若需要转移到下一个流表中继续进行匹配,则下一个流表号 n 要大于当前流表号i 。
  • 当匹配完成后,则执行动作集合,通常是转发或者修改数据包。
  • Table-miss 用于处理与该流表中流表项未匹配成功的情况,由该流表项决定将数据包丢弃、上传给控制器或是转交给下一个流表。
  • 若在一个流表中不存在 Table-miss 项,则默认将报文丢弃。

    OpenFlow 协议

  • OpenFlow 协议是控制器与 OpenFlow 交换机进行通信的标准,它在安全通道进行传输

  • 其定义的通信消息类型有 3 种:Controller-to-Switch 消息,Asynchronous 消息和 Symmetric 消息

    • Controller-to-Switch 消息由控制器发起,用来获取管理OpenFlow 交换机的运行状态
    • Asynchronous 消息由交换机发起,用来将网络事件或交换机的状态变化传递到控制器
    • Symmetric 消息可由控制器或交换机发起。
  • (1)Controller-to-Switch 消息

    • Features:用于在控制器和交换机之间建立传输层安全会话。
    • Configuration:用于控制器查询或设置交换机上的配置信息。
    • Modify-state:用于控制器管理交换机中的流表项和端口状态等。
    • Read-state:用于控制器向交换机请求一些统计信息例如流、数据包等。
    • Packet-out:用于控制器通过交换机的指定端口发送数据包。
  • (2)Asynchronous 消息

    • Packet-in:当交换机收到一个数据包,在流表中没有匹配项时则发送该消息询问控制器如何处理。
    • Flow-removed:当交换机中的流表项因超时等原因被删除时,会触发。
    • Port-status:交换机端口状态发生变化时,会触发。
    • Error:交换机发生问题时,会触发。
  • (3)Symmetric 消息

    • Hello:用于控制器和交换机之间建立连接。
    • Echo:用于测量延迟、双方是否保持连接等。
  • 图为在 Wireshark软件中抓取的使用 OpenFlow 协议的数据包

image.png

  • 通过观察标记区域可以看到被标记的 OpenFlow 数据包类型为 OFPT_FLOW_MOD 属于Controller-to-Switch 消息中的 Modify-state 消息,由控制器向交换机下达指令修改交换机中的流表信息。
  • 观察图中其它报文,注意到交换机和控制器之间在通过类型为OFPT_ECHO_REPLY的数据包和类型为OFPT_ECHO_REQUEST的数据包交互信息,这两种类型的数据包都属于 Symmetric 消息。