什么是VPP
VPP(Vector Packet Processing)是思科旗下的一款可拓展的开源框架,提供用用的、高质量交换、路由功能的应用框架。是网络协议领域常用的开源框架。
为什么叫VPP
VPP全称Vector Packet Processing(矢量报文处理)。VPP的精髓都包含在名字里了,即这个Vector。矢量报文处理与常规的报文处理有什么差别?
标量报文处理
一个标量报文处理流程的典型过程是:一次仅处理一个报文,一个报文中接口收到后,经过若干个功能模块的依次处理。每个功能模块的处理结果,通常有三类,1)丢弃;2)不作处理投递给下一功能模块;3)改写报文/转发。
1 | +---> fooA(packet1) +---> fooB(packet1) +---> fooC(packet1) |
标量报文处理存在以下问题:
- I-cache抖动:每个报文都要完整地执行完所有功能模块(foo)的处理,程序频繁地替换I-cache(instruction cache)缓存中的数据,导致缓存利用率降低,从而影响计算机性能。
- 每个报文处理过程中的调用栈信息随功能模块(foo)而变化,导致调用栈存放的D-cache的存取压力大。
矢量报文处理
矢量报文处理把报文组成一个“报文矢量”(可理解为报文组)。每一个功能模块(foo),都对报文矢量中的报文做一次性处理。
这样的设计:
- 减少了I-cache抖动,因为每个instruction重复应用于处理报文组的每个报文,提高了I-cache命中率。
- 调用栈信息重复应用于报文组的每个报文,D-cache的存取压力随之降低。
1 | +---> fooA([packet1, +---> fooB([packet1, +---> fooC([packet1, +---> |
报文处理图
VPP中的关键设计是Packet Process Graph(报文处理图)。使VPP具有以下特性:
- 可伸缩,可插件扩展
- 成熟的图节点架构
- 可定制的流水线
- 插件平等
在处理图中,开发人员可以定制插入新的处理节点,这让VPP易于扩展且可以用于定制化地对报文进行特定意途的处理。
VPP平台从接口上接收报文,组合成报文向量,然后把报文向量“喂”给报文处理图,图中的所有节点对报文向量进行逐一处理。
VPP插件都是在运行时加载的共享库。一个插件可以引入新的报文处理图节点或重新组织报文处理图。你可以生成一个完全独立于VPP原生的报文处理图。