OpenFlow Flow-Mod消息学习
任务内容
1、 熟悉Flow-Mod消息触发场景。
2、 掌握Flow-Mod消息格式和常用字段含义。
实验原理
OpenFlow 协议支持3种消息类型:Controller-to-Switch(控制器—交换机)、Asynchronous(异步)和Symmetric(对称),每一类消息又有多个子消息类型。
1、 Controller-Switch(控制器—交换机)消息,这类消息由控制器发起。包括Features、Configuration、Modify-State、Read-State、Send-Packet、Barrier等几类消息,用于对OF交换机的管理。
2、 Asynchronous(异步)消息,这类消息用来将网络事件或交换机状态的变化更新到控制器。主要包括4种子类型:Packet-in、Flow-Removed、Port-status和Error消息。
3、 Symmetric(同步)消息与前两类消息有所不同,Symmetric类的消息可由控制器或者OF交换机中的任意一侧发起,这类消息包括以下3种类型:Hello、Echo和Vendor。
Modify-State消息是OpenFlow消息中最为重要的消息类型,控制器通过Port-mod消息用来管理端口状态,通过Flow-mod消息增删交换机的流表项,考虑到流表在OpenFlow的重要意义,在此针对Flow-mod消息进行详尽分析。
图1是Flow-mod消息的具体格式,其主要字段含义介绍如下:
- 前4个字段,表示OpenFlow消息的通用报头。
wildcard字段,表示匹配时12元组的掩码位,被掩盖掉的元组不参加匹配。- 从
in_port到tp_dst字段,表示流表项12元组的信息。 cookie字段,在处理数据分组时不会用到,控制器通过该字段来过滤流的统计信息。command字段,表示对流表的操作,包括增加(Add)、删除(Delete)、修改(Modify)等。idle_time字段,表示当这条流表项在这段时间内没有匹配到数据分组,则该流表项失效。hard_time字段,表示自流表项下发后只要过了这段时间即刻失效。priority字段,表示该流表项被处理的优先级,原则上优先级越高,所属的Table号就越小。buffer_id字段,表示对应Packet-in消息的buffer_id。out_port字段,仅在command为Delete或者Delete Strict时有效,表明当某表项不仅匹配了Flow-mod中给出的12元组,且转发动作中指定端口等于该out_port的动作时才予以删除,即对删除操作的一种额外限制。flags字段,该字段为标志位,OpenFlow v1.0中包括3项:OFPFF_SEND_FLOW_REM(流表失效时是否向控制器发送Flow-removed消息),OFPFF_CHECK_OVERLAP(交换机是否检测流表冲突),OFPFF_EMERG(该流表项将被存于Emergency Flow Cache中,仅在交换机处于紧急模式时生效)。actions字段,该字段是个数组,表示要对满足过滤条件的流做的动作列表,actions[0]即代表其中第一个动作。

创建实验
选择控制器1,打开命令行终端,登录RYU控制器。执行ifconfig命令,查看控制器IP,如下图所示。

执行cd openlab/ryu/ryu/app命令,进入RYU主程序所在的文件位置。
执行如下命令,启动RYU控制器。
$sudo ryu-manager --verbose simple_switch_13.py ofctl_rest.py rest_topology.py

登录Mininet所在主机,执行ifconfig命令,查看Mininet所在主机的IP,如下图所示

控制器自动下发流表
登录RYU控制器,启动抓包工具Wireshark,捕获控制器与交换机建立连接后,控制器自动发送给交换机的flow_mod消息。执行以下命令:
$ sudo wireshark
双击enp0s17网卡,查看enp0s17网卡上数据包收发情况,如下图所示。

选择openflowV4过滤openflow13
登录mininet所在主机,连接控制器
$ sudo mn --controller=remote,ip=30.0.1.3,port=6633

登录RYU控制器,停止Wireshark,观察数据包列表。

可以看到控制器会发出flow_mod消息,该消息的Commend为ADD,表示添加流表项。整个消息可以分为三部分:openflow主体部分、match部分、instruction部分,其中instruction部分可以省略。match部分是匹配条件,instruction部分是指令,当一个数据包满足匹配条件就会执行instruction中的指令。控制器发送的add消息中action为output,而output的端口是controller,也就是说让交换机将符合匹配要求的数据包都转发给控制器,如下图所示。

手动下发流表
步骤1 选择控制器1,打开命令行终端,登录RYU控制器,执行sudo wireshark命令,启动Wireshark。
步骤2 在控制器中再打开一个Terminal,输入以下命令获取交换机DPID,如下图所示。
$ curl http://localhost:8080/stats/switches

步骤3 添加流表项,执行以下命令,具体命令如下所示。
$ curl -X POST -d '{"dpid": 1, "cookie": 1, "cookie_mask": 1,"table_id": 1,"idle_timeout": 300,"hard_timeout": 300,"priority": 35,"flags": 1,"match":{"in_port":1},"actions":[{"type":"OUTPUT","port": 2}]}' http://localhost:8080/stats/flowentry/add
dpid的值就是上面获取到交换机的DPID,priority是流表项的优先级,默认值是32767,最大值也是32767。本例中,可以理解为“将交换机port1端口接收到的数据包都从port2转发出去”。

