现有的SDN解决方案将控制平面与转发平面分离,并为我们提供了控制平面的可编程能力。而事实上,目前通过软件编程实现的控制平面的功能,在传统的高级交换机和路由器上也都能实现,差别是厂商把这些功能固化在了系统/硬件中,这些系统/硬件是封闭的,第三方难以介入进行定制或二次开发。虽然一些高级设备提供了SDK,使得用户能够进行一定程度的定制,但也必须受厂商所制定的规范的限制,能做到的事情十分有限。目前SDN所做的就是打破这些限制,让设备和网络更加的灵活,让用户不被厂商设备绑定,从而拥有无限的可能。

现有的SDN解决方案为用户开放的是控制平面的可编程能力,那转发平面呢?正常情况下,转发设备的数据包解析,转发流程是由设备转发芯片固化的,所以设备在协议的支持方面并不具备扩展能力。并且,厂商开发新的转发芯片以支持新的协议或者扩展协议特性的代价也非常高,需要将以前的硬件重新设计,势必导致更新成本高,时间周期长等一系列问题。所以在一定程度上,这种将设备功能和协议支持与硬件绑定的模式限制了网络的快速发展。

因此,我们可以得出以下结论:新一代的SDN解决方案必须让数据转发平面也具有可编程能力,让软件能够真正定义网络和网络设备。而P4正是为用户提供了这种能力,打破了硬件设备对数据转发平面的限制,让数据包的解析和转发流程也能通过编程控制,使得网络及设备自上而下地、真正地向用户开放。

下面,我们主要从以下几个方面谈谈我对P4这门转发平面的编程语言的理解:P4的架构及特性、交换机结构、P4程序工作流程。

1.P4架构及特性

首先我们谈谈P4的诞生,由Nick教授,博科姆教授等联合发布了一篇论文《P4: Programming Protocol-Independent Packet Processors》,该论文在SDN界引起了极大的反响和关注度。随后,Nick教授等人又发布了《The P4 Language Specification》、《Barefoot白皮书》等文件。目前,P4已经在国外引起了足够的重视,ONF成立了协议无关转发的开源项目(PIF),该项目目前的工作重点就是为P4提供配套的中间表示IR(Intermediate Representation),另外PIF工作的成果将被用来设计下一代的OpenFlow协议。

目前人们提及最多的OpenFlow协议在逐渐的完善演化过程中,表字段和表类型不断的增加。白牌交换机在支持OpenFlow协议的版本更新上,面临着和传统交换设备厂商同样的困境——OpenFlow并不支持弹性地增加匹配域支持,协议新特性的支持所需要的成本大、时间周期长。同时,随着网络中新的协议不断出现,OpenFlow协议也必将变得越来越臃肿,表的扩展也必将变得越来越困难。

P4语言在设计之初,就是为了实现以下三个特性:
(1)协议无关性
网络设备不与任何特定的网络协议绑定,用户可以使用P4语言描述任何网络数据平面协议和数据包处理行为。这一特性通过自定义包解析器、匹配-动作表的匹配流程和流控制程序实现。

(2)目标无关性
用户不需要关心底层硬件的细节就可实现对数据包的处理方式的编程描述。这一特性通过P4前后端编译器实现,前端编译器将P4高级语言程序转换成中间表示IR,后端编译器将IR编译成设备配置,自动配置目标设备。

(3)可重构性 
允许用户随时改变包解析和处理的程序 ,并在编译后配置交换机,真正实现现场可重配能力。
为了实现上述特性,P4语言的编译器采用了模块化的设计,各个模块之间的输入输出都采用标准格式的配置文件,如p4c-bm模块的输出作为载入到bmv2模块中的JSON格式配置文件。P4的架构图如图1所示。

图1 P4架构图

2. 交换机结构

在传统交换机中,数据流转化为数据帧之后进行解析,首先检查的是tag,包括有无tag、灵活Q-in-Q、VLAN映射等。VLAN tag的检查和处理在所有厂商的交换机中都是必须的,但随后数据包处理流程就因厂商而异了,不同厂商的芯片设计会产生不同的处理流程,每个处理流程就是一个基础的数据处理单元,一般情况下,交换机的流水线包含6-8个数据处理单元。

