P4可编程技术详解:从理论到硬件实现

P4的诞生

为打破传统的固定封装模式,充分解放数据平面的编程能力,Nick McKeown领导的斯坦福大学研究团队于2014年提出可编程处理语言P4。借助P4的数据平面编程能力,用户可在网卡、交换机、路由器等网络设备上实现包括VXLAN、MPLS等在内的各种网络协议。

P4语言特性

P4语言具有如下三点特性,同时也是P4语言的设计目标。

  • 协议无关性:P4语言不与特定网络协议绑定。用户只需根据现网协议支持情况和P4语法要素来实现转发逻辑自定义,可按需加入新协议,也可删去冗余协议。

  • 平台无关性:P4语言无需关注底层平台细节。用户能够独立于底层硬件对报文处理功能编程。用户不需要关心底层硬件的细节就可实现对数据包的处理方式的编程描述。前端编译器将P4高级语言程序转换成中间表示IR,后端编译器再将IR编译成目标设备配置。

  • 可重构性:P4语言支持在不更换硬件的情况下动态修改数据包处理方式。允许“朝令夕改”,同一台设备可根据现网需求随时重新配置。

    图1:P4编译架构图
    图1:P4编译架构图

P4转发模型

为了实现上述目标,P4语言定义了如图2所示的抽象转发模型。该转发模型主要包括解析器、多级流水线和缓冲区三部分。

图2:P4抽象转发模型
图2:P4抽象转发模型
  • 解析器(Parser):在利用P4语言编码时,用户可自定义数据报文的格式以及解析流程,接着解析流程会被编译器编译为数据包头解析图并配置到解析器上。在数据包进入可编程设备时,解析器会从报文中提取头部域,并将该头部与余下的数据载荷分离,然后按照编译器生成的数据包头解析图解析。

  • 多级流水线(Multistage Pipeline):由多个匹配动作表(Match-Action )组成,这些表以流水线的形式组织起来,分为入口流水线和出口流水线两部分。入口流水线的匹配动作表负责报文头部的修改并决定报文的输出端口与队列,而出口流水线的匹配动作表仅负责修改报文头部。在编写P4程序时,用户可自定义每张匹配动作表所匹配的数据包类型,执行动作及其参数等,以及各条流水线中每张匹配动作表的执行顺序。在运行时,数据平面会按控制流顺序依次处理数据报文。

  • 缓冲区(Buffer):用于缓存数据载荷以及队列中等待被处理的已解析头部报文。

P4的硬件实现

P4语言在设计之初就是以硬件的网络可编程为目标。在其平台无关性中提到在前后端编译器的共同工作下,P4语言程序最终会被编译成目标设备配置。这个过程实际上是P4的硬件下发。P4通过硬件相关的编译器编译成硬件机器码或汇编代码,下发到硬件中,真正实现硬件的网络可编程。

  • 硬件基础:Barefoot公司的Tofino是业界首款P4可编程网络交换ASIC芯片,后被intel公司收购。不过截至上月,intel已宣布停止了向全球市场的Tofino/Tofino2芯片的生产供货, 目前星融元是唯一一个能提供tofino停产后P4方案的厂家。星融元提供可编程交换机X-T/CX-T,并构建了可编程芯片+DPU的开放网络解决方案,持续助力P4的硬件实现。

    图3:星融元P4解决方案
    图3:星融元P4解决方案
  • 工作流程:以P4可编程交换机为例,其工作流程基于P4抽象转发模型。用户首先自定义数据帧的解析器和流控制程序命名为test.p4,test.p4文件通过编译器编译,得到test.json和 test.p4info两个文件。其中test.json是针对交换机硬件逻辑的配置文件,当配置文件载入交换机硬件后,交换机硬件逻辑得到更新,而test.p4info作为控制接口的配置文件,分别需要更新控制面和P4运行时的服务,完成控制面对交换机控制接口的更新。业务逻辑全部更新后完成P4的硬件实现。

    图4:P4工作流程
    图4:P4工作流程

