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主要有两个主要功能:框架可扩展、成熟的交换/路由功能。
2. 扩展性
2.1 结点操作
VPP 平台是通过 graph node 串联起来处理数据包,类似于 free bsd 的 net graph。
通过插件的形式引入新的 graph node 或者重新排列数据包的 graph node。将插件添加到插件目录中,运行程序的时候就会自动加载插件。另外插件也可以根据硬件情况通过某个 node 直接连接硬件进行加速。VPP 平台可以用于构建任何类型的数据包处理应用。比如负载均衡、防火墙、IDS、主机栈,也可以是一个组合,比如给负载均衡添加一个 vSwitch。
通过创建插件,可以任意扩展如下功能:
- 自定义新的 graph node
- 重新排列 graph node
- 添加底层 APIs
2.2 可编程能力
VPP还提供了基于共享内存或者消息队列的高性能内部API。目前VPP平台支持C和JAVA客户端进行内部API绑定。如下图所以,我们完成一个外部应用对VPP进行操作:
以上的编程能力是针对内部API的调用,另外还可以支持远程可编程能力。
远程可编程能力可以通过Data Plane Management Agent来实现,通过外部API与Data Plane Management Agent进行通信,Data Plane Management Agent通过内部API与VPP应用(引擎)进行通信。这是一个非常灵活的方法,任何人可以添加,但是需要外部API和Data Plane Management Agent匹配,以实现特定需求的VPP应用。下图展示Agent对接VPP和外部程序:
案例 Honeycomb Agent:
Honeycomb Agent通过netconf和restconf发布了yang模型的VPP功能。
像OpenDaylight 这样支持netconf/yang 的控制器可以挂载 Honeycomb 管理代理来工作。而 OpenDaylight 支持 OpenStack Neutron,所以如下图所示 OpenStack Neutron 可以集成到vpp来:
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
- MPLS-o-Ethernet –
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
- VLAN Support
4. 向量处理
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抖动问题
- 向量报文进行预取缓解了读时延问题,高性能并且更加稳定
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 全面分析