P4: Programming Protocol-Independent
Packet Processors
We propose P4 as a strawman proposal for how OpenFlow should evolve in the future.
本篇论文中将P4作为OpenFlow的未来发展方向
P4旨在增加网络编程的灵活性
三个目标:
- 字段独立性:程序员能够自定义、改变包头字段(OpenFlow固定了包头字段数目,限制了南向协议)
- 协议独立性:交换机不应绑定到任何特定的网络协议。
- 目标独立性:程序员应该能够独立于底层硬件的具体细节来描述软件包的处理功能。
随着网络发展,OpenFlow协议规范越来越复杂,字段数不断增加,所以,P4提出:
不能再一直扩展OpenFlow规范,而应该支持更为灵活的解析数据包和 “匹配-动作” 的机制,且让控制器应用程序利用一个通用的开放接口来利用这些功能
总的来说:P4用来配置交换机,告诉交换机如何处理数据包
抽象转发模型
对于到达的数据包:
- 解析器处理:从报头中识别并提取字段,从而定义了交换机所支持的协议
- 将提取的报头字段传递给 “匹配-动作” 表,该表分为两部分:
- Ingress Pipeline:数据包可以被转发、复制(用于组播、跨度或发送到控制平面)、丢弃或触发流控制
- Egress Pipeline:执行对数据包头的每个实例的修改,例如,对组播复制
Packets can carry additional information between stages, called metadata, which is treated identically to packet header fields
一个P4实例
考虑一个L2网络部署的例子,使用顶部机架(ToR)的交换机,假设终端主机的数量正在增长,而核心L2表正在溢出
解决方案:
- MPLS协议:为每个数据包打个Tag,只根据Tag转发(不足:难以实现具有多个标签的标签分发协议)
- PortLand:重写MAC地址(不足:可能会破坏现有的网络调试工具,且需要新的代理来响应ARP请求)
- P4:mTag(二者的结合)通过用4字节(32位)的Tag对“源路由”或者目的地定位器(例如PortLand’s Pseudo MAC)进行编码。每个核心交换机只需要检查其中的1个字节,并打开该信息即可
包解析器
P4的解析器其实是Header之间转换的状态机,根据检测到的值,跳转到下一个解析器
- P4的解析器都从其
start
状态开始检测数据包,在stop
状态或者出错时停止 - 解析器提取到的包头信息将会交给 “匹配-动作” 表
- 对于具有可编程解析器的设备,编译器将解析器描述转换为解析状态机
- 对于固定解析器,编译器仅仅验证解析器描述是否与目标的解析器一致
操作规范
P4语言中动作是由一系列原语组成的:
set_field
:设置某一包头中的某一个字段copy_field
:把某报头的某字段复制到另一报头的某字段add_header
:添加新报头remove_header
:删除报头increment
:修改报头某一字段的值checksum
:计算报头校验和
控制程序
经过解析处理之后:于是就来到了这里
- 包解析后,"source_check"表检查数据包和入口端口之间的一致性(例如,带有mTag的包只能从与核心交换机相连的端口收到)"source_check"表同时还会剥掉mTag头部,并在metadata中记录这个数据包是否带有mTag头部,防止重复的贴标签。
- "local_switching"表:
- " miss ":表明数据包不是发给本地主机,交给"mTag"表进行匹配,再给"egress_check"表
- " hit ":直接给"egress_check"表
- "egress_check"表:根据匹配结果或本地主机位置转发数据包,把未知目的地址的包交给SDN控制器
OpenFlow : targets fifixed-function switches
The control plane cannot express how packets should be processed to best meet the needs of control applications.
P4 : more flexible switches
The programmer decides how the forwarding plane processes packets without worrying about implementation details