由于对SDN充满着兴趣,在学习了一段时间OpenFlow之后,一次偶然的机会接触到了P4。P4可以实现很多新的Idea,但是无奈于国内的实践资料太少了(有些资料似乎比较陈旧了)。唯一的学习来源是官网的英文实例教程,但是摸索起来很费时间。因此本人打算把自己的探索经验,写成一个专题,和大家分享,学习,交流。着重点是实践而非理论,有不正确的地方欢迎批评指正。

为什么要从理论上开始介绍呢?因为有了一些基础的理论概念,才能更好的去编程,不会摸不着头脑。无论大家对SDN的理解如何,我觉得都有必要把一些基础的概念,如:数据面,控制面等概念了解清楚,了解为什么要有P4,与OpenFlow的区别是什么等等。知道了这些,会提高我们的学习效率和质量。

SDN 与 OpenFlow

相信大家对SDN和OpenFlow都非常了解了。如果是这样,可以直接跳过这个部分,直接阅读下一节。

SDN的概念

SDN(Software Defined Network,软件定义网络)。 相对于传统网络,软件定义网络实现了控制平面数据平面的分离,同时(至少在逻辑上)构建了一个集中的控制平面。人们可以在这个单一的控制平面上,实现对全网各个网元设备的监控,管理,编程。

●  数据平面:维护一个由一系列流表组成的(pipeline,流水线)。当数据包经过交换机时,首先会走的是数据平面,即去匹配这些表。根据匹配到的相应的规则(action),如output, drop。从不同的端口转发或者丢弃。但是FIB的信息是如何添加的呢?为什么FIB会知道数据包该从哪个端口转发呢?这就需要控制平面去管理它。
 ●  控制平面:不管是分布式的控制平面,还是集中式的控制平面。控制平面可以理解为网元设备的操作系统。他可以写一些程序,里面含有特定的算法,向数据平面添加相应的转发规则。也就是说,控制平面相当于网元设备的大脑,当数据平面不知道如何转发一个数据包时,会向大脑询问,大脑根据自己对网络拓扑的”认知“,向数据平面返回指定的规则,数据平面记录这条规则,在之后的转发过程中,就不再询问自己的大脑(速率较慢),而是根据“肌肉记忆”直接转发。

OpenFlow

OpenFlow的诞生和历史不做赘述。OpenFlow在SDN中扮演怎样一个地位呢?我们先来看一张图片:

我们知道,SDN的一个重要概念就是控制平面和数据平面的分离,以及集中式的控制平面,这个集中的控制平面就是我们所说的控制器。那么控制平面与数据平面分离之后,如何像往常一样管理数据平面呢?因此,在分离后的控制平面和数据平面之间,只能通过一个特定的协议进行交互,这个协议就是我们的OpenFlow协议。也就是上图所示的1. Open interface to packet forwarding.

所以, OpenFlow协议有如下特点:

●  定义了用于控制器和数据平面(各个OpenFlow交换机)交互的报文格式。
 ●  OpenFlow必须是一个 target-independent 的协议,所谓target-independent就是与 特定的交换机无关,能够提供一种抽象,从而可以以统一的接口管理网络中所有的设备,从而实现一个逻辑集中的控制平面。
 ●  OpenFlow作为一种南向协议,其与其他南向接口的对比如下。

这张图放的有点早了,但是可以看到OpenFlow虽然实现了Target-independent,但是没有实现Protocol-independent。 这个是OpenFlow的最主要的缺陷之一,这也是引入P4的最主要的原因。什么是Protocol-independent呢?请继续看。

OpenFlow的缺陷

OpenFlow虽然为SDN奠定了基础。但是在进行应用开发的时候有一个很大的局限,就是OpenFlow没有真正做到协议不相关。也就是说,OpenFlow只能依据现有的协议来定义流表项。打个比方,就好像OpenFlow给了我们几个固定形状的积木,让我们自行组装,却不能让我们自己定义积木的形状。 这就是OpenFlow的局限所在!

举个例子:

OpenFlow 1.0 的时候有12个字段,这些字段分别就是我们熟悉的,IP地址,MAC地址,等等。但是很快发现,单单这12个字段不能满足现实网络世界中各种需求(在网络中的协议有很多种)。所以到OpenFlow1.3的时候字段增加到40个,现在OpenFlow1.5甚至更多。

