学习完P4 tutorials----Basic Forwarding和Basic Tunneling两个实验,也急需补充些理论知识。
透过实验的现象,再看理论也不是很枯燥难懂。
什么是P4
P4是“Programming Protocol-independent Packet Processors” 每个词的首字母的缩写。最早是在https://arxiv.org/pdf/1312.1719.pdf. 这篇论文所发布。
一开始P4是为可编程交换机而设计,现在已经扩展到交换机、网卡、FPGA以及软交换机等很多种设备。现在我们一般在称P4中的这些设备为target。
传统交换机 vs P4可编程交换机
target的实现一般包括控制平面和数据平面。P4主要是设计数据平面的功能,以及涉及一部分控制平面和数据平面交互接口的定义。
如下图,我们看传统交换机和P4可编程交换机的不同之处。
传统交换机,是由设备厂商定义数据平面的功能。控制平面管理数据平面是通过管理表(如:routing table),配置特定对象(如:meters),处理控制报文(如:routing protocol packets)、异步事件(如:link up/down、notificatins)。
相比传统交换机P4可编程交换机有本质的区别:
数据平面功能不是预先设定的,而是P4程序定义的。数据平面初始化功能是由P4程序定义(如图中长红箭头),没有内置的网络协议。
控制平面和数据平面交互使用统一的通道。P4程序编译生成控制平面和数据平面交互的API。
因此P4是协议无关的,使用者可以灵活定义数据平面的行为。
P4中的核心概念
Header Type:描述数据包中报文头的字段和大小尺寸。
Parsers:描述收到数据包的报文头序列、如何识别序列以及提取数据包的报文头和字段。
Tables:关联用户定义的key与action关联。P4 Tables是传统交换机Tables的扩充,它能实现routing table,flow table,acl以及其它用户自定义table的查找。包括多变量决策。
Actions:描述如何操作数据包报文头字段和元数据(metadata)的代码。actions可以包括控制平面在runtime时提供的数据。
Match-action units:执行以下操作顺序:
- 从数据包或计算的元数据中构造查找keys,
- 使用keys进行查表,选择要执行的action(包括关联数据),
- 最后执行选定的action。
Control flow:描述在target上的包处理程序,包括:match-action units调用的数据相关顺序,解析(包重组)。
Extern objects:是特定的体系架构,可以由P4程序通过API操作,但是由于它属于hard-wired不可改变(如:checksum units)不能被P4编辑。
User-defined metadata:与每个数据包相关的用户定义的数据包构造。
Intrinsic metadata:与每个数据包相关的结构提供的元数据(如:数据包的入接口)
P4 对target编程的工作流
下图,用P4编辑target的标准工作流程:
target 由设备厂商提供软件或硬件的实现框架、架构模型,P4编译器;架构用户为特定的体系架构编写P4的程序代码。该架构模型定义了target上的一组P4可编程组件及其外部数据平面接口。
编译P4程序会产生两个组件:
- 数据平面的配置,它描述了程序的转发逻辑,这是一个.bin的文件(例如针对 ASIC),也可以是其他格式的文件,例如运行在 simple_switch 就是一个 .json文件;
- 控制平面管理数据平面对象状态的API。
例如我之前介绍的P4 tutorials----Basic Forwarding这个实验中
P4 program是basic.p4,P4 compiler是p4c,P4 architecture model是V1 model,target是bmv2软件交换机,API是P4Runtime。
basic.p4通过编译器p4c编译后生成basic.json并加载到bmv2软交换机,
编译器生成basic.p4.p4info.txt文件,这个文件中包含了sX-runtime.json里定义的tables,keys,actions,由P4Runtime加载到控制平面。
architecture model
之前实验用的软件交换机BVM2对应的 V1Model。从下图可以看出,数据包的处理过程像一条流水线一样,它由5个模块组成,分别是:
Parser:解析器,对数据包根据预先定义好的格式进行解析,并提取头部的各个字段,在这里可能会根据不同的头部进行匹配。比如如果三层包头的协议字段是0x0800则是ip报文。
Ingress:Ingress流水线部分,数据处理逻辑的入口。
TM:Traffic Manager,在这里定义核心的处理逻辑,并且会对一些元数据进行更新。
Egress:Egress流水线部分,数据处理逻辑的出口。
Deparser:用于对数据包进行重组,因为数据包在处理过程中经历了分解和处理。所以最后转发的时候需要重组一下。
不过现在据说PSA才是真实世界里匹配万物的利器,有空再着重学习一下,
特别是第一个支持P4编程的Tofino芯片也值得一看。
今天先到这吧,改天再继续把Parser、Ingress、 Egress、Deparser学一学。给自己多挖几个坑。