前言

在RYU API流表控制(1),我们介绍了如何通过RYU提供的REST API来获取流表项目,这一节,我们将探索如何使用REST来添加、删除、修改流表。

实验拓朴

控制器:RYU (192.168.1.196)
交换机:s1,s2
主机:h1,h2,h3,h3
联通性(直连):
h1<->s1;h2<->s1
h3<->s2;h4<->s2
s1<->s2
拓扑代码如下:

__author__ = 'jmh081701'
from mininet.topo import Topo
class MyTopo(Topo):def __init__(self):Topo.__init__(self)left=[]left.append(self.addHost("h1"))left.append(self.addHost("h2"))right=[]right.append(self.addHost("h3"))right.append(self.addHost("h4"))switchs=[]switchs.append(self.addSwitch("s1"))switchs.append(self.addSwitch("s2"))self.addLink(left[0],switchs[0])self.addLink(left[1],switchs[0])self.addLink(right[0],switchs[1])self.addLink(right[1],switchs[1])self.addLink(switchs[0],switchs[1])topos={'mytopo':(lambda : MyTopo())}

启动mn及控制器

初始联通性测试

(mininet)>pingall*** Ping: testing ping reachability
H1 -> H2 H3 H4
H2 -> H1 H3 H4
H3 -> H1 H2 H4
H4 -> H1 H2 H3
*** Results: 0% dropped (12/12 received)

ok.

获取当前流表,分析具体的拓扑结构:

删除当前流表:

URL:http://192.168.1.196:8080/stats/flowentry/clear/1
方法:delete
URL:http://192.168.1.196:8080/stats/flowentry/clear/2
方法:delete

获得S1的流表:

让h1 ping h2

mininet>h1 ifconfig
H1-eth0   Link encap:Ethernet  HWaddr f2:45:ed:50:45:f9  inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0···
mininet>h1 ping h2

URL: http://192.168.1.196:8080/stats/flow/1
方法:GET

{"1": [{"actions": ["OUTPUT:1"],"idle_timeout": 0,"cookie": 0,"packet_count": 7,"hard_timeout": 0,"byte_count": 574,"duration_sec": 12,"duration_nsec": 58000000,"priority": 1,"length": 96,"flags": 0,"table_id": 0,"match": {"dl_dst": "f2:45:ed:50:45:f9","in_port": 2}},{"actions": ["OUTPUT:2"],"idle_timeout": 0,"cookie": 0,"packet_count": 6,"hard_timeout": 0,"byte_count": 532,"duration_sec": 12,"duration_nsec": 54000000,"priority": 1,"length": 96,"flags": 0,"table_id": 0,"match": {"dl_dst": "ba:d9:2d:31:ba:73","in_port": 1}},{"actions": ["OUTPUT:CONTROLLER"],"idle_timeout": 0,"cookie": 0,"packet_count": 52,"hard_timeout": 0,"byte_count": 5739,"duration_sec": 73,"duration_nsec": 68000000,"priority": 0,"length": 80,"flags": 0,"table_id": 0,"match": {}}]
}

分析:
“f2:45:ed:50:45:f9”(h1) 与S1的1号口子直连
“ba:d9:2d:31:ba:73”(h2) 与S1的2号口子直连

获取S2 的流表

mininet>h3 ifconfig
H3-eth0   Link encap:Ethernet  HWaddr 6e:32:5b:d2:a5:cb  inet addr:10.0.0.3  Bcast:10.255.255.255  Mask:255.0.0.0···
mininet>h3 ping h4

让H3与H4互通
获取交换机2的流表项
URL: http://192.168.1.196:8080/stats/flow/2
方法:GET

{"2": [{"actions": ["OUTPUT:2"],"idle_timeout": 0,"cookie": 0,"packet_count": 3,"hard_timeout": 0,"byte_count": 182,"duration_sec": 7,"duration_nsec": 981000000,"priority": 1,"length": 96,"flags": 0,"table_id": 0,"match": {"dl_dst": "6e:32:5b:d2:a5:cb","in_port": 3}},{"actions": ["OUTPUT:3"],"idle_timeout": 0,"cookie": 0,"packet_count": 2,"hard_timeout": 0,"byte_count": 140,"duration_sec": 7,"duration_nsec": 978000000,"priority": 1,"length": 96,"flags": 0,"table_id": 0,"match": {"dl_dst": "8a:4f:1b:f4:b0:93","in_port": 2}},{"actions": ["OUTPUT:CONTROLLER"],"idle_timeout": 0,"cookie": 0,"packet_count": 55,"hard_timeout": 0,"byte_count": 6187,"duration_sec": 382,"duration_nsec": 843000000,"priority": 0,"length": 80,"flags": 0,"table_id": 0,"match": {}}]
}

