P4 Network SDN

P4_16 语言定义

P4_16 Language Specification

HERMITOUO
2021-11-03
7 min

本文主要内容源自 P4_16 Language Specification

# Scope

本规范文件定义了 P4_16 语言的结构和程序的解释。它定义了该语言的语法、语义规则和符合要求的实现方式。

本文并没有定义:

  • P4 程序在数据包处理系统中的编译、加载和执行机制。
  • 数据由一个数据包处理系统接收并传递给另一个系统的机制。
  • 控制平面管理匹配行动表和其他由 P4 程序定义的有状态对象的机制。
  • P4 程序的大小或复杂性。
  • 能够提供符合要求的实现的数据包处理系统的最低要求。

# Terms, definitions, and symbols

在本文中,将使用如下术语:

  • Architecture:一组 P4 可编程组件和它们之间的数据平面接口。
  • Control plane:一类算法以及相应的输入和输出数据,它们与数据平面的配置和配置有关。
  • Data plane:一类描述数据包处理系统对数据包进行转换的算法。
  • Metadata:P4 程序执行过程中产生的中间数据。
  • Packet:网络数据包是由分组交换网络携带的格式化的数据单位。
  • Packet header:数据包开头的格式化数据。一个给定的数据包可能包含一系列表示不同网络协议的数据包头。
  • Packet payload:数据包头后面的数据(有效载荷)。
  • Packet-processing system:为处理网络数据包而设计的数据处理系统。通常,数据包处理系统实现控制平面和数据平面算法。
  • Target:一种能够执行 P4 程序的数据包处理系统。

# Overview

P4 是一种语言,用于表达数据包如何被可编程转发元件(如硬件或软件交换机、网络接口卡、路由器或网络设备)的数据平面所处理。P4 的名字来自于介绍该语言的原始论文,"Programming Protocol-independent Packet Processors",https://arxiv.org/pdf/1312.1719.pdf。

虽然 P4 最初是为交换机编程而设计的,但它的范围已经扩大到包括大量的设备。在本文件的其余部分,我们使用通用术语 target 来表示所有这些设备。

许多 target 同时实现了控制平面和数据平面。P4 被设计为只指定 target 的数据平面功能。P4 程序还定义了部分控制平面和数据平面通信的接口,但 P4 不能用来描述 target 的控制平面功能。在本文的其余部分,当我们谈论 P4 “对目标进行编程”时,我们指的是“对目标的数据平面进行编程”。

作为一个 target 的具体例子,下图说明了传统的固定功能交换机和 P4 可编程交换机之间的区别。在传统的交换机中,制造商定义了数据平面的功能。控制平面通过管理表的条目(如路由表)、配置专门的对象(如仪表)以及处理控制包(如路由协议包)或异步事件(如链路状态变化或学习通知)来控制数据平面。

但 P4 可编程交换机在以下两个方面与传统交换机不同:

  1. 数据平面的功能不是事先固定的,而是由一个 P4 程序定义的。数据平面在初始化时被配置为实现 P4 程序所描述的功能(由长的红色箭头所示),并且没有内置的现有网络协议(协议无关)。
  2. 控制平面使用与固定功能设备中相同的通道与数据平面进行通信,但是数据平面中的表和其他对象不再是固定的,而是由 P4 程序定义的。同时,P4 编译器生成了控制平面用来与数据平面通信的 API,便于控制平面进行控制。

因此,P4 可以说是独立于协议的,但它允许程序员表达丰富的协议和其他数据平面行为。

Figure 1

P4 语言提供的核心抽象是:

  • Header types:描述数据包中每个报头的格式(字段集及其大小)。
  • Parsers:描述接收到的数据包中允许的头部序列,如何识别这些头部序列,以及从数据包中提取的头部和字段。
  • Tables:关联了用户定义的键和操作(Key and Action)。P4 表抽象了传统的交换机表,可以用来实现路由表、流查找表、访问控制列表和其他用户定义的表类型,包括复杂的多变量决策。
  • Actions:是描述如何操作数据包头字段和元数据的代码片段。Action 可以包括数据,这些数据在运行时由控制平面提供。
  • Match-action units:执行以下任务:
    • 从数据包字段或计算的元数据构造查找键。
    • 使用构造的键执行表查找,选择要执行的操作(包括关联的数据) 。
    • 执行选定的操作。
  • Control flow:表示为一个命令式程序,描述 target 上的数据包处理过程。包括匹配动作单元调用的数据相关序列,也可以使用控制流执行解析(数据包重组)。
  • Extern objects:是架构特定的构造,可以通过定义明确的 API 被 P4 程序操作,但其内部行为是硬连接的(例如,校验单元),因此无法使用 P4 进行编程。
  • User-defined metadata:与每个数据包关联的用户定义的数据结构。
  • Intrinsic metadata:由与每个数据包相关联的体系结构提供的元数据——例如,接收数据包的输入端口。

下图展示了使用 P4 对 target 进行编程时的典型工具工作流程。

Figure 2

Target 制造商为该 target 提供硬件或软件实现框架、架构定义以及 P4 编译器。P4 程序员为特定的架构编写程序,该架构定义了 target 上的一组 P4 可编程组件,以及它们的外部数据平面接口。

编译一个 P4 程序会产生两个组件:

  1. 一个数据平面配置,实现输入程序中描述的转发逻辑。
  2. 一个用于管理来自控制平面的数据平面对象的状态的API。

P4 是一种特定领域的语言,被设计为可在多种目标上实现,包括可编程网络接口卡、FPGA、软件交换机和硬件 ASIC。因此,该语言仅限于可以在所有这些平台上有效实现的结构。

假设查表操作和与外部对象的交互的成本是固定的,所有的 P4 程序(即解析器和控件)对于收到和分析的输入数据包的每个字节执行的操作数量是固定的。尽管解析器可能包含循环,但只要在每个循环中提取一些头,数据包本身就为解析器的总执行提供了一个约束。换句话说,在这些假设下,P4 程序的计算复杂度与所有报头的总大小呈线性关系,而绝不取决于处理数据时积累的状态的大小(例如,流量的数量,或处理的数据包总数)。这些保证对于实现各种目标的快速数据包处理是必要的(但不是充分的)。

Last Updated: 1/17/2022, 3:45:29 AM