SDN网络技术:OpenFlow协议(1)

2023-05-16

本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程、网络技术、Linux内核及实操、容器技术等。欢迎大家关注,二维码文末可以扫。

导读:OpenFlow协议允许控制器直接访问和操作网络设备的转发平面,它是实现SDN网络转控分离的关键部分。通过OpenFlow协议,SDN控制器与数据转发层之间建立了一个标准的通信接口。本文将对其背景及组件进行详细介绍,OpenFlow的运行机制将放在下一篇文章进行介绍。


一、背景

转发和控制分离是SDN网络的本质特点之一。在SDN网络架构中,控制平面与转发平面分离,网络的管理和状态在逻辑上集中到一起,底层的网络基础从应用中独立出来,由此,网络获得前所未有的可编程、可控制和自动化能力。这使用户可以很容易根据业务需求,建立高度可扩展的弹性网络。要实现SDN网络的转控分离架构,就需要在SDN控制器与数据转发层之间建立一个标准通信接口。

2008年,斯坦福大学成立了一个名为Clean Slate的小组,这个小组在2009年开发出了一个可以满足SDN网络转控分离架构的标准,即OpenFlow 1.0。OpenFlow协议允许控制器直接访问和操作网络设备的转发平面,这些设备可以是物理设备,也可以是虚拟的路由器或者交换机。

OpenFlow 1.0问世后不久就引起了业界关注。2011年3月21日,德国电信、脸书、谷歌、微软、雅虎等公司共同成立的了ONF组织,旨在推广SDN,并加大OpenFlow的标准化力度。该组织陆续制定了OpenFlow 1.1、1.2、1.3、1.4等标准,目前仍在继续完善中。


二、OpenFlow组件

OpenFlow组件包含了OpenFlow交换机、OpenFlow控制器、用于连接设备和控制器的安全通道(Secure Channel)以及OpenFlow表项,具体可参考图1。其中OpenFlow交换机设备和OpenFlow控制器是组成OpenFlow网络的实体,要求能够支持安全信道和OpenFlow表项。

图1 OpenFlow组件

 

2.1、OpenFlow控制器

OpenFlow控制器位于SDN架构中的控制层,通过OpenFlow协议南向指导设备的转发。目前主流的OpenFlow控制器分为两大类:开源控制器和厂商开发的商用控制器。这里简要介绍几款较为知名的开源控制器。

1)NOX/POX

NOX是第一款真正的SDNOpenFlow控制器,由Nicira公司在08年开发,并且捐赠给了开源组织。NOX支持OpenFlow V1.0,并提供相关C++的API,采用异步的、基于时间的编程模型。

2)ONOS

ONOS控制器是由The OpenNetworking Lab使用Java及Apache实现发布的首款开源SDN网络操作系统,主要面向服务提供商和企业骨干网。ONOS的设计宗旨是实现可靠性强、性能好、灵活度高的SDN控制器。

3)OpenDaylight

OpenDaylight是一个Linux 基金合作项目,该项目以开源社区为主导,使用Java语言实现开源框架,旨在推动创新实施以及软件定义网络透明化。面对SDN型网络,OpenDaylight作为项目核心,拥有一套模块化、可插拔且极为灵活的控制器,还包含一套模块合集,能够执行需要快速完成的网络任务。

 

2.2、OpenFlow交换机

OpenFlow交换机由硬件平面上的OpenFlow表项和软件平面上的安全通道构成,OpenFlow表项为OpenFlow的关键组成部分,由Controller下发来实现控制平面对转发平面的控制。

一个OpenFlow交换机可以有若干个OpenFlow实例,每个OpenFlow实例可以单独连接控制器,相当于一台独立的交换机,根据控制器下发的流表项指导流量转发。OpenFlow实例使得一个OpenFlow交换机同时被多组控制器控制成为可能。

图2 OpenFlow交换机与控制器

 

