p4语言简介
P4(Programming Protocol-Independent Packet Processors) 是一种数据面的高级编程语言。数据面编程就是我们自定义匹配字段 ,自定义动作类型 , 从而自定义流表 ,进而形成流水线。p4不仅可以对数据流进行转发,还可以对交换机等转发设备的数据处理流程进行软件编程定义。p4语言实现的交换机架构如下图
p4语言特点
p4的几个需要注意的点:
- 可以实现现有协议的转发功能
- 可以自定义数据包结构
- 可以在现有协议的基础上进行新的功能开发
- SW 风格开发——协议和转发的开发模式类似于软件开发
p4的语言要素
- headers(metadata)
- parser
- table & action
- control flow code
headers
可以自定义header,添加目前数据包中不存在的字段,便于实现转发时候特定字段的匹配和动作。但是p4写成的程序只负责解析字段,所以还需要软件环境。
parser
用于解析数据包的headers的状态机,他可以有很多种状态,可以根据来的数据包的状态来选择变成哪个状态,而且有三个预留的状态
- start
- reject
-
accept
除这三个之外的状态可以自己定义,状态之间的转变也可以用户自己定义,完全是可编程的。
table & action
table是由controller通过南向协议进行下发,而匹配的模式可以由p4语言来确定,table只提供了表,怎么去查表,查表之后进行怎么样的动作,也都完全由p4程序来确定,包括匹配的key,下一步的action id,但是action data是由table传出来的。
control flow code
这部分就像是c++程序里面的顺序结构,规定先干什么,然后在干什么,最后干什么,这部分的可编程化,把交换机的单一功能变得更加自主和智能化。交换机不再仅仅完成简单的ip或者名称匹配,而是又一个复杂的流程需要完成,可以是多个匹配任务的连续,也可以对数据包的包头进行修改,增加,删减等动作。所谓的协议和转发策略一切变得跟软件开发一样简单。