图2 传统交换机流水线结构

图2中列出的是几个比较常见的数据帧处理单元,如二层转发、ACL转发等。流水线上每个基础数据处理单元处理数据的过程,就是根据数据帧解析后的包头信息,重复查表、匹配并执行对应的交换机指令的过程。

P4交换机中也有流水线(pipeline)的概念,一条流水线表示一组完整的数据处理流程,这一概念和传统交换机中的的流水线是相似的。如图3所示,在P4交换机中一条流水线可以包含以下组件:解析器/逆解析器、匹配-动作表、元数据总线。其中除了元数据总线,其他组件都是非必须的。

解析器(parser):将分组数据转化成元数据。
逆解析器(Deparser):将元数据转化成序列化的分组数据。
匹配动作表(match-action table):操作元数据。
元数据(metadata):在流水线内存储数据信息。

图3 P4交换机流水线结构

P4交换机中将流水线处理数据的过程进行抽象和重定义,数据处理单元对数据的处理抽象成匹配和执行匹配-动作表的过程,包头的解析抽象成P4中的解析器,数据处理流程抽象成流控制。P4中基础数据处理单元是不记录数据的,所以就需要引入一个元数据总线,用来存储一条流水线处理过程中需要记录的数据。P4交换机的专用物理芯片Tofino,最高支持12个数据处理单元,可以覆盖传统交换机的所有功能。

有了以上的知识储备,就可以很轻松的刻画出P4交换机的结构。如图4所示,P4交换机中含有两条流水线——入口流水线和出口流水线;同时还有一些数据流管理功能,例如:拥塞控制,队列控制,流量复制等。

图4 P4交换结构

对比图2 图3和图4,我们不难看出P4交换机结构与传统的交换机并没有多少差别,而且在芯片的设计上也仅仅是增加了可以自定义基础数据处理单元和转发流程的功能,其他设计与传统交换机芯片无异,这也使得P4交换机能够在为用户提供数据转发平面的可编程能力的同时,保证数据的线性转发速率。

3. P4程序工作流程

至此,我们可以梳理出P4的完整工作流程。用户首先需要自定义数据帧的解析器和流控制程序,其次P4程序经过编译器编译后输出JSON格式的交换机配置文件和运行时的API,再次配置的文件载入到交换器中后更新解析起和匹配-动作表,最后交换机操作系统按照流控制程序进行包的查表操作。

图5 P4工作流程

如图5所示,以新增VLAN包解析为例,图中解析器除VXLAN以外的包解析是交换机中已有的,载入VXLAN.p4文件所得的配置文件的过程就是交换机的重配置过程。配置文件载入交换机后,解析器中会新增对VXLAN包解析,同时更新匹配-动作表,匹配成功后执行的动作也是在用户自定的程序中指定。执行动作需要交换机系统调用执行动作对应的指令来完成,这时交换机系统调用的是经过P4编译器生成的统一的运行时API,这个API就是交换机系统调用芯片功能的驱动,流控制程序就是指定API对应的交换机指令。

