OpenFlow 协议
OpenFlow是一种新型的网络协议,它是控制器和交换机之间的标准协议。
自2009年底发布1.0版本后,OpenFlow协议又经历了1.1、1.2、1.3及1.4版本的演进过程,
目前使用和支持最多的是1.0和1.3版本。
OpenFlow1.3在1.0版的基础上进一步优化及升级,其中添加了很多新的特性及消息,
如支持多个流表(flow table)、组表(group table),支持多控制器等。
一个流表中包含多个流表项,OpenFlow v1.3中流表项主要由7部分组成,
分别是:
匹配域(用来识别该条表项对应的flow)
优先级(定义流表项的优先顺序)
计数器(用于保存与条目相关统计信息)
指令(匹配表项后需要对数据分组执行的动作)
Timeouts、Cookie、Flags.
流表项图
与OpenFlow v1.0不同的是,OpenFlow v1.3协议中一台OF交换机会有多张流表。具体匹配流程如下图所示。
当一个数据包到达交换机,从数据包中提取匹配字段从第一个流表开始 查找 匹配,匹配字段取决于数据包的类型。
通常包括各种数据包的头字段。
例如:以太网源地址或ipv4的地址等.
此外 ,还可以对数据包关联的字段(如交换机14的入端口等)进行匹配 。
如果数据包和流表项匹配成功 ,则更新计数器并执行流表项中的指令。
如果该流表项使用GOTO指令指向某一其他流表,则执行完本次指令的数据包以及动作集、
元数据等信息转到GOTO指令指向的流表进行下一步的匹配(也就是图中的跳转到Table n?);
若未指向另一流表则执行动作集,此时流水线处理成功。
如果在某个流表中并未匹配成功,则查找该流表中是否存在table-miss流表项
( 流表中的table-miss流表项指定如何处理未匹配成功的数据包).
如果存在table-miss流表项,则按该流表项中的指令执行,如丢弃数据包、
将数据包转到另外一个流表或者发送给控制器(即通过Packet_In消息传递给控制器,
由控制器制定数据包的转发策略而后通过Packet_Out消息下发流表给交换机)等;
如果在流表中并未匹配成功,并且该流表项中不存在table-miss流表项,那么交换机将会丢弃该数据包。
OpenFlow协议在工作中使用 GOTO指令从一 张流表转到另 一 张流表 ,该技术被称为多级流表技术 。
SDN控制器的路由原理:
OpenFlow协议定义了交换机在报文匹配失败时向控制器申请流表的方法,
当交换机收到一个不能被当前流表各条流匹配的数据包时,通过将失配
报文的相关信息封装在Packet-In消息中发送给控制器,让控制器知晓
报文失配情况,由控制器通过Flow-Mod等消息向交换机安装新流表。
笔记来源于: (54条消息) OpenFlow 协议详解(干货)_dwj_daiwenjie的博客-CSDN博客_openflow协议