OpenFlow

OpenFlow协议规范定义了OpenFlow交换机、流表、OpenFlow通道以及OpenFlow交换协议。

OpenFlow是第一个开放的南向接口协议,也是目前最流行的南向协议。它提出了控制与转发分离的架构,规定了SDN转发设备的基本组件和功能要求,以及与控制器通信的协议。

SDN与OpenFlow的关系

SDN与OpenFlow不是划等号的关系,而是SDN包含OpenFlow的关系。实际上,SDN有多种实现方案,在ONF SDN方案中OpenFlow充当南向接口的作用。
南向接口的定义是控制平面与数据平面之间进行交互的协议,南向接口除了可以采用OpenFlow外,还有许多别的协议,如OF-CONFIG、OVSDB、NETCONF、PCEP、XMPP等等

OpenFlow交换机

OpenFlow交换机转发面由两部分组成:端口和流表。一个交换机可以有很多种端口,也可以有很多级流表。

它主要由OpenFlow通道和数据平面组成,而数据平面又包括流表、端口、组表和Meter表等:
OpenFlow通道:用于交换机和控制器进行通信(基于OpenFlow交换协议)
流表:即存放流表项的表
端口:是OpenFlow与其他网络协议栈进行数据交换的网络接口,包括物理端口、逻辑端口以及预留端口等
组表:用于定义一组可被多个流表项共同使用的动作
Meter表:用于计量和限速

流表

流表用于存储流表项,多级流表以流水线的方式处理。

流表由若干条流表项(Flow Entry)组成,流表项结构如下图所示。
每个流表项由匹配域(包括输入端口、包头以及其他流表设置的元数据)、优先级、指令集、计数器、计时器、Cookie和用于管理流表项的flag组成:

匹配域(Match Fields):用于定义某条流,也是流表匹配的依据
指令(Instructions):表示对该条流应该如何处理
优先级(Priority):表示该流表项的优先匹配程度
计数器(Counters):用于统计该条流的信息
生存时间(Timeouts):表示流表项的有效存活时间
Cookie:控制器设置用来过滤被流统计、流修改和流删除操作请求影响的流表项
标志(Flags):用于流表项管理

流表项最为重要的两项为匹配域和指令与动作,当OpenFlow交换机收到一个数据包,将它包头解析后与流表中流表项匹配域进行匹配,匹配成功则执行指令,因此流表可以简化理解为key-value形式的{匹配域-指令}表。

匹配域:

OpenFlow提供丰富的匹配域字段来定义不同粒度的流,如可以基于目的IP地址定义一条流,也可以根据源IP地址 + 目的IP地址来定义一条流

指令与动作

一、指令(Instruction)是流表项匹配成功时的处理动作,分为三类

1、更新动作集(Action Set):添加、修改、清空动作集,前面两个对应Write-Actions指令,清空动作集对应Clear-Actions指令
2、修改流水线处理次序:从序号低的表跳转到序号高的表,对应Go-To-Table指令
3、其他:更新元数据以及设定触发器,分别对应Write-Metadata指令和Stat-Trigger指令

二、动作(Action)Action是指对数据包的具体处理动作,可分为两类

一类是定义数据包的转发,另一类是修改数据包包头字段

流表匹配过程

解析数据包得到的首部字段,用于与流表项匹配域进行匹配。若一个数据包与多个流表项匹配成功,最后只与优先级最高的流表项进行匹配。

匹配成功:

更新计数器,执行相应指令

匹配失败:

流表中没有设置Table-Miss流表项,匹配失败时,丢弃数据包
流表中设置有Table-Miss流表项(优先级为0且匹配域为ANY),则最后会匹配该表项,执行相应指令(如丢弃、交由控制器处理、交给下一张流表处理)

使用单流表转发数据包:

假设主机A发送数据包给主机B,使用单张流表的OF交换机处理数据包过程,如图所示
OF交换机从1端口接收数据包
OF交换机解析数据包首部,并查询流表进行流表匹配,匹配第一条流表项,并执行相应指令
将数据包转发到OF交换机的2端口

多级流表与流水线处理:

从OpenFlow1.1开始引入了多级流表和流水线处理机制,多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率。每张表都有序号,数据包通过跳转指令按照流表序号递增的方向在多个流表之间进行匹配,这样就构成了一条流水线,如下图所示,可见流水线处理是有方向的。流水线处理可以在OpenFlow交换机的入端口或出端口上进行,一般都在入端口出进行流水线处理。当流水线上只有一张流表时,就简化成单流表匹配的情况。

  • 流水线处理开始:OpenFlow交换机接收数据包后,执行入端口的流水线处理,同时给该流水线分配一个动作集(Action Set)
  • 流表匹配
    • 匹配成功

      更新相应流表项的计数器,完成对该条流的统计工作
      执行流表项对应的指令

    • 匹配失败:

      一个数据包可能在流表中与所有的流表项都不匹配或者匹配到Table-Miss流表项(优先级为0且匹配域为ANY),这两种情况都称为Table-Miss,对于前者,OpenFlow交换机将丢弃数据包;对于后者,OpenFlow交换机根据Table-Miss流表项,处理数据包(丢弃数据包、转发给控制器、交给下一个流表处理)

  • 流水线处理结束:若当前不是执行跳转指令,则执行动作集中的所有动作,完成对数据包的处理,然后结束流水线处理

