P4学习(三)基础

发布时间:2024年01月11日

一 架构

在这里插入图片描述
为了进一步说明这一点,让我来描述一下当前网络系统是如何构建的

当你开始构建一个网络系统时,你首先要定义你的需求列表和你想要包含的特性

然后你看看所有不同的可用的数据包处理芯片,它们都有一个数据表,用英语大致解释了它们是如何处理数据包的

你试着挑选一个最适合你需要的,当然它也可能有一堆你不需要的东西

但是一旦你决定了一个芯片,它就定义了你的系统将如何自下而上地构建。它定义了如何编写驱动程序,以及交换机操作系统中运行的控制平面如何能够与固定功能芯片中的转发平面进行交互

当然,如果你想添加一个新功能,例如在你的系统中支持一个新的协议,你需要改变固定功能的芯片,这在最好的情况下可能需要4年的时间!4年后,你可能已经找到了一种方法来绕过它,或者如果你决定仍然需要它,那么你必须更换所有的硬件,这是非常昂贵的,而且可能是很大的痛苦。

现在P4和整个可编程数据平面运动正试图颠覆这种设计理念。P4和整个可编程数据平面运动实际上是你们许多人可能认为的软件定义网络的逻辑扩展。

公平地说,SDN确实改变了我们运营大型网络的方式,使其变得更好

OpenFlow当然是启用SDN的关键协议,它标准化了与交换机交互的方式。因此如何添加/删除表项、查询统计信息等等。该协议为我们提供了对网络设备的运行时控制。

OpenFlow还标准化了我们可以用来编程网络设备的模型,即它识别了匹配/动作抽象。

SDN还带来了网络逻辑集中控制的概念。这很方便,因为它真的可以帮助简化控制平面,因为我们不再需要等待分布式算法收敛,我们可以有一个网络的中心视图。

然而,这种实现SDN的方法遇到了一些问题。

其中一个问题是,随着数据平面协议的改变和发展,我们需要更新控制器和交换机之间南向接口的标准。

如果你看一下OpenFlow,第一个版本支持12个可以匹配的报头字段,现在有40个。因此,OpenFlow已经扩展了很多,并且随着数据平面协议的不断变化和新协议的创建,它将继续扩展。我们都知道,对标准进行更改的过程可能需要相当长的时间。但需要更长的时间的是,你知道你必须更新你的交换芯片ASIC,以支持新的数据平面协议。

这种方法的另一个问题是,提供支持SDN的交换机芯片的供应商之间的互操作性有限。有些使用OpenFlow,有些使用netconf,而其他可能使用其他SDN协议。这些南向接口的差异必须在SDN控制器上处理,这可能相当麻烦。

此外,这种方法提供了有限的可编程性。当您购买启用SDN的交换机时,它将支持一些可以匹配的固定字段集和一些可以在满足匹配标准时执行的固定操作集,但您不能从根本上更改该匹配字段集或操作集。

所以这些正是P4和P4Runtime试图解决的问题。

所以我们可以这样想OpenFlow和这个传统的SDN模型实际上是为了给那些拥有和运营大型网络的人,控制控制平面而设计的。P4现在意味着给予网络运营商对数据平面的控制。

在这里插入图片描述
为了进一步说明这一点,让我来描述一下当前网络系统是如何构建的

当你开始构建一个网络系统时,你首先要定义你的需求列表和你想要包含的特性

然后你看看所有不同的可用的数据包处理芯片,它们都有一个数据表,用英语大致解释了它们是如何处理数据包的

你试着挑选一个最适合你需要的,当然它也可能有一堆你不需要的东西

但是一旦你决定了一个芯片,它就定义了你的系统将如何自下而上地构建。它定义了如何编写驱动程序,以及交换机操作系统中运行的控制平面如何能够与固定功能芯片中的转发平面进行交互

当然,如果你想添加一个新功能,例如在你的系统中支持一个新的协议,你需要改变固定功能的芯片,这在最好的情况下可能需要4年的时间!4年后,你可能已经找到了一种方法来绕过它,或者如果你决定仍然需要它,那么你必须更换所有的硬件,这是非常昂贵的,而且可能是很大的痛苦。

现在P4和整个可编程数据平面运动正试图颠覆这种设计理念。

在这里插入图片描述
我们真正想要的是能够在高层次上精确地定义芯片应该如何处理数据包,这是通过编写P4程序来完成的

然后P4程序被编译到芯片上

通过这种方式,网络系统设计人员可以准确地定义他们想要在系统中拥有的功能,而不必依赖第三方芯片供应商为他们做出决定

在这里插入图片描述
那么P4为什么这么好呢?

当然,一个明显的好处是现在可以很容易地添加新功能,只需更改P4程序并重新编译即可。或者,您可能实际上想要删除不使用的功能,以降低网络中的复杂性。许多网络故障是由网络运营商甚至不知道他们正在使用的功能的意外交互引起的!

使用P4,在部署后在不同表之间重新分配资源变得非常容易。对于固定的功能开关,特性和表大小在设计时就已确定。

可编程转发也带来了更大的网络可见性,以及软件风格的开发过程

现在,你可以改变你的网络数据平面的功能,而不必问第三方芯片供应商;你可以保持自己的想法,从而获得竞争优势

在这里插入图片描述
为了设计一种编程语言,选择适合我们想要表达的算法的抽象机器是非常有用的。

P4基于高速分组处理设备的抽象模型,称为PISA,即协议独立交换机架构。

PISA包括四个基本组成部分:

首先,它是一个可编程解析器,它决定哪些数据包头将被数据平面程序识别。它被建模为一个简单的、确定性的状态机,它使用数据包数据和标识符标头。它通常通过查看前面标识的报头中的特定字段在状态之间进行转换。例如:前14个字节是以太网报头。然后,如果你看一下以太网类型,你就知道下一个报头是VLAN标签,IPv4或IPv6报头,MPLS标签等。如果解析器识别了IPv4报头,它可以根据IP协议跳转到下一个状态,等等。

PISA体系结构的核心是一个管道,由一系列“匹配-行动”阶段组成。它们所能做的是将一些数据与包含一些条目的表进行匹配,并执行相应的操作。如果你仔细想想,这几乎就是所有网络设备所做的。例如,L2交换机将使用目的MAC地址(和VLAN)在L2表中执行匹配,然后执行动作,例如“向此出口端口发送数据包”。类似地,L3交换也很容易简化为匹配序列,例如目的IP地址查找将产生NexthopID,对NexthopID的查找将产生动作,例如“发送到端口”,“更改MAC地址”,“减少TTL”等。acl, MPLS交换,一切都可以用这种方式表达。甚至像if()或switch()语句这样的基本操作也可以简化为match和Action这样的基本操作。

在管道的末端,有一个可编程的分离器(顾名思义)执行该操作,它与解析相反。它将数据包重新组装回来(例如,通过序列化报头),这样数据包就可以回到网络上,进入排队/复制引擎等。

在这里插入图片描述
PISA的运作方式非常直接(无论是象征性的还是字面上的)。

首先,数据包到达解析器,解析器根据解析器程序将其拆分为各个报头。

然后解析后的报头被传递到match-action管道中,该管道根据match-action表匹配报头或中间结果,并执行各种操作:

例如,它可以删除或添加标题

它可以在报头、中间结果和设备状态(在这里表示为表)之间自由移动数据。

它既可以执行简单的算术,也可以执行更专门的操作

最后,发送器将剩余的报头序列化回包字节流

在这里插入图片描述
P4程序由各种不同的组件组成

解析器和控件是您在P4中描述的主要可编程块

解析器是作为状态机实现的,其唯一目的是以某种用户定义的方式从数据包中提取报头字段

控件负责主要的匹配操作处理。在这里定义和应用表和操作来操作包头和元数据

这些解析器和控制块的实现由P4编程器提供;它们是使用语言中定义的各种数据类型和表达式构建的

另一方面,这里列出的橙色框是由P4可编程目标的供应商提供的。

体系结构描述指定了可编程解析器、控制块以及供应商特定块的特定配置。

供应商也可能提供一个我们称之为“extern”的库。extern提供了一些在P4中没有实现的功能,但是提供了一个可以与P4程序交互或被P4程序调用的接口。P4开发人员可以将它们视为黑盒。外部可能特定于特定的目标,但不同的目标实际上可能支持提供相同接口和功能的外部,这有助于P4程序的可移植性。

现在让我们看看我们将在本教程中使用的特定体系结构,v1模型。

在这里插入图片描述
P4_16区分了目标和体系结构。

目标是特定硬件实现的体现

而体系结构提供了一个接口,通过一组P4可编程组件、外部组件和固定组件对目标进行编程。外部提供了一些由供应商实现的功能,这些功能在P4程序中被“黑盒”调用。

一个目标可能支持许多不同的体系结构

基本上,社区开发和标准化语言本身以及必须始终存在的专用对象的核心库。

目标设备的供应商为他们的平台和他们支持的外部库提供体系结构定义。

在这里插入图片描述在这里插入图片描述

二 语法

官方仓库地址:https://github.com/p4lang/tutorials

2.1 概念

在这里插入图片描述

2.2 V1Model Architecture

在这里插入图片描述
它包括一个P4可编程解析器和分离器、一个用于验证传入数据包校验和的块、一个用于更新传出数据包校验和的块、匹配操作处理的独立入口和出口管道,以及一个流量管理器。流量管理器目前在P4中是不可编程的,但它执行调度任务,有时在输入和输出端口之间复制数据包。

2.3 V1Model Standard Metadata

在这里插入图片描述

2.4 P416 Program Template (V1Model)

在这里插入图片描述

2.5 Hello World Test

在这里插入图片描述
在这里插入图片描述

三 Example

3.1 target

  1. 解析数据包中的以太网和IPv4报头
  2. 在IPv4路由表中查找目的地址
  3. 更新源/目的MAC地址
  4. 减量生存时间(TTL)字段
  5. 设置出口端口
  6. 将报头放回包中

3.2 Topo

在这里插入图片描述

3.3 P416 Types (Basic and Header Types)

在这里插入图片描述

3.4 P416 Types (Other Types)

在这里插入图片描述

3.5 Parse

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_51976556/article/details/135462877
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。