OpenFlow交换机实际在转发过程中,依赖于OpenFlow表项,转发动作则是由交换机的OpenFlow接口完成。OpenFlow接口主要有三类,物理接口(比如交换机的以太网口)、逻辑接口(比如聚合接口、Tunnel接口)和保留接口(由转发动作定义的接口,实现OpenFlow转发功能)。


三、OpenFlow表项

OpenFlow的表项在V1.0阶段,只有普通的单播表项,也即我们通常所说的OpenFlow流表。随着OpenFlow协议的发展,更多的OpenFlow表项被添加进来,如组表(Group Table),计量表(Meter Table)等,以实现更多的转发特性以及QoS功能。

 

3.1、OpenFlow流表

狭义的OpenFlow流表是指OpenFlow单播表项,广义的OpenFlow流表则包含了所有类型的OpenFlow表项。OpenFlow通过用户定义的流表来匹配和处理报文。所有流表项都被组织在不同的Flow Table中,在同一个Flow Table中按流表项的优先级进行先后匹配。一个OpenFlow的设备可以包含一个或者多个Flow Table

 

(1)、流表项组成

一条OpenFlow的表项(Flow Entry)由匹配域(Match Fields)、优先级(Priority)、处理指令(Instructions)和统计数据(如Counters)等字段组成,流表项的结构随着OpenFlow版本的演进不断丰富,不同协议版本的流表项结构如下。

图3 流表项组成

 

1)Match Fields

流表项匹配规则,可以匹配入接口、物理入接口,流表间数据,二层报文头,三层报文头,四层端口号等报文字段等。

2)Priority

流表项优先级,定义流表项之间的匹配顺序,优先级高的先匹配。

3)Counters

流表项统计计数,统计有多少个报文和字节匹配到该流表项。

4)Instructions& Actions

流表项动作指令(Instructions& Actions)集,定义匹配到该流表项的报文需要进行的处理。当报文匹配流表项时,每个流表项包含的指令集就会执行。这些指令会影响到报文、动作集以及管道流程。交换机不需要支持所有的指令类型,并且控制器可以询问OpenFlow交换机所支持的指令类型。具体的指令类型参见下表:

                                                                                         表1流表项动作指令

Instruction

处理

Meter

对匹配到流表项的报文进行限速

Apply-Actions

立即执行Action

Clear-Actions

清除动作集(Action Set)中的所有Action

Write-Actions

更改动作集(Action Set)中的所有Action

Write-Metadata

更改流表间数据,在支持多级流表时使用

Goto-Table

进入下一级流表

每个流表表项的指令集中每种指令类型最多只能有一个,指令的执行的优先顺序为:

Meter –> Apply-Actions -> Clear Actions-> Write-Actions -> Write-Metadata -> Goto-Table

当OpenFlow交换机无法执行某个流表项中的动作时,该交换机可以拒绝这个流表项,并向Controller返回unsupported flow error信息。

常见Action动作的类型如下:

                                                                                          表2 Action动作

必选的

Output

转发到指定的OpenFlow端口

Drop

无直接动作,指令集中无output动作则丢弃该报文

Group

处理报文到指定Group

可选的

Set-Queue

设置报文的队列id

Push-Tag/Pop-Tag

写入/弹出标签例如VLAN, MPLS等

Set-Field

修改报文的头字段

Change-TTL

修改TTL,Hop Limit等字段

5)Timeouts

流表项的超时时间,包括了Idle Time和Hard Time。

Idle Time:在Idle Time时间超时后如果没有报文匹配到该流表项,则此流表项被删除。

Hard Time:在Hard Time时间超时后,无论是否有报文匹配到该流表项,此流表项都会被删除。

6)Cookie

Controller下发的流表项的标识

 

3.2、流表处理流程

OpenFlow规范中定义了流水线式的处理流程,报文匹配处理流程如下图所示:

图4 流表处理流程

 

