二、网络编程

网络编程

在本节中,我们首先定义网络可编程性的概念和相关术语。然后讨论了控制平面可编程性和数据平面编程,详细阐述了数据平面编程模型,指出了数据平面编程的优点。

名词解释

我们将可编程性定义为软件或硬件执行外部定义的处理算法的能力。这种能力将可编程实体从灵活(或可配置)实体中分离出来;后者只允许改变内部定义的算法的不同参数,而这些参数保持不变。

因此,术语网络可编程性意味着定义在网络中执行的处理算法的能力,特别是在单个处理节点中执行的处理算法,如交换机、路由器、负载均衡器等。通常假设在连接网络节点的链路中没有发生特殊的处理。如果有必要,可以将这种处理描述为发生在作为链接端点的节点上,或者通过添加一个具有一个输入和一个输出的“线路颠簸”节点。

传统上,由电信设备执行的算法被分为三个不同的类:数据平面、控制平面和管理平面。在这三类算法中,管理平面算法对整个包处理和网络行为的影响最小。此外,它们已经可编程几十年了,例如,SNMPv1在1988年标准化,甚至在那之前就创建了。因此,本节不再对管理平面算法进行进一步讨论。

真正的网络可编程性意味着能够指定和更改控制平面和数据平面算法。在实践中,这意味着网络运营商(用户)能够自己定义数据和控制平面算法,而不需要涉及网络设备的原始设计人员。对于网络设备供应商(他们通常设计自己的控制平面)来说,网络可编程性主要意味着定义数据平面算法的能力,而不需要涉及所选包处理特定于应用程序的集成电路(ASIC)的原始设计者。

网络可编程性是一个强大的概念,它允许网络设备供应商和用户构建最适合他们需求的网络。此外,他们可以比以往任何时候都更快、更便宜,而且不会影响设备的性能和质量。

由于各种技术原因,不同的层在不同的时间点可编程。管理平面在20世纪80年代实现可编程,而控制平面的可编程直到21世纪末到21世纪初才实现,可编程的交换asic直到21世纪末才出现

因此,尽管我们关注的是数据平面的可编程性,但我们将从讨论控制平面的可编程性及其最著名的实现(称为软件定义网络(SDN))开始。这个讨论也将使我们更好地理解数据平面可编程性的重要性。

控制平面可编程性和SDN

路由器、交换机等传统网络设备具有复杂的数据平面和控制平面算法。它们是内置的,用户通常无法替换它们。因此,设备的功能是由其供应商定义的,他们是唯一可以更改它的人。在行业术语中,供应商通常被称为原始设备制造商(OEMs)。

软件定义网络(SDN)是历史上第一次尝试使设备,特别是它们的控制平面可编程。在选定的系统上,设备制造商允许用户绕过内置的控制平面算法,以便用户可以介绍自己的控制平面算法。这些算法可以直接向数据平面提供必要的转发信息,而数据平面仍然是不可替换的,并且仍然在设备供应商或他们选择的硅供应商的控制下。

由于各种技术原因,决定提供一个可以远程调用的api,这就是SDN的诞生。图2描述了SDN与传统网络的比较。不仅控制平面可编程,而且可以在一个集中控制器中实现全网控制平面的算法。在一些重要的用例中,例如严格控制的海量数据中心,这些集中的、全网络的算法被证明比为许多自治网络的分散控制而设计的传统算法(如边界网关协议(BGP))更简单、更高效。

在这里插入图片描述

图2:传统组网与具有固定功能数据平面的SDN的区别。

对这种方法进行标准化的努力导致了OpenFlow (of)[21]的开发。希望一旦OF标准化了消息传递API来控制数据平面功能,SDN应用程序将能够利用该API提供的功能来实现网络控制。有大量的文献对of[13, 14, 15]和SDN[6, 7, 8, 9, 11, 10, 12]进行了概述。

然而,很明显,OF假设了一个具体的数据平面功能,但没有正式指定。而且,作为OF基础的具体数据平面是不能改变的。它执行由OF规范定义的唯一的(尽管相对灵活)算法。

在某种程度上,正是这种认识导致了我们将在下一节讨论的现代数据平面编程的发展。

数据平面编程

如前所述,数据平面可编程性是指数据平面及其算法可以由用户定义,无论是网络运营商还是使用分组处理专用集成电路的设备设计者。事实上,数据平面可编程性在网络行业的大部分历史中都存在,因为数据平面算法通常是在通用cpu上执行的。只有随着高速链路的出现,超过了CPU的处理能力,以及随后分组处理(交换)asic的引入,数据平面的可编程性(或缺乏)才成为一个问题。

数据平面算法负责处理通过电信系统的所有数据包。因此,它们最终定义了此类系统的功能、性能和可伸缩性。在控制平面中实现数据平面功能的任何尝试通常都会导致显著的性能下降。当数据平面编程被提供给用户时,从本质上改变了用户的能力。他们可以构建定制的网络设备,而不需要在性能、可伸缩性、速度或能耗方面做出任何妥协。

对于自定义网络,可以设计新的控制平面和SDN应用程序,用户可以为它们设计最适合自己的数据平面算法。数据平面编程并不一定意味着为用户提供任何api,也不需要像of那样支持外部控制平面。设备供应商可能仍然决定开发一个专有的控制平面,并仅为自己的利益使用数据平面编程,而不一定使他们的系统更加开放(尽管许多现在确实开放了他们的系统)。图3显示了这两个选项。

在这里插入图片描述

图3:数据平面可编程性可能被供应商用于更有效的开发,或者被用户用于提供自己的数据和控制平面算法。

来自[10,9,16,17]的四项调查概述了数据平面编程,但没有特别关注P4。

数据平面编程模型

数据平面算法可以并且经常使用标准编程语言来表示。然而,它们不能很好地映射到专门的硬件上,如高速asic。因此,提出了几种数据平面模型作为硬件的抽象。数据平面编程语言是为这些数据平面模型量身定制的,并提供了以抽象方式表达算法的方法。然后编译产生的代码,以便在支持各自数据平面编程模型的特定数据包处理节点上执行。

数据流图抽象和协议独立交换体系结构(PISA)是数据平面模型的例子。我们对第一个问题进行了概述,并对第二个问题进行了深入的阐述,因为PISA是P4的数据平面编程模型。

数据流图抽象

在这些数据平面编程模型中,数据包处理用有向图来描述。图中的节点表示简单的、可重用的原语,可以应用于数据包,例如,数据包报头修改。图的有向边表示包遍历,在每个包的基础上在节点中执行遍历决策。图4显示了IPv4和IPv6数据包转发的示例图

在这里插入图片描述

图4:数据流图抽象:IPv4和IPv6转发的示例图

实现这种数据平面编程模型的编程语言示例有:click[1]、向量包处理器(VPP)[2]和BESS[22]。

协议独立交换体系结构(PISA)

图5描述了PISA。它是基于一个可编程的匹配操作管道的概念,很好地匹配现代交换硬件。它是可重构匹配动作表(RMTs)[23]和可分解可重构匹配动作表(dRMTs)[24]的推广。

在这里插入图片描述

图5:协议独立的交换机架构(PISA)。

PISA由一个可编程解析器、一个可编程部门和一个由多个阶段组成的可编程匹配-动作管道组成

  • 可编程解析器允许程序员与有限状态机一起声明任意报头,有限状态机定义报头在包中的顺序。它将序列化的包头转换成结构良好的形式。

  • 可编程的匹配操作管道由多个匹配操作单元组成。每个单元包括一个或多个匹配操作表(MATs),用于匹配数据包并使用所提供的操作数据执行特定于匹配的操作。包处理算法的批量是以这种MATs的形式定义的。每个MAT包括与存储器(静态随机访问存储器(SRAM)或三元内容可寻址存储器(TCAM))耦合的匹配逻辑,以存储查找键和相应的操作数据。动作逻辑,如算术运算或报头修改,是由算术逻辑单元(alu)实现的。附加的操作逻辑可以使用有状态对象来实现,例如,计数器,仪表,或寄存器,这些都存储在SRAM中。控制平面通过在MATs中写入条目来影响运行时行为,从而管理匹配逻辑。

  • 在可编程部门,程序员声明如何序列化数据包。

由PISA管道处理的数据包由数据包负载和数据包元数据组成。PISA只处理从解析器一路传送到部门的包元数据,而不处理单独传送的包负载。

