使用OpenFlow协议建立软件定义网络,可以将网络作为一个整体而不是无数的独立设备进行管理。传统交换机使用生成树协议或其他一些新标准(如多链路透明互连,TRILL)来确定数据包转发路径。而OpenFlow将转发决策从各个交换机转移到控制器上,这一般是服务器或工作站。
管理应用程序执行控制器,负责与所有网络交换机进行交互,配置数据转发路径,从而提高带宽利用率。这个应用程序与云管理软件进行交互,保证有足够的带宽支持负载的创建和变化。
OpenFlow标准定义了控制器与交换机之间的交互协议,以及一组交换机操作。这个控制器—交换机协议运行在安全传输层协议(TLS)或无保护 TCP 连接之上。控制器向交换机发送指令,控制数据包的转发方式,以及配置参数,如VLAN优先级。交换机会在链路中断或出现未指定转发指令的数据包时,发送消息通知控制器。
转发指令基于流,这个流由所有数据包共享的通用特性组成。定义流需要指定许多参数,其中可能包括:数据包到达的交换机端口、来源以太网端口、来源 IP端口、VLAN标签、目标以太网或IP端口及许多其他数据包特性。控制器会在交换机上设置一组参数,用于定义各个流,以及匹配流的数据包处理方式。
每一个交换机都维护着许多路由表,而每一个表又包含多个路由记录。每一条路由记录包含一个匹配域,它定义了流、计数器和指令集。匹配域中记录的项目可能包含一个与到达数据包相对应的比较参数值,或者一个表示流的参数集中不存在此记录的指示值。
路由表的编号从0开始,到达的数据包对表0的记录进行比较。如果匹配,路由计数会增加,然后执行指定的指令集。如果到达的数据包不匹配任何路由表记录,那么必须创建一个新流。有的交换机可能直接丢弃未定义的流,但是大多数情况下,数据包都会转发到控制器上。然后,控制器为该数据包定义一个新流,并且创建一个或多个路由表记录。然后,它会将记录发送到交换机上,并增加路由表。最后,数据包会被送回交换机,使用新创建的路由记录进行处理。
路由表指令会修改每一个数据包所设置的操作。一开始,数据包会使用空操作集进行处理。这些操作可能要求数据包通过指定的端口进行转发,或者需要修改数据包TTL、VLAN、MPLS标签或数据包QoS。
第一个路由表的指令可能会对数据包执行操作,或者增加一些将来执行的操作。这些指令会将数据包与其他路由表记录进行比较,控制数据包的后续处理。后续路由表的记录的指令可能会进一步增加操作,删除或修改之前添加的操作,或者执行其他一些操作。
在将数据包发送到下一路由表之前,指令也可能会给数据包增加一个元素数据值。这个值就成为额外参数,它会与下一个路由表的记录的元数据值进行匹配。数据包会逐个表地进行处理,直到所有指令都处理完,并且数据包成功转发。
指令可能会指定一个组标识符。组是一种为数据包指定在多个流中执行相同操作集的高效方法。组操作定义在交换机的组表记录。每一个记录都包括标识符值、组类型、计数器和操作集。组类型规定是否所有操作集都会执行,这很适合用于实现广播或多播,或者规定只执行某些特定的操作集。