FD.io VPP:用户文档 HostStack

RToax 2020年9月

HostStack

1. 描述

VPP的主机协议栈是利用VPP传输,会话和应用程序层协议的用户空间实现。它大致包括四个主要部分:

  • 接受可插拔传输协议的会话层
  • 用于在VPP和应用程序之间推送数据的共享内存机制
  • 传输协议实现(例如,TCP,QUIC,TLS,UDP)
  • 通讯库(VCL)和LD_PRELOAD库

2. 会话层架构

会话层架构

2.1. 会话命名空间

为了限制通信范围,应用程序应在附加时提供它们所属的名称空间和一个秘密。命名空间是预先/独立配置的,并用作将应用程序与网络层资源(如接口和fib表)相关联的一种方式。因此,它们用作限制要使用的源ip并限制路由范围的方法。如果应用程序不请求名称空间,则会将其分配给默认名称空间,而默认名称空间又使用默认的fib,并且默认情况下未配置任何机密。

多个名称空间可以使用相同的fib表,在这种情况下,本地名称空间之间的通信使用共享内存fifos。但是,如果命名空间使用不同的fib表,则仅在ip路由之后才能建立通信,如果配置了任何fib表/ vrf泄漏,则不再支持共享内存通信。应该注意的是,当为名称空间提供sw_if_index时,零IP(inaddr_any)绑定将转换为绑定到所请求接口的绑定。

2.2. 会话表

应用程序的另一种选择是在名称空间内提供其通信范围。也就是说,与可以从传输层和网络层获得帮助的全局范围相比,它们可以请求会话层的本地范围。在这种通信模式下,共享内存fifo(直通会话)被专门使用。尽管如此,由于现有的应用程序特性,仍必须在会话建立消息中提供in_addr_any(零个)本地主机ip地址。

这种分离允许我们定义一种会话层ACL,我们将其称为会话规则,从而允许/拒绝/重定向连接到应用程序。本地表是特定于名称空间的,可以用于出口会话/连接过滤:即,可以拒绝连接到给定的ip或ip前缀+端口。而全局表是特定于fib表的,可以用于入口过滤:即,可以允许或丢弃与ip / port的传入连接。

会话规则实现为match-mask-action数据结构,并支持最长的ip前缀匹配和端口通配符。

2.3. 会话关闭状态机

3. 文献资料

3.1. TLS应用

TLS应用
堆栈通过自定义内置应用程序向其他客户端应用程序提供TLS服务。TLS应用程序实现了一种特殊的传输类型,从基础TCP传输的角度来看,它可以充当应用程序,而从客户端应用程序的角度来看,它也可以充当传输。我们将此垫片层称为TLS上下文。该应用程序不直接实现TLS协议,即记录层,握手协议以及密码计算和套件[1],而是依赖于mbedtls [2]和openssl [3]之类的库。可以从较低角度看到该架构的高级视图:

因为加密和解密操作分别导致字节数的增加和减少,所以单个客户端会话需要四个FIFO。也就是说,在每个方向上,加密和未加密的数据都在不同的FIFO中进行缓冲。

为了建立客户端会话,通常采取以下步骤:

客户端应用程序请求到远程会话终结点的TLS连接。除了TLS传输,应用程序还必须指定对等方的:ip,端口和主机名,这是证书验证所必需的。如果未提供主机名,则接受所有服务器证书。
TLS应用程序(作为传输)会收到连接请求通知。分配TLS上下文,然后,TLS应用程序作为应用程序打开与远程传输终结点的TCP连接。
一旦建立了TCP连接并通知了TLS应用程序,mbedtls / openssl上下文将初始化为TLS客户端并启动握手协议。
握手完成后,TLS应用程序将使用配置的CA证书来验证服务器的证书并通知客户端应用程序。
此时,如果连接成功,则客户端应用程序可以开始与远程对等方交换数据。TLS应用程序读取推送到TX fifo中的数据,将其写入mbedtls / openssl,一旦加密,便推送到TCP连接的TX fifo中。相反,在接收时完成。

