SDN原理 OpenFlow协议 -2
本文由SDN原理视频而成:SDN原理
流表 FlowTable --- OpenFlow的核心
问题3 流表项 Flow Entry
单流表(OpenFlow 1.0版本) -> 多流表(OpenFlow 1.3版本)
组成1(OpenFlow 1.0):Header Fields | Counters | Actions
不同版本的OpenFlow协议的流表项 不一样。OpenFlow 1.0版本包括了包头域,计数器,动作三个部分。
流表项包头域 --- 匹配
可以看出来,除了进接口,传统OSI七层模型中2-4层的寻址信息都包含在报头域中了:目的IP地址,源IP地址,目的MAC地址,源MAC地址,端口号···
因此,流表约等于 路由表 + MAC地址表 + 端口号··· 包含了原有OSI七层所有的寻址信息。
也就是说:OpenFlow交换机 相比 传统网络的交换机 是一个比较模糊的概念,不再区分交换和路由;所以 OpenFlow交换机 可以广义理解为 OpenFlow转发设备 (路由器,交换机,防火墙)。
从小的方面来看,SDN交换机是一个传统意义上的OSI二层设备;从大的方面来看,它是一个”具有七层结构“(指的是 具有所有七层寻址信息)的交换机。
有新意的地方:取消了传统网络 中间路由 的分层结构 分层次进行匹配;把所有的信息一次性进行匹配。
计数器 --- 流量可视化
传统网络的计数器这一方面,是一个弱项;虽然TCP有 四个定时器:重传定时器,坚持定时器,2MSL定时器,保活定时器,IP有TTL字段,但是没有比较多的技术支持对数据流进行计数。
也就是说,在传统网络里面,你不知道通过每一个接口的流量具体有多少,在这条链路上已经跑了多少流量。
简单来说,就是流量可视化。
SDN需要支持流量可视化,方便管理人员和用户根据可视化的流量来指定一些策略:比如拥塞控制,提高链路带宽的利用率等等。
计数器 Counters 主要对每张表,每个端口,每个流进行计数:方便监管流量。
比如:经过这个端口已经有多少流量了?匹配这个流表项的数据报有多少了?这个表项 或者这张表 查找多少次了?
如果所有的交换机支持计数器,那么每一个交换机都根据计数器向控制器汇总流量信息,那么控制器就很容易生成一张全局的流量图,方便用户对流量进行监控和制定策略。
这是 SDN 中很核心的一点,很有新意的一点。
Actions 动作 流表项的关键 --- 按需修改
Action 动作 是对匹配该表项的流的操作。
传统网络的动作,就两种:要么进行转发,要么进行丢弃。而SDN中的动作,非常的多。
原因:OpenFlow协议需要支持 源目IP地址,源目MAC地址等等的 按需修改。
OpenFlow 1.0规定了必备动作(Required Actions),和可选动作(Optional Actions)。
必备行动1 -转发 Forward
- 泛洪选项,ALL -转发到所有出口(但不包括入口),相当于往所有接口泛洪。
- 给控制器,CONTROLLER -封装并转发给控制器
- 找本地,LOCAL -转发给本地网络栈
- 按表执行,TABLE -对要发出去的包执行流表内的动作
- 从哪里来从哪里去,IN_PORT -从入口发出
必备行动2 -丢弃 Drop
没有明确指明 处理行动 的表项,将匹配的所有分组默认丢弃。
可选行动1 -转发 Forward
- NORMAL -按照传统OSI七层模型中的第二层(源目MAC),或者是第三层(源目IP)进行转发。
- FLOOD -通过最小生成树从出口泛洪发出,不包括入口。
可选行动2 -入列 Enqueue
将包转发到 绑定某个端口的队列 中去;常用于管道限速。
非常重要的 可选行动3 -修改域 Modify-field
修改报头内容 这是和传统网络最大的区别:OpenFlow能够对报头信息进行修改。
很明显,OpenFlow所提供的流表,表项比传统网络路由表等 更加丰富,操作,执行动作比以前更加繁多。
组成2(OpenFlow 1.3):Match Fields | Priority | Counters | Instructions | Timeouts | Cookie
在1.3版本中:流表项包头域 -> 匹配域;多了一个 优先级;动作 -> 指令;增加了 超时时间 和 缓存信息。
从1.0版本开始,OpenFlow支持多流表:每张流表都有独立的序号,从序号最小的流表开始匹配,每张表进行独立的处理操作。
匹配域 -匹配
匹配域是之前1.0包头域的拓展,匹配内容除了OSI二到四层的寻址信息(MAC,IP,PORT)之外,多了MPLS,IPv6,PBB,Tunnel ID 等支持;1.0版本能匹配12个信息,1.3版本能够匹配39个信息。
这样做的原因,是为了尽量减小传统网络协议对SDN的影响;如果还有OpenFlow尚未支持的协议,那么就通过混合型网络来支持。当OpenFlow发展到支持匹配所有路由信息的时候,那么就可以摒弃掉原来传统网络路由转发的机制了。
趋势:传统路由选择协议 -> 混合协议(OpenFlow 与 传统路由选择协议 共存) -> OpenFlow协议 SDN时代。
优先级 -优先匹配
顾名思义,用于标志流表项匹配的优先次序,优先级越高 越早匹配,默认为0。
计数器 -流量可视化
和之前类似,主要对 流,表,端口 做统计,方便进行流量监管。
在原有基础上,加入了 每组,每个动作集的计数。
指令(这里只列举部分指令) 是之前动作的抽象 增加了非常多的内容
需要弄明白:动作,动作集,指令。
在新的版本中,指令相比动作增加了非常多的内容,因为引入了多流表的概念,所以多了很多的指令(动作,动作集,指令)。
必备指令:Write-Actions action(s):将指定的命令添加到命令集中。也就是说,命令不一定要马上执行,可以积累到命令集中,类似一个脚本,然后一起共同执行。
附加指令:Apply-Actions action(s):立即执行指定的动作,不改变行动集。
在1.3中,命令不一定马上执行:比如Drop,Next Table,Forward等等,它可以直接执行,也可以先 预缓存 到一个动作缓存中(或者说,动作集)。
附加指令:Clear-Actions:在动作集中 立即清除所有的行动。
举个例子,在 流 匹配了多个流表表项之后,通过指令积累了一定的动作,如果感觉到不是特别满意,就可以在下一个流匹配的表项中加入 Clear-Action 这个指令,清除掉之前积累的所有动作。
总的来说,1.3版本的流表项,所支持的逻辑需求 更加丰富。
在1.0版本的时候,动作是一个一个执行的,没办法集中处理;而1.3的话,允许动作集中执行,通过命令形成动作集,或者看这些动作不顺眼,用一个Clean-Actions清空命令集。
注意:
在1.3中,需要清楚的概念是:流表项中有指令Institution和动作Action之分,流表项中的指令 是用于影响动作的:比如通过指令将动作添加到动作集中,或者通过指令清空动作集。
而动作则是一系列对流的操作,比如丢弃,封装之后交给交换机,或者是转递到哪一条链路等等。
这也体现了SDN的一个理念:在原有平面上抽象出一个抽象层,比如我们这里就是从动作中抽象出指令,通过这个抽象层更加方便的进行管理与操作,就像图形界面之于命令行一样。
引用一段话,源自一篇博文SDN:软件定义网络
纵观计算机的发展历程,各方面都可以看到通过增加类似的虚拟化层次来提高生产效率的案例。比如高级语言之于汇编,比如图形界面之于命令行。这种添加层次的解决方案,总是能让问题得到更清晰的解决。
回到指令
在视频教学内,指令分成四块内容:第一块是指令,第二块是动作,它们之间的关系在上面的 注意 已经提及了。
那么第三块,是用来干嘛的呢?
既然,我们使用了第一块的指令,让第二块的动作添加或者是删除到动作集中,目的是为了更好的管理动作;那么当动作需要统一进行的时候,如何确定 动作集中的动作 的先后顺序呢?
比如动作集中 有两个动作添加了进来,一个是将流A封装交给控制器,另外一个是将流B丢弃,哪一个先执行呢?
类比于BGP协议,动态选路确定最优路的时候,有那么多的影响因素,如何确定这些因素影响的优秀级?
指令的第三块内容,就是用来干这个的:它们确定了动作集中动作执行的优先顺序。
指令部分 总结
行动集与每个报文相关,默认为空。
一个流表项可以通过 Clear-Action 和 Write-Action 两个指令来对行动集进行操作。
当一个表项的指令集没有包含 Goto-Table 指令的时候,流水线就停止了(即不用再去查找另外一张流表),然后报文的行动集就被执行。
注意:多张表的查找,叫做流水线处理。
交换机可以通过 Apply-Actions 修改动作执行顺序。
行动集包括所有的行动,无论它们以什么样的顺序加入到集中,执行的顺序始终按照优先级来进行。
我的理解:流找到对应的表项 -> 表项的指令 将表项的动作添加到动作集中/将动作执行 -> 由表项中的优先顺序(上面的第三部分)确定动作的执行顺序 -> 指令集中没有遇到 Goto-Table指令 按照顺序执行动作集中的动作
也就是说,表项中(1)有指令集,指令集中有 将动作抽象成逻辑层集中处理的指令(Write-Action & Clear-Action) 还有 定义先后顺序的指令;(2)有匹配执行的动作
超时时间 Timeout
用于标志该流表项的 老化时间,到了超时时间限制就删除,目的:节省内存资源。
附属信息 Cookies
由控制器选择的 不透明数据值,控制器使用Cookies来进行 过滤流的统计数据(计数器的相关信息),流改变,流删除。
但是,当处理单个数据报的时候,不能使用。
2016/9/7
SDN原理 OpenFlow协议 -2的更多相关文章
- SDN原理 OpenFlow协议 -1
本文基于SDN原理视频而成:SDN原理 OpenFlow OpenFlow 协议 和 传统的路由选择协议 有很多相似的地方,同时在某些地方也具有一定的颠覆性. 路由表,由IP地址和子网掩码组成.MAC ...
- SDN原理 OpenFlow协议 -4
通道 Channel 在前面的OpenFlow的内容中,我们提到了在交换层所采用的流表是控制层的Controller下发的,那么Controller是如何下发流表的呢?中间经过了哪些的流程和步骤?控制 ...
- SDN原理 OpenFlow协议 -3
问题4:流表匹配 OF1.1版本 这是OF1.1版本的操作,引入了多流表,1.0版本并没有多流表. 多流表的匹配称为 流水线处理:交换机从流表0开始查找,按照流表序号从小到大匹配. 每个包按照优先级去 ...
- SDN学习之OpenFlow协议分析
学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到现在的有所熟悉,经历了许多,也走了不少弯路,其中,最为忌讳的便是,我在学习过程中,尚未搞明白OpenFlow协议的情况下,便开始对S ...
- 传统二三层转发融合SDN Openflow协议的Hybrid交换机转发流程
Hybrid 交换系统(以下简称Hybrid 交换机)是交换机融合了OVS(Openflow vswitch)原生代码,集传统和Openflow 技术于一体的转发系统.主要解决纯Openflow 基于 ...
- SDN学习之Mininet验证OpenFlow协议版本
最近学习如何使用mininet,但是,刚刚开始时一直无法知道如何查看OpenFlow协议的版本,通过查阅网上的资料,从SDNLAB中,学习到了如何验证,mininet自身基于OpenFlow13版本的 ...
- [转]SDN与OpenFlow技术简介
http://blog.163.com/s_zhchluo/blog/static/15014708201411144727961/ 本文是2012年文章,对Openflow的发展.规范.应用和SDN ...
- SDN原理 控制层 Controller控制器
本文参照SDN原理视频而成:SDN原理 Controller 概念 从上面这个图片,我们能够知道,Controller 是一个非常重要的东西:承上启下,左右拓展. 从整个SDN的架构来看,控制器 处在 ...
- 实战录 | 基于openflow协议的抓包分析
<实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...
随机推荐
- js嵌套轮播图
$(function(){ var navLi = $(".top_nav").find("li"), conDiv = $(".top_con&qu ...
- iOS - 开发中调试小技巧
对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...
- hdu4975 网络流解方程组(网络流+dfs判环或矩阵DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4975 A simple Gaussian elimination problem. Time Limit: 20 ...
- 从零打造在线网盘系统之SSH框架整合
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
- spring-boot集成redis
application.properties #redis 配置 # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redi ...
- Laravel 5.7 No 'Access-Control-Allow-Origin' header is present on the request resource
前后端项目跨域访问时会遇到此问题,解决方法如下: 创建一个中间件 php artisan make:middleware EnableCrossRequestMiddleware 该中间件的文件路径为 ...
- 利用Dockerfile构建一个基于CentOS 7镜像
利用Dockerfile构建一个基于CentOS 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像. Dockerfile内容如下: FROM centosMAINTA ...
- python linux 自动补全 tab.py
#!/usr/bin/env python # python startup file import sys import readline import rlcompleter import ate ...
- 设计模式之——visitor模式
visitor模式,又叫访问者模式,把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类.这样,当需要增加新的处理时候,只需要编写新的 访问者类,让数据结构可 ...
- Alpine Linux配置使用技巧【一个只有5M的操作系统(转)】
Alpine Linux是一个面向安全应用的轻量级Linux发行版.它采用了musl libc和busybox以减小系统的体积和运行时资源消耗,同时还提供了自己的包管理工具apk. Alpine Li ...