P4: Programming Protocol-IndependentPacket Processors

目录

一、P4背景

(1)何为P4? 

(2)P4 的目标:

(3)P4为什么诞生?

二、抽象的转发模型

(1)转发模型的工作原理及优势

(2)转发模型的操作 

 三、一门编程语言

四、P4语言示例

五、编制P4程序

六、结论 


一、P4背景

(1)何为P4? 

P4 是一种高级语言,用于编程与协议无关的数据包处理器。它可与SDN 控制协议(如 OpenFlow)结合使用,使网络更加灵活,并能够适应新应用、新协议的快速发展需求。它提高了网络编程的抽象级别,并可以作为控制器和交换机之间的通用接口如图1所示。

(2)P4 的目标:

1、可重构性:控制器应该能够重新定义字段中的数据包解析和处理。 

2、协议独立性: 交换机不应与任何特定的网络协议绑定。

3、目标独立性: 程序员应能独立地描述数据包处理功能,而不依赖于底层硬件的具体情况。

(3)P4为什么诞生?

最开始OpenFlow接口很简单,但是随着发展该规范变得越来越复杂(参见表1),具有更多的标头字段和规则表的多个阶段,以允许交换机向控制器公开更多功能。在技术人员看来,未来的交换机应该支持解析数据包和匹配报头字段的灵活机制,允许控制器应用程序通过通用的开放接口,但是对新一代交换芯片进行编程远非易事,因此P4---一种用于独立于编程协议的分组处理器的高级语言,就随之而诞生了。

二、抽象的转发模型

(1)转发模型的工作原理及优势

在这一抽象模型中,如图2所示,交换机通过可编程解析器转发数据包,然后是匹配+操作的多个阶段,按串联、并行或两者的组合排列。                                                                                     

与OpenFlow相比较而言,我们的模型优势有:1.支持一个可编程解析器,以允许定义新的标头。2.匹配+操作的多个阶段,它们可以是并行的或串联的。3.我们的模型假设动作由交换机支持的protocol-independent原语组成,这使我们可以根据常见的抽象模型处理数据包。4.程序员可以创建独立于目标的程序,编译器可以将其映射到各种不同的转发设备,从相对较慢的软件交换机到基于ASIC的最快交换机。

(2)转发模型的操作 

1.配置:对解析器进行编程,设置匹配+操作阶段的顺序,并指定每个阶段处理的标头字段。配置决定了支持哪些协议以及交换机如何处理数据包。

2.填充:向配置期间指定的匹配+操作表添加(和删除)条目。 填充决定了在任何给定时间应用于数据包的策略。

流程大概是:解析器识别并从标头中提取字段,从而定义交换机支持的协议,然后将提取的标头字段传递给匹配+操作表。入口匹配+操作确定出口端口并确定数据包放入的队列,出口匹配+操作对包报头执行每个实例的修改,数据包可以在阶段之间携带称为元数据的附加信息,操作将数据包映射到队列,队列被配置为接收特定的服务规则,其被选择为交换机配置的一部分。

 三、一门编程语言

 P4语言允许程序员基于网络协议(如IPv4,IPv6等)来定义标头类型。这些标头类型定义了标头可能包含的字段以及它们的长度。通过声明可能的标头类型,P4可以更灵活地支持各种网络协议。例如,程序员可能会声明一个IPv4标头,包含版本,头长度,服务类型,总长度,标识符,标志,片偏移,生存时间,协议,校验和,源IP地址和目标IP地址等字段。

除此以外,P4语言也允许程序员处理数据包标头,程序员通过定义一组解析函数,表达了如何解析以及处理从网络收到的各类数据包。解析函数定义了数据包标头的初始状态以及顺序,从而描述了数据包各部分的处理方式。一旦给定标头被成功解析,适配的函数指令就会开始执行,它来处理和操作网络数据包中包含的信息。举例来说,程序员可能会定义一个解析IPv4标头的函数。该函数会检查版本字段,确保它是4;会检查头长度字段,确保它至少20字节;确认其他字段(如源IP和目标IP)存在。如果这一切都正确无误,那么程序就会开始处理该数据包,根据需要进行路由、过滤或其他操作。

数据包处理语言必须允许程序员表达(隐式或显式)标头字段之间的任何串行依赖关系。可以通过分析表依赖图(TDG)来识别依赖关系,这些图描述了表之间的字段输入、操作和控制流。但是程序员倾向于考虑使用命令式结构而不是图形的数据包处理算法,因此我们提出了一个两步编译过程。程序员使用表示控制流(P4)的命令式语言来表达数据包处理程序;在这下面,编译器将P4表示转换为TDG以促进依赖分析,然后将TDG映射到特定的交换机目标。

四、P4语言示例

P4包含标题、解析器、表三个部分。 