多级流表实现对流的细粒度控制:

使用多级流表实现主机A发送到给主机B的所有TCP报文正常转发,UDP报文均丢弃,从而实现对不同流的细粒度控制

基本思想:

流表0中匹配主机A到主机B的IP流,然后跳转到其他流表,如流表2
流表2中在IP流的基础上进一步匹配TCP流或UDP流,根据要求将TCP流正常转发,UDP流丢弃

OpenFlow的两种下发流表方式

根据流表的安装时机,可分为Proactive方式和Reactive方式

Proactive

在数据包还未到达OpenFlow交换机前,SDN控制器就向OpenFlow交换机主动下发流表,这种方式相当于预置路由
例如Table-Miss表项,就需要采用Proactive方式在SDN控制器与OpenFlow交换机建立连接后下发,显示的指定数据包查表失败时,OpenFlow交换机的处理方式

Reactive

数据包到达OpenFlow交换机因查流表失败时,产生Packet-In消息询问SDN控制器,SDN控制器计算路由后下发流表到OpenFlow交换机,这种方式相当于按需下发路由,只有在有路由需求且查流表失败时,才会触发新的流表安装

组表

独立于流水线之外,每台OpenFlow交换机只有一张组表。组表(Group Table)由若干条组表项(Group Entry)组成,具有将多个端口定义为一个组的能力,从而实现广播、多播,负载均衡、链路聚合、故障转移等
组表项结构如图所示,定义了一到多个动作桶(Action Bucket),用于描述转发到指定端口前,对数据包的处理。

使用组表实现多播:

假设主机A使用多播方式向主机B和C发送IP数据包

计量表

对流进行测量,从而为流提供QoS功能,如限速、DiffServ
每台OpenFlow交换机只有一张计量表(Meter Table),由若干计量表项(Meter Entry)组成,每个计量表项可以定义一至多个计量带(Meter Band),计量带定义了带宽阈值和数据包处理方式(丢弃、DSCP标记)

对流进行限速:

假设对某条流X(目的IP地址:10.0.0.2)进行限速,且当前测得流X数据包的速率为1200kBps
流表匹配后,交由计量1处理
由于测得数据包速率1200kBps > 带宽阈值1000,根据计量带0定义的处理方式丢弃数据包,从而实现限速

OpenFlow消息

消息按照发送的位置可分为三大类,每一大类中有若干子消息

Flow-Mod消息

Flow-Mod消息用于流表操作,包括添加、删除、修改流表项。该消息由控制器下发给交换机,从而指导交换机对数据包的处理

Packet-In消息

Packet-Out消息

基于OpenFlow的SDN网络工作原理

传统网络中网络设备的工作过程

假设主机A向主机B发送IP数据包,且所有路由表和MAC地址表中都有该数据包的相应表项
路由器之间运行分布式路由协议构建路由表。查表成功则基于目的IP地址转发;查表失败时,丢弃数据包
交换机根据自学习算法构建MAC地址表。查表成功则基于目的MAC地址转发;查表失败时,除入端口外其余所有端口转发出去

基于OpenFlow的SDN网络中网络设备的工作过程

路由计算、转发规则(流表)下发由控制器完成
OF交换机只需要按照流表进行转发,查表失败时,通过Pacekt-In消息询问控制器

假设主机A向主机B发送IP数据包,且所有流表有该数据包相应表项
OpenFlow交换机查询流表来转发数据包,查表成功则基于匹配域(如目的IP地址+源IP地址)转发;查表失败时,则询问SDN控制器
流表由SDN控制器来构建

假设主机A向主机B发送IP数据包,且OpenFlow交换机中流表为空

OF交换机接收IP数据包
OF交换机解析数据包首部并查询流表,由于流表为空,不知道如何转发,因此需要询问控制器
OF交换机向控制器发送Packet-In消息
控制器为主机A发送给主机B的IP数据包计算路由
控制器向OF交换机下发流表,使用FlowMod消息承载流表信息,OF交换机接收该消息后安装流表
控制器向OF交换机发送Packet-Out消息,指示OF交换机按照刚安装好的流表转发IP数据包
OF交换机收到Packet-Out消息后转发数据包

路由器,交换机,OpenFlow交换机对包的转发处理

