OpenFlow1.3
1.OpenFlow端口
OpenFlow端口是OpenFlow处理进程和网络之间传递数据包的网络接口。OpenFlow交换机之间通过OpenFlow端口在逻辑上相互连接。
OpenFlow的数据包从入口端口接收,经过OpenFlow的流水线处理,可将它们转发到输出端口。输入端口是数据包的属性,贯穿整个OpenFlow流水线,代表数据包是从哪个端口接收的。在进行报文匹配的时候会用到入端口。OpenFlow流水线可以决定数据包通过输出行动发送到输出端口,它定义了数据包怎样传到网络中。
OpenFlow交换机必须支持的三种类型的标准端口:物理端口,逻辑端口,保留端口。
1.1 物理端口
OpenFlow的物理端口为交换机的一个硬件接口。在一些部署中,OpenFlow交换机可以实现硬件的虚拟化,在这种情况下,OpenFlow物理端口可以代表一个与交换机硬件接口对应的虚拟切片。
1.2 逻辑端口
OpenFlow的逻辑端口为交换机定义的端口,并不直接对应一个交换机的硬件接口,是一个更高层次的概念,可能包括报文封装,映射物理端口的功能,也可能是不使用的端口。相对于物理端口,逻辑端口的数据包中存在一个叫做隧道ID的额外的元数据字段与之关联;当逻辑端口接收的分组被发送的控制器时,其逻辑端口和相应底层的物理端口都要报告给控制器。
1.3 保留端口
OpenFlow的保留端口,通常用作转发动作,如:发送到控制器,泛洪,或使用非OpenFlow的方法转发,即正常交换机处理方式。
OpenFlow交换机的保留端口可以分为“Required”(必备)和“Optional”(可选)两种方式。
- Required(必备)
动作 | 内容 |
---|---|
ALL | 转发特定的数据包到所有端口(包括数据包的入端口) |
CONTROLLER | OpenFlow控制器的控制通道,作为出端口时进行封装数据包消息并使用OpenFlow协议发送。作为入端口时,用来确认控制器的数据包 |
TABLE | OpenFlow流水线的开始,仅在输出时有效 |
IN PORT | 代表数据包的输入端口,用于输出时,仅能通过入端口发送的数据包 |
ANY | 用于未指定端口的OpenFlow指令 |
- Optional(可选)
动作 | 内容 |
---|---|
LOCAL | 交换机的本地网络堆栈和管理堆栈 |
NORMAL | 代表传统的非OpenFlow流水线,仅用于一个输出端口 |
FLOOD | 使用普通流水线处理进行泛洪(发往所有端口但不包括入端口) |
2.OpenFlow表
2.1 流水线处理
每个OpenFlow交换机的流水线包含多个流表,每个流表包含多个流表项,OpenFlow的流水线处理顶一个数据包如何与那些流表进行交互。OpenFlow交换机至少具有一个流表。
- 流水线流程
OpenFlow交换机流表按标号从0开始,且总是从第一个流表开始,数据包与流表0的流表项进行匹配,其他的流表根据第一个表的匹配结果进行调用。在对某个流表的流表项进行匹配时,如果匹配到了流表项,则该流表项内的指令集被执行,这些指令可能包括指导数据包传递到另一个流表的Goto指令,在那里进行同样的处理(流水线处理只能前进,即goto指令只能指向比它大的流表)。流水线的最后一个表项可以不包括GOTO指令。当数据包匹配到的流表项没有GOTO指令时,流水线处理停止,数据包将会进行转发操作。
若数据包在流表中没有匹配到流表项,这是一个table-miss行为,table-miss将会对数据包进行丢弃或传递到另一个表中取决于table-miss流表的配置。或者根据数据包的信息转发到控制器。
2.2 流表
一个流表中包含多个流表项,每个流表项包含:
Match Fields | Priority | Counters | Instructions | Timeouts | Cookie |
---|
内容 | 说明 |
---|---|
匹配字段 | 对数据包匹配,包括端口和数据包报头,及前一个表指定的可选元数据 |
优先级 | 流表项的匹配次序 |
计数器 | 更新匹配数据包的计数 |
指令 | 修改行动集或流水线处理 |
超时 | 最大时间计数或流有效时间 |
cookie | 由控制器选择的不透明数据值。控制器用来过滤统计数据,流改变和删除 |
流表项通过匹配字段和优先级决定,在一个流表中匹配字段和优先级共同确定唯一的流表项。所有字段通配和优先级为0的流表项为table-miss流表项。
2.3 匹配
- 匹配流程
OpenFlow交换机在接收到一个数据包后,开始从第一个流表,并基于流水线的方式进行查找。
数据匹配字段从数据包中提取,用于表查找的数据包匹配字段依赖于数据包类型,这些类型通常包括各种数据包的报头字段,如:以太网源地址或IPV4地址。除了通过数据包报头中进行匹配,也可以通过入口端口和元数据字段进行匹配。元数据可以用来在一个交换机的不同表里面传递信息。报文匹配字段标识报文的当前状态,如果在前一个表中使用Apply-Actions改变了数据包的报头,那么这些变化也会在数据包匹配字段中反映。
数据包匹配字段中的值用于查找匹配的流表项,如果流表项字段具有值得ANY,他就可以匹配报头中的所有可能值。数据包与表进行匹配,优先级最高的表项必须被选择,且与选择流表项相关的计数器会更新,选定流表项的指令集也被执行。若多个匹配的流表项有相同的最高优先级,所选择的流表项被确定为未定义表项。
2.4 Table-miss
每一个流表必须能处理table-miss的流表项。table-miss表项指定在流表中如何处理与其他流表项未匹配的数据包。比如讲数据包发送到控制器,丢弃数据包或直接将包扔到后续的表。
table-miss的流表项也有他的匹配字段和优先级,它通配所有匹配字段,且优先级最低(0)。table-miss流表项的匹配可能会不属于正常范围内流表支持的匹配,例如精确匹配会不支持在其他流表项中使用通配符,但必须支持table-miss的通配符流表项。table-miss流表项的行为在许多方面像任何其他流表项,流表中不存在table-miss表项,控制器可以在任何时候添加或删除它,它也可能会超时失效。table-miss流表项能够匹配其他流表项不能匹配的数据,当数据包与table-miss表项匹配时,table-miss表项指令就会执行。如果该table-miss表项直接将数据包通过CONTROLLER端口发送到控制器,那么报文中的信息必须与一个table-miss表项匹配。
2.5 流表项删除
流表项可以通过两种方式在流表中删除,控制器的请求或交换机流超时机制。
2.6 组表
组表包括若干组表项,这也是一种openflow转发方法,就是若干流表项指向一组
Group Identifier | Group Type | Counters | Action Buckets |
---|
每个组表项由组编号确定具体为:
内容 | 说明 |
---|---|
组编号 | 一个32位的无符号整数,唯一标识该组 |
组类型 | 确定组语义 |
计数器 | 当报文被组表处理时更新数据 |
行动桶 | 包含一组要执行的动作和参数 |
- 组类型(Group Types)
组类型包括必备(Required)选项和可选(Optional)选项。
必备选项(Required)
内容 | 说明 |
---|---|
all | 执行组中所有行动桶,用于多播或广播的转发 |
indirect | 执行组中定义的一个动作桶,这个组只支持单一的动作桶,允许多个流表项或组指向一个组编号 |
可选选项(Optional)
内容 | 说明 |
---|---|
select | 执行组中的一个动作桶 |
fast failover | 执行一个活跃的动作桶 |
2.7 计量表
一个计量表包含若干个计量表项,确定每个流量的计数,单位流量的计量可以使OpenFlow实现各种简单的QoS业务,如:限速,并且可以结合每个端口队列来实现复杂的QoS框架,如:DiffServ。
计量可以测试数据包的速率,使这些数据包可以实现速率控制。计量直接连接到流表项。任意的流表项可以在它的指令集中定义一个计量,计量测量和控制和它相连的所有流的速率,在同一个表中可以使用多个计量,但必须使用分离的流表项。
Meter Idertifier | Meter Bands | Counters |
---|
每个计量表项所含内容及说明:
内容 | 说明 |
---|---|
计量的标识符 | 一个32位的无符号整数唯一识别符 |
计量带 | 无序列表,定义带的速度和处理数据包的方式 |
计数器 | 报文被计量表项处理时更新 |
- Meter Bands(计量表带)
每个计量表可能有一个或多个计量带,每个计量带指定适用的速率和数据被处理的方式。每个计量带包括:
Band Type | Rate | Counters | Type specific arguments |
---|
内容和说明
内容 | 说明 |
---|---|
带类型 | 定义了数据包怎样被处理 |
计量率 | 选择计量带,定义了带可以运行的最低速率 |
计数器 | 当数据包被计量带处理时更新 |
类型参数 | 带类型的可选参数 |
带类型可选(Optional)参数
内容 | 说明 |
---|---|
drop | 丢弃数据包,可以用来定义的速率限制带 |
dscp remark | 减少数据包的IP头中的DSCP字段丢弃的优先级。可用于定义一个简单的DiffServ策略 |
2.8 计数器
计数器可以进行如下计数:每一个流表,流量入口,端口队列,组,动作桶,计量表,计量带。主要用于统计流量信息,例如活动表项,查找次数,发送包数等。如下所示为OpenFlow规范中定义的计数器集:
- Per Flow Table
Counter | Bits | |
---|---|---|
Reference count(active entries) | 32 | Required |
Packet Lookups | 64 | Optional |
Packet Matches | 64 | Optional |
- Per Flow Entry
Counter | Bits | |
---|---|---|
Received Packets | 64 | Optional |
Received Bytes | 64 | Optional |
Duration(second) | 32 | Required |
Duration(nanoseconds) | 32 | Optional |
- Per Port
Counter | Bits | |
---|---|---|
Received Packets | 64 | Required |
Transmitted Packets | 64 | Required |
Received Bytes | 64 | Optional |
Transmitted Bytes | 64 | Optional |
Received Drops | 64 | Optional |
Transmit Drops | 64 | Optional |
Received Errors | 64 | Optional |
Transmit Errors | 64 | Optional |
Received Frame Alignment Errors | 64 | Optional |
Received Overrun Errors | 64 | Optional |
Receive CRC Errors | 64 | Optional |
collisions | 64 | Optional |
Duration(seconds) | 32 | Required |
Druation(nanoseconds) | 32 | Optional |
- Per Queue
Counter | Bits | |
---|---|---|
Transmit Packets | 64 | Required |
Transmit Bytes | 64 | Optional |
Transmit Overrun Errors | 64 | Optional |
Duration(seconds) | 32 | Required |
Durqation(nanoseconds) | 32 | Optional |
- Per Group
Counter | Bits | |
---|---|---|
Reference Count(flow entries) | 32 | Optional |
Packet Count | 64 | Optional |
Byte Count | 64 | Optional |
Duration(seconds) | 32 | Required |
Durqation(nanoseconds) | 32 | Optional |
- Per Group Bucket
Counter | Bits | |
---|---|---|
Packet Count | 64 | Optional |
Byte Count | 64 | Optional |
- Per Meter
Counter | Bits | |
---|---|---|
Flow Count | 32 | Optional |
Input Packet Count | 64 | Optional |
Input Byte Count | 64 | Optional |
Duration(seconds) | 32 | Required |
Durqation(nanoseconds) | 32 | Optional |
- Per Meter Band
Counter | Bits | |
---|---|---|
In Band Packet Count | 64 | Optional |
In Band Byte Count | 64 | Optional |
2.9 指令
每个流表项中包含一组指令,当一个数据包匹配流表项时指令会被执行,这些指令可以更改数据包,行动组或流水线处理。
OpenFlow中包含的指令如下:
- 可选(Optional)
内容 | 说明 |
---|---|
Meter meter id | 直接将包计量后丢弃 |
Apply-Actions action | 立即进行指定的行动,而不改变行动集,通常用来修改数据包 |
Clear-Actions | 在行动集中立即清除所有的行动 |
Write-Metadata metadata/mask | 在元数据区域记录元数据 |
- 必备(Required)
内容 | 说明 |
---|---|
Write-Actions action | 将指定的行动添加到正在运行的行动集 |
Goto-Table next-table-id | 指定流水线处理进程中下一张表的ID |
2.10 行动集
行动集与每个报文相关,默认为空,一个流表项可以使用Write-Actions指令或者Clear-Action指令修改行动集。行动集在表间被累加。当一个表项的指令集没有包含Goto-Table指令时,流水线处理就停止,报文行动集被执行。
行动集包含所有的行动,无论他们以什么顺序加入到行动集中,行动集的顺序均按照下列顺序执行。如果行动集包含组行动,那么行动桶中的行动也按照下列顺序执行,交换机可以通过Apply-Actions指令修改行动执行顺序。
顺序 | 内容 | 说明 |
---|---|---|
1 | copy TTL inwards | apply copy TTL inward actions to the packet |
2 | pop | apply all tag pop actions to the packet |
3 | push-MPLS | apply MPLS tag push action tothe packet |
4 | push-PBB | apply PBB tag push action to the packet |
5 | push-VLAN | apply VLAN tag push action to the packet |
6 | copy TTL outwards | apply copy TTL outwards action to the packet |
7 | decrement TTL | apply decrement TTL action to the packet |
8 | set | apply all set-field actions to the packet |
9 | qos | apply all QoS actions, such as set queue to the packet |
10 | group | 如果指定了组行动,那么按照这个序列中的顺序执行组行动存储段里的行动 |
11 | output | 如果没有指定组行动,报文就会按照 output 行动中指定的端口转发 |
注:Output行动最后执行,如果行动组和输出行动均存在,行动组优先级最高,两个均不存在,报文被丢弃。
2.11 行动列表
Apply-Actions指令和Packet-out消息中存在行动列表,行动效果累加,全部都会执行。
2.12 行动
- 必备动作
动作 | 说明 |
---|---|
Output | 报文输出到指定端口 |
Drop | 丢弃 |
Group | 用组表处理报文 |
- 可选行动
动作 | 说明 |
---|---|
Set-Queue | 设置报文的队列ID,为了Qos需求 |
Push-Tag/Pop-Tag | |
Set-Field | 设置报文包头的类型和修改包头的值 |
Change-TTL | 修改TTL值 |
3.OpenFlow通道
OpenFlow通道是交换机连接控制器的接口,通过这个接口,控制器可以对交换机进行管理和配置,接收交换机信息并向交换机发送数据包。
消息被封装为openflow协议中规定的格式在交换机和控制器之间传输,运行在安全传输层协议和无保护的tcp连接上。
3.1 OpenFlow协议
OpenFlow协议支持三种消息类型:controller-to-switch,asynchronous(异步)和symmetric(对称),三种消息类型又有多个子消息类型。
controller-to-switch消息由控制器发出,主要用于管理和获取switch状态;asynchronous消息由switch发出,用于网络事件和交换机状态变化更新发送到控制器;symmetric消息可以由交换机或控制器发出。
- controller-to-switch
内容 | 说明 |
---|---|
Features | 建立传输安全会话时,控制器发送给交换机,交换机应答交换机所支持的功能 |
Configuration | 控制器用于设置或查询交换机上的配置信息,交换机需应答查询信息 |
Modify-state | 控制器管理交换机流表项和端口状态 |
Read-state | 控制器想交换机请求关于流或数据包的统计信息 |
Packet-out | 控制器通过交换机向指定端口发送数据包 |
Barrier | 控制器确保消息依赖满足,接收完成操作通知 |
- asynchronous
内容 | 说明 |
---|---|
Packet-in | 数据包在交换机中没有匹配项时,通过Packet-in消息发送给控制器 |
Flow-removed | 交换机的流表项因为超时或修改等原因被删除掉,会触发此消息 |
Port-status | 交换机端口状态发生变化时触发 |
Error | 交换机发生问题时触发 |
- symmetric
内容 | 说明 |
---|---|
Hello | 交换机和控制器用于建立连接 |
Echo | 交换机和控制器均可以发送Echo,接收者需回复Echo reply。用于测量延迟,是否保持连接 |
Vendor | 交换机提供附加信息 |
3.2 建立连接
OpenFlow连接建立后,交换机和控制器必须先要发送OFPT_HELLO消息给对方,该消息携带双方支持的最高版本号,接收方将采用双方都支持的最低协议版本进行通信。发现共同支持的协议版本,则进行连接,否则发送OFPT_ERROR消息,中断连接。
3.3 加密
安全通道用TLS连接加密,交换机启动后通过6633端口进行TCP连接,双方交换证书进行认证。
3.4 中断连接
连接异常时,交换机尝试去连接备份的控制器。当多次连接失败后,交换机进入紧急模式,重置所有的TCP连接。此后,数据包匹配指定的紧急模式流表项,删除其他正常流表项。
3.5 多控制器
交换机可以与多台控制器建立连接,进行故障转移和负载均衡。
3.5.1 Role
与多台控制器建立连接时,各个控制器具有名为Role(角色)的作用,Role可以分为:
- EQUAL
- MASTER
- SLAVE
默认的Role为EQUAL。当为EQUAL时,各个控制器具有相同的作用,也可以对OpenFlow交换机进行完全访问。EQUAL控制器可以对交换机发送Flow-Mod消息,变更交换机设置,在默认设置中,OpenFlow交换机向EQUAL控制器发送所有的异步消息。
对于MASTER控制器,具有和EQUAL相同的权限,但是一个拓扑中只能存在一个MASTER,一个OpenFlow交换机只能与一个MASTER控制器连接,同时,其他的控制器被置为SLAVE。
当交换机为SLAVE时,OpenFlow控制器只能对OpenFlow交换机进行Read-Only访问,只要不指定异步消息,将不能向SLAVE发送除Port-Status消息之外的消息。