SDN学习之OpenFlow协议分析
学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到现在的有所熟悉,经历了许多,也走了不少弯路,其中,最为忌讳的便是,我在学习过程中,尚未搞明白OpenFlow协议的情况下,便开始对SDN进行相关操作,今天写这篇博客,一方面是为了巩固我以前所学的东西,另一方面,重新学习SDN相关的协议,以改正我之前的错误认知,当然,由于还是初学者,仍会存在一些错误的认识,欢迎各位留言指正。
OpenFlow协议的思路,即使网络设备维护一个FlowTable,并且只通过FlowTable对报文进行处理,FlowTable本身的生成、维护和下发完全由外置的控制器Controller来实现。
此外,OpenFlow交换机把传统网络中,完全由交换机/路由器控制的报文转换为由交换机和控制器来共同完成数据的
转发操作,从而实现数据的转发与路由控制的分离。控制器则通过事先规定好的接口操作OpenFlow交换机中的流表,从而达到数据转发的目的。

OpenFlow控制器与交换机的交互通信图
在OpenFlow交换机中,包含安全通道,多级流表和组表。通过安全通道,OpenFlow交换机可以和控制器建立基于OpenFlow协议的连接;而流表则用来匹配OpenFlow交换机收到的报文;组表用来定义流表需要执行的动作。
本文基于mininet和ryu,对OpenFlow协议报文进行分析。
OpenFlow协议主要是通过对不同类型消息的处理来实现控制器与交换机之间的路由控制的。目前OpenFlow协议主要支持三种消息类型,分别是controller-to-switch、symmetric(对称型消息)以及asynchronous(异步消息类型)。每种消息类型分别对应多种事件,如异步消息类型中我们最常见的PacketIn事件,也是我们等下所主要阐述的事件。

OpenFlow协议所支持的三种消息类型
常用的消息主要是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源码中看到。
SDN学习之OpenFlow协议分析的更多相关文章
- 实验3:OpenFlow协议分析实践
作业链接:实验3:OpenFlow协议分析实践 一.实验目的 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包: 能够借助包解析工具,分析与解释 OpenFlow协议的数据 ...
- OpenFlow协议分析
OpenFlow协议分析实验手册 启动虚拟机mininet 和 控制器 ODL 启动wireshark,在控制器的ens32 网卡抓包 使用mininet创建简单拓扑,并连接控制器,指定交换机为ovs ...
- 实验 5 :OpenFlow 协议分析和 OpenDaylight 安装
实验 5 :OpenFlow 协议分析和 OpenDaylight 安装 一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获 ...
- 软件定义网络实验记录⑤--OpenFlow 协议分析和 OpenDaylight 安装
一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内 ...
- 实验 5:OpenFlow 协议分析和 OpenDaylight 安装
一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接;通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...
- 实验 5:OpenFlow 协议分析和 OpenDaylight 安装
一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接:通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...
- SDN学习之Mininet验证OpenFlow协议版本
最近学习如何使用mininet,但是,刚刚开始时一直无法知道如何查看OpenFlow协议的版本,通过查阅网上的资料,从SDNLAB中,学习到了如何验证,mininet自身基于OpenFlow13版本的 ...
- 实战录 | 基于openflow协议的抓包分析
<实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...
- OpenFlow协议1.0及1.3版本分析
OpenFlow是SDN控制器和交换之间交流的协议,在SDN领域有着十分重要的地位. OpenFlow协议发展到现在已经经过了1.0.1.3.1.4等版本.其中1.0和1.3版本使用的是最为广泛的. ...
随机推荐
- spring定时器的使用
Spring定时任务在有的项目中起到很关键的作用,它允许你通过配置来指定特定时间去调用特定类的特定方法. 一. 分类 1.作业类需要继承特定的类.特定的类有: org.springframework. ...
- Linux云自动化运维第五课
Linux云自动化运维第五课 一.进程定义 进程就是cpu未完成的工作 二.ps命令 ps a ###关于当前环境的所有进程 x ###与当前环境无关的所有进程 f ###显示进程从属关系 e ### ...
- Linux之wc命令
wc - print newline, word, and byte counts for each file 为文件打印行数,字符数,字节数 参数: -l 仅列出行 -w 仅列出多少字(英文单字 ...
- pyqt系列原创入门教程
pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...
- Node.js服务端框架谁才是你的真爱
1. Express 背景: Express, 疯一般快速(而简洁)的服务端JavaScript Web开发框架,基于Node.js和V8 JavaScript引擎. Express 是一个基于 No ...
- 按条件生成j随机json包:randomjson
前端开发中,在做前后端分离的时候,经常需要手写json数据,有2个问题特别揪心: 1,数据是写死的,不能按一定的条件随机生成长度不一,内容不一的数据 2,写数组的时候,如果有很多条,需要一条一条地写, ...
- 《c#入门经典第五版》简介及pdf电子书网盘下载地址(收藏)
<C#入门经典(第5版)>全面讲解C# 2010和.net架构编程知识,为您编写卓越C# 2010程序奠定坚实基础.C#入门经典系列是屡获殊荣的C#名著和超级畅销书.最新版的<C#入 ...
- 如何快速将本地项目托管到到github上?
1,打开你的本地项目文件夹,比如 test-demo: 2,打开github(没有github的要自己注册下), 点击new repository 3,填写项目信息,创建项目 4,复制新建的项目url ...
- 第二章 Struts 2的应用
2.1 Struts 2的应用 2.1.1 使用步骤 1.创建web项目,添加jar包,创建helloWorld.jsp页面 2.创建HelloWorldAction ...
- 每天一个linux命令(63):Linux中zip压缩和unzip解压缩命令详解
文章转自:http://www.jb51.net/LINUXjishu/105916.html 1.把/home目录下面的mydata目录压缩为mydata.zipzip -r mydata.zip ...