OpenFlow协议入门(通俗易懂!) |
您所在的位置:网站首页 › sdn控制器和sdn交换机如何连接 › OpenFlow协议入门(通俗易懂!) |
一、OpenFlow简介
OpenFlow由斯坦福大学Nick Mckeown教授提出,为SDN控制平面与数据平面之间提供通信接口标准,以实现SDN网络的转控分离架构。OpenFlow协议允许SDN控制器直接访问和操作数据平面中的网络设备,控制网络转发行为,数据平面采用基于流的方式进行转发。目前由ONF(Open Networking Foundation)负责推广和制定OpenFlow标准,截至本文发表时,最新版本为1.5.1。 可以说OpenFlow是SDN中非常重要的技术,以至于许多人(包括笔者在内)在谈及SDN时就自然联想到OpenFlow。但SDN与OpenFlow不是划等号的关系,而是SDN包含OpenFlow的关系。实际上,SDN有多种实现方案,在ONF SDN方案中OpenFlow充当南向接口的作用。南向接口的定义是控制平面与数据平面之间进行交互的协议,南向接口除了可以采用OpenFlow外,还有许多别的协议,如OF-CONFIG、OVSDB、NETCONF、PCEP、XMPP等等 三、基于OpenFlow的SDN网络工作原理 1、传统网络中网络设备的工作过程假设主机A向主机B发送IP数据包,且所有路由表和MAC地址表中都有该数据包的相应表项 路由器之间运行分布式路由协议构建路由表。查表成功则基于目的IP地址转发;查表失败时,丢弃数据包交换机根据自学习算法构建MAC地址表。查表成功则基于目的MAC地址转发;查表失败时,除入端口外其余所有端口转发出去![]() 假设主机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消息后转发数据包在介绍流表之前,需要先解释流的概念,流(Flow)就是具有相同特征的数据包集合。例如,源MAC地址为MAC_A,目的MAC地址为MAC_B的所有数据包集合就可以视为一条流,可见流具有方向性。有别于传统网络中路由器基于数据包独立转发的模式,使用OpenFlow的SDN网络是基于流进行转发的,即对相同特征的数据包集合采用同样的处理。 2、流表流表(Flow Table)是OpenFlow中最重要的一张表,它用于指导OpenFlow交换机对收到的数据包进行转发,相当于二层的MAC地址表和三层的路由表。在OpenFlow 1.1以后的版本中,每台交换机支持使用多张流表,构成流水线处理,从而完成对数据包更为复杂的处理。流表由若干条流表项(Flow Entry)组成,流表项结构如下图所示。 流表项最为重要的两项为匹配域和指令,当OpenFlow交换机收到一个数据包,将它包头解析后与流表中流表项匹配域进行匹配,匹配成功则执行指令,因此流表可以简化理解为key-value形式的{匹配域-指令}表。 (1)匹配域OpenFlow提供丰富的匹配域字段来定义不同粒度的流,如可以基于目的IP地址定义一条流,也可以根据源IP地址 + 目的IP地址来定义一条流。 指令(Instruction)是流表项匹配成功时的处理动作,分为三类 更新动作集(Action Set):添加、修改、清空动作集,前面两个对应Write-Actions指令,清空动作集对应Clear-Actions指令修改流水线处理次序:从序号低的表跳转到序号高的表,对应Go-To-Table指令其他:更新元数据以及设定触发器,分别对应Write-Metadata指令和Stat-Trigger指令动作(Action) Action是指对数据包的具体处理动作,可分为两类,一类是定义数据包的转发,另一类是修改数据包包头字段 解析数据包得到的首部字段,用于与流表项匹配域进行匹配。若一个数据包与多个流表项匹配成功,最后只与优先级最高的流表项进行匹配。 匹配成功,更新计数器,执行相应指令匹配失败 流表中没有设置Table-Miss流表项,匹配失败时,丢弃数据包流表中设置有Table-Miss流表项(优先级为0且匹配域为ANY),则最后会匹配该表项,执行相应指令(如丢弃、交由控制器处理、交给下一张流表处理)假设主机A发送数据包给主机B,使用单张流表的OF交换机处理数据包过程,如图所示 OF交换机从1端口接收数据包OF交换机解析数据包首部,并查询流表进行流表匹配,匹配第一条流表项,并执行相应指令将数据包转发到OF交换机的2端口从OpenFlow1.1开始引入了多级流表和流水线处理机制,多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率。每张表都有序号,数据包通过跳转指令按照流表序号递增的方向在多个流表之间进行匹配,这样就构成了一条流水线,如下图所示,可见流水线处理是有方向的。流水线处理可以在OpenFlow交换机的入端口或出端口上进行,一般都在入端口出进行流水线处理。当流水线上只有一张流表时,就简化成单流表匹配的情况。 使用多级流表实现主机A发送到给主机B的所有TCP报文正常转发,UDP报文均丢弃,从而实现对不同流的细粒度控制 基本思想: 流表0中匹配主机A到主机B的IP流,然后跳转到其他流表,如流表2流表2中在IP流的基础上进一步匹配TCP流或UDP流,根据要求将TCP流正常转发,UDP流丢弃根据流表的安装时机,可分为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定义的处理方式丢弃数据包,从而实现限速消息按照发送的位置可分为三大类,每一大类中有若干子消息 Controller-to-Switch消息:SDN控制器主动发送给OpenFlow交换机的消息 Features:用于获取交换机特性Configuration:用来配置和查询交换机参数Modify-State:用来修改交换机状态信息(增删改流表项、组表项等) Table-Mod消息Flow-Mod消息(流表操作,添加、删除、修改流表项)Group-Mod消息Port-Mod消息Meter-Mod消息Read-State:用来读取交换机状态信息(当前配置、统计信息等) Port-Stats消息Flow-Stats消息…Packet-Out:用来指定交换机将数据包从指定端口转发出去Barrier:在不同消息之间使用,确保操作顺序执行Role Request:控制器用于询问或设置自身在交换机中的角色,常用于交换机与多控制器连接的场景Asynchronous-Configuration:控制器设置异步消息过滤器,只接收感兴趣的异步消息,一般在多控制器场景下使用Asynchronous(异步)消息:OpenFlow交换机主动发送给SDN控制器的异步消息 Packet-In:将数据包交给控制器处理,一般流表匹配中出现Table-Miss时或流表项显示指定将数据包交给控制器时,触发该消息Flow-Removed:通知控制器,流表项被删除;流表项超时或控制器删除流表项时触发该消息(需要在交换机配置时使能该消息)Port-status :通知控制器,交换机端口状态发生变化Role-status:通知控制器,控制器在交换机中的角色发送变化Controller-Status:通知控制器,OpenFlow通道状态发生变化Flow-monitor:通知控制器,流表发送变化 Symmetric(对称)消息:可由SDN控制器或OpenFlow交换机主动发送的消息 Hello:建立控制器与交换机之间的OpenFlow通道Echo:检测交换机与控制器之间的连接状态或测量OpenFlow通道的时延和带宽Error:用于通告错误Experiment:用于实验,测试新特性![]() Flow-Mod消息用于流表操作,包括添加、删除、修改流表项。该消息由控制器下发给交换机,从而指导交换机对数据包的处理。其在OpenFlow1.3中的消息格式如下图所示。 Packet-In消息用于将OpenFlow交换机上指定数据包交给控制器处理,一般流表匹配中出现Table-Miss时或流表项显示指定将数据包交给控制器时,触发该消息。此外,它还能用于主动测量时回收探测包,从而结合Packet-Out消息实现对网络拓扑与链路时延的测量,其在OpenFlow1.3中的消息格式如下图所示。 Packet-Out消息用于指定交换机将数据包从指定端口转发出去。触发该消息的情况有两种:1.转发Packet-In消息携带的数据包 2.转发控制器主动构造的数据包(如用于链路发现的LLDP报文)。此外,由于该消息能够携带自定义数据包,控制器通过在Packet-Out消息中封装探测包并下发至指定交换机,就能够发起主动测量任务,配合Packet-In消息可实现对网络拓扑与链路时延的测量,其在OpenFlow1.3中的消息格式如下图所示。 如果觉得此篇文章有价值,希望可以一键三连,您的关注是我持续更新的动力~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |