P4编程语言


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

P4是一种开源语言,由一家名为P4语言联盟的非营利组织授权和支持。 Open Networking Foundation(ONF)和Linux Foundation(LF)是开源网络项目中的两个最大的伞形组织,它也得到了它的支持。
该语言最初是在2013年创造的,并在SIGCOMM CCR文档中于2014年进行了描述,该文档的标题为“与协议无关的包路由处理器编程”。

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

开放网络基金会执行董事Guru Parulkar表示:“ SDN已改变了网络行业,P4将SDN推向了新的高度,提供了路由领域的可编程性。

P4语言最初由来自Google,Intel,Microsoft Research,Barefoot,Princeton和Stanford的一组工程师和研究人员创建。 目标很简单:创建一种易于使用的语言,软件开发人员可以在一天中学习该语言,并使用它来准确描述如何通过网络发送数据包。

从一开始,P4就被设计为独立于目标的(即,用P4编写的程序可以出于各种目的而不变地编译,例如ASIC,FPGA,CPU,NPU和GPU)。

而且,该语言是与协议无关的(即,P4程序可以描述现有的标准协议,或者可以用于指示新的自定义寻址模式)。

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

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

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

使用P4,网络设备供应商可以在所有产品上依靠通用的基本路由行为,从而可以重用测试基础结构,简化管理软件的开发并最终确保兼容性。

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

研究界也在加强。 几个领先的学术网络技术研究小组已经基于P4程序发布了有趣的新应用程序,包括负载平衡,一致的协议和键值缓存。 正在创建一个新的编程范例,创新正在从硬件过渡到软件,这使许多意想不到的,新颖而绝妙的想法得以出现。

开发社区为代码开发做出了重大贡献,包括编译器,管道,行为模型,API,测试环境,应用程序等。 阿里巴巴,AT&T,Barefoot,Cisco,Fox Networks,Google,Intel,IXIA,Juniper Networks,Mellanox,Microsoft,Netcope,Netronome,VMware,Xilinx和ZTE等公司都有专门的开发人员; 来自BUPT,康奈尔大学,哈佛大学,麻省理工学院,NCTU,普林斯顿大学,斯坦福大学,Technion大学,清华大学,麻州大学和USI等大学的学生; P4是一个独立的社区项目,而包括CORD,FD.io,OpenDaylight,ONOS,OvS,SAI和Stratum在内的开源项目都凸显了这一事实。

典型的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包含在许多产品中,并提供对Juniper嵌入式处理器及其程序代码的编程访问。

锐捷网络是P4及其为网络带来的利益的积极支持者。 借助P4,公司可以为广泛的客户创建并提供一流的解决方案。

4)电信提供商;

AT&T是P4的第一个支持者之一,也是第一个使用P4来确定其希望在网络上看到的行为并在其网络上使用P4可编程转发设备的支持者之一。

Deutsche Telekom使用该语言来原型化关键网络功能,作为Access 4.0的一部分。

5)半导体产业;

该语言使Barefoot可以实现一种新的范例,以将软件功能转移到网络路由平面。

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

6)软件。

VMware相信P4会创造巨大的能量,创新和社区,从而导致网络中有意义且必要的转型。 VMware最初是该行业运动的一部分,因为新的创新浪潮是由软件方法驱动的,这些方法扩展了基础架构的功能并在最新产品中实施了该架构。

因此,P4是一种与目标无关且与协议无关的编程语言,被工业界和科学界用来唯一地确定作为程序的数据包路由行为,然后可以出于多种目的对其进行编译。 今天的目标包括硬件和软件交换机,虚拟机管理程序交换机,NPU,GPU,FPGA,SmartNIC和ASIC。

该语言的主要功能大大扩展了其应用范围,并提供了在网络体系结构中的快速实现。

从哪里开始


P4是一个开源项目;所有当前信息都在P4.org网站上

链接到资源库https://github.com/p4lang ,您可以在其中获取示例和培训材料的源代码。

具有P4支持的Eclipse 插件 ,但是我们可以推荐Barefoot的P4 Studio



让我们分析内核的主要抽象:

标头的定义 - 定义了协议的帮助标头。

标头集的定义:

  • 包格式和标题字段名称的描述
  • 固定和可变允许字段

举个例子

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;
}


解析器是解析标头的任务。

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



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;
}


Match-Action模块 -创建搜索键,在表中搜索,执行操作的操作。

图中显示了一个典型的模块示例:



控制流 -指示Match-Action模块的应用顺序。 这是一个命令程序,它定义了高级逻辑和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
}

元数据是与每个程序包关联的数据结构。

元数据有2种类型:

自定义元数据(所有软件包的空结构)
你可以把你想要的一切放在这里
在整个管道中可用
方便您自己使用,例如存储包的哈希值

内部元数据-由体系结构提供
在此定义输入端口,输出端口
数据包排队的时间戳,队列深度
组播哈希/组播队列
包裹优先,包裹重要性
输出端口规格(例如输出队列)

编译器P4


P4编译器(P4C)生成:

  1. 数据平面运行时
  2. 用于数据平面中机器状态控制的API


P4中的软件开关示例


可以从资源库下载源代码。

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

该图显示了项目编译图:



使用表,读取寄存器,计数器进行操作:

  • 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>
  • 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>
  • 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。

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



PS在初夏,英特尔签署了一项收购Barefoot Networks的协议,目的是快速满足Hyperscale Cloud用户的需求。 英特尔公司数据中心执行副总裁兼总经理Navin Shenoy表示,这将使英特尔为数据中心客户提供更大的工作量和更多的机会。

以我个人的观点,不要忘记英特尔是FPGA芯片生产的领导者,并且它具有出色的Quartus环境。 因此,您可以期待,随着Intel的到来,Barefoot不仅会扩展其产品线,而且Quartus和P4 Studio还将对Toffino和Toffino 2系列进行重大更新。

P4社区的正式成员是Factor Group

Source: https://habr.com/ru/post/zh-CN460439/


All Articles