摘要简述
P4是一种高级语言,用于编程与协议无关的数据包处理器。
P4工作于SDN控制协议,就像OpenFlow。但是在OpenFlow的当前形式中,它显式地指定了它操作的协议头。这组字段在几年内从12个字段增加到了41个字段,增加了规范的复杂性,但仍然没有提供添加新报头的灵活性。
在本文中,我们提出P4作为OpenFlow未来应该如何发展的建议。有三个目标:
- 现场可重构:一旦交换机部署,程序员应该能够改变交换机处理数据包的方式
- 协议无关性:交换机不应绑定到任何特定的网络协议
- 目标无关性:程序员应该能够独立于底层硬件的细节来描述包处理功能
本文目录
1. 研究目的
OpenFlow通过显示地声明协议头部来表明可以处理的操作,但是近些年来,协议头部集合已经从12个扩展到了41个,复杂性大大提高,而且openflow也没有提供足够的灵活性来增加新的协议。P4可以看做是OpenFlow的一种未来演化趋势。
2. 研究背景/问题
2.1现存问题:
OpenFlow难以满足定义新协议的要求
2.2 解决方法(本文方法):
P4设计目标
- 可重构性:
控制器应该能够在现场重新定义数据包解析和处理 - 协议无关性:
交换机不应绑定到特定的数据包格式。相反,控制器应该能够指定(i)用于提取具有特定名称和类型的报头字段的数据包解析器,以及(ii)处理这些报头的类型匹配+操作表的集合 - 目标无关性:
正如C程序员不需要知道底层CPU的细节一样,控制器程序员也不需要知道底层交换机的细节。相反,编译器在将独立于目标的描述(用P4编写)转换为依赖于目标的程序(用于配置交换机)时,应该考虑交换机的功能
3. 本文重点(方法)
3.1 抽象转发模型
抽象模型中(图 2)通过可编程解析器切换转发数据包,然后是多个匹配+动作阶段,以串联、并行或两者的组合排列。
模型源自 OpenFlow,但是与OpenFlow有不同之处.
三点区别概括:
- 首先,OpenFlow 假定使用固定解析器,而我们的模型支持可编程解析器以允许定义新的标头。
- 其次,OpenFlow 假设 match+action 阶段是串联的,而在我们的模型中它们可以是并行的或串联的。
- 第三,我们的模型假设动作由交换机支持的独立于协议的原语组成。
实际中的数据包可能会被不同的转发设备转发,比如以太网交换机、路由器、负载平衡器等等。但是我们不管这些底层硬件,只把注意力集中在P4语言如何描述在这个抽象的转发模型上的数据转发。通过这一点程序员可以编程独立于设备的程序,编译器可以将这些程序映射到各种不同的转发设备。
转发模型由两种类型的操作控制:配置和填充(configure and populate)
配置操作:
1)对解析器编程
2)设置match+action不同阶段(stage)的顺序
3)指定每个阶段(stage)处理的头字段。
配置决定了支持哪些协议以及交换机如何处理数据包。
填充操作: 向配置期间指定的match+action表添加(和移除)表项。
填充决定了在任何给定时间应用于数据包的策略。
转发模型如何处理数据包?
首先,由解析器处理。
假设分组主体被单独缓冲,并且不可用于匹配。解析器识别并提取报头中的字段,从而决定交换机支持的协议。该模型对协议报头的含义不做任预设,只知道解析后的表示定义了匹配和动作操作的字段集合。
然后,将提取的报头字段传递到 match+action表。
匹配+动作表分为入口和出口。虽然两者都可以修改数据包头,但入口 匹配+操作确定出口端口并确定放置数据包的队列。根据入口处理,数据包可以被转发、复制(用于多播、跨度或到控制平面)、丢弃或触发流控制。出口匹配+动作对数据包报头执行每个实例的修改——例如,对于多播副本。动作表(计数器、监管器等)。
数据包可以在各个阶段(stage)之间携带额外的信息,称为元数据,它与数据包头字段的处理方式相同。元数据的典型示例包括ingress port、传输目的地和 queue、可用于数据包调度的时间戳,以及不涉及更改数据包的解析表示(例如虚拟网络标识符)的从表到表传递的数据。
队列规则的处理方式与当前的 OpenFlow 相同:一个操作将一个数据包映射到一个队列,该队列被配置为接收特定的服务规则。选择服务规程(例如,最小速率、DRR)作为交换机配置的一部分。
虽然超出了本文的范围,但是可以添加动作原语,以允许程序员实现新的或现有的拥塞控制协议。例如,可以对交换机进行编程,根据新的条件设置ECN位,或者使用match+action表实现专有的拥塞控制机制。
3.2 一种编程语言
本文使用该抽象转发模型定义一种语言表示如何配置交换机和处理数据包。
语言要求:
1、表达解析器是如何编程的,以便解析器知道预期的数据包格式;
2、反映专用硬件中的parse-match-action流水线。
3、程序员表示(隐式/显式)报头字段之间的任何串行相关性。
依赖关系决定了哪些表可以并行执行。(TDG显示依赖关系)
两步编译过程:
1、在最高级别,程序员使用表示控制流的命令式语言(P4)来表达数据包处理程序;
2、在此之下,编译器将P4表示转换成TDGs以进行依赖性分析,然后将TDG映射到特定的交换机设备。
TDGs是什么?
TDGs(Table Dependency Graphs):表依赖关系图
TDGs可以用于识别依赖关系,这些图会描述了表之间的字段输入、动作和控制流。
例如,上图3显示了L2/L3交换机的示例TDG。TDG节点直接映射到match+action表,并且依赖关系分析识别每个表在流水线中的