P4 语言概述
目录
一. P4的语言特性
斯坦福大学的Nick McKeown 教授为了充分解放数据平面的编程能力于2014 年首次设计并提出了数据平面特定领域编程语言P4,经提出就得到了学术界和工业界的广泛关注和认可。工业界纷纷跟进并着手研制了一系列高性能的可编程硬件,其中主要包含Barefoot Tofino,Cavium XPliant以及Netronome NICs[9]等。其中Barefoot Tofino 是目前业界数据分组转发速度最快的可编程硬件,最高可以达到6.5Tbit/s 的线速数据分组转发速率,性能远超传统交换机。一方面基于可编程设备的可定制化特性能够快速实现和验证一些新型的网络架构、功能和协议,极大加速了网络演进和创新;另一方面基于可编程设备的高性能特性,传统上由灵活但低性能的中间件实现的一些比如防火墙,负载均衡等较为简单的网络功能可以卸载到可编程数据平面上实现来获取可观的性能提升。数据平面特定领域编程语言P4 具有如下3 点语言特性。
1) 可重配置性:P4 支持转发逻辑代码经过编译部署到具体平台上之后动态修改报文的处理方式。这样的话,运营商就可以在不更换硬件的前提下灵活定义数据平面的处理行为,极大降低了更换设备的资金成本和等待新设备开发的时间成本。
2) 协议无关性[4]:P4 并不绑定于某个特定的网络协议。开发人员只需根据P4 语言定义的语法语义要素结合平台的相关特性就可以自定义新协议,同时也能够去除冗余的协议,按需使用协议,降低了额外开销,提高了设备的资源利用率。
3) 平台无关性[4]:开发人员可以独立于特定的底层运行平台来编写数据报文处理逻辑。代码能够通过设备相关的后端编译器快速地在硬件交换机、FPGA、SmartNIC、软件交换机等不同平台之间移植,减轻了开发人员的负担,提高了开发效率。
二. P4的模型结构
为此,P4 语言定义了一套抽象转发模型[10]来支撑上诉三点语言特性。如图1 所示,抽象转发模型包含3 个主要部分。
1) 第一部分是可编程的数据报文头部解析器。开发人员在编写P4 代码时可以自定义报文头部解析流程,灵活解析不同的数据报文格式,经过编译之后产生类似于图2 所示的数据报文头部解析状态转移图,在部署时配置到可编程设备的报文头部解析器上。在数据报文进入可编程设备时数据平面先将报文头部和载荷分离,接着根据解析图的状态转移规则解析并保存报文的头部到对应自定义的头部域中,用于流水线中流表的匹配操作。
2) 第二部分是可编程的多阶段流水线[10]。从图1 中可以看出主要分为入口流水线和出口流水线,其中,入口流水线主要进行数据分组修改以及决定出端口的操作,随之数据分组进入对应出端口的缓存队列中;而出口流水线仅负责数据分组的修改。开发人员可以自定义每张匹配动作表中的匹配头部域,执行动作及其参数,流表的数量等以及各条流水线中每张匹配动作表的执行顺序。P4 代码经过编译之后会产生一张由匹配动作表组成的有向无环图(DAG),即数据平面控制流。运行时数据平面会依据控制流中匹配动作表的顺序依次匹配处理每个数据报文。
3) 第三部分是控制平面上的控制程序。P4 程序会在编译后生成对应的控制接口,主要负责在运行时向设备的数据平面下发并安装具体的流表匹配规则,配置计数器、寄存器等与平台相关的特定对象以及采集其他运行时的状态统计信息。
参考文献: 刘争争, 毕军, 周禹, et al. 基于P4的主动网络遥测机制[J]. 通信学报, 2018, 39(S1):168-175.