1.3 SDN的基本构件
部署SDN需要的基本构件包括:SDN交换机(如OpenFlow交换机)、SDN控制器、控制器中用于和转发设备通信的接口、通常的南向接口(OpenFlow)和网络应用接口(北向接口)。在SDN中,由于控制逻辑和算法被卸载到了控制器中,交换机一般被表示为能够通过开放接口访问的基础转发硬件。OpenFlow交换机分为两类:纯粹的OpenFlow交换机(只支持OpenFlow操作)和混合的OpenFlow交换机(可启用OpenFlow操作)。
纯粹的OpenFlow交换机不具有传统交换机的板级控制特性,完全依赖于控制器作转发决策。混合的OpenFlow交换机除了支持传统的操作和协议之外,还支持OpenFlow操作。目前大多数商用交换机都是混合型的。OpenFlow交换机包括一个流表,流表负责执行数据包的查表和转发,交换机的每个流表保存一组流的纪录,流记录中包括:
- 首部字段或匹配字段、数据包首部中提取的信息、输入端口以及元数据信息,这些信息用于匹配输入的包。
- 计数器,用于对特定的流进行统计,如统计所接收数据包的个数、字节数以及流的持续时间等。
- 一组应用于所匹配的数据包的指令或具体操作,决定如何处理符合匹配条件的数据包。例如,将数据包从指定的端口转发出去。
SDN(以及OpenFlow)中分离的系统可以和计算机平台上的应用程序与操作系统类比,在SDN中,控制器(即网络操作系统)提供了网络的可编程接口,通过编写应用程序,可以完成控制和管理任务,实现新的功能。图1-1给出了该模型的分层视图,在该视图中,控制是集中式的,编写应用程序时,可以把网络视为一个单一的系统,这样虽然简化了策略的执行与管理任务,但控制器和网络转发单元之间的绑定关系必须随时保持着。如图1-1所示,担任网络操作系统角色的控制器必须至少实现两个接口:一个南向接口,支持控制器和交换机之间的通信;一个北向接口,为控制器和高层的策略应用及服务提供可编程的API。首部字段(匹配字段)显示在图1-1中,流表中的每条记录包含特定的值或ANY(图1-1中用*即通配符表示),后者表示能够匹配任何值。
如果交换机处理IP源地址和目的地址字段时支持子网掩码,则能够更精确地定义匹配。端口字段用数字表示交换机的端口(或输入端口),编号从1开始,该字段的长度取决于具体的实现。输入端口字段适用于所有的数据包。交换机有效端口的源和目的MAC(以太网)地址字段也适用于所有数据包,其长度为48比特。以太网类型字段长度为16比特,适用于所有有效端口上的数据包,OpenFlow交换机必须既能够匹配标准的以太网数据包,也能够匹配带有子网访问协议(Subnetwork Access Protocol,SNAP)首部和0x000000值的机构唯一识别符(Organizationally Unique Identifier,OUI)的IEEE 802.2数据包。特定值0x05FF用于匹配所有不带有SNAP首部的802.3数据包。VLAN ID适用于所有类型为0x8100的以太网数据包。该字段的长度为12比特(即4096个VLAN),VLAN优先级字段长度为3比特,可用于所有类型为0x8100的以太网数据包。IP源和目的地址字段长度为32比特,适用于所有IP和ARP数据包,这些字段可以与子网掩码进行掩码操作。IP报文的协议字段适用于所有IP数据包、以太网帧封装的数据包和ARP数据包。该字段的长度是8比特,如果是ARP数据包,则只使用ARP报文操作码的低8位,IP报文的ToS (Type of Service)字段长度为6比特,适用于所有IP数据包。这个字段的值是8比特,ToS取其中的高6位。源端口和目的传输端口地址(以及ICMP的类型和代码字段)长度为16比特,适用于所有的TCP、UDP和ICMP数据包。若只考虑ICMP的类型和代码,则只需考虑低8位值的匹配。
图1-1 OpenFlow交换机、流表、OpenFlow控制器和网络应用
每个表、每个流、每个端口和每个队列都维持一个计数器。计数器循环计数,因此不设进位溢出位,图1-2给出了所需的计数器集合,图中以及本书中提到的字节都是指8比特的组合,持续时间表示某个流在交换机的流表中存在的时间。接收错误字段包括所有显式定义的错误:帧错误、超限、CRC错误以及其他错误。
图1-2 用于信息统计的计数器列表
每个流记录都跟0个或者多个具体操作相关联,这些操作指示OpenFlow交换机如何处理与流记录匹配的数据包。如果没有具体的转发操作,该数据包就被丢弃。具体操作列表必须按照一定的顺序执行,然而,这并不确保一个端口上数据包的输出顺序。例如,两个经操作列表处理后所产生的到达同一个输出端口的数据包,很可能会以任意的顺序输出。纯粹的OpenFlow交换机只支持规定的(required)操作,而混合的OpenFlow交换机则可以同时支持常规(NORMAL)操作。两种交换机都能支持FLOOD操作。规定操作是:
转发:OpenFlow交换机必须能够将数据包转发到物理端口,同时支持向下列虚拟端口的转发:
ALL:将数据包发送到除了其输入端口以外的所有接口。
CONTROLLER:封装数据包并将其发送到控制器。
LOCAL:将数据包发送到交换机的本地网络栈。
TABLE(仅用于输出数据包的消息):执行流表中的操作。
IN_PORT:从输入端口输出数据包。
丢弃:表明丢弃所有相匹配的数据包。若流记录中没有定义具体操作,则作丢弃处理。
可选的操作包括:
转发:交换机在进行转发操作时,可以选择支持以下的虚拟端口:
NORMAL:采用交换机所支持的常规转发途径转发数据包(即常规的第2层、VLAN,或者第3层处理)。
FLOOD:沿最小支撑树以洪泛的方式向除输入接口以外的端口转发数据包。
进入队列(Enqueue):通过端口的队列转发数据包,转发行为由所配置的队列策略决定,通常被用来提供基本的QoS支持。
修改字段(Modify field):可选的字段修改操作有:
设置VLAN ID:若没有定义VLAN,则增加一个新的首部,在其中定义VLAN ID(12比特的数据),并把优先级设为0;若原来已存在VLAN首部,则用新的定义值取代原来的VLAN ID。
设置VLAN优先级:若没有定义VLAN,则增加一个新的首部,在其中定义优先级(3比特的取值),并把VLAN ID设为0;若原来已存在VLAN首部,则用新的定义值取代原来的优先级字段值。
剥离VLAN首部:若存在VLAN首部,则将其剥离。
修改源或目的以太网MAC地址:用新的取值(48比特)替换原来的源或目的以太网MAC地址。
修改源或目的IPv4地址:用新的取值(32比特的数据)替换原来的源或目的IPv4地址,并更新IP报文的校验和(同样适用于TCP/UDP的校验和)。该操作只针对IPv4数据包。
修改IP报文的服务类型(ToS)字段值:用新的取值(6比特的数据)替换原来的ToS字段值,该操作只针对IPv4数据包。
修改传输层的源或目的端口号:用新的取值(16比特的数据)替换原来的源或目的端口号,并更新TCP或UDP的校验和。该操作只针对TCP或UDP数据包。
每当有一个数据包到达OpenFlow交换机时,数据包的首部便被提取出来,跟流记录中的匹配字段进行比对,查找匹配从流表的第一个记录开始,依次往下进行,当发现一个相匹配的记录,交换机将使用该流记录所关联的一系列操作对数据包进行处理。每当发现一个和流记录匹配的数据包,就会更新这个流记录所对应的计数器值。如果查表结果没有发现匹配记录,交换机将根据流表的失配(table-missing)记录中的指令决定采取相应操作。流表中必须包含一个失配记录,以便应对找不到匹配的情况,在这个特殊的记录中定义一组操作,用于处理找不到匹配的输入数据包,这些操作包括:丢弃该数据包、向所有的接口发送该数据包,或者通过安全的OpenFlow信道向控制器转发该数据包。查表时使用的首部字段取决于数据包的类型,具体描述如下:
将流的有关输入端口的规定与接收数据包的物理端口进行比对。
所有数据包的以太网帧首部(如图1-1中所定义的源MAC地址、目的MAC地址、以太网的类型字段等)都用于查表匹配。
如果是一个VLAN数据包(以太网类型字段值为0x8100),其VLAN ID和VLAN优先级(PCP)字段用于查表匹配。
如果是IP数据包(以太网类型字段值为0x0800),IP首部包含的字段(源IP地址、目的IP地址、协议字段、ToS等)均用于查表匹配。
如果IP数据包封装的是TCP或UDP(IP报文首部的协议字段值为6或17),则查表比对的信息包括传输层端口号(TCP/UDP源或目的端口)。
如果IP数据包封装的是ICMP报文(IP报文首部的协议字段值为1),则查表时会包括ICMP的类型和代码字段。
如果数据包的IP报文分片的偏移量字段是非零值,或者不是最后一个分片(more fragment 标志位为1),查表时把传输层端口号设为0。
对于ARP数据包(以太网类型字段值等于0x0806),可以根据情况,选择把其中的源IP和目的IP地址字段值包括到查表的字段中。
数据包跟流表记录的匹配按照优先级进行,精确定义了匹配规则(即没有使用通配符)的流记录总是具有最高的优先级,全部采用通配符的流记录具有与其相关联的优先级,具有高优先级的流记录总是先于具有低优先级的流记录进行匹配。如果多个流记录具有相同的优先级,则交换机可以选取任意的匹配顺序。编号越大,优先级越高。图1-3表示OpenFlow交换机中的数据包处理流程。需要注意的很重要的一点是:如果一个流表的字段值是ANY(*,通配符),则它就能够匹配首部中的任何可能取值。
以太网的帧有各种类型(如Ethernet II、带有或者不带有SNAP的802.3帧等),如果数据包是Ethernet II格式的帧,则以太帧的类型字段按照预期的方法处理;如果数据包是802.3格式的帧,带有SNAP首部,OUI的值等于0x000000,则用SNAP协议ID来比对流的以太网帧类型字段。如果一个流记录中规定以太帧类型为0x05FF,那它就能够匹配所有不带SNAP首部的802.2以太网帧,以及虽然带有SNAP首部,但是OUI取值不等于0x000000的以太网帧。
图1-3 OpenFlow交换机中的数据包处理流程