P4编程语言

P4编程语言
P4 是一种编程语言,旨在对数据包路由规则进行编程。 与 C 或 Python 等通用语言不同,P4 是一种特定于领域的语言,具有许多针对网络路由优化的设计。

P4 是一种开源语言,由名为 P4 语言联盟的非营利组织授权和维护。 它还得到开放网络基金会 (ONF) 和 Linux 基金会 (LF) 的支持,这两个基金会是开源网络项目最大的伞式组织。
该语言最初于 2013 年创造,并在 2014 年 SIGCOMM CCR 题为“协议无关,数据包路由处理器编程”的论文中进行了描述。

自诞生以来,P4 呈指数级增长和发展,迅速成为描述网络设备(包括网络适配器、交换机和路由器)传输数据包的标准。

开放网络基金会执行董事 Guru Parulkar 表示:“SDN 改变了网络行业,P4 通过为路由带来可编程性,将 SDN 提升到了一个新的水平。”

P4 语言最初是由来自 Google、Intel、微软研究院、Barefoot、普林斯顿大学和斯坦福大学的一群工程师和研究人员创建的。 目标很简单:创建一种易于使用的语言,软件开发人员可以在一天内学习并使用它来准确描述数据包如何通过网络发送。

从一开始,P4 就被设计为与目标无关(即用 P4 编写的程序可以不加修改地编译以在各种目标上运行,例如 ASIC、FPGA、CPU、NPU 和 GPU)。

该语言也是独立于协议的(即,P4 程序可以描述现有的标准协议或用于指定新的自定义寻址模式)。

在工业上,P4用于设备编程。 也许将来的Internet-RFC和IEEE标准也将包括P4规范。

P4 可用于可编程和固定功能设备。 例如,它用于准确记录开源 SONiC 交换机操作系统使用的交换机抽象接口 (SAI) API 中的交换机管道行为。 P4 还用于 ONF Stratum 项目来描述各种固定和可编程设备之间的开关行为。

描述交换机和网络适配器的行为首次允许您在部署之前创建整个网络的准确可执行模型。 大型云提供商可以完全使用软件来测试和调试网络,从而显着减少实验室互操作性测试的时间和成本,而无需昂贵的硬件。

通过使用 P4,网络设备供应商可以期望在所有产品中实现通用的底层路由行为,从而允许重复使用测试基础设施、简化管理软件开发并最终确保互操作性。

当然,P4 可以用来编写描述全新路由方式的程序。 例如,P4 广泛用于数据中心、企业和服务提供商网络中的遥测和测量。

研究界也加大了力度。 几个领先的学术网络研究小组已经发布了基于 P4 程序的令人兴奋的新应用程序,包括负载平衡、共识协议和键值缓存。 一种新的编程范式正在被创建,创新正在从硬件转向软件,允许许多意想不到的、新颖的和巧妙的想法出现。

开发者社区为代码开发做出了重大贡献,包括编译器、管道、行为模型、API、测试框架、应用程序等。 阿里巴巴、AT&T、Barefoot、思科、福克斯网络、谷歌、英特尔、IXIA、瞻博网络、Mellanox、微软、Netcope、Netronome、VMware、Xilinx 和中兴通讯等公司都有专门的开发人员; 来自北京邮电大学、康奈尔大学、哈佛大学、麻省理工学院、交大、普林斯顿大学、斯坦福大学、以色列理工学院、清华大学、麻省大学、USI等大学; CORD、FD.io、OpenDaylight、ONOS、OvS、SAI 和 Stratum 等开源项目凸显了 P4 是一个独立社区项目的事实。

P4 语言的典型控制器生成:

P4编程语言

应用前景

P4编程语言
由于该语言旨在用于路由应用程序,因此与通用编程语言相比,要求和设计选项列表有所不同。 该语言的主要特点是:

  1. 独立于目标实施;
  2. 所使用协议的独立性;
  3. 现场可重构性。

独立于目标实施

P4 程序被设计为独立于实现,这意味着它们可以针对许多不同类型的执行引擎进行编译,例如通用处理器、FPGA、片上系统、网络处理器和 ASIC。 这些不同类型的机器被称为P4目标,每个目标都需要编译器将P4源代码转换为目标切换模型。 编译器可以内置到目标设备、外部软件甚至云服务中。 由于 P4 程序的许多原始目标是用于简单的数据包交换,因此很常见地听到“P4 交换机”一词,尽管“P4 目标”更准确。

