《现代网络技术》读书笔记:SDN数据平面和OpenFlow
本文部分内容来源于《现代网络技术:SDN,NFV,QoE、物联网和云计算:SDN,NFV,QoE,IoT,andcloud》
SDN数据平面
SDN 数据平面也称为基础设施层,而在ITU-T的Y3300标准中则称为资源层,它是网络转发设备根据 SDN控制平面的决策来执行数据传输和处理所处的平面。SDN网络中网络设备的重要特征是这些设备只完成简单的转发功能,不需要内嵌软件来执行自治决策。
数据平面功能
控制支撑功能:与 SDN控制层进行交互,从而通过资源-控制接口支持可编程特性,交换机与控制器之间的通信以及控制器对交换机的管理都是通过OpenFlow协议进行的。
数据转发功能:从其他网络设备和端系统接收到达的数据流,并将它们沿着计算和建立好的数据转发路径转发出去,转发路径主要根据SDN应用定义的规则决定。
网络设备使用的转发规则体现在转发表中,转发表反映了特定类别分组的下一跳路由。除了简单地转发分组以外,网络设备还可以对分组的首部进行修改,或者丢弃该分组。如图所示,到达的分组被放置在输人队列中,等待网络设备的处理,而分组在完成转发之后通常会放置于输出队列,等待传输
数据平面协议
上图给出了网络设备所支持的协议,数据流包括IP分组流。转发表必须根据上层协议(例如TCP、UDP或其他运输层、应用层协议)来定义表项,网络设备进行转发决策时通过检查IP首部,也可能包括分组的其他首部信息来完成。
图中另一个重要的数据流是南向应用程序编程接口(API),包括OpenFlow协议数据单元(PDU)或其他类似的南向API协议数据流。
OpenFlow逻辑网络设备
基本概念
为了将 SDN 概念实用化,需要满足以下两个必要条件:
- 所有由SDN控制器管理的交换机、路由器和其他网络设备必须有通用的逻辑架构该逻辑架构可以在不同厂商的设备以及不同类型的网络设备上用不同的方法实现只要SDN控制器看起来是统一的逻辑交换功能实体即可。
- SDN 控制器和网络设备之间需要标准的安全协议。
上图表明了OpenFlow环境中主要的要素,包括含有OpenFlow软件的SDN控制器、OpenFlow交换机和端系统。
上图显示了OpenFlow交换机的主要构成。SDN控制器使用运行在运输层安全协议(TLS)之上的OpenFlow协议与兼容OpenFlow的交换机通信,每个交换机与其他OpenFlow 交换机相连,此外也可能会与产生和接收分组流的端用户设备相连。在交换机端,其接口称为OpenFlow信道Open-Flow channel),这些连接是通过OpenFlow端口实现的,而OpenFlow端口(Open-Flow port)则连接着交换机和SDN控制器。OpenFlow定义了3种类型的端口。
-
物理端口:与交换机的硬件接口相对应,例如在以太网交换机上,物理端口与以太网接口一一对应。
-
逻辑端口:不直接与交换机的硬件接口相对应,逻辑端口是更高层的抽象,可以采用非 OpenFlow方法在交换机上进行定义(例如链路聚合组、隧道、环回地址)。逻辑端口可以包括分组封装,也可以映射到不同物理端口上,在逻辑端口进行的处理与具体的实现相关,而且对OpenFlow处理必须是透明的,这些端口必须像物理端口那样与 OpenFlow处理进行交互。
-
保留端口:由OpenFlow规范定义,它指定了通用的转发行为,例如发送给控制器和从控制器接收、洪泛,或使用非OpenFlow方法转发(例如像“正常”的交换机一样处理)。
OpenFlow规范中定义了逻辑交换机体系结构中的三种主要表结构:
流表 (Flow Table): 将到达的分组映射到特定的流,并指定这些分组应当执行的操作。OpenFlow交换机通常包含多个流表,以流水线的方式协同工作。流水线方式意味着一个分组在处理过程中可以依次通过多个流表,直到被处理完毕。流表的每一项称为“流表项”,可以定义特定流的匹配规则以及处理该流的动作。
组表 (Group Table): 流表可以直接将流引导到某个组表上,组表负责触发各种复杂的动作,例如负载均衡、冗余路径等。组表的存在允许OpenFlow处理多个流,这些流在组表中被定义为不同的组,从而可以实现复杂的转发行为。每个组表项包含了一组执行操作的动作集(action set),可以对一条或多条流施加操作。
计量表 (Meter Table): 计量表专注于与性能相关的控制。它可以对特定流执行基于流量的监控和限速等操作。计量表在特定条件下触发动作,例如当流量超过某个设定的阈值时,它可以采取相应措施。计量表的目的是帮助管理流量性能,确保网络的高效运行。
OpenFlow规范并没有对“流”进行明确的定义。在一般网络术语中,流通常指一组具有相同首部内容的分组。例如,所有具有相同源IP地址和目的IP地址的分组可以视为同一个流;或者,所有具有相同虚拟局域网(VLAN)标识符的分组也可以被视为同一流。
流表
在OpenFlow中,流表是逻辑交换机体系结构的基本组成部分,每个进入交换机的分组(packet)都会经过一个或多个流表。流表的每个项(即流表项)由不同的字段组成,用于对流量进行识别和处理。
一个流表项包含以下主要字段:
- 匹配字段:用于定义流表匹配的条件,包括源地址、目的地址、端口等。这些字段决定了数据包是否符合特定流的匹配条件。
- 优先级:流表项的优先级决定了多个匹配项之间的匹配顺序。优先级高的流表项会被优先匹配。
- 计数器:用于记录流表项的匹配次数或流量统计。计数器可以帮助管理员了解流量情况和资源使用情况。
- 指令:当数据包匹配流表项时,指令决定对数据包的处理方式,比如转发、丢弃或修改。
- 超时时间:流表项的超时时间可以是硬超时(Hard Timeout)或空闲超时(Idle Timeout),分别代表流表项的生存时间和在无匹配数据包时的等待时间。
- Cookie:这是一个由控制器分配的字段,便于流的管理和追踪。
- 标识:用于存储流表项的元信息,便于进一步的管理。
匹配字段包含多个必要的匹配条件,例如:
- 输入端口:表明数据包进入交换机的端口。
- 源和目的地址:包括IPv4和IPv6地址,可以是确切地址或地址段。
- 端口:TCP和UDP的源端口和目的端口,用于匹配特定应用层流量。
- VLAN ID和优先级:用于识别虚拟局域网内的流量。
- 其他协议字段:如IPv6扩展头、MPLS标签等,用于更细粒度的流量控制。
每个流表项可以执行多个操作(称为动作集),例如:
- 转发:将数据包发送到指定的端口。
- 丢弃:直接丢弃数据包。
- 修改:对数据包的特定字段进行修改,例如更改TTL值。
- 组表跳转:将数据包发送到另一个组表,以便执行更复杂的操作。
流表流水线
交换机包含一个或多个流表,数据包经过多个流表时可以形成流水线的处理流程。每个表可以从0开始的表编号进行标识。当数据包进入交换机后,通常首先进入第一个流表。经过一个流表处理后,可以根据匹配结果决定是否进入下一个流表或直接执行动作。
OpenFlow规定了流表的两个主要处理阶段:
-
入口处理:当一个数据包进入交换机时,从表0(第一个表)开始,根据输入端口ID等条件进行初始匹配。表0是数据包进入流表流水线的唯一入口,数据包在这一阶段被标记和识别。
-
出口处理:出口处理用于决定最终的输出端口。在此阶段,可以根据流水线中所有流表的结果来决定是否直接输出到某个端口,或者进一步传送到控制器或其他流表。出口处理阶段是流水线的终点,用于输出操作。
在流表流水线中,数据包经过多个流表进行匹配和处理,具体流程包括以下步骤:
-
流表匹配: 在每个流表中,数据包会根据匹配字段(如输入端口ID)进行匹配。匹配字段包含了预定义的条件,可以包括输入端口、IP地址、VLAN ID等。如果匹配成功,数据包会继续执行与流表项关联的动作。
-
优先级匹配: 如果有多个流表项匹配到数据包,优先级高的流表项将会被优先执行。优先级是由管理员在定义流表项时指定的。
-
执行动作: 一旦匹配成功,数据包会按照流表项的定义执行指定动作。常见的动作包括转发、丢弃、组跳转等。对于流水线中的每个流表项,可能执行以下操作:
-
- 更新计数器:记录匹配到的次数或数据量。
-
- 执行指令集:包括更新动作集、修改元数据或执行特定的操作。
-
- 引导分组:如果指定了下一个流表编号,数据包会被传送到指定的下一个流表,继续匹配。
-
缺省动作: 如果数据包没有匹配到流表项或所有匹配项均无缺省操作,数据包将被丢弃;否则,执行缺省动作集。
多级流表的使用
多级流表的作用是通过多个流表实现对流量的细粒度控制,或者将一条流分解为多条并行的子流。使用多级流表可以帮助简化SDN控制器和OpenFlow交换机的操作流程,提高网络的灵活性和控制精度。
上图展示了一个多级流表的使用示例。在这个例子中:
表0包含一个流表项,用于定义特定源IP地址到特定目的IP地址的分组流。该表项表示了所有从该源到目的地址的流量都会经过表0的初始匹配。表0相当于对流量的粗粒度分类。
表1根据协议类型(例如TCP和UDP)进一步对流量进行细分。对于TCP流和UDP流,分别使用不同的流表项处理。这样可以区分开不同协议的流量,为后续步骤提供更多的灵活性,例如应用不同的QoS策略。
表2根据应用层协议(如FTP、SMTP、SNMP等)对流量进行更细粒度的分流。例如,将TCP流细分为FTP和SMTP子流,将UDP流细分为SNMP子流。这些子流可以依据特定需求进行独立的管理。
组表
在流水线的处理过程中,流表可以将分组流引导到某个组表而非其他流表,组表和组动作使得 OpenFlow可以用一个单独的实体来表示一组端口集合,从而进行分组转发。不同类型的组表示不同的转发抽象,例如多播和广播。
一个组表项由以下四部分构成:
- 组标识符:一个32位的标识,用于唯一标识每个组表项。
- 组类型:定义组的操作方式,决定了组项的工作逻辑。
- 计数器:记录组表项的处理次数或流量统计数据。
- 动作桶(Bucket):一个包含一系列操作的列表,每个动作桶包括一组执行的动作集合及其相关参数。
组类型决定了如何对组内的流量进行分发,主要类型包括:
全部(All): 组表的“全部”类型会执行组中所有动作桶中的操作。即数据包会被复制并发往所有指定的输出端口,这种方式适用于广播或多播的场景。例如,数据包可以被发送到多个端口,实现类似广播的效果。
选择(Select): 选择类型的组表项会根据某种选择算法(例如哈希算法或轮询)来决定选择一个动作桶执行。选择算法可以实现负载均衡,使流量均匀分布在多个路径或端口上。适用于需要分摊流量的场景,如服务器负载均衡。
快速恢复(Fast Failover): 在快速恢复类型中,组表会依次检查动作桶的状态,当检测到一个存活的桶时,立即执行该桶中的操作。快速恢复主要用于实现故障恢复,当某条路径不可用时,系统自动切换到另一条可用路径。
间接(Indirect): 间接类型仅包含一个动作桶,并且所有流表项共享此组。该类型适用于单一输出路径的场景,比如多条流共享一个出口端口。若要修改路径,只需更新组表中的动作桶,而不需要修改每条流的流表项。
OpenFlow协议
OpenFlow协议描述了发生在OpenFlow控制器和OpenFlow交换机之间的报文交互。通常来说,该协议是在TLS之上实现的,它提供了安全的penFlow信道。OpenFlow协议使得控制器可以对流表中的流表项执行增加、修改和删除动作,它支持三类报文。
控制器到交换机:这些报文由控制器产生,在某些情况下需要交换机对其进行响应这类报文使得控制器可以对交换机的逻辑状态进行管理,包括交换机中流和组表项的配置及相关细节。Packet-out也属于这一类报文,当交换机将一个分组发送给控制器,同时控制器决定不丢弃该分组,而是将分组转发到交换机的某个输出端口时控制器就会发送Packet-out报文。
异步:这类报文不是由控制器引发的。这类报文包括发送给控制器的各种状态报文以及 Packet-in报文,当交换机中没有某个分组匹配的流表项时,会使用Packet-in报文将分组转发给控制器。
对称:这类报文既不是控制器也不是交换机主动引发的,它们有一些帮助作用。Hello 报文通常用于控制器和交换机之间第一次建立连接的时候的交互,Echo请求与响应报文可以让交换机或控制器对控制器到交换机之间连接的时延或带宽进行测量或者仅用于测试设备是否开启和正在运行,Experimenter报文用于计划在OpenFlow未来的版本中嵌入新的功能。
OpenFlow协议为 SDN控制器提供了三类信息,以用于管理网络,具体包括以下。
- 基于事件的报文:当一条链路或一个端口发生状态变化时,交换机会发送报文给控制器。
- 流统计信息:交换机根据流量情况产生的信息,该信息可以让控制器对流量进行监视,并根据需要重新配置网络,调整网络参数以满足 QoS需求。
- 封装的分组:由交换机发送给控制器,因为流表项中有显式的动作来发送该分组或者交换机需要相应的信息来建立一个新的流表项。