OpenFlow
OpenFlow协议规范定义了OpenFlow交换机、流表、OpenFlow通道以及OpenFlow交换协议。
OpenFlow是第一个开放的南向接口协议,也是目前最流行的南向协议。它提出了控制与转发分离的架构,规定了SDN转发设备的基本组件和功能要求,以及与控制器通信的协议。
SDN与OpenFlow的关系
SDN与OpenFlow不是划等号的关系,而是SDN包含OpenFlow的关系。实际上,SDN有多种实现方案,在ONF SDN方案中OpenFlow充当南向接口的作用。
南向接口的定义是控制平面与数据平面之间进行交互的协议,南向接口除了可以采用OpenFlow外,还有许多别的协议,如OF-CONFIG、OVSDB、NETCONF、PCEP、XMPP等等
OpenFlow交换机
OpenFlow交换机转发面由两部分组成:端口和流表。一个交换机可以有很多种端口,也可以有很多级流表。
它主要由OpenFlow通道和数据平面组成,而数据平面又包括流表、端口、组表和Meter表等:
OpenFlow通道:用于交换机和控制器进行通信(基于OpenFlow交换协议)
流表:即存放流表项的表
端口:是OpenFlow与其他网络协议栈进行数据交换的网络接口,包括物理端口、逻辑端口以及预留端口等
组表:用于定义一组可被多个流表项共同使用的动作
Meter表:用于计量和限速
流表
流表用于存储流表项,多级流表以流水线的方式处理。
流表由若干条流表项(Flow Entry)组成,流表项结构如下图所示。
每个流表项由匹配域(包括输入端口、包头以及其他流表设置的元数据)、优先级、指令集、计数器、计时器、Cookie和用于管理流表项的flag组成:
匹配域(Match Fields):用于定义某条流,也是流表匹配的依据
指令(Instructions):表示对该条流应该如何处理
优先级(Priority):表示该流表项的优先匹配程度
计数器(Counters):用于统计该条流的信息
生存时间(Timeouts):表示流表项的有效存活时间
Cookie:控制器设置用来过滤被流统计、流修改和流删除操作请求影响的流表项
标志(Flags):用于流表项管理
流表项最为重要的两项为匹配域和指令与动作,当OpenFlow交换机收到一个数据包,将它包头解析后与流表中流表项匹配域进行匹配,匹配成功则执行指令,因此流表可以简化理解为key-value形式的{匹配域-指令}表。
匹配域:
OpenFlow提供丰富的匹配域字段来定义不同粒度的流,如可以基于目的IP地址定义一条流,也可以根据源IP地址 + 目的IP地址来定义一条流
指令与动作
一、指令(Instruction)是流表项匹配成功时的处理动作,分为三类
1、更新动作集(Action Set):添加、修改、清空动作集,前面两个对应Write-Actions指令,清空动作集对应Clear-Actions指令
2、修改流水线处理次序:从序号低的表跳转到序号高的表,对应Go-To-Table指令
3、其他:更新元数据以及设定触发器,分别对应Write-Metadata指令和Stat-Trigger指令
二、动作(Action)Action是指对数据包的具体处理动作,可分为两类
一类是定义数据包的转发,另一类是修改数据包包头字段
流表匹配过程
解析数据包得到的首部字段,用于与流表项匹配域进行匹配。若一个数据包与多个流表项匹配成功,最后只与优先级最高的流表项进行匹配。
匹配成功:
更新计数器,执行相应指令
匹配失败:
流表中没有设置Table-Miss流表项,匹配失败时,丢弃数据包
流表中设置有Table-Miss流表项(优先级为0且匹配域为ANY),则最后会匹配该表项,执行相应指令(如丢弃、交由控制器处理、交给下一张流表处理)
使用单流表转发数据包:
假设主机A发送数据包给主机B,使用单张流表的OF交换机处理数据包过程,如图所示
OF交换机从1端口接收数据包
OF交换机解析数据包首部,并查询流表进行流表匹配,匹配第一条流表项,并执行相应指令
将数据包转发到OF交换机的2端口
多级流表与流水线处理:
从OpenFlow1.1开始引入了多级流表和流水线处理机制,多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率。每张表都有序号,数据包通过跳转指令按照流表序号递增的方向在多个流表之间进行匹配,这样就构成了一条流水线,如下图所示,可见流水线处理是有方向的。流水线处理可以在OpenFlow交换机的入端口或出端口上进行,一般都在入端口出进行流水线处理。当流水线上只有一张流表时,就简化成单流表匹配的情况。
- 流水线处理开始:OpenFlow交换机接收数据包后,执行入端口的流水线处理,同时给该流水线分配一个动作集(Action Set)
- 流表匹配
- 匹配成功
更新相应流表项的计数器,完成对该条流的统计工作
执行流表项对应的指令
- 匹配失败:
一个数据包可能在流表中与所有的流表项都不匹配或者匹配到Table-Miss流表项(优先级为0且匹配域为ANY),这两种情况都称为Table-Miss,对于前者,OpenFlow交换机将丢弃数据包;对于后者,OpenFlow交换机根据Table-Miss流表项,处理数据包(丢弃数据包、转发给控制器、交给下一个流表处理)
- 流水线处理结束:若当前不是执行跳转指令,则执行动作集中的所有动作,完成对数据包的处理,然后结束流水线处理
多级流表实现对流的细粒度控制:
使用多级流表实现主机A发送到给主机B的所有TCP报文正常转发,UDP报文均丢弃,从而实现对不同流的细粒度控制
基本思想:
流表0中匹配主机A到主机B的IP流,然后跳转到其他流表,如流表2
流表2中在IP流的基础上进一步匹配TCP流或UDP流,根据要求将TCP流正常转发,UDP流丢弃
OpenFlow的两种下发流表方式
根据流表的安装时机,可分为Proactive方式和Reactive方式
Proactive
在数据包还未到达OpenFlow交换机前,SDN控制器就向OpenFlow交换机主动下发流表,这种方式相当于预置路由
例如Table-Miss表项,就需要采用Proactive方式在SDN控制器与OpenFlow交换机建立连接后下发,显示的指定数据包查表失败时,OpenFlow交换机的处理方式
Reactive
数据包到达OpenFlow交换机因查流表失败时,产生Packet-In消息询问SDN控制器,SDN控制器计算路由后下发流表到OpenFlow交换机,这种方式相当于按需下发路由,只有在有路由需求且查流表失败时,才会触发新的流表安装
组表
独立于流水线之外,每台OpenFlow交换机只有一张组表。组表(Group Table)由若干条组表项(Group Entry)组成,具有将多个端口定义为一个组的能力,从而实现广播、多播,负载均衡、链路聚合、故障转移等
组表项结构如图所示,定义了一到多个动作桶(Action Bucket),用于描述转发到指定端口前,对数据包的处理。
使用组表实现多播:
假设主机A使用多播方式向主机B和C发送IP数据包
计量表
对流进行测量,从而为流提供QoS功能,如限速、DiffServ
每台OpenFlow交换机只有一张计量表(Meter Table),由若干计量表项(Meter Entry)组成,每个计量表项可以定义一至多个计量带(Meter Band),计量带定义了带宽阈值和数据包处理方式(丢弃、DSCP标记)
对流进行限速:
假设对某条流X(目的IP地址:10.0.0.2)进行限速,且当前测得流X数据包的速率为1200kBps
流表匹配后,交由计量1处理
由于测得数据包速率1200kBps > 带宽阈值1000,根据计量带0定义的处理方式丢弃数据包,从而实现限速
OpenFlow消息
消息按照发送的位置可分为三大类,每一大类中有若干子消息
Flow-Mod消息
Flow-Mod消息用于流表操作,包括添加、删除、修改流表项。该消息由控制器下发给交换机,从而指导交换机对数据包的处理
Packet-In消息
Packet-Out消息
基于OpenFlow的SDN网络工作原理
传统网络中网络设备的工作过程
假设主机A向主机B发送IP数据包,且所有路由表和MAC地址表中都有该数据包的相应表项
路由器之间运行分布式路由协议构建路由表。查表成功则基于目的IP地址转发;查表失败时,丢弃数据包
交换机根据自学习算法构建MAC地址表。查表成功则基于目的MAC地址转发;查表失败时,除入端口外其余所有端口转发出去
基于OpenFlow的SDN网络中网络设备的工作过程
路由计算、转发规则(流表)下发由控制器完成
OF交换机只需要按照流表进行转发,查表失败时,通过Pacekt-In消息询问控制器
假设主机A向主机B发送IP数据包,且所有流表有该数据包相应表项
OpenFlow交换机查询流表来转发数据包,查表成功则基于匹配域(如目的IP地址+源IP地址)转发;查表失败时,则询问SDN控制器
流表由SDN控制器来构建
假设主机A向主机B发送IP数据包,且OpenFlow交换机中流表为空
OF交换机接收IP数据包
OF交换机解析数据包首部并查询流表,由于流表为空,不知道如何转发,因此需要询问控制器
OF交换机向控制器发送Packet-In消息
控制器为主机A发送给主机B的IP数据包计算路由
控制器向OF交换机下发流表,使用FlowMod消息承载流表信息,OF交换机接收该消息后安装流表
控制器向OF交换机发送Packet-Out消息,指示OF交换机按照刚安装好的流表转发IP数据包
OF交换机收到Packet-Out消息后转发数据包
路由器,交换机,OpenFlow交换机对包的转发处理