RYU实战,REST API流表控制(2)
前言
在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)相关推荐
- 实时获取SDN网络拓扑中交换机流表项的思路
一.引言 为了使对网络中异常流量的检测具有一定的主动性,例如实时的获取网络中的流表项,查阅论文和资料,提供以下几个思路. 二.通过ovs-ofctl命令 ovs-ofctl用来控制OVS作为OpenF ...
- ryu--北向接口(流表的操作以及多控制器流表信息互通)
实验目标: (1)实现网络拓扑的各个主机之间的相互通信 (2)实现各个自治域的控制器的流表获取(各个控制器的流表信息互通) (3)实现应用层对控制器的控制,进而实现对整个网络的控制 大致的实现效果如下 ...
- Mininet笔记-流表的增删查
查看流表 因为ryu控制器下发了流表,所以,已经存在了流表 dpctl:针对所有的交换机进行操作 添加流表.删除流表 添加流表:数据包从端口1进来,可以从端口2出去:从端口2进来,从端口1出去 流表有 ...
- Open vSwitch流表应用实战
本文参考:Open vSwitch流表应用实战 一个通过改变流表下发而实现的互相通信实验. 实验目的: 掌握Open vSwitch下发流表操作: 掌握添加.删除流表命令以及设备通信的原理. 原理:. ...
- Mininet+OVS:如何更改SDN交换机的流表条目上限
前言 流表是SDN交换机转发的重要环节.当一个不匹配的流量进入交换机时,交换机通过packet-in上报控制器,控制器以flow-mod应答,并在交换机中安装对应规则. OVS中提供了对于流表的支持, ...
- Flink异步io应用场景之流表join维表
简介 维度表,作为数据仓库里面的概念,是维度属性的集合,比如时间维.地点维:可以是一个mysql或者cassandra,redis等存储,甚至是自己定义的一些api. 流表是kafka等流式数据. 根 ...
- OpenFlow协议Open Flow交换机跟流表(FlowTable)
Open Flow协议.Open Flow交换机跟流表(FlowTable) 传统网络:传统网络的缺陷或者催生SDN的背景请参考链接https://www.cnblogs.com/031602523l ...
- 如何解决复杂条件下的程序流的控制问题?
帖子 http://www.cjsdn.com/post/view?bid=1&id=39182&sty=1&tpg=1&age=0 提出了一个程序设计中常常遇到的问题 ...
- Apache Flink 漫谈系列(06) - 流表对偶(duality)性
实际问题 很多大数据计算产品,都对用户提供了SQL API,比如Hive, Spark, Flink等,那么SQL作为传统关系数据库的查询语言,是应用在批查询场景的.Hive和Spark本质上都是Ba ...
最新文章
- SpringSecurity csrf验证忽略某些请求
- 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境
- 20170513 Python练习册0011过滤敏感词
- 【见闻录系列】浅谈搜索系统与推荐系统的一点区别
- mongoose schema Schema hasn't been registered for model
- 硬盘格式化怎么操作?
- 虫虫 5个衡量软件质量的标准(可自动化)
- 怎么把图片做成pdf文件?
- Swift 下标用法
- PyG 中Message Passing机制详解
- 【Cartopy】1.库的安装和使用
- lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录 | 求索阁
- promise Eslint sql传参方式 async-await
- AcWing 2041. 干草堆(一维差分)
- torch.bmm 函数
- 线性代数——正交矩阵
- Mac 系统下查看隐藏文件夹的方法
- 员工满意度调查如何分析改进?
- 声源定位c语言源代码,stm32声源定位.doc
- 15分钟用Java平台实现Springboot框架构建后端项目框架