OpenDaylight与Mininet应用实战之流表操作三
本文简要介绍在虚拟机环境下,主要目的是对Open vSwitch下发的流表操作,通过OpenDaylight与Mininet熟悉添加、删除流表的命令及设备通信的原理。
1 流表作用
在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。我们可以通过对流表操作来控制交换机的转发行为。下面简单介绍一下流表的基本操作。
2 环境准备
参考本专题前面两篇文章装好OpenDaylight(以下简称“ODL”)和Mininet的虚拟机环境。
3 Mininet连接ODL控制器
首先我们在已安装有相关环境的虚拟机终端中启动ODL和Mininet,Mininet创建一个默认树形拓扑并选择Mininet的控制器为ODL。ODL启动详见:OpenDaylight与Mininet应用实战之基本环境搭建(一)。
# mn –switch ovsk –controller=remote,ip=[ODL_IP],port=6633[默认端口]
在ODL的Web界面中我们可以看到已连接上ODL的交换机。
4 流表的简单操作
4.1 从终端对流表进行操作
新建一个终端查看当前交换机上的流表,返回值应为空。
root@ubuntu:/# ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
在Mininet中pingall一下,交换机下面的两台主机h1、h2应能互相通信,如果不能通信请检查交换机是否与ODL正确连接。
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (0/2 lost)
此时再查看交换机s1中流表应为两条。
root@ubuntu:/# ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=76.445s, table=0, n_packets=0, n_bytes=0, priority=1,ip,nw_dst=10.0.0.2 actions=mod_dl_dst:4a:d3:cf:8c:cc:4c,output:2
cookie=0x0, duration=76.49s, table=0, n_packets=2, n_bytes=196, priority=1,ip,nw_dst=10.0.0.1 actions=mod_dl_dst:46:bc:5d:64:2f:06,output:1
我们看到每条流规则由一系列字段组成,它们由基本字段、条件字段和动作字段三部分组成。有了流表后交换机就根据流表来进行数据包的操作,当然我们也可以人工的进行流表的新增、修改、删除操作。在我们这个环境下有两种方式对流表进行操作,一种是直接在终端下输入命令,另一种则是在ODL的Web界面下操作,相比而言第二种的图形化界面更加人性化一点。
例如让交换机丢弃从2号端口发来的所有数据包。
# ovs-ofctl add-flow s1 priority=1,in_port=2,actions=drop
增加这条流表以后,Mininet中h1和h2主机之间没有办法通信了。
mininet> pingall
*** Ping: testing ping reachability
h1 -> X
h2 -> X
*** Results: 100% dropped (2/2 lost)
我们再删除一条流规则:例如删除条件字段中包含in_port=2的所有流表。
# ovs-ofctl del-flows br0 in_port=2
因为我们之前添加的丢弃2号端口包的流表已被删除,这时Mininet中h1和h2主机又可以正常通信了。
4.2 通过ODL的Web界面进行流表操作
我们进入ODL的Web界面里面的Troubleshoot标签页,点击左侧Existing Nodes下对应交换机的Flows就能看到当前交换机上的流表。
切换至Flows标签页下,就可以进行流表的操作了。
点击Add Flow Entry根据字段填写相应的值,这里我们将来自1端口的包丢弃,输入一个流表名称,Node选择对应交换机,Input Port选择1端口s1-eth1(1),最后的Actions选择Drop。填写后点击Install Flow,流表便由控制器写入交换机了。这里一条流表中可以按顺序执行多个Action。
此时Mininet两台主机又无法通信了,将这条流表删除后两台主机便又可以正常通信。
5 总结
本文主要让读者对OpenFlow流表有更进一步的了解,简略介绍一些基本的流表操作。后续读者可以进行比如改写源和目标机的ip和mac地址、对数据包泛洪、回环等操作,用户可以根据需求通过修改流表来自主地控制转发行为,这本身也是SDN的初衷之一,也使得我们控制网络更加的便捷、灵活、多样。
- HDUOJ-----2175取(m堆)石子游戏
- Golang语言社区-Go语言递归
- go语言mongdb管道使用(一)
- HDUOJ---------2255奔小康赚大钱
- HDUOJ------1711Number Sequence
- HDUOJ---1712 ACboy needs your help
- HDUOJ---1867 A + B for you again
- HDUOJ--------1420Prepared for New Acmer
- PowerVM虚拟化环境下 CPU 利用率的监控与探究
- 虚函数中构造函数的调用顺序
- HDUOJ-----4512吉哥系列故事——完美队形I(LCIS)
- go语言mongdb管道使用(二)
- HDUOJ--4565 So Easy!
- Go 语言Map(集合)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 自定义方便kubectl中pods的管理
- R语言入门之切尾均值(trimmed mean)与绝对中位差(median absolute deviation,mad)
- 盘一盘 Python 特别篇 20 - SciPy 稀疏矩阵
- Spark 3.0.0-SNAPSHOT Access Kerberized HDFS
- Spark Nightly Builds
- R语言入门之基本统计量
- K8S 生态周报| Istio 已修复导致 Pod 崩溃的 bug
- Spark Kubernetes 的源码分析系列 - submit
- 如何交互可视化 Roam Research 局部笔记网络?
- Spark Kubernetes 的源码分析系列 - features
- Spark Kubernetes 的源码分析系列 - scheduler
- 简易Ramdisk 镜像制作(基于Centos7+)
- 在 K8S 部署一个 Spark History Server - 篇1
- R语言入门之非参数假设检验
- 在 K8S 部署一个 Spark History Server - 篇2