OpenFlow协议原理简介
Overview
对于用户来说,网络构建是一项基础性的工作。他们从设备制造商订购网络设备、组网,投入使用后还要对网络流量进行管理。通常大的甲方不会只从一家制造商订购设备,而是会选择把份额分配给不同的制造商。这么做的理由很明显:未来更新设备的主动权。但多个制造商也有坏处,如果每家的产品操作和管理方式不一致,又会使得运维成本提升。怎么办呢?不如设备制造商都遵循同一个标准吧。OpenFlow
就是这样一个协议,它解耦了流量管理与具体硬件的关系,只要网络设备支持OpenFlow
,那么我就可以用同一种方式管理它。
转发与控制分离是OpenFlow的典型特征。如Figure-1所示,OpenFlow网络主要由OpenFlow控制器和OpenFlow交换机组成。控制器可以对整个OpenFlow网络的交换机进行集中控制,它告诉交换机遇到特定的报文应该如何处理
Figure.1 SDN Network
###流表
流表(Flow Table)是OpenFlow中的一个重要概念。顾名思义,流表是流组成的表。那么什么是流呢? 流是标识一条网络连接的特征信息,这些信息包括L1的交换机端口、L2的以太网地址(MAC)、L3的IP地址以及L4的TCP/UDP端口号。
OpenFlow 1.0中的流表项定义如下:
Figure.2 OpenFlow 1.0 Flow table entry
• header fields
表示匹配的报文特征
• counters
记录统计信息
• actions
表示匹配成功后交换机采取的动作,常见的动作包括修改报文头部、增删VLAN TAG、从指定交换机端口转发或者丢弃。
一个OpenFlow交换机可以只有一个流表,也可以包含多个流表。但需要注意的是,在OpenFlow 1.0中,即使交换机有多个流表,它也只能最多只能匹配一个流表项(依次从表0开始匹配)。而在OpenFlow 1.1以上的版本中,一个报文可以与各个流表都进行匹配,最后执行多个流表项叠加的动作。
以下是OpenFlow 1.0定义的报文处理流程:
Figure.3 OpenFlow 1.0 Packet Process Flowchart
OpenFlow交换机在从一个端口收到报文后,从报文中提取出流信息,再以此为依据进行流表项的搜索,如果找到,就执行流表项中定义的行动,如果没有,就将其发送给OpenFlow控制器。
OpenFlow 1.1引入了指令(Instruction)的概念,它是行动(Action)的容器,每条流表项可以包含多个指令。同时,该版本还引入了行动集合(Action Set)的概念,行动集合与每个报文绑定,它记载着当匹配所有流表完成后,报文需要执行的行动的集合,也就是“支持多个流表中的流表项应用到一个数据报文”
OpenFlow 1.1对流表项也有相应的修改
Figure.4 OpenFlow 1.1 Flow table entry
• match fields
: 除了1.0中的header fileds
功能外,还可选地包含了报文匹配过程中由前一个flow table传递过来的metadata。metadata可以用来记录报文报文经过了哪些table的匹配,比如流表项可以规定满足该表项的报文必须首先经过前面特定table。
• counters
:记录统计信息
• instructions
修改报文的行动集合
如此一来,报文在OpenFlow交换机的处理过程便成了流水线的形式:每个匹配的表项可以将需要执行的行动添加到行动集合,最后再执行 图4.1.1
以下是OpenFlow 1.1定义的报文处理流程:
Figure.5 OpenFlow 1.1 Packet Process Flowchart
控制器与交换机的通信
OpenFlow控制器与OpenFlow交换机在控制平面网络建立安全通道(默认使用TCP:6653)传递消息,所有消息都是以下面的OpenFlow头开始
Figure.6 OpenFlow Header
OpenFlow头后面紧跟具体的消息,各个版本支持的消息类型略有不同,详细列表见of-message,下面介绍几个用的最多的消息。
Packet-In消息
当OpenFlow交换机找不到报文匹配的流表项或者流表项的行动(Action)就是发送给OpenFlow控制器时,它会将报文通过Packet-In
消息发送给OpenFlow控制器,由控制器决定报文该何去何从。Packet-In
消息的格式如下:
Figure.7 OpenFlow 1.0 Packet-In
buffer_id用来唯一地标识这个报文。in_port是OpenFlow交换机收到该报文的端口,reason用来区别匹配不到流表项和主动发送给控制器这两种原因。
Flow-Mod消息
Flow-Mod
消息是OpenFlow控制器对OpenFlow交换机设置流表项的消息。Figure-X是OpenFlow 1.0版本的Flow-Mod
消息格式:
Figure.8 OpenFlow 1.0 Flow-Mod
其中,match表示流的匹配条件;cookie是一个OpenFlow交换机不需要理解的值;command是具体的流表操作方式;idle_timeout和hard_timeout表示流表项的老化时间;priority表示表项的优先级;buffer_id表示一个被交换机缓存的报文,这个报文由于没有查找到匹配的表项,因此发送Packet-In
消息给OpenFlow控制器,OpenFlow控制器在Flow-Mod
带上该id,指示OpenFlow交换机可以重新处理此报文;action为该流表项的行动。
Packet-Out消息
Packet-Out
消息用于OpenFlow控制器将报文下发到OpenFlow交换机,这个报文可能是OpenFlow交换机通过Packet-In
消息发送给OpenFlow控制器的,也有可能是OpenFlow控制器主动发送到数据平面的。Figure-X是OpenFlow 1.0版本的Packet-Out
消息格式
Figure.9 OpenFlow 1.0 Packet-Out
如果buffer_id不为-1(0xffffffff),说明该报文是之前Packet-In
消息携带的,如果为-1,则Packet-Out
消息最后的data需要显式包含要发送的报文。