学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到如今的有所熟悉,经历了许多,也走了很多弯路,其中,最为忌讳的即是,我在学习过程当中,还没有搞明白OpenFlow协议的状况下,便开始对SDN进行相关操做,今天写这篇博客,一方面是为了巩固我之前所学的东西,另外一方面,从新学习SDN相关的协议,以改正我以前的错误认知,固然,因为仍是初学者,仍会存在一些错误的认识,欢迎各位留言指正。缓存
OpenFlow协议的思路,即便网络设备维护一个FlowTable,而且只经过FlowTable对报文进行处理,FlowTable自己的生成、维护和下发彻底由外置的控制器Controller来实现。安全
此外,OpenFlow交换机把传统网络中,彻底由交换机/路由器控制的报文转换为由交换机和控制器来共同完成数据的网络
转发操做,从而实现数据的转发与路由控制的分离。控制器则经过事先规定好的接口操做OpenFlow交换机中的流表,从而达到数据转发的目的。异步
OpenFlow控制器与交换机的交互通讯图async
在OpenFlow交换机中,包含安全通道,多级流表和组表。经过安全通道,OpenFlow交换机能够和控制器创建基于OpenFlow协议的链接;而流表则用来匹配OpenFlow交换机收到的报文;组表用来定义流表须要执行的动做。ide
本文基于mininet和ryu,对OpenFlow协议报文进行分析。学习
OpenFlow协议主要是经过对不一样类型消息的处理来实现控制器与交换机之间的路由控制的。目前OpenFlow协议主要支持三种消息类型,分别是controller-to-switch、symmetric(对称型消息)以及asynchronous(异步消息类型)。每种消息类型分别对应多种事件,如异步消息类型中咱们最多见的PacketIn事件,也是咱们等下所主要阐述的事件。spa
OpenFlow协议所支持的三种消息类型orm
经常使用的消息主要是Hello消息、Feature消息,Echo消息,以及Packet_in、Packet_out和Flow_mod等。其中Hello、Feature、Echo消息分别包含REQUEST与REPLY消息,每个消息REQUEST与REPLY的Transaction ID相同,交换机经过ID进行识别对应事件端口。接口
在一般的交换机事件发生时,主要通过以下几个交互步骤:
OpenFlow协议下的交换机与控制器交互流程
其中,Hello消息是在OpenFlow初始化中就已经实现,基于ryu的消息获取,在我目前这个阶段还没有获知如何截获。而交换机特征报文以及PacketIn报文都可获取。OpenFlow协议的报文通常为以下格式:
OpenFlow协议基本报文格式
正如图中看到的,报文分为协议版本、消息类型、消息包(包括头部)长度、与包有关的事件ID(回复配对请求时使用相同的ID)以及所对应消息类型的报文信息。其中,不一样的消息类型所对应的 报文信息是不一样的。
为了更好的说明这一点,本文分别截获了PacketIn以及switch_features两种报文格式:
PacketIn报文
switch_features报文
显然,两种报文总的来看,形式相同,惟有最后一部分的格式不一样,这是因为不一样事件所致使的。报文的截取,能够经过在ryu控制器中,输出经OpenFlow协议描述后的msg消息获得。
而在总的消息报文中,触发的不一样事件,其最后一部分所对应的报文亦是不一样,以PacketIn报文为例,它的基本格式为:
PacketIn报文格式
PacketIn报文包含缓存ID号、控制器的标识符、数据、匹配字段、包被发送的缘由、被查询流表的标识符以及帧的全长。不一样的消息类型的报文,因为触发的消息不一样,所描述的信息不一样,故致使这部分报文存在差别,这一点经过比较所截获的两种报文信息能够看出。
报文的定义格式能够在相应的RYU源码中看到。