P4编译器作用

将 .p4 源代码编译为目标设备(如 BMv2 软件交换机)的配置文件(如 JSON)。解析和检查 P4 程序的语法和语义,生成硬件或软件可以理解的配置。

P4源程序通过编译器生成json文件,这个文件才是真正交给可编程交换机的东西,然后交换机再根据这个文件来具体解析怎么匹配和处理。

编译器与设备配置的关系可以类比为一个软件开发和运行的过程:

  • P4 源程序(.p4 文件):类似于用高级语言编写的程序代码。
  • P4 编译器(p4c):类似于 C 语言的编译器(如 GCC),将源代码编译成可执行文件(JSON 配置)。
  • JSON 文件:类似于最终的二进制可执行文件,直接告诉设备如何运行。
  • 交换机:类似于计算机,加载 JSON 文件后,根据其中的规则处理流量。

在 SDN(软件定义网络)中,控制器是掌握全网信息的中心大脑,当网络拓扑或主机 IP 信息发生变化时,控
制器会最先感知到这些变化,然后根据新的网络状态和策略生成或更新表项,并动态下发到交换机的数据面。

P4 的数据平面与控制平面
P4 的设计基于 数据平面 和 控制平面 的分离,这种分工是其动态特性的基础:

数据平面(Data Plane):

静态部分,由 P4 源程序定义。
描述如何解析数据包、匹配表规则,以及执行哪些动作。
通过编译生成的 JSON 文件加载到可编程交换机中,作为交换机的运行时“说明书”。
控制平面(Control Plane):

动态部分,由控制器负责管理。
运行时通过 P4Runtime 等接口向交换机下发匹配规则和动作参数。
表项的更新不影响数据平面的核心逻辑,可实时动态调整。
动态运行时的工作原理
编译阶段:

P4 程序(.p4 文件)被编译为 JSON 文件,包含头部结构、解析器逻辑、表的定义和可执行的动作。
JSON 文件加载到可编程交换机,定义数据平面行为。
运行时动态管理:

控制器通过 P4Runtime 协议动态管理表项,例如添加新的匹配规则,或修改已有规则的动作参数。
控制器的下发操作立即生效,无需重启交换机或重新编译 P4 程序。
数据包处理:

数据包到达交换机后,解析器根据 JSON 定义提取字段。
交换机匹配表项,并执行对应的动作,如转发、丢弃或修改字段。
动态运行时的优点
无需中断服务:表项的动态更新可以实时进行,网络不会因为规则调整而中断。
高效灵活:控制器可以根据流量的实时变化动态调整规则,例如增加 ACL 规则或改变路由路径。
易于扩展:数据平面的逻辑通过 JSON 文件静态定义,控制器可以随时扩展表项,不需要修改底层逻辑。
符合 SDN 理念:将控制和转发分离,使网络更加可编程和灵活。
P4 的动态特性对比传统语言
特性 P4 的动态更新表项 传统高级语言(如 C)
运行时更新规则 控制器动态下发表项,无需重启设备 修改代码需重新编译和运行
核心逻辑的定义 静态 JSON 文件,保持不变 程序逻辑直接定义行为
适用场景 动态流量管理(路由、ACL、防火墙等) 静态逻辑控制

P4程序中只定义table,然后table中有key和可能的多个动作,具体采用哪个动作是由控制面决定的