所使用协议的独立性

P4 与协议无关。 这意味着该语言不具备对 IP、以太网、TCP、VxLAN 或 MPLS 等常见协议的本机支持。 相反,P4 程序员在程序中描述所需协议的标头格式和字段名称,然后由编译后的程序和目标设备解释和处理。

现场可重构性

协议独立性和抽象语言模型允许重新配置——P4 目标应该能够在系统部署后更改数据包处理。 这种能力传统上与通过通用处理器或网络处理器而不是固定功能集成电路的路由相关。

尽管该语言中没有任何内容会阻止对特定协议集的性能进行优化,但这些优化对于语言作者来说是不可见的,并且最终会降低系统和目标的灵活性及其可重构性。

该语言的这些特征最初是由其创建者制定的,重点是其在网络基础设施中的广泛使用。

该语言已在许多公司中使用:

1)超大规模数据中心;

中国公司腾讯是全球最大的投资公司,也是最大的风险投资公司之一。 腾讯在中国和世界其他国家的子公司专注于高科技业务的各个领域,包括各种互联网服务、人工智能和电子娱乐领域的开发。

P4和可编程路由是该公司网络架构中使用的先进技术。

作为发起者之一,Google 自豪地注意到 P4 在网络行业,特别是在数据中心架构设计中的快速采用。

2)商业公司;

高盛利用与开源社区合作、开发通用标准和解决方案的优势来创新网络基础设施,为客户提供更好的解决方案。

3)生产;

整个网络行业将受益于像 P4 这样唯一定义转发行为的语言。 思科还相信将其产品线转移到使用这种语言。

瞻博网络已将 P4 和 P4 Runtime 纳入许多产品中,并提供对瞻博网络嵌入式处理器及其软件代码的编程访问。

锐捷网络是P4及其给网络带来的好处的坚定支持者。 借助 P4,该公司可以为广大客户创建并提供一流的解决方案。

4) 电信提供商;

AT&T 是 P4 的早期采用者,是最早使用 P4 来定义其希望在其网络中看到的行为并在其网络上使用 P4 可编程转发设备的公司之一。

在德国电信,该语言被用来构建关键网络功能的原型,作为 Access 4.0 计划的一部分。

5)半导体行业;

该语言使 Barefoot 能够实现一种向网络路由平面提供软件功能的新范例。

Xilinx 是 P4.org 的创始人之一,积极参与 P4 语言的开发,并将其实施到基于 FPGA 的 SmartNIC 和 NFV 硬件可编程平台中,并作为 SDNet 设计的一部分发布了首批 P416 编译器之一。

6)软件。

VMware 相信 P4 创造了巨大的能量、创新和社区,正在推动网络中有意义且必要的变革。 VMware 从一开始就参与了这一行业运动,新一波的创新浪潮是由基于软件的方法推动的,这些方法扩展了基础架构功能并将其实施到最新的产品中。

因此,P4 是一种独立于目标和协议的编程语言,工业界和学术界使用它来唯一地将数据包路由行为定义为程序,而该程序又可以针对多个目标进行编译。 如今,目标包括硬件和软件交换机、管理程序交换机、NPU、GPU、FPGA、SmartNIC 和 ASIC。

该语言的主要特点显着扩展了其应用范围,并确保其在网络架构中的快速实现。

入门

P4是一个开放项目,所有相关信息都在网站上 P4.org

存储库链接 https://github.com/p4lang,您可以在其中获取示例源代码和教程。

插件 对于支持 P4 的 Eclipse,但我们可以推荐 P4工作室 来自赤脚。

P4编程语言

我们看一下内核的主要抽象:

定义标头 - 在他们的帮助下,协议标头被确定。

标头定义指定:

  • 数据包格式和头字段名称的描述
  • 固定和可变允许字段

例如

header Ethernet_h{
    bit<48>  dstAddr;
    bit<48>  srcAddr;
    bit<16>  etherType;
}

header IPv4_h{
    bit<4>  version;
    bit<4>  ihl;
    bit<8>  diffserv;
    bit<16>  totalLen;
    bit<16>  identification;
    bit<3>  flags;
    bit<13>  fragOffset;
    bit<8>  ttl;
    bit<8>  protocol;
    bit<16>  hdrChecksum;
    bit<32>  srcAddr;
    bit<32>  dstAddr;
    varbit<320>  options;
}