要初始化侦听会话,必须为应用程序配置服务器证书(将提供给客户端)和私钥。

3.1.1. 组态

TLS应用程序在VPP启动时向会话层注册。当前可以通过启动配置文件配置以下内容:

ca-cert-path:CA证书的路径。默认情况下使用/etc/ssl/certs/ca-certificates.crt
use-test-cert-in-ca:用于指示是否应将嵌入式TLS服务器证书添加到CA链以进行测试的标志。
想要充当TLS服务器的应用程序必须配置TLS证书和私钥。这些可以在应用程序附件之后通过本机C API函数vnet_app_add_tls_cert / vnet_app_add_tls_key或通过APPLICATION_TLS_CERT_ADD / APPLICATION_TLS_KEY_ADD二进制API调用提供。

3.1.2. 例子

3.1.2.1. HTTP服务器

要启动服务器,请执行以下操作:

# test http server uri tls://local-ip/port

在与服务器连接的浏览器中执行

https://vpp_ip/port/sh/run

如果一切顺利,则vpp应该已经返回了show run命令的结果。请注意,由于嵌入式服务器证书是自签名的,因此浏览器很可能会抱怨其有效性。

3.1.2.2. 回显客户端/服务器

在cli服务器上连接到的vpp实例上:

# test echo server uri tls://server_ip/port

在第二个vpp实例上,客户端连接到:

# test echo client uri tls://server_ip/port

这应该成功,因为如果未提供服务器主机名,则任何证书都被视为有效。要验证服务器的证书,请通过如下所示的主机名。嵌入式证书中的主机名是testtls.fd.io:

# test echo client uri tls://[testtls.fd.io]server_ip/port

4. 主机协议栈入门

应用程序可以针对主机堆栈服务针对以下API进行链接:

  • 内置C API。它只能由VPP中托管的应用程序使用
  • “原始”会话层API。它不为异步通信提供任何支持
  • 提供类似POSIX接口的VCL API。它带有自己的epoll实现。
  • 通过LD_PRELOAD的POSIX API

可以使用许多测试应用程序来练习这些API。对于以下所有示例,假定已启动并正确配置了两个VPP实例以确保它们之间的网络连接。要测试网络连接是否可用,可以使用内置的ping工具。按照惯例,我们认为第一个vpp实例(vpp1)是服务器附加到的实例,第二个实例(vpp2)是客户端应用程序附加到的实例。为了说明的目的,所有示例都将TCP用作传输协议,但是可以使用其他可用协议。

5. 内置Echo服务器/客户端

在vpp1上,从cli执行以下操作:

# test echo server uri tcp://vpp1_ip/port

在vpp2上:

# test echo client uri tcp://vpp1_ip/port

有关如何进一步配置客户端/服务器应用程序以进行吞吐量和CPS测试的更多详细信息,请参见此处

6. 外部Echo服务器/客户端(vpp_echo)

VPP外部回显服务器/客户端测试应用程序(vpp_echo)是一个定制的性能测试应用程序,它支持所有VPP HostStack传输层协议:

  • tcp
  • udp
  • quic

Vpp_echo利用“本地HostStack API”来验证性能,并使用单向和双向数据流正确处理连接/流事件。可以在构建树中找到

$ ./build-root/build-vpp[_debug]-native/vpp/bin/vpp_echo

从vpp 20.01开始,包含在主要的vpp debian软件包中(例如vpp_20.01-release-amd64.deb)

启动vpp1并附加服务器应用程序:

$ ./build-root/build-vpp_debug-native/vpp/bin/vpp_echo uri tcp://vpp1_ip/port

然后启动vpp2并附加客户端:

$ ./build-root/build-vpp_debug-native/vpp/bin/vpp_echo client uri tcp://vpp1_ip/port

vpp_echo的当前命令行选项是:

vpp_echo --help
Usage: vpp_echo [socket-name SOCKET] [client|server] [uri URI] [OPTIONS]
Generates traffic and assert correct teardown of the hoststacksocket-name PATH    Specify the binary socket path to connect to VPPuse-svm-api         Use SVM API to connect to VPPtest-bytes[:assert] Check data correctness when receiving (assert fails on first error)fifo-size N[K|M|G]  Use N[K|M|G] fifosmq-size N           Use mq with N slots for [vpp_echo->vpp] communicationmax-sim-connects N  Do not allow more than N mq events inflightrx-buf N[K|M|G]     Use N[Kb|Mb|GB] RX buffertx-buf N[K|M|G]     Use N[Kb|Mb|GB] TX test bufferappns NAMESPACE     Use the namespace NAMESPACEall-scope           all-scope optionlocal-scope         local-scope optionglobal-scope        global-scope optionsecret SECRET       set namespace secretchroot prefix PATH  Use PATH as memory root pathsclose=[Y|N|W]      When stream is done, send[Y]|nop[N]|wait[W] for closenuris N             Cycle through N consecutive (src&dst) ips when creating connectionslcl IP              Set the local ip to use as a client (use with nuris to set first src ip)time START:END      Time between evts START & END, events being :start - Start of the appqconnect    - first Connection connect sentqconnected  - last Connection connectedsconnect    - first Stream connect sentsconnected  - last Stream got connectedlastbyte    - Last expected byte receivedexit        - Exiting of the apprx-results-diff     Rx results different to pass testtx-results-diff     Tx results different to pass testjson                Output global stats in jsonstats N             Output stats evry N secslog=N               Set the log level to [0: no output, 1:errors, 2:log]crypto [engine]     Set the crypto engine [openssl, vpp, picotls, mbedtls]nclients N          Open N clients sending datanthreads N          Use N busy loop threads for data [in addition to main & msg queue]TX=1337[K|M|G]|RX   Send 1337 [K|M|G]bytes, use TX=RX to reflect the dataRX=1337[K|M|G]      Expect 1337 [K|M|G]bytes-- QUIC specific options -- quic-setup OPT      OPT=serverstream : Client open N connections. On each one server opens M streamsOPT=default : Client open N connections.On each one client opens M streamsqclose=[Y|N|W]      When connection is done send[Y]|nop[N]|wait[W] for closeuni                 Use unidirectional streamsquic-streams N      Open N QUIC streams (defaults to 1)Default configuration is :server nclients 1 [quic-streams 1] RX=64Kb TX=RXclient nclients 1 [quic-streams 1] RX=64Kb TX=64Kb

7. VCL套接字客户端/服务器

有关更多详细信息,请参见此处的教程
VCL套接字客户端/服务端

8. 教程/测试应用

  • 测试HTTP Server应用
  • 测试Echo客户端/服务器应用程序
  • 测试代理应用
  • sshd与LD_PRELOAD
  • 具有LD_PRELOAD的iperf3
  • 带有LD_PRELOAD的Nginx

9. 演示运行清单

  • 2017年DPDK北美峰会
  • FD.io Mini Summit KubeCon 2017
  • FD.io Mini Summit KubeCon欧洲2018
  • FD.io Mini Summit KubeCon NA 2018 幻灯片和视频
  • FD.io Mini Summit KubeCon EU 2019 幻灯片和视频

以上内容由RToax翻译整理自网络。

