精华内容
下载资源
问答
  • 2019-08-21 14:06:58

    OpenFlow,一种网络通信协议,属于数据链路层,能够控制网上交换器或路由器的转发平面(forwarding plane),借此改变网络数据包所走的网络路径。。

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

    学过计算机网络的人都知道,OSI七层架构,这是现代互联网通信的基础。而SDN提出的是三层架构,及应用层(业务层),控制层,转发层。在这种架构上有两个突出的特点,一个是控制平面和数据平面分离,一个是可编程性。数控分离可以更大程度的使转发层设备发挥数据转发能力(和瘦AP一个道理);而可编程可以使网络设备成为变形金刚,一个设备可以是交换机,可以是路由器,也可以变成防火墙或者网关,设备功能由程序定义。

    Openflow协议于2006年诞生于斯坦福大学的一个资助项目,2008年由Nick McKeown教授发表的论文《OpenFlow:Enableing Innovationin Campus Networks》正式提出。我们已经知道,SDN核心思想为数据与控制分离,硬件与软件解耦。openflow协议通过引入“流”的概念,控制器根据某次通信中“流”的第一个数据分组的特征,使用openflow协议提供的接口对数据平面设备部署策略,也就是在交换机上部署流表,这些通信的后续流量则按照相应流表在硬件上进行匹配,转发,从而实现网络设备在数据转发平面的灵活变动,网络设备的功能不再是一成不变。

    OpenFlow控制器:
    OpenFlow控制器位于SDN架构中的控制层,通过OpenFlow协议南向指导设备的转发。

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

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

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

    大多数开源的SDN控制器是完全基于OpenFlow协议开发的,这是因为其设计多数源自于Onix(一种分布式控制器框架)。相比之下,大部分商用控制器会将OpenFlow和其他协议进行联合使用,以完成更复杂的功能。

    在openflow协议 1.0版本中,流表项主要由三部分组成:分组头域、计数器、动作表。

    其中分组头域为数据分组匹配流表项时参考的依据,类似传统交换机做二层转发时匹配数据分组的MAC地址,或者路由器三层转发时的IP地址。分组头域里面包含OSI 1层至4层的12个网络控制信息,如源MAC,目的MAC,VLAN标签,VLAN优先级,源IP,TCP端口号等等,正是因为头域里面提供了丰富的标注,才使得控制器可以对流进行更加细粒度的控制。

    计数器可以统计一些流的查找次数,生存时间等。

    动作表为相应流对应的动作,如转发到本地网络栈,转给控制器,丢弃等。

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

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

    一条OpenFlow的表项(Flow Entry)由匹配域(Match Fields)、优先级(Priority)、处理指令(Instructions)和统计数据(如Counters)等字段组成。
    (1)Match Fields
    流表项匹配规则,可以匹配入接口、物理入接口,流表间数据,二层报文头,三层报文头,四层端口号等报文字段等。

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

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

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

    (5)Timeouts
    流表项的超时时间,包括了Idle Time和Hard Time。
    Idle Time:在Idle Time时间超时后如果没有报文匹配到该流表项,则此流表项被删除。

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

    (6)Cookie
    Controller下发的流表项的标识

    更多相关内容
  • OpenFlow协议

    千次阅读 2021-09-01 21:55:48
    OpenFlow是一种网络通信协议,应用于SDN架构中控制器和转发器之间的通信。软件定义网络SDN的一个核心思想就是“转发、控制分离”,要实现转、控分离,就需要在控制器与转发器之间建立一个通信接口标准,允许控制器...

    OpenFlow是什么???

    OpenFlow是一种网络通信协议,应用于SDN架构中控制器和转发器之间的通信。软件定义网络SDN的一个核心思想就是“转发、控制分离”,要实现转、控分离,就需要在控制器与转发器之间建立一个通信接口标准,允许控制器直接访问和控制转发器的转发平面。OpenFlow引入了“流表”的概念,转发器通过流表来指导数据包的转发。控制器正是通过OpenFlow提供的接口在转发器上部署相应的流表,从而实现对转发平面的控制。

    OpenFlow的起源与发展

    OpenFlow起源于斯坦福大学的Clean Slate项目,该项目的目标是要“重塑互联网”,旨在改变设计已略显不合时宜,且难以进化发展的现有网络基础架构。在2006年,斯坦福的学生Martin Casado领导了一个关于网络安全与管理的项目,试图通过一个集中式的控制器,让网络管理员方便地定义基于网络流的安全控制策略,并将这些安全策略应用到各种网络设备中,从而实现对整个网络通讯的安全控制。

    受此项目启发,Clean Slate项目的负责人Nick McKeown教授及其团队发现,如果将传统网络设备的数据转发和路由控制两个功能模块相分离,通过集中式的控制器(Controller)以标准化的接口对各种网络设备进行管理和配置,那么这将为网络资源的设计、管理和使用提供更多的可能性,从而更容易推动网络的革新与发展。于是,他们便提出了OpenFlow的概念,并且于2008年发表了题为《OpenFlow: Enabling Innovation in Campus Networks》的论文,首次详细地介绍了OpenFlow的原理和应用场景。

    2009年,基于OpenFlow,该研究团队进一步提出了SDN(Software Defined Network,软件定义网络)的概念,引起了行业的广泛关注和重视。2011年,由Google、Facebook、微软等公司共同发起成立了一个对SDN影响深远的组织ONF(Open Networking Foundation),致力于发展SDN。ONF将OpenFlow定义为SDN架构的控制层和转发层之间的第一个南向标准通信接口,并加大OpenFlow的标准化力度。
    在这里插入图片描述
    自2009年底发布第一个正式版本v1.0以来,OpenFlow协议已经经历了1.1、1.2、1.3以及最新发布的1.5等版本的演进过程。目前使用和支持最多的是OpenFlow1.0和OpenFlow1.3版本。
    在这里插入图片描述

    OpenFlow工作原理

    整个OpenFlow协议架构由控制器(Controller)、OpenFlow交换机(OpenFlow Switch)、以及安全通道(Secure Channel)组成。控制器对网络进行集中控制,实现控制层的功能;OpenFlow交换机负责数据层的转发,与控制器之间通过安全通道进行消息交互,实现表项下发、状态上报等功能。
    在这里插入图片描述

    OpenFlow组件

    OpenFlow控制器

    OpenFlow控制器位于SDN架构中的控制层,是SDN的“大脑”,通过OpenFlow协议指导设备的转发。目前主流的OpenFlow控制器分为两大类:开源控制器和厂商开发的商用控制器。常见的开源控制器例如NOX/POX、OpenDaylight等。厂商的商用控制器有Huawei的iMaster NCE等。

    1、NOX/POX

    NOX是第一款真正的SDN OpenFlow控制器,由Nicira公司在08年开发,并且捐赠给了开源组织。NOX支持OpenFlow V1.0,并提供相关C++的API,采用异步的、基于时间的编程模型。而POX可以视作是更新的、基于Python的NOX版本,支持Windows,Mac OS和Linux系统上的Python开发,主要用于研究和教育领域。

    2、ONOS

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

    3、OpenDaylight

    OpenDaylight是一个Linux 基金合作项目,该项目以开源社区为主导,使用Java语言实现开源框架,旨在推动创新实施以及软件定义网络透明化。面对SDN型网络,OpenDaylight作为项目核心,拥有一套模块化、可插拔且极为灵活的控制器,还包含一套模块合集,能够执行需要快速完成的网络任务。OpenDaylight控制器的命名以化学元素为名,最初的产品是Hydrogen(氢),当前已经发布了第八个版本Oxygen(氧),并且实现了OpenDaylight与NFV开放平台OPNFV(Open Platform for NFV)、开源云平台OpenStack和开放网络自动化平台ONAP(Open Network Automation Platform)同步。

    OpenFlow安全通道

    安全通道就是连接OpenFlow交换机与控制器的信道,负责在OpenFlow交换机和控制器之间建立安全链接。控制器通过这个通道来控制和管理交换机,同时接收来自交换机的反馈。

    通过OpenFlow安全通道的信息交互必须按照OpenFlow协议规定的格式来执行,通常采用TLS(Transport Layer Security)加密,在一些OpenFlow版本中(1.1及以上),有时也会通过TCP明文来实现。通道中传输的OpenFlow消息类型包括以下三种:

    Controller-to-Switch消息:由控制器发出、OpenFlow交换机接收并处理的消息,主要用来管理或获取OpenFlow交换机状态。
    Asynchronous消息:由OpenFlow交换机发给控制器,用来将网络事件或者交换机状态变化更新到控制器。
    Symmetric消息:可由OpenFlow交换机发出也可由控制器发出,也不必通过请求建立,主要用来建立连接、检测对方是否在线等。

    OpenFlow交换机

    OpenFlow交换机是整个OpenFlow网络的核心部件,主要负责数据层的转发。OpenFlow交换机可以是物理的交换机/路由器,也可以是虚拟化的交换机/路由器。按照对OpenFlow的支持程度,OpenFlow交换机可以分为两类:

    OpenFlow专用交换机:一个标准的OpenFlow设备,仅支持OpenFlow转发。他不支持现有的商用交换机上的正常处理流程,所有经过该交换机的数据都按照OpenFlow的模式进行转发。
    OpenFlow兼容型交换机:既支持OpenFlow转发,也支持正常二三层转发。这是在商业交换机的基础上添加流表、安全通道和OpenFlow协议来获得了OpenFlow特性的交换机。
    OpenFlow交换机在实际转发过程中,依赖于流表(Flow Table)。流表是OpenFlow交换机进行数据转发的策略表项集合,指示交换机如何处理流量,所有进入交换机的报文都按照流表进行转发。流表本身的生成、维护、下发完全由控制器来实现。

    流表项的组成

    在传统网络设备中,交换机/路由器的数据转发需要依赖设备中保存的二层MAC地址转发表、三层IP地址路由表以及传输层的端口号等。OpenFlow交换机中使用的“流表”也是如此,不过他的表项并非是指普通的IP五元组,而是整合了网络中各个层次的网络配置信息,由一些关键字和执行动作组成的灵活规则。

    OpenFlow流表的每个流表项都由匹配域(Match Fields)、处理指令(Instructions)等部分组成。流表项中最为重要的部分就是匹配域和指令,当OpenFlow交换机收到一个数据包,将包头解析后与流表中流表项的匹配域进行匹配,匹配成功则执行指令。

    流表项的结构随着OpenFlow版本的演进不断丰富,不同协议版本的流表项结构如下。
    在这里插入图片描述

    多级流表与流水线处理

    OpenFlow v1.0采用单流表匹配模式,这种模式虽然简单,但是当网络需求越来越复杂时,各种策略放在同一张表中显得十分臃肿。这使得控制平面的管理变得十分困难,而且随着流表长度与数目的增加,对硬件性能要求也越来越高。

    从OpenFlow v1.1开始引入了多级流表和流水线处理机制,当报文进入交换机后,从序号最小的流表开始依次匹配,报文通过跳转指令跳转至后续某一流表继续进行匹配,这样就构成了一条流水线。多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率。
    在这里插入图片描述
    在这里插入图片描述

    流表下发方式

    OpenFlow流表的下发分可以是主动(Proactive)的,也可以是被动(Reactive)的:

    主动模式下,控制器将自己收集的流表信息主动下发给OpenFlow交换机,随后交换机可以直接根据流表进行转发。
    被动模式下,OpenFlow交换机收到一个报文而查流表失败时,会发送消息询问控制器,由控制器进行决策该如何转发,并计算、下发相应的流表。被动模式的好处是交换机无需维护全部的流表,只有当实际的流量产生时才向控制器获取流表记录并存储,当老化定时器超时后可以删除相应的流表,因此可以大大节省交换机芯片空间。

    OpenFlow的应用场景

    随着OpenFlow概念的发展和推广,其研究和应用领域也得到了不断拓展,主要包括网络虚拟化、安全和访问控制、负载均衡等方面。下面以几个典型的场景来展示OpenFlow的应用:

    • OpenFlow在校园网络中的应用
      科研院校网络是OpenFlow的发源地,也是OpenFlow被广泛应用的网络环境。学生或研究人员在进行网络创新性研究时,可能会有全新设计的网络控制协议和数据转发技术需要验证,他们希望有一个平台能帮助他们把网络的控制、转发独立出来,以便能在平台上自由验证他们的研究工作。基于OpenFlow的网络正好可以提供这样一个试验平台,不仅更接近真实网络的复杂度,实验效果好,而且可以节约实验费用。

    • OpenFlow在数据中心网络中的应用
      云数据中心是OpenFlow得以发扬光大的地方。云数据中心部署时存在多租户资源动态创建、流量隔离以及虚拟机动态迁移等虚拟化需求,OpenFlow交换机可以配合云管理平台实现网络资源的动态分配和网络流量的按需传输,实现云服务的网络虚拟化需求并可以改善网络性能。其次,在数据中心的流量很大,如果不能合理分配传输路径很容易造成数据拥塞,从而影响数据中心的高效运行。如果在数据中心中部署OpenFlow,可以动态获取各链路的流量传输情况,动态下发OpenFlow流表规则进行均衡调度,实现路径优化以及负载均衡。

    • OpenFlow在园区网络中的应用
      在园区网络中可以使用OpenFlow对接入层设备进行有效的管控。接入层设备的特点是量大、故障率高,但设备功能和流量策略相对简单。如果使用OpenFlow,可以在控制器上集中统一对接入设备进行流表下发、网络监控等维护工作。在要求用户身份认证的场合,可以把认证流量引导到控制器上,在验证用户身份合法后再下发准入规则到用户连接的交换机端口上。在控制器检测到特定网络端口或特定用户流量异常时,可以通过下发规则关停设备端口或限制特定流量,快速恢复网络故障,提高网络可靠性和安全性。

    OpenFlow的未来

    OpenFlow作为SDN转控分离架构和可编程性的灵魂已经存在近十年了,作为SDN技术家族中的老前辈可谓劳苦功高。然而,从整个网络技术数十年的发展历程来看,Openflow还只是个刚刚长成的少年,尽管已具备了丰富的功能雏形,在未来的日子里仍然还有很长的成熟期要度过。我相信伴随着云计算和虚拟化技术的进一步推广落地,在众多SDN技术支持者的贡献下,OpenFlow会更加稳定、强大,最终能够某种程度上推动全人类科技的发展和生活的改善。最后,套用一句我最喜欢的话来结尾:OpenFlow的征途是星辰大海,诸君努力!

    参考

    展开全文
  • openflow协议

    2020-09-21 10:39:07
    Open Networking Foundation openflow标准协议,版本为1.5版本,为SDN网络架构下的南北向通信协议,用于控制器和交换机之间的通信,控制器向交换机下发表项,用于交换机转发数据报文
  • openflow 协议

    2013-07-22 00:24:53
    这是一份openflow协议的文档,包括这个版本,openflow-spec-v0.8.9 openflow-spec-v1.1 openflow-spec-v1.2 openflow-spec-v1.3 另外还有一个中文版的
  • OpenFlow协议分析.pdf

    2020-04-07 18:34:37
    OpenFlow协议是软件定义网络中非常重要的一部分,sdn网络分为为数据网和信令网,此篇协议讲述的就是关于信令网的,希望对你有所帮助
  • OpenFlow协议分析

    2021-11-11 17:41:57
    本实验通过wireshark抓包分析openflow1.3协议的各种报文与字段。 抓包 首先安装好实验所需的软件,这里不多赘述,需要的可以点击查看:mininet多方法安装,控制器安装 运行控制器(我这里是OpenDayLight),其他...

    实验环境:CentOS + OpenDayLight-Carbon + mininet + WireShark
    本实验通过wireshark抓包分析openflow1.3协议的各种报文与字段。

    抓包

    • 首先安装好实验所需的软件,这里不多赘述,需要的可以点击查看:mininet多方法安装控制器安装

    • 运行控制器(我这里是OpenDayLight),其他的也可以不过需要支持1.3版本的openflow。

    • 打开wireshark进行抓包,网卡直接选择any就行。

    • 使用mininet连接控制器,在mininet里面pingall获得一些报文,然后就可以退出mininet了

    • 现在就能看到wireshark捕获到很多报文,直接停止捕获开始分析。

    分析

    利用过滤器,输入过滤条件: openflow_v4,v4 表示1.3版本。

    然后就能看到传输的openflow协议的报文。
    在这里插入图片描述

    点击报文即可查看到其中具体的字段,这里以比较有代表性的FLOW_MOD报文为例,其它同理。
    各个表项具体的含义见下一部分。

    在这里插入图片描述

    利用wireshark的流量图功能,选择过滤器过滤之后的结果如下:
    可以清晰的看出openflow各个阶段发送到报文(原图较长,只截取了小部分)

    概述

    OpenFlow 协议支持3种消息类型:Controller-to-Switch(控制器—交换机)、Asynchronous(异步)和Symmetric(对称),每一类消息又有多个子消息类型。

    • 1、 Controller-Switch(控制器—交换机)消息,这类消息由控制器发起。包括Features、Configuration、Modify-State、Read-State、Send-Packet、Barrier等几类消息,用于对OF交换机的管理。
    • 2、 Asynchronous(异步)消息,这类消息用来将网络事件或交换机状态的变化更新到控制器。主要包括4种子类型:Packet-in、Flow-Removed、Port-status和Error消息。
    • 3、 Symmetric(同步)消息与前两类消息有所不同,Symmetric类的消息可由控制器或者OF交换机中的任意一侧发起,这类消息包括以下3种类型:Hello、Echo和Vendor。
      Modify-State消息是OpenFlow消息中最为重要的消息类型,控制器通过Port-mod消息用来管理端口状态,通过Flow-mod消息增删交换机的流表项,考虑到流表在OpenFlow的重要意义,在此针对Flow-mod消息进行详尽分析。
    类型作用
    HELLO是使用来协商控制器和交换机之间openflow协议的版本号的消息。
    FEATURE_REQUEST是控制器用来查询交换机特性消息,如交换机ID,缓冲区数量,端口及端口属性等。
    FEATURE_REPLY交换机收到feature_request消息之后会回复feature_reply消息来报告自己的特性。
    SET_CONFIG控制器对交换机进行配置的消息。控制器可以配置交换机的 MTU,报文分片处理等能力。
    PACKET_IN当交换机遇到不知道如何转发的报文时,使用 Packet_IN 消息将无法处理的报文封装起来发送给控制器,交给控制器去判断处理。并且交换机会将该数据包缓存。
    PACKET_OUT控制器可以使用 Packet_Out 消息,告诉交换机某一个数据包如何处理
    FLOW_MOD下发流表项。通过 Flow_Mod 消息可以对流表进行添加、删除、变更设置等操作。可以简单理解为一个flow_mod就是就是一个流表项
    ECHO_REQUEST & ECHO_REPLY控制器和交换机通过 ECHO_REQUEST 和 ECHO_REPLY 报文保持连接

    Flow-mod消息的具体格式,其主要字段含义介绍如下:

    字段含义
    前4个字段表示OpenFlow消息的通用报头。
    wildcard字段表示匹配时12元组的掩码位,被掩盖掉的元组不参加匹配。
    从in_port到tp_dst字段表示流表项12元组的信息。
    cookie字段在处理数据分组时不会用到,控制器通过该字段来过滤流的统计信息。
    command字段表示对流表的操作,包括增加(Add)、删除(Delete)、修改(Modify)等。
    idle_time字段表示当这条流表项在这段时间内没有匹配到数据分组,则该流表项失效。
    hard_time字段表示自流表项下发后只要过了这段时间即刻失效。
    priority字段表示该流表项被处理的优先级,原则上优先级越高,所属的Table号就越小。
    buffer_id字段表示对应Packet-in消息的buffer_id。
    out_port字段仅在command为Delete或者Delete Strict时有效,表明当某表项不仅匹配了Flow-mod中给出的12元组,且转发动作中指定端口等于该out_port的动作时才予以删除,即对删除操作的一种额外限制。
    flags字段该字段为标志位,OpenFlow v1.0中包括3项:OFPFF_SEND_FLOW_REM(流表失效时是否向控制器发送Flow-removed消息),OFPFF_CHECK_OVERLAP(交换机是否检测流表冲突),OFPFF_EMERG(该流表项将被存于Emergency Flow Cache中,仅在交换机处于紧急模式时生效)。
    actions字段该字段是个数组,表示要对满足过滤条件的流做的动作列表,actions[0]即代表其中第一个动作。
    展开全文
  • SDN网络安全规则及OpenFlow协议的安全分析.pdf
  • 分析sdn,设计sdn的相关,对ryu控制器感兴趣的。
  • openflow - 是OpenFlow协议的纯Go实现
  • 基于分层EFSM的OpenFlow协议建模 ,章志豪,张先恩,OpenFlow协议作为软件定义网络(SDN)目前事实的南向标准协议之一,受到了越来越多的研究者的关注。在本文中,针对OpenFlow协议建模,��
  • 生动的SDN基础内容介绍(二)背景OpenFlow三级目录 ...上文讲了一些SDN的基础知识,这篇文章将介绍SDN出现的依据之一,也就是OpenFlow协议。 OpenFlow OpenFlow、流表、流表项、漏表、多级流表、组表、计量表

    背景

    上文讲了一些SDN的基础知识,这篇文章将介绍SDN出现的依据之一,也就是OpenFlow协议。

    强烈推荐看
    1、OpenFlow官方的手册(超级强烈推荐!!!)http://www.cs.columbia.edu/~lierranli/coms6998-8SDNFall2013/papers/openflow-spec-v1.3.2.pdf
    2、OpenFlow中文版手册(不太全)https://www.jianshu.com/p/acfeae1771b3

    OpenFlow

    OpenFlow

    这是最经典的一张OpenFlow的图。一个OpenFlow交换机由一个或多个流表和一个组表组成,执行流量包的查找(匹配)和转发,一个OpenFlow通道到一个外部控制器。交换机同控制器通信,控制器通过OpenFlow协议管理交换机。

    OpenFlow标准协议允许控制器直接访问和操作网络设备的转发平面,这些设备可以是物理设备,也可以是虚拟的路由器或者交换机(例如OVS,OVS会在后续简单介绍)。

    也就是说有了OpenFlow我们才可以让控制平面指挥数据平面干活,那么是怎么指挥的呢。首先需要了解一些基础的概念。

    OpenFlow的基础概念

    以OpenFlow v1.3为例

    流表项

    流表项也就是flow entry。
    流表项
    流表项通过OpenFlow协议被控制器下发到OpenFlow交换机中,每次接收到数据包交换机根据流表项制定的规则进行一系列的操作。按之前的比喻,流表项就是领导下发的一条条规则,人们就靠着着一条条规则来让身体干活。

    那么流表项里面都有什么呢:

    1、匹配域Match Fields:

    流表项的匹配规则
    也就是流表项的匹配规则,即这条流表项对哪些数据包起作用。匹配规则有很多种,具体的可以去看官方文档和官方手册。这里以匹配源ip地址为例。如果我们想获取一定时间内源地址为10.0.0.1的包的数量,那么就把匹配域定为“源ip:10.0.0.1”。

    如RYU控制器的代码为

    match = parser.OFPMatch(eth_type = 0x800,ipv4_src=(net,net_mask))
    

    eth_type表示是ip协议,net为10.0.0.1,net_mask为子网掩码(OpenFlow支持匹配网段,匹配网段通过设置子网掩码实现)。那么以后只要是源ip为10.0.0.1的数据包都会与该流表项相匹配。

    那如果有多个流表项匹配域拥有相同的源ip地址,数据包会与哪个流表项匹配呢?
    这就是OpenFlow很蛋疼的一个地方。OpenFlow只会匹配一个最先下发的流表项,其他流表项不会与数据包匹配。具体的实验可以看https://blog.csdn.net/weixin_40610952/article/details/80509378

    不光是这样,OpenFlow没有解决粗粒度流和细粒度流同时测量的信息丢失问题。例如,流表项A匹配10.0.0.0/29,流表项B匹配10.0.0.1。当一个源地址为 10.0.0.1 的数据包到
    达时,只有先下发的流表项A才会计数。

    解决这种问题的一个方法就是优先级:如果两个流表项的优先级不同,则只有优先级高的流表项才能与数据包匹配。

    2、优先级Priority:

    流表项优先级,定义流表项之间的匹配顺序,优先级高的先匹配。
    那我要是想都匹配呢?我想要10.0.0.1同时匹配到A和B两个流表项,我的一个想法是用流表,这个在后续介绍流表的时候再说。

    3、流表项计数Counters:

    统计有多少报文和字节匹配到该流表项,这就很好理解了,如果有一个来自10.0.0.1的数据包匹配上该流表项了,那么byte_count+=该数据包的bytes数,packet_count+=1。Counters在网络管理和网络测量方面极为重要,可以收集网络中的信息。

    4、指令与动作Instructions&actions:

    该字段表明需要交换机对匹配到的数据包做什么动作/操作。
    借用http://www.h3c.com/cn/d_201811/1131080_30005_0.htm中的一些内容。
    具体的指令类型如下图所示:
    指令的类型
    每个流表表项的指令集中每种指令类型最多只能有一个,指令的执行的优先顺序为:
    Meter –> Apply-Actions -> Clear Actions -> Write-Actions -> Write-Metadata -> Goto-Table

    常见的Action动作的类型如下:
    动作的类型

    看到这里人可能晕了,为啥有个指令还有个动作,不能把这俩合在一起吗,我第一次看见的时候也很纳闷为啥要分开。后来发现指令是数据包被匹配上之后执行的操作,就相当于领导告诉你要干啥活(整理文档、打代码、打扫卫生等)。而动作是更细致的划分,如整理文档的话可能会有写、改、删除、转发这几个操作。同时,动作可以被放在动作集里在流表中累加传输,这个后续讲到流表的时候再介绍。

    以指令为Apply-Actions,动作为Output为例,此时想让匹配到的数据包从端口1转发,那么RYU的代码如下:

    out_port = 1
    actions = [parser.OFPActionOutput(out_port)]
    inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                                 actions)]
    

    匹配到数据包之后把该数据包从端口1转发,该动作立即执行。

    5、超时时间Timeouts:

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

    6、标识Cookie:
    控制器下发的流表项的标识。

    流表

    刚刚提到了好多次流表,一个流表里面会储存很多流表项。
    流表项通过匹配字段和优先级决定:在一个流表中匹配字段和优先级共同确定唯一的流表项。所有字段通配 (所有字段省略) 和优先级等于0的流表项被称为table-miss流表项,也就是漏表项(后续会介绍)。

    从OpenFlow1.1开始引入了多级流表和流水线处理机制,即一个交换机中可能有很多流表,每个流表又有很多流表项。要这么多流表干啥,多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率,可以更好地处理数据包。即让一个数据包可以被不同的网络管理应用执行多次操作。

    OpenFlow规范中定义了流水线式的处理流程,数据包匹配处理流程如下图所示:
    数据包匹配处理流程
    数据包在交换机中的处理过程
    当数据包进入交换机后,必须从编号最小的流表开始依次匹配。可以按次序从小到大越级跳转,但不能从某一流表向前跳转至编号更小的流表。

    当报文成功匹配一条流表项后,将首先更新该流表项对应的统计数据(如成功匹配数据包总数目和总字节数等),然后根据指令进行相应操作,比如跳转至后续某一流表继续处理,修改或者立即执行该数据包对应的动作集等。

    当数据包已经处于最后一个流表时,其对应的动作集中的所有动作将被执行,包括转发至某一端口,修改数据包某一字段,丢弃数据包等。

    回到之前考虑的问题:
    在介绍流表项的时候提到了“我想要10.0.0.1同时匹配到A和B两个流表项”。假设流表项A是网络管理应用下发的,想要修改数据包的头字段。流表项B是负责正常转发的,想要将10.0.0.1转发到端口1。那么可以把A放在流表0里面,把B放在流表1里面,将添加头字段的动作放入动作集之后从流表0跳到流表1,执行添加头字段的动作与转发的动作。

    https://blog.csdn.net/qq_41094042/article/details/121924741的另一个例子。
    流表0中匹配主机A到主机B的IP流,然后跳转到其他流表,如流表2。
    流表2中在IP流的基础上进一步匹配TCP流或UDP流,根据要求将TCP流正常转发,UDP流丢弃。

    多级流表的例子二

    跳转的指令为之前提到的Goto-Table,在RYU中的实现为:

    go_to_table=1 #跳转到流表1中
    inst = [parser.OFPInstructionActions(ofproto.OFPIT_WRITE_ACTIONS,
                                                 actions),
                    parser.OFPInstructionGotoTable(go_to_table)]
    

    漏表

    漏表即table-miss。
    每个流表必须包含table-miss表项,table-miss表项指定如何处理流表中与其他流表项未匹配的数据包,比如把数据包发送给控制器、丢弃数据包或直接将包扔到后续的表。

    该表项的匹配域为通配,即匹配任何报文,优先级为0,Instructions与正常表项相同。通常,如果table-miss表项不存在,默认行为是丢弃报文。

    在RYU中如果想将未匹配到的数据包都交给控制器处理,则代码为:

    match = parser.OFPMatch()
    actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
                                              ofproto.OFPCML_NO_BUFFER)]
    self.add_flow(datapath, 0, match, actions)
    #datapath为数据通路,也就是交换机
    

    流表项的下发

    在RYU中的流表项下发代码为:

    def add_flow(self, datapath, priority, match, actions):
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser
            inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                                 actions)]
            mod = parser.OFPFlowMod(datapath=datapath, priority=priority,
                                        match=match, instructions=inst)
            datapath.send_msg(mod)
    

    流表项的删除

    流表项可以通过两种方式在流表中删除,一个是通过控制器的请求,一个是利用交换机的流超时机制。

    在RYU中由控制器主动删除流表项的代码为:

    def del_flow(self, datapath, match, priority, table_id): #删除特定流表项
    	ofproto = datapath.ofproto
    	ofp_parser = datapath.ofproto_parser
        instructions=[]
    	mod = ofp_parser.OFPFlowMod(datapath, 0, 0, table_id,
                                             ofproto.OFPFC_DELETE, 0, 0,
                                             priority,
                                             ofproto.OFPCML_NO_BUFFER,
                                             ofproto.OFPP_ANY,
                                             ofproto.OFPG_ANY, 0,
                                             match, instructions)        
        datapath.send_msg(mod)
    

    计量表

    对流进行测量,从而为流提供QoS功能,如限速、DiffServ。
    详情可看这篇博客对计量表的介绍
    https://blog.csdn.net/qq_41094042/article/details/121924741

    组表

    一个OpenFlow交换机中只有一个组表Group Table,一个组表包括若干组表项。 一个流表项指向一个组的能力使得可以实现额外的转发方法。
    组表
    组表的优点可以参考这篇博客
    https://blog.csdn.net/qq_25777079/article/details/105073951

    控制器与交换机的通信

    OpenFlow通道是每个交换机连接控制器的接口,通过这个接口,控制器配置和管理交换机,接收来自交换机的事件,从交换机发出数据包。

    所有 OpenFlow通道消息的格式必须遵循OpenFlow协议。通道通常使用TLS加密。

    OpenFlow协议支持三种消息类型:
    1、控制器到交换机(controller-to-switch):
    消息由控制器发起,用来直接管理或检查交换机的状态。如配置、修改状态、读交换机的各种信息、指定动作等。
    2、异步(asynchronous):
    用于控制器更新网络事件和交换机状态变化。如table-miss的数据包的发送、流表项的移除、通知控制器某个端口发生变化等。
    3、对称(symmetric)

    总结

    至此部分的OpenFlow基础知识介绍完了,其他部分请看
    1、OpenFlow官方的手册(超级强烈推荐!!!)http://www.cs.columbia.edu/~lierranli/coms6998-8SDNFall2013/papers/openflow-spec-v1.3.2.pdf
    2、OpenFlow中文版手册(不太全)https://www.jianshu.com/p/acfeae1771b3

    下章会介绍关于Ryu控制器的一些内容
    https://blog.csdn.net/weixin_44480014/article/details/123258955

    展开全文
  • OpenFlow是一种交换技术,使用OpenFlow协议建立软件定义网络,可以将网络作为一个整体而不是无数的独立设备进行管理,目前很多厂商都开始考虑使用OpenFlow协议,这里我们就先给大家介绍这方面的知识,希望大家可以多...
  • 在SDN网络架构之上,深入探讨基于OpenFlow协议的底层网络拓扑发现机制,阐述了新网络架构下的链路发现方法及无环转发结构构建方法。仿真验证了该方法的有效性,并在Mininet中对该方法的收敛时间进行测算。该拓扑发现...
  • OpenFlow网络 分为以下三个部分 OpenFlow交换机:主要实现数据层的转发 FlowVisor:主要作用是对网络进行虚拟化 Controller:主要是对网络集中控制 OpenFlow交换机 由以下三个部分组成: 安全通道 安全通道是...
  • 关于OpenFlow协议

    2020-12-24 14:42:45
    SDN中两个重要元素:控制器(掌控全局,指挥网络内的设备工作)交换机(转发数据)控制器与网络设备通过OpenFlow协议进行通信OpenFlow交换机内有一个FlowTable,交换机按照流表转发数据,流表由控制器生成和维护。...
  • OpenFlow:简述对OpenFlow协议的认识

    千次阅读 2019-03-25 15:36:25
    OpenFlow:简述对OpenFlow协议的认识 一、OpenFlow协议的背景 转发和控制分离是SDN网络的本质特点之一 。在SDN网络架构中,控制平面与转发平面分离,网络的管理和状态在逻辑上集中到一起,底层的网络基础从应用中...
  • 华三Openflow协议详解
  • SDN网络技术:OpenFlow协议(2)

    千次阅读 2019-09-07 15:27:48
    本文首发于我的公众...导读:续上篇文章(对OpenFlow协议背景以及组件进行了介绍),本篇文章将对OpenFlow的运行机制进行详细的介绍。 一、OpenFlow支持的报文类型 在了解OpenFlow信道的建立过程之前,我们需要...
  • SDN软件定义网络之南向协议——OpenFlow协议 三种消息类型 1.controller to switch 2.asynchronous 告知控制器新数据包的到达和交换机状态的改变 3.symmetric 由控制器或交换机任意一方发送,无需对方的许可或请求...
  • OpenFlow协议是什么

    千次阅读 2020-05-01 13:12:06
    为什么学习OpenFlow? 实践SDN的首选 主流南向接口协议 P4和PISA的前身 OpenFlow起源 Ethane项目是OpenFlow的前身 集中式、主动式,基于Flow控制 2008年的Open Flow论文 最初用于网络实验 OpenFlow是什么 一...
  • SDN网络技术:OpenFlow协议(1)

    千次阅读 2019-09-07 15:11:39
    导读:OpenFlow协议允许控制器直接访问和操作网络设备的转发平面,它是实现SDN网络转控分离的关键部分。通过OpenFlow协议,SDN控制器与数据转发层之间建立了一个标准的通信接口。本文将对其背景及组件进行...
  • openflow协议的工作原理及流表的基本操作 1、openflow协议的工作原理 首先看一下python文件中的拓扑图,主机h1如果要与h3进行通信,h1向网络发送数据包,这里数据包发送给交换机s1,由于刚开始时,交换机s1的流表中...
  • openflow协议
  • OpenFlow:简述对OpenFlow协议1.3的认识

    千次阅读 2019-03-26 14:24:19
    OpenFlow:简述对OpenFlow协议1.3的认识       OpenFlow1.3和 OpenFlow1.0的区别较大,也是当前商业上广泛使用的 Open Flow版本之一。       ...
  • openflow协议1.3.0中文版.pdf
  • openflow协议v1.3.4

    2016-07-27 20:17:51
    This document describes the requirements of an OpenFlow Logical Switch. Additional information describing OpenFlow and Software Defined Networking is available on the Open Networking Foundation ...
  • Openflow协议

    2018-06-08 16:08:58
    控制器与网络设备间需要一种协议才能互相通信,即为Openflow协议Openflow交换机中的转发表称为流表,流表中包含了:数据包匹配特征,数据包处理方法Openflow消息分为三种:1.Controller-to-Switch,由控制器主动发出...
  • OpenFlow 协议详解(干货)

    万次阅读 多人点赞 2019-05-03 15:45:16
    自2009年底发布1.0版本后,OpenFlow协议又经历了1.1、1.2、1.3及1.4版本的演进过程,目前使用和支持最多的是1.0和1.3版本。OpenFlow1.3在1.0版的基础上进一步优化及升级,其中添加了很多新的特性及消息,如支持多个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,139
精华内容 2,055
关键字:

OpenFlow协议