报文元数据分为报文头、用户自定义元数据和内部元数据。

  • 报文报头是与网络协议报头相对应的元数据。它们通常在解析器中提取,或在department中发出,或两者同时发出。
  • 内在元数据是与固定功能组件相关的元数据。p4可编程组件可以通过读取它们产生的内在元数据来接收来自固定功能组件的信息,或者通过设置它们消费的内在元数据来控制它们的行为。
  • 用户定义的元数据(通常称为简单的元数据)是一种临时存储,类似于其他编程语言中的本地变量。它允许开发人员向包中添加可在整个处理管道中使用的信息。

所有的元数据,无论是包头、用户定义的元数据还是内在的元数据,都是暂时的,这意味着当相应的包离开处理管道时,它会被丢弃(例如,从出口端口发送或丢弃)。

PISA提供了一个抽象的模型,可以用各种方式创建具体的建筑。例如,它允许指定包含可编程组件的不同组合的管道,例如,一个没有解析器或分离器的管道,一个有两个解析器和分离器的管道,以及它们之间附加的匹配操作管道。PISA还允许高级处理所需的专门组件,例如,哈希/校验和计算。除了PISA的可编程组件外,交换机架构通常还包括可配置的固定功能组件。例如,接收或发送包的入口/出口端口块、实现多播或克隆/镜像包的包复制引擎,以及负责包缓冲、排队和调度的流量管理器。

固定功能组件通过生成和/或消费内在元数据与可编程组件通信。例如,入口端口块生成表示可能在匹配操作单元中使用的入口端口号的入口元数据。为了输出数据包,匹配操作单元生成代表出口端口号的内在元数据;然后,流量管理器和/或出口端口块使用此内在元数据。

图6描述了一个典型的基于PISA的交换机架构。它包括一个可编程的入口和出口管道以及三个固定功能组件:入口块、出口块、包复制引擎以及入口和出口管道之间的流量管理器。

在这里插入图片描述

图6:典型的基于PISA的交换机架构。

P4[5]是用于描述PISA数据平面算法的最广泛的领域专用编程语言。它最初的想法和名字是在2013年[25]介绍的,2014年[5]作为研究论文发表。自2019年以来,P4语言联盟[26]进一步开发和标准化了P4语言,该联盟是开放网络基金会(ONF)的一部分。P4语言联盟由一个技术指导委员会管理,并设有五个工作组(WGs)。P414[27]是该语言的第一个标准化版本。目前的规范是2016年首次引入的P416[28]。

其他用于PISA的数据平面编程语言有FAST[29]、OpenState[30]、Domino[31]、FlowBlaze[32]、Protocol-Oblivious Forwarding[33]和NetKAT[34]。此外,Broadcom[3]和Xilinx[4]基于匹配动作表提供特定于供应商的可编程数据平面。

好处

数据平面的可编程性带来了多种好处。在下面,我们总结了主要的好处。

数据平面编程为网络数据包处理引入了充分的灵活性,即算法、协议、特征可以由用户添加、修改或删除。此外,可编程数据平面还可以配置用户自定义的控制平面可编程API和SDN。为了降低复杂性,代码中可能只包含特定用例所需的组件。与多用途设备相比,这提高了安全性和效率。

结合合适的硬件平台,数据平面编程允许网络设备设计者甚至用户试验新的协议和设计独特的应用程序;两者都不再依赖于专门的包处理专用集成电路的供应商来实现自定义算法。与基于硅的新解决方案的长开发周期相比,新的算法可以在几天内编程和部署

数据平面编程也有利于网络设备开发人员,即使使用相同的包处理专用集成电路,也可以轻松创建差异化产品。此外,他们可以保守自己的专有技术,而不需要与ASIC供应商共享细节,并可能将其透露给将使用相同ASIC的竞争对手。

到目前为止,现代数据平面程序和编程语言还没有达到通用编程语言所达到的可移植性程度。然而,用高级语言表达数据平面算法有可能使电信系统显著地更独立于目标。此外,数据平面编程不要求但鼓励完全透明。如果源代码是共享的,那么所有协议和行为的定义都可以查看、分析和推理,这样数据平面程序就可以从社区开发和审查中受益。因此,用户可以选择成本效益高的硬件,非常适合他们的目的,并在其上运行他们的算法。这种趋势是由SDN推动的,通常被称为网络分解。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值