当报文进入Switch后,必须从最小的Flow Table开始依次匹配。Flow Table可以按次序从小到大越级跳转,但不能从某一Flow Table向前跳转至编号更小的Flow Table。当报文成功匹配一条Flow Entry后,将首先更新该Flow Entry对应的统计数据(如成功匹配数据包总数目和总字节数等),然后根据Flow Table中的指令进行相应操作,比如跳转至后续某一Flow Table继续处理,修改或者立即执行该数据包对应的Action Set等。当数据包已经处于最后一个Flow Table时,其对应的Action Set中的所有Action将被执行,包括转发至某一端口,修改数据包某一字段,丢弃数据包等。具体实现时,OpenFlow交换机还需要对匹配表项次数进行计数、更新匹配集和元数据等操作。

图5 流表匹配流程

 

3.3、Table Miss表项

每个流表(Flow Table)都包含一个TableMiss流表项,该表项用于定义在流表中没有匹配的报文的处理方式,该表项的匹配域为通配,即匹配任何报文,优先级为0,Instructions与正常表项相同。通常,如果Table-Miss表项不存在,默认行为是丢弃报文。

 

3.4、Flow Remove

Flow Entry可以由Controller通过OpenFlow消息进行删除,也可以在IdleTime超时或者Hard Time超时后自动删除。Idle Time超时有两种情况:某个流表表项长时间不匹配报文则idle_timeout字段设置为非0;某个流表表项一定时间过后,无论是否匹配报文 hard_timeout字段设置为非0。如果Controller在建立表项时,携带了Flow Remove标记,则表项在删除时,设备需要通知Controller Flow Remove消息。


四、OpenFlow组表

OpenFlow组表的表项被流表项(Flow Entry)所引用,提供组播报文转发功能。一系列的Group表项组成了GroupTable,每个表项结构如图:

图6 OpenFlow组表

 

根据Group ID可检索到相应Group表项,每个Group表项包含多个动作Bucket,每个Bucket包含多个动作,Bucket内的动作执行顺序依照ActionSet的顺序。

 

4.1、OpenFlowMeter表

Meter计量表项被流表项(FlowEntry)所引用,为所有引用Meter表项的流表项提供报文限速的功能。一系列的Meter表项组成了MeterTable,每个Meter表项的组织结构如下:

图7 OpenFlow计量表

 

一个Meter表项可以包含一个或者多个MeterBands,每个Meter Band定义了速率以及动作,报文的速率超过了某些MeterBand,根据这些MeterBand中速率最大的那个定义的动作进行处理。

 

4.2、OpenFlow安全通道

OpenFlow设备与Controller通过建立OpenFlow信道,进行OpenFlow消息交互,实现表项下发,查询以及状态上报等功能。通过OpenFlow信道的报文都是根据OpenFlow协议定义的,通常采用TLS(Transport Layer Security)加密,但也支持简单的TCP直接传输。如果安全通道采用TLS连接加密,当交换机启动时,会尝试连接到控制器的6633 TCP端口(Openflow端口通常默认建议设置为6633)。双方通过交换证书进行认证。因此,在加密时,每个交换机至少需配置两个证书。

 

