网络技术发展


本文主要介绍网络技术的发展流程,包括SDN、OpenFlow、P4的基础知识。

1 SDN知识

SDN (Software Defined Network,软件定义网络)。 相对于传统网络,软件定义网络实现了控制平面与数据平面的分离,同时(至少在逻辑上)构建了一个集中的控制平面。人们可以在这个单一的控制平面上,实现对全网各个网元设备的监控,管理,编程。

  • 数据平面:维护一个由一系列流表组成的流水线。当数据包经过交换机时,首先会走的是数据平面,即去匹配这些表。根据匹配到的相应的规则(action),如output, drop,从不同的端口转发或者丢弃。但是流表的信息是如何添加的呢?为什么流表会知道数据包该从哪个端口转发呢?这就需要控制平面去管理它。
  • 控制平面:不管是分布式的控制平面,还是集中式的控制平面。控制平面可以理解为网元设备的操作系统。他可以写一些程序,里面含有特定的算法,向数据平面添加相应的转发规则。也就是说,控制平面相当于网元设备的大脑,当数据平面不知道如何转发一个数据包时,会向大脑询问,大脑根据自己对网络拓扑的”认知“,向数据平面返回指定的规则,数据平面记录这条规则,在之后的转发过程中,就不再询问自己的大脑(速率较慢),而是根据“肌肉记忆”直接转发。

2 OpenFlow知识

2.1 发展史

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

自2009年底发布第一个正式版本v1.0以来,OpenFlow协议已经经历了1.1、1.2、1.3以及最新发布的1.5等版本的演进过程。目前使用和支持最多的是OpenFlow1.0和OpenFlow1.3版本。OpenFlow是第一个开放的南向接口协议,也是目前最流行的南向协议。它提出了控制与转发分离的架构,规定了SDN转发设备的基本组件和功能要求,以及与控制器通信的协议。2011年,由Google、Facebook、微软等公司共同发起成立了一个对SDN影响深远的组织ONF (Open Networking Foundation),致力于发展SDN。

在这里插入图片描述

2.2 架构

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

  • 控制器
    OpenFlow控制器位于SDN架构中的控制层,是SDN的“大脑”,通过OpenFlow协议指导设备的转发。目前主流的OpenFlow控制器分为两大类:开源控制器和厂商开发的商用控制器。常见的开源控制器例如NOX/POX、OpenDaylight等。厂商的商用控制器有Huawei的iMaster NCE等。
  • 安全通道
    安全通道负责在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特性的交换机。

在这里插入图片描述

2.3 交换机

OpenFlow交换机在实际转发过程中,依赖于流表(Flow Table)。流表是OpenFlow交换机进行数据转发的策略表项集合,指示交换机如何处理流量,所有进入交换机的报文都按照流表进行转发。流表本身的生成、维护、下发完全由控制器来实现。在传统网络设备中,交换机/路由器的数据转发需要依赖设备中保存的二层MAC地址转发表、三层IP地址路由表以及传输层的端口号等。OpenFlow交换机中使用的“流表”也是如此,不过他的表项并非是指普通的IP五元组(IP源地址、IP目的地址、协议号、源端口、目的端口),而是整合了网络中各个层次的网络配置信息,由关键字和执行动作组成的灵活规则。OpenFlow1.0规范定义了包括输入端口、MAC源地址、MAC目的地址、以太网类型、VLANID、IP源地址、IP目的地址、IP端口、TCP源端口、TCP目的端口在内的10个关键字(十元组)。

OpenFlow流表的每个流表项都由匹配域(Match Fields)、计数器(Counters)、处理指令(Instructions)等部分组成。流表项中最为重要的部分就是匹配域和指令,当OpenFlow交换机收到一个数据包,将包头解析后与流表中流表项的匹配域进行匹配,匹配成功则执行指令。流表项的结构随着OpenFlow版本的演进不断丰富,不同协议版本的流表项结构如下图所示,1.3版本中流表项各域的说明如下。

  • 匹配域是流表匹配的关键字段,主要包括入端口号和报文各层头字段信息。
  • 匹配域和优先级唯一指定一条流表项,由于匹配字段包含了链路层、网络层和传输层的大部分标识,会存在一个数据包可与多个流表项中的匹配字段相匹配,优先级则在存在冲突时用于标识流表项的执行顺序。
  • 计数器用于统计数据量的相关信息,例如匹配成功的报文数和丢弃的报文数等。
  • 指令集表示当数据包匹配到该流表项时,需要执行的动作。
  • 失效时间用于设定流表项的超时时间,当流表项到达超时时间将被系统删除。
  • Cookie是控制器设置的流表项标识。

在这里插入图片描述
OpenFlow v1.0采用单流表匹配模式,这种模式虽然简单,但是当网络需求越来越复杂时,各种策略放在同一张表中显得十分臃肿。这使得控制平面的管理变得十分困难,而且随着流表长度与数目的增加,对硬件性能要求也越来越高。从OpenFlow v1.1开始引入了多级流表和流水线处理机制,当报文进入交换机后,从序号最小的流表开始依次匹配,报文通过跳转指令跳转至后续某一流表继续进行匹配,这样就构成了一条流水线。多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率。OpenFlow流表的下发可以是主动的,也可以是被动的:

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

