阿凡达

多数人可能已经知道,QUIC新运输协议启动为谷歌HTTP22实验,IETF正在实现标准化HTTP/3默认传输协议其结果很可能在未来几年内广泛部署QUIC越来越受欢迎并预期广泛部署,因此必须在向量包处理器中提供QUIC实施程序,以测量用全空间QUIC栈可实现性能,并辅助QUIC协议实现更多创新

如果你不熟悉VPP,你可能想查查快速数据项目网站或这些其他博客文章说到描述它.

QUIC与TCP相比有几个趣味属性第一,它是一个加密协议使用TLS1.3握手,因此它可用与今天TLS使用相同的X.509证书使用第二,QUIC提供任意数可靠并有序字节流应用通过向应用流提供传输协议可见度,解决TCP/TLS头端阻塞问题属于单流数据不延迟时, 某些包会投到另一包上 。最后,它支持移动端点切换网络而不中断QUIC连接

VPP建QUIC栈

if you try in a应用中QUIC, 最先你可能注意到的一件事是协议有几大不同用数种语言执行, 每种语言都有不同的北向API

VPP执行运输协议称为主机栈,揭开套接字式API通过定期Linux应用方便消费某些应用甚至有可能不修改使用它,多亏薄翻译层可加载LD_PRELOADQuic使用新API定义基于套接字概念以方便QUIC应用开发

XKCD927

因内流复用层QUIC应用需要处理三种逻辑对象:监听器、连接器和流流对象与传统UDP和TCP监听器和连接有不同属性结果适应套接字非直接性三类套接字显示QUICAPI,并有下列属性:

  • 监听插件 :TCP/UDP正常监听程序绑定端口并使用接受传入连接监听程序不再想接受新连接时可关闭
  • 连接插件 :sockets通过连接或接受调用创建与TCP或UDP套接字不同,这些套接字无法发送或接收数据,仅用于管理连接流
  • 流套接字 :sockets提供发送接收函数,以便同级交换数据或通过连接套接字创建新本地启动流流可由对等方关闭连接中的任何点

连接可随时由对等点或偶关闭关闭连接隐式关闭所有流

QUIC套接字式API协议映射

QUIC套接字实现

VPp主机栈内有广度内部框架,以会议概念为基础宿主栈会议大致匹配 POSIX世界套接字QUIC基于UDP,主机栈已经实现UDP,VPPQUIC实施既是消费者(VPPUDP栈),也是主机栈提供商(QUIC协议)。

QUIC协议逻辑 我们没有从头重实施取而代之的是,我们选择依赖Quicly库.库里有许多属性,

  • 以C写并积极维护
  • 仅侧重于QUIC协议逻辑并非常模块化(可插密码APIs和拥塞控制,不假设包处理)。
  • 并不假设线程模型调用
  • 依据MIT牌照发布

有了这些组件后,剩下的要做的就是写Quicly和VPP之间的粘合码,并略微修改主机栈以适应QUIC流逻辑边做边要注意数个更隐蔽的问题 关于识别、内存管理 和连接闭合处理特别是,我们搭建栈,使数据只在程序阅读后才能识别

并须谨慎避免发送者超载接收器内可用存储空间幸运-并证明它成熟-QUIC有几个选项允许同行控制非识别数据量由端对端并存内存存储流端和连接层

代码化为VPP插件并可用VPP仓库.

优化化

当然,由于性能是用户空间网络总化和VPP关键分量,我们没有停停在那里并花时间制定基准并优化QUIC栈

QUIC新协议没有iperf等标准性能测试工具结果,我们在主机栈顶端搭建像iperf基准工具开通数列连接 接通数列流 并尽量快速发送数据允许我们测量QUIC栈的吞缩性

第一件事我们注意到 大部分时间花在密码代码上, 所以我们开始优化部分由Quicly默认密码后端取代Openssl使用VPP快速本地密码API简单变换产生10%-15%性能提高

提高性能,我们应用了位素素实根基技术,即分包处理基本级数并应用多级数后再移到下一级数提高指令缓存效率并保持数据缓存使用可预测性Quic处理包分两步处理:协议处理和加密/解密

  • RX路径上使用Quicly卸载a
  • TX路径上用非操作处理器替换Quicly加密处理器,这些处理器只保存加密密钥和数据范围实际加密同时对Quicly生成的所有包执行,紧接传入UDP栈前。

优化后总吞值增益达30%,达4.5Gbit/s/VPP

外卖

持续演练使我们能够实现提供快速完全空间QUIC栈的目标VPP成熟后内部API允许快速优化新组件并产生显著效果测试还显示主机栈足够灵活易适应新协议

我们现在更清楚地理解瓶颈是什么并会继续优化此栈留意地平线上新创新应用

狦稱龟喷 浪琩示例应用代码自由伸手vpp-dev@lists.fd.io万一你有任何问题



作者类

阿凡达

AloysAugustin

软件工程师

VPP工程