我的公众号「码农之屋」(id: Spider1818) ,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDN网络技术:OpenFlow协议(1) 的相关文章

  • 项目综合管理:CMMI和敏捷实践分析

    转自 http www examda com pm Know zonghe 20100507 105035776 html 由于上次已经说过CMMI与敏捷的关系在企业宏观面的思考 xff0c 这里只谈在企业实施层面的共同点和区别 一 共同点
  • MySQL 修改root用户密码和设置权限

    方法1 xff1a 用SET PASSWORD命令 mysql u root p mysql gt SET PASSWORD FOR 39 root 39 64 39 localhost 39 61 PASSWORD 39 newpass
  • A-Softmax(SphereFace)的总结及与L-Softmax的对比

    目录 1 A Softmax的推导 2 A Softmax Loss的性质 3 A Softmax的几何意义 4 源码解读 A Softmax的效果 与L Softmax的区别 引言 SphereFace在MegaFace数据集上识别率在2
  • keil编译不过的常见问题

    keil编译不过的常见问题 1 编码方式不统一编译报错例解决方法 改成同一编码方式 2 重复定义编译报错解决方法保证工程里只有一个含有main xff08 xff09 的c文件或者保证USER里只有一个含有main xff08 xff09
  • Chrome 无法携带跨站cookie的各种解决方案

    同源策略的历史及对应的解决方案 当页面内发起请求时 xff0c 会默认携带该域名下的cookie 而cookie同源策略是指 xff1a 除非当前域名和请求域名是同源 xff0c 才会默认携带cookie 这就导致 xff0c localh
  • 华为OJ_2129_素数伴侣

    输入 有一个正偶数N xff08 N 100 xff09 xff0c 表示待挑选的自然数的个数 后面给出具体的数字 xff0c 范围为 2 30000 输出 输出一个整数K xff0c 表示你求得的 最佳方案 组成 素数伴侣 的对数 输入
  • 深度学习-神经网络之函数拟合

    理论上神经网络可以拟合任意的函数 xff08 应该用逼近更贴切一些 xff09 定义好神经网 xff0c 送进去x和y xff0c 模型就学完了 但实际上 xff0c 远没有这么简单 不信 xff0c 我们来看个简单例子 拟合一个y 61
  • XServer基本概念 + x11vnc配置远程桌面

    前言 读研发论文难啊 xff0c 之前所有的blog都写在了自己的笔记本上 xff0c 因为觉的写的太好了浪费时间 xff0c 自己可以看懂就够了 xff0c 但是白岩松老师的 34 机会大多数取决于别人背后怎么评价你 34 和雄子的 将复
  • LCD1602按照5x7点阵显示字符,可显示一些简单的汉字

    xff01 本博客是 LCD1602自定义点阵字符 的学习笔记以及补 xff08 chao xff09 充 xff08 xie xff09 LCD1602能存8个自定义字符 首地址分别为0X40 0X48 0X50 0X58 0X60 0X
  • mysql修改root密码

    打开mysql命令终端 MySQL 8 0 Command Line Client xff0c 然后输入密码进入 紧接着输入如下命令 xff0c 可将密码更改为 rootcgcl alter user root 64 localhost i
  • Linux下vncviewer和vncserver的安装

    1 安装vncserver xff08 1 xff09 需要以root用户进行vncserver的安装 xff0c 命令行为 xff1a yum install tigervnc server xff08 2 xff09 安装vncview
  • 怎样把shell结果赋值给变量 | shell 中获取命令语句结果的方式

    怎样把shell结果赋值给变量 xff0c shell 中获取命令语句结果的方式 xff0c 通常采用以下两种方式 xff1a 1 执行符号方式 96 96 如 xff1a a 61 96 echo abc 96 echo a abc 2
  • CSS的替换元素

    CSS的 替换元素 xff1a 通过修改某个元素的属性值呈现的内容就可以被替换的元素 替换元素的特性 xff1a 内容不受页面上的CSS的影响 也就是样式表现在CSS作用域之外大部分有自己默认的尺寸 xff0c lt img gt 标签没有
  • Jack 服务编译问题 Android 7.0

    jack 服务常见错误解决方法 当你编译Android时 xff0c 你不需要修改任何内容 Jack是Andriod M的默认编译工具 只需使用标准的makefile命令执行即可 当第一次执行jack时 xff0c 它会在你的机器上启动一个
  • Tomcat+Nginx+HTTPS

    root 64 lb01 conf d cat etc nginx conf d proxy zrlog oldboy com conf upstream zrlog server 172 16 1 7 8080 server 172 16
  • PHP多进程异步处理复杂接口类似微服务(企业真实案例)

    需求 用户下单 推荐合师傅给用户 类似滴滴派单 场景 在线服务平台有各类技术师傅入驻 顾客在下单后需要根据在线师傅及顾客位置计算推荐总分排行后返回推荐的师傅给用户 问题 1 php fpm 框架 无法多线程工作 2 平台师傅有多个评分属性
  • Swoole数据库连接池分析及实现

    使用PHP swoole 由于其内存常驻及协程特性 一般是需要使用数据库链接池来减少链接创建的开支的 一个连接池的实现难点在哪 下面分析 1 如何判断是否该获取新的链接 A 默认规则一个协程对应一个数据库连接 同一个协程里应该返回同一个链接
  • Api接口数据安全及数据加密方式主要流程实现

    简述接口数据安全的主要实现方式 一 数据校验 常用算法 MD5 SHA1 流程 1 前端生成数据后按照约定方式生成一个sign 校验字段 一般通过MD5或者SHA1 方式 一并提交给后端 2 后端获得参数后通过同样的方式生成sign 然后跟
  • 简述PHP执行流程

    目的 xff1a 本文主要介绍PHP执行流程 目的是梳理php代码是如何最终转换成为机器二进制指令而被执行的 参考文章 xff1a https blog csdn net diavid article details 81035188 PH
  • Java为啥比PHP快?

    一直都说php比java要慢 今天从理论跟实际测试看看php是否真的慢 慢在哪里 一 运行模式对比 java 一般用java 语言开发的网站项目都是以命令行模式运行 部分可能以可执行文件 xff08 exe xff09 的形式运行 php