解析器 ——他们的任务是解析头条新闻。

以下解析器示例将确定机器的最终状态从一种初始状态到两种最终状态之一的转换:

P4编程语言

parser MyParser(){
 state  start{transition parse_ethernet;}
 state  parse_ethernet{
    packet.extract(hdr.ethernet);
    transition select(hdr.ethernet.etherType){
        TYPE_IPV4: parse_ipv4;
        default: accept;
        }
    }…
}

— 包含将用户按键与操作链接起来的机器状态。 活动 — 对如何操作包的描述。

这些表包含数据包转发的状态(在管理级别定义),描述匹配操作单元

数据包的匹配方式为:

  • 完全符合
  • 最长前缀匹配 (LPM)
  • 三重匹配(掩蔽)

table ipv4_lpm{
    reads{
        ipv4.dstAddr: lpm;
    } actions {
        forward();
    }
}

所有可能的操作必须提前在表中定义。

动作由代码和数据组成。 数据来自管理层(例如IP 地址/端口号)。 某些无循环原语可以直接在操作中指定,但指令的数量必须是可预测的。 因此,操作不能包含任何循环或条件语句。

action ipv4_forward(macAddr_t dstAddr, egressSpec_t port){
    standard_metadata.egress_spec = port;
    hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
    hdr.ethernet.dstAddr = dstAddr;
    hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}

匹配动作模块 — 创建搜索键、在表中搜索、执行操作的操作。

一个典型的模块示例如图所示:

P4编程语言

控制流 — 表示 Match-Action 模块的使用顺序。 这是一个命令式程序,定义了高级逻辑和匹配动作序列。 控制流通过定义控制级别来链接所有对象。

外部对象 是具有明确定义的架构和 API 接口的特定对象。 例如校验和计算、寄存器、计数器、计数器等。

extern register{
    register(bit<32> size);
    void read(out T result, in bit<32> index);
    void write(in bit<32> index, in T value);
}

extern Checksum16{
  Checksum16();    //constructor
  void clear();    //prepare unit for computation
  void update(in T data);    //add data to checksum
  void remove(in T data);  /remove data from existing checksum
  bit<16> get(); //get the checksum for the data added since last clear
}

元数据 — 与每个包相关的数据结构。

有两种类型的元数据:

  自定义元数据(所有包的空结构)
    你可以在这里放任何你想要的东西
    整个管道可用
    方便用于您自己的目的,例如,用于存储包哈希

  内部元数据 - 由架构提供
    输入端口、输出端口在这里定义
    数据包排队时的时间戳、队列深度
    多播哈希/多播队列
    包优先级、包重要性
    输出端口规范(例如输出队列)

P4编译器

P4 编译器 (P4C) 生成:

  1. 数据平面运行时间
  2. 用于管理数据平面中机器状态的 API

P4编程语言

P4 语言的软件开关示例

源代码可以从存储库下载。

p4lang/p4c-bm:为 bmv2 创建 JSON 配置
p4lang/bmv2:了解 bmv2 版本 JSON 配置的软件开关

图为项目编译图:

P4编程语言

对表、读取寄存器、计数器进行操作:

  • table_set_default <table name> <action name> <action parameters>
  • table_add <table name> <action name> <match fields> => <action
    parameters> [priority]
  • table_delete <table name> <entry handle>


源代码包含 simple_switch_CLI 程序,方便使用软件开关 API。

您可以从存储库下载此示例和其他示例。

P4编程语言

PS 今年夏初,英特尔签署了收购Barefoot Networks的协议,以期快速满足超大规模云用户的需求。 正如Navin Shenoy(英特尔公司执行副总裁兼数据中心事业部总经理)所说,这将使英特尔能够为数据中心客户提供更大的工作负载和更多机会。

在我个人看来,我们不应该忘记Intel是FPGA芯片生产的领导者,它拥有优秀的Quartus环境。 这意味着我们可以预期,随着Intel的到来,Barefoot不仅会扩大其产品线,Quartus和P4 Studio也将在Toffino和Toffino 2系列上得到重大更新和补充。

P4社区正式会员-公司 因子组.

来源: habr.com

添加评论