任务内容

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. Spring入门(一):创建Spring项目

    本篇博客作为Spring入门系列的第一篇博客,不会讲解什么是Spring以及Spring的发展史这些太理论的东西,主要讲解下如何使用IntelliJ IDEA创建第一个Spring项目以及通过一个示例 ...

  2. Servlet练习:实现增删改查的综合练习

    ---恢复内容开始--- 本文为原创,转载请注明出处:https://www.cnblogs.com/Tom-shushu/p/9383066.html 本篇内容主要介绍:通过Servlet,JSP, ...

  3. 从零学习Fluter(九):正式使用flutter进入商业开发

    一下为下个app 功能模块简要划分 接口文档需要说明 公告接口 messageTitle -- 消息内容 红包墙接口 使用说明 地理位置定位 shareGetMoney - 分享活动金额 lookCo ...

  4. live-server 介绍&安装

    live-server是可以运行前端静态文件的一个服务器,既然我们要前后端分离,所以就需要单独将html代码运行起来,这里我们选择live-server,等到后边真正部署的时候在用nginx js的解 ...

  5. vue 导出xlsx表功能

    详细步骤: 1.需要安装三个依赖: npm install -S file-saver xlsx npm install -D script-loader 两个命令行包含三个依赖. 2.项目中src下 ...

  6. kali的网络服务

    1.启动Apache: service apache2 start 关闭: service apache2 stop 将Apache2服务添加到自动启动的程序组里: update-rc.d apach ...

  7. 网络浅析(<<网络是怎么连接的>> 总结)

    概要 基本概念 网线 集线器 交换机 路由器 路由器和交换机 路由器和集线器 接入网 IP DNS 以太网 协议栈 网络连接过程 通信过程(浏览器 -> 服务器) 客户端和服务端 服务端的套接字 ...

  8. #033 信安培训基础题Python解决网络安全实验室|网络信息安全攻防学习平台

    第三题猜猜这是经过了多少次加密?分值: 200 加密后的字符串为:一大串 字符串最后面是= 所以是base64.b64decode编码究竟为啥有=就是base64咱也不知道 咱也不敢问咋解密也是从网上 ...

  9. June. 26th 2018, Week 26th. Tuesday

    No affection but interests can be found in the world of animals. 在动物的世界里,只有利益,没有感情. From Animal Worl ...

  10. 数据结构学习之栈求解n皇后问题

    数据结构学习之栈求解n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...