随机推荐

  • PHP微服务 hyperf+nacos使用

    PHP微服务 hyperf 43 nacos使用 这里简单说下微服务 及架构方面东西 1 微服务对php 43 fpm 模式意义不是很大 原因就是php 43 fpm 天生支持模块拆分 热更新 如果只是性能上的考虑 那php 43 fpm
  • PHP项目临时拓容Nginx负载均衡实操记录

    项目域名 test baidu com 服务器A 127 0 0 1 内网ip 原有服务器 服务器B 172 30 228 254 内网ip 需求 项目本在服务器A中正常运行 现在临时搞活动 需要拓容一台 多台服务器 在最小成本跟改动下完成
  • layui templet中html标签获取js全局变量方法

    开发中涉及layui中 xff0c 在使用到table的模板方法时templet xff0c 会遇到其内部除了使用table field xff08 此处通过d 来获取 xff0c 就不啰嗦了 xff09 然后如果想获取某个外部js中的全局
  • PHP分布式部署代码同步Git实现

    PHP 分布式部署后 代码自动同步实现 项目架构如下 需要更新代码时我们只需要把代码传到主服务器后通过定时任务主服务器自动push 代码到Git服务端 之后其他从服务器则自动从Git云端拉取最新的代码即可 需要用到 expect 软件 安装
  • nginx 负载均衡502问题

    项目架构 nginx 43 php fpm 负载均衡 负载均衡关键配置如下 引入负载均衡配置 include proxy conf 负载均衡 upstream test balance server 172 28 196 xxx 80 we
  • 用Android 动画 演示冒泡排序

    之前面试遇到的一道机试题 当时时间不够没有调出来 有时间把它整了一下 代码 public class MainActivity extends ActionBarActivity implements OnClickListener pri
  • 教你怎么阅读外文文献

    转载自 http www douban com group topic 14551517 NO 1 中科院大博士是如何进行文献检索和阅读的 xff08 好习惯受益终生 xff09 一 如何进行文献检索 我是学自然科学的 xff0c 平时确实
  • webpack打包时提示Invalid configuration object错误

    初学者如果是通过网上教程来学习webpack xff0c 第一次用webpack打包时通常会遇到下面这样的问题 xff1a 实际上出错信息已经说明了问题原因 xff1a Invalid configuration object Webpac
  • Maven核心概念(1)--坐标

    注 xff1a 转载时请注明原作者 lreis2010 及出处 http blog csdn net lreis2010 xff01 作者初次接触Maven是希望有一种方式能够自动化地管理项目中使用的Jar包 随着对于Maven的学习 xf
  • 【UML】四种关系

    一 在学习UML中的时候含有的四种关系是 xff1a 关联Association xff1a 是一种结构化的关系 xff0c 指一种对象和另一种对象有联系 xff0c 给定关联的两个类 xff0c 可以从其中的一个类的对象访问到另一个类的相
  • vnc,在windows系统上安装vnc,操作教程

    VNC是一款可以实现远程桌面控制 方面很实用的小工具 xff0c 今天给大家分享如何在在windows系统上安装vnc的操作方法 xff1a 小编在这里用到了 xff1a IIS7服务器管理工具来操作的 具体操作的如下 xff1a 一 首先
  • 51单片机手动自动智能窗户窗帘控制系统手动自动定时

    实践制作DIY GC 00 45 智能窗户窗帘控制系统 一 功能说明 xff1a 基于 51 单片机设计 智能窗户窗帘控制系统 二 功能介绍 xff1a STC89C52 AT89C52 系列最小系统板 43 5VUSB电源 43 ULN2
  • linux下 bash-completion 离线安装(Ubuntu或centos )

    bash completion 安装 实现k8s命令自动补全 xff0c 我们需要安装bash completion 在github下载离线包 下载地址解压 tar xvJf bash completion 2 11 tar xz 命令补全
  • ROS自定义地图(CAD、手绘等)

    0x00 概述 在前面的文章中 xff0c 我们介绍如何自动导航时 xff0c 都是基于使用gmapping或者hector mapping创建的地图 当然使用其他的建图方法创建的地图也可以 xff0c 但是目前为止 xff0c 无论使用哪
  • STM32 控制蜂鸣器播放音乐的原理和实例

    STM32 控制蜂鸣器播放音乐的原理和实例 本文通过将乐谱里的每个音符的声音频率和声音时长保存在两个数组里面 1 使用通用定时器TIM4实现无中断的微秒级延时函数 xff0c 控制每个音符的发声时长 2 使用系统滴答时钟Systick实现带
  • 影响力最大化——CELF算法的简介与python实现

    CELF算法是Leskovecl等人利用IC模型的子模特性对爬山贪心算法进一步改进得到的优化算法 子模函数的定义为 任意函数f 将有限集合映射为非负实数集并且满足收益递减特性即为子模函数 设集合s T xff0c 任意元素v添加到集合S中获
  • Qos队列调度算法(SP/WRR/DWRR)

    本文重点分析sonic中支持的三种Qos队列调度算法 xff1a 1 SP xff08 Strict Priority xff0c 严格优先级 xff09 也称为PQ xff08 Priority Queuing xff09 调度 xff0
  • python的MapReduce的应用案例

    在学习这个项目中用到许多数学公式 xff0c 有的自己不太懂 xff0c 所以上传上来进行实地应用 参考资料 generate train feature map py usr bin env python encoding 61 UTF
  • 索赔649亿!GitHub Copilot惹上官司,被指控侵犯代码版权,是开源社区“寄生虫”...

    大数据文摘授权转载自AI前线 整理 xff1a 刘燕 xff0c 核子可乐 一位 20 年老开源程序员 xff1a GitHub Copilot 就是开源社区的 寄生虫 GitHub 面临集体起诉 xff0c 索赔 647 亿 GitHub
  • SDN网络技术:OpenFlow协议(1)

    本文首发于我的公众号码农之屋 xff08 id Spider1818 xff09 xff0c 专注于干货分享 xff0c 包含但不限于Java编程 网络技术 Linux内核及实操 容器技术等 欢迎大家关注 xff0c 二维码文末可以扫 导读