【博客450】OpenFlow学习相关推荐

  1. 今天开通android博客 该认真学习了

    今天开通android博客 该认真学习了  大家都支持我啊!!!!哈哈哈 转载于:https://www.cnblogs.com/tqj-zyy/archive/2011/08/23/tqj-zyy. ...

  2. 独上高楼望尽天涯路——以博客记录分享学习成长

    独上高楼望尽天涯路--以博客记录分享学习成长 以下是我科技节的一个小项目,之后会记录分享我完成这个小项目的学习过程和学习心得,以及相关知识点的学习总结. 小项目思路: 是采用stm32单片机对小车进行 ...

  3. SpringBoot 博客开发 个人学习(项目开始和前端页面)

    博客开发 前言 1.需求与功能 1.1 需求 1.2 功能 2.页面开发(非重点,可直接跳过看后台部分) ===>>前端展示页面 2.1 首页 2.2 详情页 2.3 分类页 2.4 标签 ...

  4. 上位机.net大佬博客大全-菜鸟学习上位机C#那些事儿

    小白菜摸索C#过程~ 大佬博客:http://www.tracefact.net/tech/重点推荐,C#程序编写规范.委托详解 任务定时器–FluentScheduler:http://www.su ...

  5. ESP32连接校园网,第一次接触网络通信,写一篇博客记录一下学习笔记。

    一.校园网服务器分析 我们的校园网,当我们连接上xxst时,处于它的局域网当中,只有我们获得认证授权之后才能访问外界网络,而认证授权这一操作对于单片机来说只不过是几行代码就能解决,而对于我没有系统学习 ...

  6. 【我的第一篇博客】——上个月学习总结(4月)

    大家好,我是monitor_sun 目录 前言 学习月总结 1.复盘上个月(4月)的学习成果 2.在本月/季度的学习过程中遇到的难题有哪些,是如何解决的,从中学到了什么? 3.有什么事情是自己一直想做 ...

  7. 大牛博客和各种学习资源

    昨晚和几个老同学小聚,聊得很开心.忘了到哪儿聊起一些牛人的博客,走得时候华仔还一直说要我一定记得把博客链接email给他.索性写个资源帖,记录一些我经常浏览的博客,并在此向所有提供,分享优秀资源的博主 ...

  8. 那些游戏开发牛人的博客和IT学习网站

    游戏大牛的博客 1.吴云洋(Cloud),网名云风,毕业于中南大学,原网易游戏核心成员.杭州研究中心总监,是网易<大话西游>.<梦幻西游>等游戏的重要开发者.2011年9月5日 ...

  9. 收藏的博客 -- Qt/C++学习

    Qt Creator环境: 使用Qt Creator作为Linux IDE,代替Vim:实现两台Linux电脑远程部署和调试(一台电脑有桌面系统,一台电脑无桌面系统) 使用Qt Creator作为Li ...

  10. (背包)剪辑的别人写的背包文章,转到自己博客上供以后学习使用

    背包问题--"完全背包"详解及实现(包含背包具体物品的求解) 分类: 背包问题2011-11-26 16:23 5820人阅读 评论(3) 收藏 举报 pathtable算法c优化 ...

最新文章

  1. Linux系统如何安装AutoFs挂载服务
  2. 表单重复提交的解决方法
  3. shopify api php 开发,Shopify插件开发基础篇-获取店铺信息
  4. sql array 数组基本用法(四)
  5. 推荐 GitHub 2K+ 星:前端监控工具 - webfunny 项目
  6. mongodb 群集图_群集和重叠条形图
  7. 将Teams app升级到net6
  8. Python爬虫用Selenium抓取js生成的文件(一)
  9. .network 中文文档_以太坊链下支付网络Raiden API中文文档
  10. Python中用字典的映射来代替switch语句
  11. 苹果官网再度开售iPhone SE:这是在为新品清库存了?
  12. SQL语句执行效率及分析
  13. 用Redis实现分布式锁 与 实现任务队列
  14. 修改postgresql库表的owner
  15. 职场人士,如何打造“自品牌”?
  16. IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间
  17. Excel 锁定特定单元格 不允许更改
  18. Edge检查更新时出错:无法连接到Internet。如果使用防火墙,请将 MicrosoftEdgeUpdate.exe 加入允许列表中。...
  19. 我只好去找了一根绳子系着它的脖子
  20. java 实现输出水仙花数

热门文章

  1. 深入理解JVM-内存模型
  2. 2022年软件测试工程师常见面试题,标准答案都在这
  3. 人工智能和机器学习之间的差异及其重要性,一定要分清楚!
  4. 遥远的救世主: 人从根本上要面对两个问题
  5. Linux系统应用 第八章 Shell编程入门
  6. 网络安全的学习路线是怎么样的?
  7. 解决端口8080被占用的问题!
  8. shell传参python脚本和获取返回值的探索方式
  9. expander菜单控件_AMZ建议扩展器「AMZ Suggestion Expander」
  10. 【Python】报错解决:SyntaxError: Non-ASCII character ‘\xe5‘ in file button.py on line 3, but no encoding