P4(Programming Protocol-Independent Packet Processors)是一种开源的、数据面的高级编程语言,专为编程可重构网络而设计。P4自诞生以来便引起了学术界与工业界的广泛关注,不仅各大顶级会议和期刊上P4 相关的学术论文大量涌现,谷歌、AT&T、阿里巴巴、腾讯等在内的超过 100 家世界知名大型公司也已加入 P4 语言联盟,产业界掀起了P4应用与探索的浪潮。
P4联盟成员单位
起源:将可编程性引入到转发平面
2006年,斯坦福大学教授Nick Mckeown和他的学生Martin Casado提出了一个逻辑上集中控制的企业安全解决方案SANE,打开了集中控制解决安全问题的大门。2007年,Martin博士在SANE基础上实现了面向企业网管理的Ethane项目,这是SDN架构和OpenFlow的前身。同年,Nick教授、Martin博士和美国工程院院士、UC Berkeley大学教授Scott Shenker创立了Nicira Networks公司,随着OpenFlow协议诞生,2012年,Nicira被VMware以12.6亿美金天价收购,彻底引爆了SDN。
SDN(Software Defined Network),软件定义网络。 相对于传统网络,SDN实现了控制平面与数据平面(转发平面)的分离,同时(至少在逻辑上)构建了一个集中的控制平面。人们可以在这个单一的控制平面上,实现对全网各个网元设备的监控,管理,编程。
控制平面与数据平面分离之后,如何像往常一样管理数据平面呢?这就需要独特的协议—OpenFlow协议。OpenFlow虽为SDN奠定了基础,但在进行应用开发时有一个很大的局限,就是OpenFlow没有真正做到协议不相关。也就是说,OpenFlow只能依据现有的协议来定义流表项。
自OpenFlow1.0发布以来,其版本目前已经演进到1.5版本。其中匹配域的个数从1.0版本的12元组变为1.3版本的40个,最后到1.5版本的45个匹配域,其匹配域数目随着新版本支持特性的更新而不断增加。但OpenFlow并不支持弹性地增加匹配域,每增加一个匹配域就需要重新编写控制器和交换机两端的协议栈以及交换机的数据包处理逻辑,这无疑增加了交换机设计的难度,也严重影响OpenFlow协议的版本稳定性,影响OpenFlow的推广。为了解决OpenFlow协议编程能力不足的问题以及其设计本身所带来的可拓展性差的难题,Nick教授等人提出了P4高级编程语言。
Nick教授曾在一次演讲中提到,SDN的第一步是在兼容现有硬件设备的前提下发展软件。SDN的第二步则是发展为它专门优化的硬件设备。P4是一种对底层设备数据处理行为进行编程的高级语言,用户可以直接使用P4语言编写网络应用,之后经编译对底层设备进行配置使其完成用户的功能需求**。P4通过数据平面可编程动态配置设备及开放的生态将网络控制权真正到了最终用户手中,这实际上回应了Nick发展SDN的初心,帮助网络用户摆脱被芯片、硬件厂商各种协议的制约。**
此外,Nick教授和P4的伙伴们成立了Barefoot Networks公司,**致力于开发基于P4的网络芯片Tofino和软件开发套件Capilano,并帮助P4社区发展壮大。**这可以解释为什么Sequoia、Andreessen Horowitz、Lightspeed、Google、高盛、阿里和腾讯一起投资了它,业界将它视为下一个Nicira,而融资额是Nicira当年的4倍。
不仅如此,还有很多技术大牛加入这个公司,Nicira的创始人Martin Casado从VMware辞职并加入Andreessen Horowitz不久,就参与了这宗投资。从谷歌Fiber项目出来不久的Craig Barrett,也加盟了这家初创公司,成为了CEO。
P4作为所有可编程网络设备的开源语言,易于移植。由于P4程序可以由用户编写,因此有助于保留新IP的所有权。现在,不再需要与芯片厂商或他们的客户共享新的功能规范,从而保留知识产权保护。P4使新协议的部署更加简单,消耗的时间更少。使用P4,用户可以根据应用程序仅实现所需的协议,并删除其应用程序不需要的协议。因此,可以有效地利用现有资源。编程数据平面现在可以使用软件编写程序,用P4编译和加载硬件,从而提供软件重用、数据隐藏、库创建、硬件和软件组件分离、软件升级和调试方便等优点。也就是说,P4开辟了许多机会并改变了网络芯片的设计方式,提供了一个设计完全可编程芯片的样本模型和思路。
产业:知名公司发力P4创新与应用
P4已加入开放网络基金会(ONF)和Linux基金会,自2013年,P4的采用量呈指数级增长,迅速成为描述如何通过网络设备转发数据包的标准。作为P4的重要推动者,Barefoot Networks推出了Tofino及Tofino 2,Tofino 2采用7nm工艺技术处理12.8 Tb / s的数据包,性能了提升一倍,同时保持了完整的P4可编程性,使其成为满足超大规模数据中心、云、企业和服务提供商网络需求的最佳选择。Tofino 2和Tofino也是世界上唯一的完全可编程交换芯片,允许网络架构师用P4可编程交换机取代传统的固定功能交换机。另外,他们推出了P4 Studio,这是一个软件开发环境,旨在帮助推动可编程转发平面的采用。目前,各大知名企业及初创公司积极拥抱P4和Tofino,推动P4产业生态建设与落地应用。
作为P4的创造者之一,谷歌很自豪地看到P4在整个网络行业的迅速普及。2017年,Google Cloud和Barefoot Networks合作为P4网络编程语言创建了一个开源运行时应用程序编程接口(API)。2018年,谷歌软件工程师Jim Wanderer在博客中宣布,谷歌正在与Stratum上的开放网络基金会(ONF)合作,围绕P4Runtime设计和构建开源“下一代”SDN。Stratum平台的核心是P4Runtime提供控制平面软件的方法,用来控制交换机,路由器,防火墙,负载平衡器等的转发平面。Wanderer表示,P4Runtime将成为谷歌下一代数据中心和广域网控制平面编程的基础。
思科的数据中心高级副总裁兼首席技术官Tom Edsall认为,整个网络行业将受益于P4这样的语言,这种语言明确地规定了转发行为。2017年11月11日至12日在新加坡举行的IETF 100上, Barefoot Networks和思科使用Barefoot的6.5Tb / s Tofino™交换机和FD.io VPP展示了IOAM的实现方式。
Juniper已经在MX路由平台中使用了一个名为Penta的新硅片。该公司采用P4作为描述控制平面与交换机和路由器数据平面之间沟通的语言。Juniper还在整个产品组合中实现了将P4 Runtime作为开放数据平面编程的API。在Juniper交换机或路由器内部,所有芯片的编程访问都是在AFI(抽象转发接口)的转发抽象层上进行的。该API层为Juniper自己的控制平面(Junos)以及第三方控制平面(例如SDN控制器)提供对ASIC的编程访问。
P4和Tofino在电信行业也拥有广泛的使用案例。AT&T曾利用DevOps和开源等新想法使其在运营商中处于领先地位,尝到新思想新技术甜头的AT&T也正在推进和采用P4语言或Tofino。2017年3月,AT&T宣布已在部分现有的基于MPLS的网络中安装了基于Tofino的白盒,运行SnapRoute的FlexSwitch网络操作系统(NOS)。AT&T还利用该芯片的可编程性来改进网络遥测。AT&T还在旧金山布置了一个基于Tofino的交换机,在华盛顿特区布置了另一个交换机,他们利用Tofino全面了解他们在全美的流量。2018年,AT&T开源dNOS,它支持现有的网络协议,也能提供扩展功能,以支持新工具,如开源编程语言P4。
Xilinx现已将P4语言添加到其SDNet开发环境中,以实现高速(1Gbps至100Gbps)数据包处理。SDNet支持软件定义数据平面硬件的开发,支持现代P4数据包处理语言。它为当前的P4增加了一些新的概括,可以有效利用Xilinx设备独特的白盒硬件功能。SDNet凭借其P4编程模型带来的独特功能使运营商和MSO能够动态地提供独特、差异化服务,而不会中断现有服务。
国内的一线企业腾讯、百度也在关注P4的发展。腾讯为构建强大而灵活的网络,将Barefoot Tofino的可编程性与SONiC相结合。百度为提供网络中的新服务,正利用Barefoot Tofino P4解决提高可视化需求及效率的相关问题。
P4正成为一种热门语言,网络运营商想利用Tofino与P4的集成,在自有网络上对其数据的传输寻求更多的控制。网络设备供应商也使用P4提供广泛的产品。P4的诞生,将推动网络创新更上一层楼。
应用:P4的多维度应用一览
采用 P4 技术与可编程数据平面,网络管理员可以使用编程的方式对交换机的报文处理逻辑进行更改,从而很容易地实现新功能、支持新协议,缩短开发周期与开发成本。并且,将一些原本由中间件实现的网络功能与端服务器实现的应用卸载到可编程数据平面上,还能获得可观的性能收益,提升网络与应用的整体表现。 本节从负载均衡与资源分配、网络测量、监控与诊断、网络安全、使用 P4 技术提升其他技术性能等方面来展现学术界与工业界基于 P4 与可编程数据平面作出的应用成果。
负载均衡 在大型数据中心中,44%的流量是虚拟 IP 地址流量,需要做带状态负载均衡来维持每条连接的一致性,而数据中心通常会使用上百台服务器专门来做负载均衡,占用大约 4%的计算资源。并且,使用服务器做负载均衡会引入较高计算开销,带来较高的延迟与抖动,影响用户体验。在有关文献中提出了 SilkRoad,使用可编程交换机来做带状态四层负载均衡。SilkRoad 可以使用一台可编程交换机替代上百台服务器来完成带状态负载均衡的工作,不仅将带状态负载均衡的成本降低了两个数量级,而且还降低了延迟与抖动。
在应用层面,当今互联网上的许多服务(例如:搜索、社交网络、电子商务等)依赖于高并发、低延迟的键值对查询。然而,由于 hot items 会受到远多于其他项目的请求,因此会导致网络负载的严重不均衡,从而使得服务器过载或者空闲,造成吞吐的下降与响应时间的长尾分布。有的文献中提出了一种新的键值对存储架构 NetCache,利用可编程交换机给用户提供热键值对项目,从而均衡跨存储节点的负载。
网络测量、监控与诊断 对网络进行日常的管理和维护依赖于及时有效的网络测量和监控。NetFlow是应用广泛的网络监控工具,但是在监控所有流时会带来较高的处理时间与较大的存储空间消耗,很难在数据中心的商用交换机中进行部署,于是有人设计了 FlowRadar,其核心思想是在可编程交换机上使用扩展的可逆布鲁过滤器查询表对每条流的计数器进行编码,然后使用远程采集器的计算能力对全网流计数器进行解码和分析。
在大型网络中故障经常会发生,影响上层应用的性能,甚至造成重大经济损失。因此需要及时地对 TCP 流大小是否异常、网络是否丢包、何处发生故障等问题作出正确诊断。数据中心里 99%的流为 TCP 流,若对其日志进行离线处理,不仅实时性差而且低效,因此需要在线诊断;如果修改终端虚拟机的协议栈来做检测又会侵犯租户的权益;如果在核心层做检测又不能获得终端视角(例如:往返时延)。于是,相关文献中提出了 Dapper 系统,使用可编程数据平面在“靠近”终端的位置(例如:hypervisor、网卡、架顶交换机等)对 TCP 连接的性能瓶颈做实时的诊断。
面向网络安全的应用 DDoS 攻击是目前网络环境中规模最大、频率最高的网络攻击手段,传统方法使用中间件来缓解。虽然 SDN 技术可以被用来防御DDoS 攻击,但是其本身又引入了新的 DDoS 的攻击点(例如:SYN-flood 攻击会使控制信道的链路容量和数据平面缓存很快成为瓶颈)。有关文献提出了可以完全实现在可编程数据平面上的 DDoS 流量清理方法,避免了与控制器的交互。
由于设备的资源限制,网络监控中经常会采用抽样或者使用 sketch 来对报**统计。如有的文献中实现了基于 sketch 的监控算法,但这些算法的设计没有考虑安全问题:由于算法公开,攻击者可以通过观测、操纵经过监控设备的流量,预测甚至控制监控结果,从而使网络管理员根据监控结果采取不当的操作,使安全策略失效。因此,有人设计了基于加密哈希函数的 count-min sketch 算法,攻击者在不知道密钥的情况下无法预测监控算法的行为,从而解决了上述安全问题。
网络功能虚拟化 P4 与可编程数据平面也为加速网络功能虚拟化(Network Function Virtualization, NFV)提供了新的机遇。目前主要有两个研究方向,一个是利用P4 的灵活性和可编程性实现高性能网络功能,另一个是利用 P4 实现虚拟环境下的网络资源管理。
路由与流表资源优化 流表资源是影响网络可扩展性的重要因素。一方面 P4 能够实现更加灵活的流表匹配方式,另一方面,P4 能够提供智能的流表过期机制实现流表资源的充分利用。因此 P4 为流表资源优化以及实现更可扩展的数据平面带来了机遇。
在大规模的企业网或者数据中心网络中,实现网络级策略仍然具有相当大的挑战。目前数据平面设备主要依赖二层到四层的标识符来指定转发策略,而并不关注上层应用信息。PRPL将用户ID、进程 ID 等进程级信息通过哈希操作嵌入到数据包中,可编程交换机则通过进程级信息实现更加智能的数据包处理。目前已经有相关技术实现了软件定义多播,能够提供可扩展的数据包多播服务,并支持包括 BIER、BIER-TE 在内的多种功能。
现有的 OpenFlow 流表过期机制依赖于一个固定的超时时间,交换机主动地移除超时的流表项,这个超时时间值的设定是流表空间利用率与交换机——控制器通信开销之间的折衷。有的文献中提到使用基于 P4 的交换机,能够在 TCP 流结束时及时从流表中删除相应的表项,减少流表空间的占用,并且不会带来额外的与控制器通信的开销。
云服务市场 为了提供多样化的网络服务,亚马逊、微软等云服务商往往会开放云服务市场来提供第三方开发者开发的服务。不过,现有的云服务商店在设计上仍存在缺陷:第三方提供的服务必须和供应商已有服务独立,不能对现有服务功能进行改善,使得许多功能不易或无法由第三方实现。在有的文献中介绍使用P4 技术设计了新的第三方服务体系结构,通过交换机识别数据包所需要的服务,将这些数据包**或直接转发到对应的服务模块进行处理;同时为了高效率地对数据包所需服务进行区分,该工作在数据包头部增加了一个域来提供必要信息帮助判别;通过插入多个数据包头部,可以实现多种服务的协作。相比传统网络,P4 带来的可编程性使得在交换机上完成流量的区分和不同服务的编排成为可能。
P4 这项技术在提供数据平面可编程能力的同时兼顾了报文处理速度,因此数据平面可以在保证高速处理报文的前提下完成自定义的报文处理逻辑,于是数据平面可以帮助终端设备完成部分工作,从而获得大幅性能提升。但是,由于 P4 在设计上并不是图灵完全的,并且数据平面资源也十分珍贵,所以将各种应用卸载到可编程数据平面之前也需要慎重考虑。 本节参考《基于 P4 的可编程数据平面研究及其应用》一文,内容有删改
实例:P4实践经验分享
由高校发起的技术创新很容易被群众质疑是否只适用于发paper,落地应用是对付质疑最有效也是唯一有效的手段。P4的应用领域广泛,在负载均衡和防DDoS攻击方面,Ucloud、Arista、Xilinx等公司贡献了很多非常经典的案例。
UCloud UCloud最早的SDN方案在转发面是采用Open vSwitch(以下简称OVS)来实现,控制面是自研的控制器。但后来遇到了SDN交换机OpenFlow流表条目有限的问题,UCloud便采用DPDK技术的**集群来替代SDN交换机。2017年25G网络开始迅速被采用,对UCloud的虚拟网络提出了更高的挑战。另一方面,DPDK也逐渐暴露出了一些不足,负载均衡算法不能被软件定义。如果网络中出现单个大象流,无法被硬件交换机或者网卡的负载均衡算法很好的分发,单根网线或者单个CPU Core出现拥塞,对业务造成巨大影响。其次,随着网络带宽从10G向25G、40G、50G、100G的演进,DPDK需要更强力的CPU才能够达到线速,成本要求较高。
2017年Q4,UCloud开始预研Barefoot的支持P4的可编程交换机(Tofino芯片),很快发现了它能够很好地满足需求。最初他们用修改版的switch.p4来实现功能,但阅读代码后发现switch.p4包含交换机功能,有很多都不需要,于是他们自己写了一个控制面。Controller这一层他们在APP模块中启动了GRPC server,重新定义了批量下发配置的接口,将配置下发速度提升了8倍。未来他们计划将控制面演进到P4 Runtime和Stratum。
UCloud在2018年上半年开始研发公网入口的IPv6转换,依托NAT64技术和可编程P4 交换机,现已成功推出了免费的UCloud公网入口IPv6转换服务。
在实现技术上,UCloud 使用有状态的 NAT64 技术来实现 IPv6 转换服务,NAT64 是一种通过网络地址转换( NAT )形式促成 IPv6 与 IPv4 主机间通信的 IPv6 转换机制。NAT64 **需要至少一个 IPv4 地址和一个包含 32 位地址空间的 IPv6 网段来完成 IPv4 与 IPv6 协议间的翻译。
NAT64 将这个 32bit 的 IPv4 地址嵌入的 IPv6 目的地址转换成目的 IPv4 地址,源 IPv6 地址转换成一个特定的源 IPv4 地址。NAT64 **则创建 IPv6 与 IPv4 地址间的映射,这可以为手动配置,也可以自动确定。
基于 NAT64 和 P4 交换机实现 IPv6 转换功能的系统架构
在上图中,NAT64 Access 使用 P4 交换机实现,通过 NAT64 Access 的一致性 Hash 实现高可用。同时在 NAT64 Access 对 CPS 进行限速,实现 DDoS 防护。NAT64 Access 与物理交换机 1 组成三层网络,通过 BGP 向物理交换机 1 宣告一个 /96 的 IPv6 地址段,作为该地域的 IPv6 prefix。POP1 与 POP2 中 Access 向外宣告的地址段相同,实现负荷分担和 POP 点级别的容灾。同理,POP 点内两个 Access 之间也是负荷分担和容灾。
Arista 2018年6月,Arista公司已经推出一系列交换机,企业可对这些交换机进行编程来执行通常由网络设备和路由器处理的任务。该公司声称新的7170系列的整合功能可降低成本和网络复杂性。主要功能包括在**设备的扩展、网络可视化、网络监控、网络安全和大规模ACLs和NAT。
7170系列的可编程性来源于该硬件中的Barefoot Networks Tofino数据包处理器,工程师是通过开源语言P4来编程该芯片。
为了简化Barefoot Tofino芯片上的编程操作,Arista公司提供了封装配置文件,其中包含用于特定应用的数据平面和控制平面功能。网络管理员可使用P4来自定义模式并将其部署到EOS系统。客户可以在P4中开发,并直接加载到系统硬件中,使完全定制成为可能的。
Xilinx 2017年,Xilinx在斯坦福大学举办的“P4语言开发日”活动上发布了最新版本的SDNet 2017.1开发工具,兼容最新的P4开发语言规范,即通过编译操作SDNet可以将前端的P4声明式程序转换为数据层的算法IP核,能够在FPGA器件中运行,主要用于高速(1Gbps~100Gbps)数据包的处理操作。
SDNet的最大特点之一是指定内容但不规定方式。也就是说,SDNet将不会关心怎样(How)实现一个网络规划,而是更在意如何通过软件的方式实现系统级人员的需要(What),比如包的解析、编辑、调节、查找等。另一方面,Xilinx的SDNet支持系统架构者通过新型的高级网络抽象语言(高级包处理规范)自动生成数据平面功能,而无需了解底层设备架构或掌握复杂的硬件编程语言。这与传统的开发过程相比节省了时间和成本。
下图演示了系统架构师如何在不需要详细了解底层设备架构的情况下释放Xilinx技术实现智能网络的优势。此实现流程允许系统架构师仅关注他们希望提供的服务,而无需关注这些服务的实现方式。
使用Xilinx SDNet工具用P4语言创建包处理解决方案
在2017年发布的SDNet版本中,实际上是将P4语言先转为Xilinx自己的语言,然后再去调用SDNet。在2018年发布SDNet-P4 v2018.3版本中直接用P4语言调用SDNet,省去了转化的机制。随着业务需求的不断增长越来越多的云服务提供商和网络服务运营商都开始转向SDN平台,采用Xilinx SDNet、Vivado开发环境在高速FPGA器件上的系统架构设计能够实现突破性的系统性能,并充分应对当今面向内容网络的性能、灵活性和安全挑战。
总结
P4 与可编程数据平面目前是受到学术界与工业界广泛关注的热门技术之一。P4作为新兴技术,它吸收了SDN数据平面与控制平面分离的思想,促进了网络协议的发展。其次 P4让数据平面的可编程性更加灵活,弥补了 OpenFlow 等技术的不可重配置、协议无关、平台无关的缺点。通过Barefoot Networks、谷歌、英特尔、微软等厂商建立的生态,在未来每个领域上都有对应的技术发展。