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