FD.io VPP用户文档:会话层架构与VPP应用相关推荐

  1. FD.io VPP 20.09版本正式发布:往期VPP文章回顾+下载地址+相关链接

    目录 下载RPM/DEB包 往期文章回顾与推荐 FD.io是一些项目和库的集合,基于DPDK并逐渐演化,支持在通用硬件平台上部署灵活可变的业务.FD.io为软件定义基础设施的开发者提供了一个通用平台, ...

  2. FD.io VPP基本介绍:理解向量包处理(VPP)

    FD.io VPP:用户文档 向量包处理器 RToax 2020年9月 1. 什么是向量包处理器(VPP) FD.io的矢量包处理器(VPP)是一个快速,可扩展的2-4层多平台网络协议栈.它在Linu ...

  3. FD.io VPP官方邮件列表

    https://www.mail-archive.com/vpp-dev@lists.fd.io/ 邮件内容更新截至2020年9月21日17:23:47 Messages by Thread [vpp ...

  4. FD.io VPP:用户文档:VPP RPM包的构建与离线安装

    VPP RPM包的构建与离线安装 RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过设置代理 ...

  5. FD.io VPP 20.05 官方文档 总目录:用户文档+开发文档+命令行

    https://docs.fd.io/vpp/20.05/index.html Vector Packet Processing FD.io VPP ▼Vector Packet Processing ...

  6. FD.io/VPP — VPP Agent — 架构设计

    目录 文章目录 目录 VPP Agent 的分层架构 KVScheduler VPP plugins VPP Agent 与 VPP Data Plane 的通信机制 VPP Agent 的软件架构 ...

  7. FD.io VPP利用iperf3进行UDP灌包测试-英特尔X520万兆网卡

    FD.io VPP:用户文档 iperf3灌包测试 RToax 2020年9月 架构 1. VPP环境配置与启动 1.1. 安装VPP环境 略 1.2. VPP配置文件 启动配置文件startup-i ...

  8. FD.io/VPP — Overview

    目录 文章目录 目录 FD.io VPP FD.io 官网:https://fd.io FD.io(Fast data – Input/Output)是 Linux 基金会下属的一个开源项目,成立于 ...

  9. 关于FD.io VPP的最新消息

    Table of Contents CuVPP:软件数据平面中基于过滤器的最长前缀匹配 快速数据项目的矢量包处理器(VPP)版本20.05 2020年打破神话的DPDK 在商品硬件上使用Calico ...

最新文章

  1. 认识一下SAP的Area Menu
  2. 什么是 AIDL 以及如何使用
  3. 【Java 网络编程】网络相关概念
  4. ad 原理图差分线_再改原理图,得加钱检查原理图PCB系列教程17
  5. Linux中的cp命令和mv命令
  6. springboot @value启动报错_打造一个 Spring Boot 注解启动控制开关
  7. 推荐 12个Idea 免费实用插件及插件离线安装方法
  8. CSS强制英文、中文换行与不换行
  9. 软件_matplotlib绘图跳过时间段的处理方案[博]
  10. 推理集 —— 现象与观察
  11. 多媒体计算机技术的核心技术是,计算机多媒体的核心技术与发展
  12. nginx-rtmp协议解读
  13. android 动态表情包,搞笑斗图动态表情包
  14. html表格动态添加图片,引用 制作html帖第四课:在表格中添加图片代码制作精美边框...
  15. Ubuntu安装基础教程(No Zuo No Die)
  16. 【价值积累】属于我的创业感悟
  17. 两年后再次遇到的Oracle启动报错,ORA-01012:not logged
  18. 多少卡路里,我应该吃是错误的
  19. Permute 3.5.9 小巧便捷的多媒体文件格式转换器
  20. Word文档中粘贴图片不显示

热门文章

  1. 电厂运维的cis数据_科技驱动升级,各类智慧电厂技术大盘点
  2. (备忘)卸载微软自带输入法
  3. C#操作SQLite数据库
  4. dijkstra+priority_queue+vector
  5. Linq 简介 及添加
  6. 用U盘作为启动盘,安装Yosemite
  7. 关于一个GetLevelDesc函数 的认知问题
  8. TextBoxWatermarkExtender扩展器与RequiredFieldValidator控件相冲突的解决方案
  9. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例
  10. 米的换算单位和公式_小学三年级数学常用公式和单位换算,孩子复习宝典!