这样带来的麻烦有很多,一是匹配效率和空间占用的问题。二是特定的OpenFlow交换机生产出来后,无法支持新的协议字段,只能在现有协议上进行开发。最终只能面临淘汰。

如果我们可以自定义协议字段的类型,甚至实现自定义动作的类型,那么我们就不需要反复修正协议本身,SDN的架构也将更加灵活。这个自定义协议字段类型自定义动作类型就是我们所说的数据面编程。

数据面编程思想

数据面编程就是我们自己定义匹配字段,自己定义动作类型,从而自己定义流表,进而形成流水线(pipline)。基于这种初衷,P4应运而生。

什么是P4

P4(Programming Protocol-Independent Packet Processors)是一种数据面的高级编程语言。他可以克服OpenFlow的局限。通过P4语言,我们可以定义我们想要的数据面。进而再通过南向协议添加流表项。

P4 与 OpenFlow 的关联与区别

P4虽然弥补了OpenFlow的不足,但是P4和OpenFlow的定位是截然不同的! OpenFlow提供了一种控制器和数据面的动态交互的协议。是一种南向协议。而P4只是一个数据面的编程语言。

通过P4,我们可以定义各种各样形状的积木,而通过南向协议,我们可以组装这些积木来实现特定的功能。也就是说,写好P4代码并不是全部,我们还需要写相应的控制面代码才能使网络正常工作。

与OpenFlow对应的是P4 Runtime。 还记的上面的那张图吗,为了实现协议无关。P4的设计者们还提供了一个南向协议——P4 runtime。 P4 runtime与OpenFlow功能类似,但是P4 runtime可以充分利用P4协议无关的特性,”与P4更搭配!“。

P4中的那些事

P4是一种高级数据面编程语言,既然是高级语言,那么其设计本身就有着很高的抽象程度。我们先来看一种图:

这是P4中提供的最简单最易理解的编程结构,V1Model。可以看到它由5个模块组成,他们的名字分别是(从左到右):

●  Parser: 解析器, 解析并且提取数据包头的各个字段。
 ●  Ingress: Ingress处理,在这里定义Ingress流水线。
 ●  TM: Traffic manager,有一些队列,用于流量控制(一些队列相关的metadata在此更新)。
 ●  Egress: Egress, 在这里定义Egress流水线。
 ●  Deparser:用于重组数据包,因为数据包在处理过程中经历了分解和处理。所以最后转发的时候需要重组一下。

P4为我们提供了上述抽象,我们就可以把所有的交换机理解为上述的模型,然后按照上述模型进行开发就可以了。所以,按照上述模型,P4语言的代码结构通常为这样:

在开始搭建环境和写P4代码前

p4 的github仓库 是学习P4编程的重要基地,我们着重了解一下几个子仓库:

 ●  behavioral-model 简称BMv2. 是一款支持P4的软件交换机。其设计初衷是完全支持P4语言,从而用于功能性试验和学习,而性能不是第一目标(与OVS不同)。BMv2可以和Mininet集成。BMv2提供两种控制接口,一种是基于thirft的CLI接口(命令行),另一种是基于gRPC和protobuf的P4 runtime。显然,一种是分布式控制平面,一种是集中式控制平面。
 ●  tutorials 是我们学习P4编程最重要的教程。里面含有一些交互式的学习材料和一个搭建好环境的虚拟机。建议大家使用搭建好环境的虚拟机学习,本人尝试过自己搭建环境,尽管最后成功了,但是中间遇到了各种报错,特别还有国内网络原因,访问github特别慢,整体搭建好还是是比较吃力的。可以直接访问我的ftp服务器下载 虚拟机镜像
 ●  p4c 是P4的编译器,它是一个比较综合的编译器,支持多个版本的p4代码,同时支持多种输出格式。有二进制形式的,也有用于BMv2的json格式。

上述几个仓库是学习过程中需要用到的,当然还有一些其他仓库,以后再介绍。

原文发布时间为:2018-10-10

本文作者:zenhox

本文来自云栖社区合作伙伴“SDNLAB”,了解相关信息可以关注“SDNLAB”。

