任务内容

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_porttp_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的值就是上面获取到交换机的DPIDpriority是流表项的优先级,默认值是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消息学习的更多相关文章

  1. RocketMQ事务消息学习及刨坑过程

    一.背景 MQ组件是系统架构里必不可少的一门利器,设计层面可以降低系统耦合度,高并发场景又可以起到削峰填谷的作用,从单体应用到集群部署方案,再到现在的微服务架构,MQ凭借其优秀的性能和高可靠性,得到了 ...

  2. RabbitMQ延迟消息学习

    准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...

  3. mod性质 学习笔记

    mod性质小结 \(a\equiv b(\mod m)\) $ \rightarrow \( \)a-b=k*m,k\in Z$ \(a\equiv b且c\equiv d(\mod m)\) \(\ ...

  4. OpenFlow协议1.0及1.3版本分析

    OpenFlow是SDN控制器和交换之间交流的协议,在SDN领域有着十分重要的地位. OpenFlow协议发展到现在已经经过了1.0.1.3.1.4等版本.其中1.0和1.3版本使用的是最为广泛的. ...

  5. OpenFlow 交换机与控制器交互步骤

    1. Hello 控制器与交互及互相发送 Hello 消息.Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的 ...

  6. RYU 灭龙战 third day

    RYU 灭龙战 third day 前言 传统的交换机有自学习能力.然而你知道在SDN的世界里,脑子空空的OpenFlow交换机是如何学习的吗?今日说法带你领略SDN的mac学习能力. RYUBook ...

  7. ryu—交换机

    1. 代码解析 ryu/app/example_switch_13.py: from ryu.base import app_manager from ryu.controller import of ...

  8. OpenFlow Switch学习笔记(三)——Flow Tables

    这次我们主要讨论下OpenFlow Switch的核心组件之一——Flow Tables,以了解其内部的 matching 以及 action handling 机制.下文将会分为几个部分来逐步详述O ...

  9. OpenFlow Switch学习笔记(七)——Matching Fields

    Matching Fields in_port=port Matches OpenFlow port port dl_vlan=vlan Matches IEEE 802.1q Virtual LAN ...

随机推荐

  1. hive基本操作与应用

    通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果 ...

  2. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  3. AndroidStudio使用问题记录

    问题: Gradle sync failed: Connection timed out: connect Consult IDE log for more details (Help | Show ...

  4. 用 Python 描述 Cookie 和 Session

    这篇文章我们来聊聊Cookie和Session,网上有很多关于这两个知识点的描述,可惜的是大部分都没有示例代码,因此本文的重点在于示例代码. 环境 Python3.6.0 Bottle0.12.15 ...

  5. Vcenter 账户密码过期设置修改

    Vcenter 安装完后,账户的密码过期时间是90天,如果不进行修改90天后就会过期,不能登录,这样对日常的定时任务影响比较大. 如何进行修改呢? 对于Vcenter 6.0 ,修改密码过期设置只能使 ...

  6. 配置用户Log on as service

    Logon to the computer with administrative privileges. Open the ‘Administrative Tools’ and open the ‘ ...

  7. selenium之表格的定位

    浏览器网页常常会包含各类表格,自动化测试工程师可能会经常操作表格中的行,列以及某些特定的单元格,因此熟练掌握表格的定位方法是自动化测试实施过程中必要的技能. 被测试网页的HTML代码 <!DOC ...

  8. LA3971 组装电脑

    思路:二分,就是在不超过b的预算下,使得品质的最小值最大化.关键还是判断函数吧. 假设答案为x,判断函数,就是每一个种类的配件的品质最基本的品质要大于x,然后找出最小的值.这样的配件品质之和的价格要小 ...

  9. tensorflow 训练之tensorboard使用

    1.add saclar and histogram tf.summary.scalar('mean', mean) tf.summary.histogram('histogram', var) 2. ...

  10. 二)Spring AOP编程思想与动态代理

    一.aop编程思想 1.面向切面,就是能够不动源码的情况下,从横切面切入新的代码功能. 2.实现原理是动态代理 动态代理的步骤 a.写生产厂家,实现接口,代理只能代理接口 b.动态代理类实现Invoc ...