得到的结论:

"6e:32:5b:d2:a5:cb"(h3) 与S2的2号口子直连
"8a:4f:1b:f4:b0:93" (h4) 与S2的3号口子直连

结论

上面的工作并非没有意义,通过流表,得到了各个主机的Mac地址,以及各个主机与交换机直连端口的关系,这对于接下来的实验很重要!尤其是匹配字段

流表增与改

添加流表

URL:http://192.168.1.196:8080/stats/flowentry/add
方法:POST
属性:
dpid:数据通路iD,简单理解就是交换机的ID,int
table_id:流表项所在的目标流表ID,简单理解就是把这个流表项加到那张表上去,int
idle_timeout:这个流表项空闲多久就失效,int
hard_timeout:这个流表项存活多久,int
priority:流表执行的优先级,int
match:匹配字段,dict
action:匹配后流所采取的动作,list of dict
重要的属性:
dpid,priority,match,action
举例:
添加 h1到h2的截断报文,也就是让h1无法ping通h2

{"dpid": 1,"cookie": 1,"cookie_mask": 1,"table_id": 0,"idle_timeout": 30,"hard_timeout": 3000,"priority": 11111,"flags": 1,"match":{"eth_src":"f2:45:ed:50:45:f9","eth_dst":"ba:d9:2d:31:ba:73"},"actions":[]}

这里 这个action为空,就可以截断h1发往h2的报文
测试 h1与h2之间的联通性:

mininet>H1 ping H2
mininet> H1 ping H2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable
From 10.0.0.1 icmp_seq=2 Destination Host Unreachable

ok,H1发往H2的已经阻端

修改流表

模糊修改

只匹配match,然后修改
URL: http://192.168.1.196:8080/stats/flowentry/add
方法:Get
举例:

{"dpid": 1,"cookie": 1,"cookie_mask": 1,"table_id": 0,"idle_timeout": 30,"hard_timeout": 3000,"priority": 11111,"flags": 1,"match":{"eth_src":"f2:45:ed:50:45:f9","eth_dst":"ba:d9:2d:31:ba:73"},"actions":[{ "type": "OUTPUT","port": 2}]}

把匹配域为”eth_src”:”f2:45:ed:50:45:f9”,”eth_dst”:”ba:d9:2d:31:ba:73”流表项都修改为从2号口子出,也就是恢复H1与h2之间的联通.

严格匹配

匹配Match与priority两个符合字段,匹配成功了才行。
举例:

{"dpid": 1,"cookie": 1,"cookie_mask": 1,"table_id": 0,"idle_timeout": 300,"hard_timeout": 4001,"priority": 11112,"flags": 1,"match":{"eth_dst":"ba:d9:2d:31:ba:73"},"actions":[]}

TIP:删除时 只要填好match字段与priority就可以

删除流表

模糊删除流表

URL: http://192.168.1.196:8080/stats/flowentry/delete
方法:POST
与模糊修改类似,match字段匹配即可

严格删除流表

URL: http://192.168.1.196:8080/stats/flowentry/delete_strict
方法:POST
与严格修改类似,match与priority同时匹配才删除

删除所有流表

上面的方法只是删除单个的流表项,如果要删除某个交换机所有的流表项则:
URL:http://192.168.1.196:8080/stats/flowentry/clear/x
删除交换机x的所有流表项,x是交换机的dpid
方法:POST

匹配字段用法:

openflow 1.3,1.1,1.2都可用

match 的各个字段,以dict的方式给出

其中主要的键可取:
in_port:报文的入端口,int
dl_src: 二层源地址(源MAC地址),”ff:ff:ff:ff:ff:ff”
dl_dst:目的MAC地址,”ff:ff:ff:ff:ff:ff”
dl_vlan:二层子网号,int
dl_vlan_pcp:二层子网优先级,int
dl_type:三层协议类型,如IP协议,IPv6协议,ARP协议.int

dl_type(自行转成为10进制) 协议类型
0x0800 IPv4
0x86DD IPv6
0x0806 ARP

nw_tos: ip服务类型

nw_tos 服务类型
0 普通 (Routine)
1 优先的
2 立即的发送 (Immediate)
3 闪电式的 (Flash)
4 比闪电还闪电式的 (Flash Override)
5 CRI/TIC/ECP
6 网间控制 (Internetwork Control)
7 网络控制 (Network Control)

nw_proto:ip协议上搭载的协议类型如 TCP,UDP

nw_proto 协议类型
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF

nw_src:源IP地址(IPv4).str.点分10进制,”192.168.1.1”
nw_dst:目的ip地址(IPv4)
tp_src:网络层源端口.int
tp_dst:网络层目的端口.int