P4编程理论与实践——理论篇相关推荐

  1. P4编程理论与实践——理论篇(转载)

    P4编程理论与实践--理论篇 由于对SDN充满着兴趣,在学习了一段时间OpenFlow之后,一次偶然的机会接触到了P4.P4可以实现很多新的Idea,但是无奈于国内的实践资料太少了(有些资料似乎比较陈 ...

  2. 直流无刷电机FOC控制算法 理论到实践 —— 理论(一)

    直流无刷电机FOC控制算法--理论 说明:图片素材来源于网络 文章目录 直流无刷电机FOC控制算法--理论 1. FOC概述 1.1 FOC由来 1.2 FOC框图 2. 驱动电路介绍 3. FOC控 ...

  3. 直流无刷电机FOC控制算法 理论到实践 —— 理论(二)

    直流无刷电机FOC控制算法 理论到实践 -- 理论(二) 上一章节:FOC直流无刷电机控制算法 理论到实践 -- 理论(一) 下一章节:直流无刷电机FOC控制算法 理论到实践 -- 实践 说明:部分图 ...

  4. python 入门到实践期末考试常出现的考试内容_Python编程入门到实践—列表篇(一)...

    一.列表是什么? 列表由一系列按特定顺序排列的元素组成. 可以创建包含字母表中所有字母.数字0-9或所有家庭成员姓名的列表:也可以将任何东西加入列表中,其中的元素之间可以没有任何关系. 列表通常包含多 ...

  5. 彻底了解C++异步从理论到实践

    1. 纠结的开篇 之前设计我们游戏用的c++框架的时候, 刚好c++20的coroutine已经发布, 又因为是专门 给game server用的c++ framework, 对多线程的诉求相对有限, ...

  6. 直流无刷电机FOC控制算法 理论到实践 —— 实践

    直流无刷电机FOC控制算法 理论到实践 -- 实践 文章目录 直流无刷电机FOC控制算法 理论到实践 -- 实践 1. 前言 2. FOC控制整体流程 3. FOC实现 3.1 定时器实现 3.1.1 ...

  7. 大神带你玩转异步编程,理论与实践齐飞,敢说是目前最全的讲解了

    要完全理解异步编程需要先理解几个概念 任务 我给任务的定义是完成某项功能的单元模块,任务有大有小,站在操作系统的角度,一个程序就是一个任务,每当运行一个程序就会创建一个新的任务,它在操作系统中还有一个 ...

  8. 编程入门注重实践还是注重理论?气宗剑宗之争的观点汇总。

    讨论地址如下,已经超过300回复,欢迎你也来发表自己的看法,我这里总结一下大家的观点. http://topic.csdn.net/u/20090927/13/72dbbaa9-c4d3-4f59-8 ...

  9. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

最新文章

  1. 腾讯微博快速有效增加广播转播量的方法与技巧
  2. iptables 流量速率控制
  3. php 3个循环,For循环只发布数组的前3个元素 - PHP(For loop is only posting first 3 elements of array - PHP)...
  4. raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘
  5. 2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)
  6. 树-二叉树、满二叉树和完全二叉树
  7. Java面试通关要点汇总集答案(七)——equals 与 == 的区别 List 和 Set 区别
  8. PGPool使用限制 1
  9. 《集成电路先进光刻技术与版图设计优化》课程分享之一:典型显微系统的光学成像原理
  10. Android studio创建Java测试类
  11. 使用Gson序列化对象将属性值中“=”转为“\u003d”问题及解决
  12. Jenkins怎么发邮件,自动化大老手把手教你
  13. 计算机科学与技术专业大学四川省录取分数,四川人工智能专业大学分数线
  14. 技术经理成长复盘-激励
  15. aecmap快捷键_ARCMAP快捷键总结
  16. Kubernetes详解
  17. 寒假知识总结【日常吐槽】
  18. 十分钟写一个基于springboot+vue+redis+mysql的银行转账与用户后台管理系统,redis实现用户登录与缓存
  19. 数据结构 单词查找 二分法-索引表-Hash表
  20. HDU1799-组合公式变形

热门文章

  1. java中使用tika,Apache Tika使用报告
  2. 基于消失点的相机自标定
  3. 七牛云+阿里云搭建免费图床(已填坑,放心食用)
  4. Windows CE
  5. 达内上市 职教培训机构迎来新机会
  6. 清华EMBA课程系列思考之十一 -- 金融市场与投资分析
  7. 短信平台软件,支持CMPP, SGIP,ISAG/ISMP协议模块
  8. 16进制转换成ASCII码值
  9. 德语翻译器在线翻译中文
  10. 电子商务和计算机工资,电子商务专业工资待遇怎么样?