FD.io:https://wiki.fd.io/view/Main_Page 官方:https://wiki.fd.io/view/VPP 介绍:https://wiki.fd.io/view/VPP/What_is_VPP%3F

1. 简介

VPP 平台是一个可扩展的框架,可提供开箱即用的交换机/路由器功能,它是思科 VPP 技术的开源版本:一种高性能的数据包处理堆栈,可以在商用CPU上运行。VPP技术基于成熟的技术,是一种模块化的设计。该框架允许在无需更改内核代码的情况下添加插件。

  • VPP全称 Vector Packet Processing,是Cisco2002年开发的商用代码;
  • 2016年2月11号,Linux基金会创建 FD.io 项目,Cisco将VPP代码的开源版本加入该项目,目前已成为该项目的核心;
  • VPP运行于用户空间,支持多种收包方式,常用的是DPDK;
  • VPP主要有两个主要功能:框架可扩展、成熟的交换/路由功能。

VPP (Vector Packet Processing) - 图1

2. 扩展性

2.1 结点操作

VPP 平台是通过 graph node 串联起来处理数据包,类似于 free bsd 的 net graph。
通过插件的形式引入新的 graph node 或者重新排列数据包的 graph node。将插件添加到插件目录中,运行程序的时候就会自动加载插件。另外插件也可以根据硬件情况通过某个 node 直接连接硬件进行加速。VPP 平台可以用于构建任何类型的数据包处理应用。比如负载均衡、防火墙、IDS、主机栈,也可以是一个组合,比如给负载均衡添加一个 vSwitch。
通过创建插件,可以任意扩展如下功能:

  • 自定义新的 graph node
  • 重新排列 graph node
  • 添加底层 APIs

VPP (Vector Packet Processing) - 图2
添加插件示例
**

2.2 可编程能力

VPP还提供了基于共享内存或者消息队列的高性能内部API。目前VPP平台支持C和JAVA客户端进行内部API绑定。如下图所以,我们完成一个外部应用对VPP进行操作:
VPP (Vector Packet Processing) - 图3
以上的编程能力是针对内部API的调用,另外还可以支持远程可编程能力。
远程可编程能力可以通过Data Plane Management Agent来实现,通过外部API与Data Plane Management Agent进行通信,Data Plane Management Agent通过内部API与VPP应用(引擎)进行通信。这是一个非常灵活的方法,任何人可以添加,但是需要外部API和Data Plane Management Agent匹配,以实现特定需求的VPP应用。下图展示Agent对接VPP和外部程序:
VPP (Vector Packet Processing) - 图4
案例 Honeycomb Agent:
Honeycomb Agent通过netconf和restconf发布了yang模型的VPP功能。
像OpenDaylight 这样支持netconf/yang 的控制器可以挂载 Honeycomb 管理代理来工作。而 OpenDaylight 支持 OpenStack Neutron,所以如下图所示 OpenStack Neutron 可以集成到vpp来:

VPP (Vector Packet Processing) - 图5

3. 网络特性

VPP拥有的网络特性如下:

  • 快速查找路由表、CAM表;
  • 任意n元组分类;
  • 商用级交换/路由功能。

VPP能提供的所有功能如下:

  • IPv4/IPv6

    • 14+ MPPS, single core
    • Multimillion entry FIBs
    • Input Checks
      • Source RPF
      • TTL expiration
      • header checksum
      • L2 length < IP length
      • ARP resolution/snooping
      • ARP proxy
    • Thousands of VRFs
      • Controlled cross-VRF lookups
    • Multipath – ECMP and Unequal Cost
    • Multiple million Classifiers –
      • Arbitrary N-tuple
    • VLAN Support – Single/Double tag
  • IPv4

    • GRE, MPLS-GRE, NSH-GRE,
    • VXLAN
    • IPSEC
    • DHCP client/proxy
  • IPv6

    • Neighbor discovery
    • Router Advertisement
    • DHCPv6 Proxy
    • L2TPv3
    • Segment Routing
    • MAP/LW46 – IPv4aas
    • iOAM
  • MPLS

    • MPLS-o-Ethernet –
      • Deep label stacks supported
  • L2

    • VLAN Support
      • Single/ Double tag
      • L2 forwarding with EFP/BridgeDomain concepts
    • VTR – push/pop/Translate (1:1,1:2, 2:1,2:2)
    • Mac Learning – default limit of 50k addresses
    • Bridging – Split-horizon group support/EFP Filtering
    • Proxy Arp
    • Arp termination
    • IRB – BVI Support with RouterMac assignment
    • Flooding
    • Input ACLs
    • Interface cross-connect

4. 向量处理

https://zhuanlan.zhihu.com/p/40049446

VPP (Vector Packet Processing) 顾名思义,使用了矢量处理而不是标量处理。
标量数据包处理一次只能处理一个数据包,数据包是按照到达先后顺序来处理的,第一个报文处理完,处理第二个,依次类推。更老的传统方法还需要处理中断,然后遍历调用堆栈( 函数会频繁嵌套调用,A调用B、B调用C …… return return …… 然后从中断返回),该过程会执行其中一项操作:平移、丢弃、重写或转发数据包。简而言之,传统报文处理是对到数据包逐个处理,不加以分类。
因此,传统标量数据包处理有如下缺陷:

  • 缓存抖动:在 L1 I-Cache(指令缓存)产生抖动
  • 缓存缺失:每个数据包都会导致一组相同的 I-Cache 未命中
  • 对于上述问题,除了扩大缓存外,没有其他方案

向量数据包处理采用了分类的思想,一次处理多个数据包。采用向量处理的优势在于它能够解决缓存抖动问题。原因在于:按类处理,如果cache命中,则这一批报文都会命中;否则一批都未命中。未命中时,由传统的n个包n次未命中变为n个包1次未命中。
VPP把一批底层硬件队列 RX ring 收到的包组成一个 Packet Vector 或者是一组包,借助于报文处理图(Packet Processing graph)来实现处理流程,图节点(graph node)把整个过程分解为一个个先后连接的服务节点。这一组包(packet vector)被第一个图节点的任务处理,然后依次被第二个graph node节点的任务处理,依次类推。
由于向量数据包中的第一个报文 packet-1 为 I-cache 进行了热身,向量数据包中剩下报文的处理性能可以直接达到极限,I-cache 缺失的固定开销平摊到了整个向量处理中,使单个报文的处理开销显著降低。
向量报文处理解决了标量处理的主要性能缺陷,并有具有如下优点:

  • 缓解了I-cache抖动问题
  • 向量报文进行预取缓解了读时延问题,高性能并且更加稳定

VPP (Vector Packet Processing) - 图6

5. 相关链接

https://fd.io/docs/vpp/latest/gettingstarted/index.html
https://docs.fd.io/vpp/20.05/
https://zhuanlan.zhihu.com/p/43735684
编译安装VPP及运行
vpp+dpdk 安装与运行
DPDK编译及使用
FD.IO-VPP研究及使用一(安装和基本使用)
VPP学习路线
Ubuntu-vpp 安装
DPDK 全面分析