如果要匹配更高层协议的内容,那么要从二层开始一直到高层
例如:匹配所有目的端口号为80的TCP报文:
match:
{
“dl_type”:2048,
“nw_proto”:6,
“tp_dst”:80
}
首先得保证是一个TCP数据报才行,否则流表将无效。

RYU实战,REST API流表控制(2)相关推荐

  1. 实时获取SDN网络拓扑中交换机流表项的思路

    一.引言 为了使对网络中异常流量的检测具有一定的主动性,例如实时的获取网络中的流表项,查阅论文和资料,提供以下几个思路. 二.通过ovs-ofctl命令 ovs-ofctl用来控制OVS作为OpenF ...

  2. ryu--北向接口(流表的操作以及多控制器流表信息互通)

    实验目标: (1)实现网络拓扑的各个主机之间的相互通信 (2)实现各个自治域的控制器的流表获取(各个控制器的流表信息互通) (3)实现应用层对控制器的控制,进而实现对整个网络的控制 大致的实现效果如下 ...

  3. Mininet笔记-流表的增删查

    查看流表 因为ryu控制器下发了流表,所以,已经存在了流表 dpctl:针对所有的交换机进行操作 添加流表.删除流表 添加流表:数据包从端口1进来,可以从端口2出去:从端口2进来,从端口1出去 流表有 ...

  4. Open vSwitch流表应用实战

    本文参考:Open vSwitch流表应用实战 一个通过改变流表下发而实现的互相通信实验. 实验目的: 掌握Open vSwitch下发流表操作: 掌握添加.删除流表命令以及设备通信的原理. 原理:. ...

  5. Mininet+OVS:如何更改SDN交换机的流表条目上限

    前言 流表是SDN交换机转发的重要环节.当一个不匹配的流量进入交换机时,交换机通过packet-in上报控制器,控制器以flow-mod应答,并在交换机中安装对应规则. OVS中提供了对于流表的支持, ...

  6. Flink异步io应用场景之流表join维表

    简介 维度表,作为数据仓库里面的概念,是维度属性的集合,比如时间维.地点维:可以是一个mysql或者cassandra,redis等存储,甚至是自己定义的一些api. 流表是kafka等流式数据. 根 ...

  7. OpenFlow协议Open Flow交换机跟流表(FlowTable)

    Open Flow协议.Open Flow交换机跟流表(FlowTable) 传统网络:传统网络的缺陷或者催生SDN的背景请参考链接https://www.cnblogs.com/031602523l ...

  8. 如何解决复杂条件下的程序流的控制问题?

    帖子 http://www.cjsdn.com/post/view?bid=1&id=39182&sty=1&tpg=1&age=0 提出了一个程序设计中常常遇到的问题 ...

  9. Apache Flink 漫谈系列(06) - 流表对偶(duality)性

    实际问题 很多大数据计算产品,都对用户提供了SQL API,比如Hive, Spark, Flink等,那么SQL作为传统关系数据库的查询语言,是应用在批查询场景的.Hive和Spark本质上都是Ba ...

最新文章

  1. SpringSecurity csrf验证忽略某些请求
  2. 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境
  3. 20170513 Python练习册0011过滤敏感词
  4. 【见闻录系列】浅谈搜索系统与推荐系统的一点区别
  5. mongoose schema Schema hasn't been registered for model
  6. 硬盘格式化怎么操作?
  7. 虫虫 5个衡量软件质量的标准(可自动化)
  8. 怎么把图片做成pdf文件?
  9. Swift 下标用法
  10. PyG 中Message Passing机制详解
  11. 【Cartopy】1.库的安装和使用
  12. lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录 | 求索阁
  13. promise Eslint sql传参方式 async-await
  14. AcWing 2041. 干草堆(一维差分)
  15. torch.bmm 函数
  16. 线性代数——正交矩阵
  17. Mac 系统下查看隐藏文件夹的方法
  18. 员工满意度调查如何分析改进?
  19. 声源定位c语言源代码,stm32声源定位.doc
  20. 15分钟用Java平台实现Springboot框架构建后端项目框架

热门文章

  1. 1009 美好的一天
  2. Sox切割脚本简单思路
  3. 一键解锁,宿舍管理隐藏技能
  4. 万兴剪刀手去水印教程_万兴神剪手怎么去水印 神剪手去水印操作详解
  5. 两点之间的最短距离是?
  6. python制作qq登录界面_Python制作一个仿QQ办公版的图形登录界面
  7. 密码技术---分组密码的模式
  8. BNN Pytorch代码阅读笔记
  9. 微信小程序canvas上传PHP,微信小程序画布 canvas
  10. ccc加拿大计算机竞赛在线评测系统,加拿大计算机竞赛简介