P4技术的应用

  • 数据中心互联的云边界网关:云边界网关作为连接云内外网络的桥梁,需要处理大量的数据流量,且云服务场景丰富,设计时需要考虑灵活可扩展,充分利用了P4语言的高度灵活性和可编程性。

  • 分布式的带内网络遥测:分布式带内网络遥测允许网络中的多个节点协同工作,实时收集和报告网络状态信息,而无需控制平面的干预。这就需要定义数据包INT头部,用于携带遥测指令和元数据,再利用P4程序定义数据包的解析逻辑,以识别和提取INT头部。

  • 负载均衡和流量缓解:P4程序通过定义哈希函数、设置转发表、动态分配流量以及实现流量控制策略和拥塞控制算法等步骤,实现负载均衡和流量缓解从而有效地优化网络性能并提高用户体验。

总结

综上所述,P4网络可编程技术在提升网络性能、降低投资和运维成本以及促进网络创新方面具有显著价值。面对灵活多变的网络需求,P4提供了新的解决方案。在未来三年内,我们仍可使用P4可编程技术来应对不断增长和演变的网络挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架,JAVA作为开发语言&#…

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处,在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis:查找命令的程序文件位置 2、locate:也是一种文件查找,但是基于数据库的查找 3、find:针…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

01 设计模式-创造型模式-工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。 通过使用工厂模式…

1.2.3 TCP IP模型

TCP/IP模型(接网叔用) 网络接口层 网络层 传输层 应用层 理念:如果某些应用需要“数据格式转换”“会话管理功能”,就交给应用层的特定协议去实现 tip:数据 局部正确不等于全局正确 但是,数据的 全局正…

数码准备记录

1.数据结构 常见的数据结构包括数组、链表、栈、队列、树(如二叉树、B树、B树)、图等 2.队列和栈的区别 队列是一种先入先出的数据结构,即最先加入的元素被最先移除; 栈是一种后进后出的数据结构,即最后加入的元素…

RTMP协议分析

理论 总体介绍 RTMP协议是应⽤层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后,RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长,将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域,启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中,main函数的标准参数列表通常如下所示: in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏,包含多个选项,如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品,每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言:在05这节数据结构里面,我们知道select * from 这个操作很危险,如果数据库很大,会把服务器资源耗尽,接下来提到的查询可以有效的限制返回记录 1:分页查询 分页查询可以有效控制一次查询出来的结果集的…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

Linux服务器安装SRAToolkit教程

SRAToolkit是由NCBI&#xff08;美国国家生物技术信息中心&#xff09;提供的一个工具集&#xff0c;用于下载、读取和转换SRA&#xff08;Sequence Read Archive&#xff09;格式的数据文件。这些数据文件包含了大规模的核酸序列数据&#xff0c;对于基因组学研究至关重要。本…

pytorch激活函数介绍

在 PyTorch 中,激活函数(Activation Functions)是神经网络中重要的非线性组件,用于引入非线性,使网络能够学习复杂的函数关系。以下是 PyTorch 中常见的激活函数及其特点: 1. ReLU (Rectified Linear Unit) 函数: torch.nn.ReLU()公式: ReLU(x)=max⁡(0,x)特点: 常用于隐…

python-代码技巧

python-代码技巧 简单tips1、多个列表循环遍历2、使用map对列表中多个文件进行批量操作 仅个人笔记使用&#xff0c;感谢点赞关注 简单tips 1、多个列表循环遍历 dataTypes ["train","test"] dataStations ["1","2","3"…

【C语言】自定义类型:结构体--结构体内存对齐(用于计算结构体的大小)

结构体内存对齐 结构体内存对齐用于计算结构体的大小。 &#xff08;1&#xff09;对齐规则 1&#xff09;&#xff09;结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。 2&#xff09;&#xff09;其他成员变量要对齐到某个数字&#xff08;对齐数&#…

FFmpeg 4.3 音视频-多路H265监控录放C++开发四 :RGB颜色

一 RGB 的意义&#xff1f; 为什么要从RGB 开始讲起呢&#xff1f; 因为最终传输到显卡显示器的颜色都是RGB 即使能处理YUV的API&#xff0c;本质上也是帮你做了从 YUV 到 RGB的转换。 RGB888 表示 R 占8bit&#xff0c;G 占8bit&#xff0c;B 占8bit&#xff0c;也就是每一…

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…