步骤5 执行以下命令,修改流表项1的优先级和action。
$ curl -X POST -d '{"dpid": 1, "cookie": 1, "cookie_mask": 1, "table_id": 1, "idle_timeout": 300, "hard_timeout": 300, "priority": 30, "flags": 1, "match":{"in_port":1},"actions":[]}' http://localhost:8080/stats/flowentry/modify_strict
步骤6 查看对应的flow_mod消息,Commond是MODIFY_STRICT,MODIFY_STRICT类型息用来修改某一条指定的流表项。从消息可以看出被修改的流表项的priority是30,匹配条件是in_port为1,如下图所示。

步骤7 执行以下命令,删除流表项1。
$ curl -X POST -d '{"dpid": 1, "cookie": 1, "cookie_mask": 1, "table_id": 1, "idle_timeout": 300, "hard_timeout": 300, "priority": 30, "flags": 1, "match":{"in_port":1},"actions":[]}' http://localhost:8080/stats/flowentry/delete_strict
步骤8 查看对应的flow_mod消息,Commend是DELETE_STRICT,DELETE_STRICT类型消息表示删除某一条指定的流表项。该消息表明删除的流表项的priority是30,匹配条件是in_port为2,如下图所示。

OpenFlow Flow-Mod消息学习的更多相关文章
- RocketMQ事务消息学习及刨坑过程
一.背景 MQ组件是系统架构里必不可少的一门利器,设计层面可以降低系统耦合度,高并发场景又可以起到削峰填谷的作用,从单体应用到集群部署方案,再到现在的微服务架构,MQ凭借其优秀的性能和高可靠性,得到了 ...
- RabbitMQ延迟消息学习
准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...
- mod性质 学习笔记
mod性质小结 \(a\equiv b(\mod m)\) $ \rightarrow \( \)a-b=k*m,k\in Z$ \(a\equiv b且c\equiv d(\mod m)\) \(\ ...
- OpenFlow协议1.0及1.3版本分析
OpenFlow是SDN控制器和交换之间交流的协议,在SDN领域有着十分重要的地位. OpenFlow协议发展到现在已经经过了1.0.1.3.1.4等版本.其中1.0和1.3版本使用的是最为广泛的. ...
- OpenFlow 交换机与控制器交互步骤
1. Hello 控制器与交互及互相发送 Hello 消息.Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的 ...
- RYU 灭龙战 third day
RYU 灭龙战 third day 前言 传统的交换机有自学习能力.然而你知道在SDN的世界里,脑子空空的OpenFlow交换机是如何学习的吗?今日说法带你领略SDN的mac学习能力. RYUBook ...
- ryu—交换机
1. 代码解析 ryu/app/example_switch_13.py: from ryu.base import app_manager from ryu.controller import of ...
- OpenFlow Switch学习笔记(三)——Flow Tables
这次我们主要讨论下OpenFlow Switch的核心组件之一——Flow Tables,以了解其内部的 matching 以及 action handling 机制.下文将会分为几个部分来逐步详述O ...
- OpenFlow Switch学习笔记(七)——Matching Fields
Matching Fields in_port=port Matches OpenFlow port port dl_vlan=vlan Matches IEEE 802.1q Virtual LAN ...
随机推荐
- 简简单单的Vue3(插件开发,路由系统,状态管理)
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...
- jQuery(四)、文档处理
1 内部插入 1.1 append(content | fn) 向每个匹配的元素内部追加内容. 参数: (1) content:要追加到目标中的内容. (2) function(index, html ...
- 前端_Bootstrap简单使用
首先说一下简单使用方法: 1.首先上官网下载Bootstrap(就是一些js文件和一些css文件) ,网址: https://v3.bootcss.com/getting-started/#downl ...
- NLog组件
接触.net项目的同志们都清楚,最初在项目中记录日志常用的是log4net日志组件,随着.net框架的不对优化升级,最近新流行的日志框架nlog,下面我就对nlog组件说说自己的认知: 下载 通过Nu ...
- css3自适应布局单位vw,vh你知道多少?
视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Vi ...
- MongoDB学习(管理数据库和集合)
管理数据库 显示数据库列表 show dbs 切换到其他数据库 use <database_name> 创建数据库 MongoDB没有提供显式的创建数据库的MongoDB shell命令. ...
- C#中try catch finally 用法
1.将预见可能引发异常的代码包含在try语句块中. 2.如果发生了异常,则转入catch的执行. catch有几种写法: catch 这将捕获任何发生的异常. catch(Exception e) ...
- 工具资源系列之给mac装个虚拟机
mac 系统安装虚拟机目前有两种主流软件,一种是 Parallels Desktop ,另一种是 vmware. 本教程选用的是 vmware ,因为我之前 windows 上安装的虚拟机软件就是vm ...
- 详细QRCode生成二维码和下载实现案例
using System; using System.Collections.Generic; using System.Linq; using System.Web; using ThoughtWo ...
- 【Linux】【MySQL】CentOS7、MySQL8.0.13 骚操作速查笔记——专治各种忘词水土不服
1.前言 [Linux][MySQL]CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行) 专治各种忘词,各种水土不服. - -,就是一个健忘贵的速查表:(当然不包括SQL的 ...