标题(Headers):在P4中,标题用来定义网络数据包在传输过程中所包含的信息。例如,一个IPv4数据包的头部可能会包含源IP地址、目标IP地址、版本号、头部长度等信息。例如,标准的eth-ernet和VLAN标题指定如下:                     

header ethernet {
        fields {
                dst_addr : 48; // width in bits
                src_addr : 48;
                ethertype : 16;
        }
}
header vlan {
        fields {
                pcp : 3;
                cfi : 1;
                vid : 12;
                ethertype : 16;
        }

在现有的网络架构中,无需改变现有的头部声明即可新增 mTag 头部。mTag 提供的头部字段显示网络有两层聚合,这一聚合层次通常对应于各种核心交换机的层次。

在这个系统中,每个核心交换机都使用预先编程的规则来监视mTag中的特定字段,这些字段的值取决于该交换机在层次结构中的位置,以及数据包的传递方向(上行或下行)。大体的逻辑可能如下:header mTag {
        fields {
                up1 : 8;
                up2 : 8;
                down1 : 8;
                down2 : 8;
                ethertype : 16;
        }
}

解析器(Parsers):P4假设底层交换机可以实现一个从开始到结束遍历数据包标头的状态机,并在它进行时提取字段值。提取的字段值将被发送到匹配+操作表进行处理,P4将此状态机直接描述为从一个标头到下一个标头的转换集。每个转换都可能由当前标头中的值触发。例如,我们描述mTag状态机如下:

parser start{

        ethernet;
        }
parser ethernet {
        switch(ethertype) {
                case 0x8100: vlan;
                case 0x9100: vlan;
                case 0x800: ipv4;
                // Other cases
        }
}
parser vlan {
        switch(ethertype) {
                case 0xaaaa: mTag;
                case 0x800: ipv4;
                // Other cases
        }
}
parser mTag {
        switch(ethertype) {
                case 0x800: ipv4;
                // Other cases
        }
}

解析器(Parsers):在P4中,解析器用于确定如何处理从网络收到的每个数据包。程序员需要编写使用P4语法的解析器,以确保数据包中的每个字节、位都按正确的顺序和方式读取。

table mTag_table {
        reads {
                ethernet.dst_addr : exact;
                vlan.vid : exact;
        }
        actions {
                // At runtime, entries are programmed with params
                // for the mTag action. See below.
                add_mTag;
        }
        max_size : 20000;
}

P4定义了一个基元操作的集合,从中构建更复杂的操作。每个P4程序定义了一组由操作基元组成的操作函数;这些操作函数简化了表规范和填充。P4假设在一个操作函数中并行执行基元。上面提到的add mTag操作实现如下:

action add_mTag(up1, up2, down1, down2, egr_spec) {
        add_header(mTag);
        // Copy VLAN ethertype to mTag
        copy_field(mTag.ethertype, vlan.ethertype);  

        // Set VLAN’s ethertype to signal mTag
        set_field(vlan.ethertype, 0xaaaa);
        set_field(mTag.up1, up1);
        set_field(mTag.up2, up2);
        set_field(mTag.down1, down1);
        set_field(mTag.down2, down2);
        // Set the destination egress port as well
        set_field(metadata.egress_spec, egr_spec);
}

P4的原始操作包括:设置字段:将标头中的特定字段设置为值,支持屏蔽集。复制字段:将一个字段复制到另一个字段。添加标头:将特定标头实例(及其所有字段)设置为有效。删除标头:从数据包中删除“弹出”标头(及其所有字段)。增量:增加或减少字段中的值。校验和:计算一组标头字段的校验和(例如IPv4校验和)。我们预计大多数交换机实现将限制操作处理,只允许与指定数据包格式一致的标头修改。

一旦定义了表和操作,剩下的唯一任务就是指定从一个表到下一个表的控制流。控制流通过函数、条件和表引用的集合指定为程序。如图4显示了边缘交换机上mTag实现所需控制流的图形表示

五、编制P4程序

为了让P4程序能够成功实现,我们还需要一个编译器。对于具有可编程解析器的设备,编译器将解析器描述转换为解析状态机,而对于固定解析器,编译器仅验证解析器描述与目标解析器一致。编译器遵循两阶段编译过程。它首先将P4控制程序转换为中间表依赖图表示,并对其进行分析以确定t-ble之间的依赖关系。然后,特定于目标的后端将此图映射到交换机的特定资源上。

六、结论 

程序员可以决定转发平面如何处理数据包,无需担心实现细节。编译器将命令式程序转化为表依赖性图,这种图可映射到许多具体的目标交换机,包括优化的硬件实现。这只是我们为开放流2.0草拟的第一步,目的是为了有所贡献的讨论。在这个提案中,交换机的几个方面还未明确定义(如,拥塞控制基元,排队规则,流量监测)。然而,我们相信这些未来都将被解决。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值