3 P4知识

3.1 提出背景

目前人们提及最多的OpenFlow协议在逐渐的完善演化过程中,表字段和表类型不断的增加。白牌交换机在支持OpenFlow协议的版本更新上,面临着和传统交换设备厂商同样的困境——OpenFlow并不支持弹性地增加匹配域支持,协议新特性的支持所需要的成本大、时间周期长。同时,随着网络中新的协议不断出现,OpenFlow协议也必将变得越来越臃肿,表的扩展也必将变得越来越困难。OpenFlow 1.0 的时候有12个字段,这些字段分别就是我们熟悉的,IP地址,MAC地址等等。但是很快发现,单单这12个字段不能满足现实网络世界中各种需求(在网络中的协议有很多种)。所以到OpenFlow1.3的时候字段增加到40个,现在OpenFlow1.5甚至更多。

这样带来的麻烦有很多,一是匹配效率和空间占用的问题。二是特定的OpenFlow交换机生产出来后,无法支持新的协议字段,只能在现有协议上进行开发。最终只能面临淘汰。如果可以自定义协议字段的类型,甚至实现自定义动作的类型,那么我们就不需要反复修正协议本身,SDN的架构也将更加灵活。这个自定义协议字段类型,自定义动作类型就是我们所说的数据面编程。数据面编程就是我们自己定义匹配字段,自己定义动作类型,从而自己定义流表,进而形成流水线(pipline)。

基于这种初衷,P4 (Programming Protocol-Independent Packet Processors)应运而生。新一代的SDN解决方案必须让数据转发平面也具有可编程能力,让软件能够真正定义网络和网络设备。而P4正是为用户提供了这种能力,打破了硬件设备对数据转发平面的限制,让数据包的解析和转发流程也能通过编程控制,使得网络及设备自上而下地、真正地向用户开放。

3.2 P4架构

为了实现下述特性,P4语言的编译器采用了模块化的设计,如下图所示。P4语言程序通过前端编译器编译成中间表示层,然后根据实现目标,采用相应的后端编译器编译对应的配置文件。各个模块之间的输入输出都采用标准格式的配置文件,如p4c-bm模块的输出作为载入到bmv2模块中的json格式配置文件。P4语言具备如下特性:

  • 协议无关性:网络设备不与任何特定的网络协议绑定,用户可以使用P4语言描述任何网络数据平面协议和数据包处理行为。这一特性通过自定义包解析器、匹配-动作表的匹配流程和流控制程序实现。
  • 目标无关性:用户不需要关心底层硬件的细节就可实现对数据包的处理方式的编程描述。这一特性通过P4前后端编译器实现,前端编译器将P4高级语言程序转换成中间表示IR,后端编译器将IR编译成设备配置,自动配置目标设备。
  • 可重构性:允许用户随时改变包解析和处理的程序 ,并在编译后配置交换机,真正实现现场可重配能力。

在这里插入图片描述
在P4交换机中一条流水线可以包含以下组件:解析器、逆解析器、匹配-动作表、元数据总线。其中除了元数据总线,其他组件都是必须的。P4中基础数据处理单元是不记录数据的,所以就需要引入一个元数据总线,用来存储一条流水线处理过程中需要记录的数据。P4交换机中含有两条流水线—入口流水线和出口流水线;同时还有一些数据流管理功能,例如:拥塞控制,队列控制,流量复制等。

  • 解析器(parser):将分组数据转化成元数据(提取数据包头的各个字段)。
  • 逆解析器(deparser):将元数据转化成序列化的分组数据(用于重组数据包,因为数据包在处理过程中经历了分解和处理。所以最后转发的时候需要重组一下) 。
  • 匹配动作表(match-action table):操作元数据。
  • 元数据(metadata):在流水线内存储数据信息。
  • 队列管理(Traffic manager),有一些队列,用于流量控制(一些队列相关的metadata在此更新)。

在这里插入图片描述

3.3 开发流程

  • 程序员使用P4语言对交换机须支持的传输协议以及包处理逻辑进行描述
    • 定义数据包所使用网络协议控制字段的格式(匹配字段及其宽度)
    • 定义数据包协议头部解析方式使其能够正确提取各个匹配元组
    • 定义数据包处理所需匹配域、“匹配+动作”表的个数以及各表项的深度
    • 预先定义一些与具体协议无关的动作
    • 定义数据包在各表间的匹配顺序
  • 程序员使用编译器对P4程序进行编译;
    • 前端编译:生成与目标交换机无关的C代码以及用于数据面控制的API
    • 后端编译:为目标交换机生成具体转发逻辑配置。此时需根据实际可编程芯片中的资源量合理选取转发表硬件结构,如RAM,TCAM等。通过在P4程序中编程来限制每个流表的宽度、深度以及匹配准则。
  • 交换机运行时控制
    • 控制面利用P4编译器生成的API来完成流表项的安装、删除以及修改等操作。目前P4数据面交换机的控制大多通过CLI(Command-Line Interface, 命令行接口)来配置转发表的表项,P4语言联盟正致力于P4Runtime接口的研究,业界尚未形成与控制器通信的南向接口协议标准。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值