P4语言的特性、P4语言和P4交换机的工作原理和流程简介相关推荐

  1. vf程序设计与c语言,周四的C语言和VF,这些你有了么?

    原标题:周四的C语言和VF,这些你有了么? 本周四 大家就要踏上C语言考试的战场了! 此时此刻 你是不是期待着大神带你复习带你飞? 快来看看大神们是怎么复习C语言的吧! 看 书 复习C语言关键是要看教 ...

  2. python与c语言的区别-c语言和python之间有什么区别

    c语言和python的区别是:1.Python是一种面向对象的解释型语言,通过缩进来表示语句体,在Python中每一条语句结尾后没有分号:2.C是一种面向过程的编译型语言,通过"{}&quo ...

  3. c语言兼容性,对C++语言和C语言的兼容性,描述正确的是( )

    对C++语言和C语言的兼容性,描述正确的是( ) 更多相关问题 [填空题] 扣件式钢管脚手架计算强度和稳定性时,要考虑荷载效应组合,永久荷载分项系数(),可变荷载分项系数(). [单选] 现场配电系统 ...

  4. 论述c语言和java语言的区别,java语言和c语言的区别有哪些

    java语言和c语言的区别有单文件的编译时间java比c语言快:c语言可以直接操作内存,java不能直接操作:c语言可以封装动态库,java不行:c语言有指针,java没有指针:c语言可以直接操作串口 ...

  5. java c语言语法对比_c语言和java的语法区别是什么

    c语言和java的语法区别是什么 发布时间:2020-06-10 11:53:18 来源:亿速云 阅读:172 作者:Leah c语言和java的语法区别是什么?针对这个问题,今天小编总结这篇有关c语 ...

  6. java c语言语法对比_c语言和java语法有区别吗?

    c语言和java语法有区别吗? c语言和java在语法上有区别,区别是: 1.C语言有指针,java没有指针: C语言的语法比较简单,但是它的亮点指针很容易出错,想要好好的运用指针是件很难的事情,用好 ...

  7. python和c语言哪个实用-c语言和python语言哪个更值得学?

    要想在测试行业有一席之地,只会一种语言是万万不能的. 不管是开发,还是软件测试工程师都有一门属于自己的工作语言. 有的喜欢用Python,有的擅长用Java,有的偏爱于Go,也有人用C语言. Pyth ...

  8. python和c语言的区别-c语言和python的区别是什么

    python和C语言的区别如下: 1.C语言是编译语言,Python是脚本语言.说是C语言会比Python快 (看了看学校oj最简单的A+B问题,C语言的运行事件大致在0ms,而Python是6.7. ...

  9. python和c语言相通吗_C语言和Python有什么区别呢?

    展开全部 python与C的区别如下. 1.语言类型不同. Python是一种动态类型语言,又是强类型语言.它们确定一个变量的类型是在e69da5e887aa323131333532363134313 ...

最新文章

  1. 设置IP安全策略将***阻杀在端口外
  2. 如何将html表单转换成url,JS表单传值和URL编码转换
  3. 不推荐重写service
  4. ×××S 2012 聚合函数 -- 介绍
  5. zabbix加vm虚拟服务器,zabbix监控vmware exsi主机的图文步骤
  6. async await Task
  7. linux下的yum命令详解
  8. Yum 安装 mysql5.7
  9. Oracle 11.2.0.4.0 Dataguard部署和日常维护(7) - Dataguard Flashback篇
  10. Eclipse Tips(2):代码颜色设置
  11. 基于Java科研成果管理系统_基于Java的高校科研管理系统的设计与实现(含源文件).doc...
  12. office图标修复工具_超好用的流程图绘图工具你还没get吗?
  13. 按键精灵文字替换,文字查找代码
  14. BMFont字体编辑器的使用
  15. img标签,显示服务器图片
  16. 金蝶K3 WISE BOM多级展开_BOM成本表
  17. python中元组常识,以及for 与 range 的用法!
  18. 一个5节点的polardb mysql_POLARDB云数据库分布式存储引擎揭秘,POLARDB和MySql 5.6兼容性能对比...
  19. DGIOT国内首家轻量级物联网开源平台——支持工业设备租赁以及远程管控
  20. android 4.4 锁屏密码,安卓手机忘记锁屏密码怎么办?安卓手机绕过锁屏密码的几种解决方法...

热门文章

  1. Linux SWAP 交换分区配置说明(转)
  2. 实现圆形头像(并且不管图大小都显示成固定尺寸)-和上一篇有点不同。
  3. LED驱动芯片TM1668驱动代码
  4. 互联网公司最常见的面试算法题大集合!
  5. 「数据一致性」理解分布式系统中的一致性
  6. 赚钱宝3代玩客云网心云 安装armbian docker 宝塔 青龙 openwrt
  7. 【2】基因功能注释之SwissProt和Interproscan
  8. 什么是正则化?他是如何起作用的?
  9. vue之push() pop() shift() unshift() splice() sort() reverse()等等
  10. Linux ffmpeg命令的使用