简介:在1月12日的「阿里云CDN产品发布会-新一代传输协议QUIC让CDN更快一步」之上,阿里云技术专家淮叶分享了QUIC技术及其应用落地实践,内容包含:QUIC协议介绍、相比TCP有哪些优势、应用场景以及技术落地实践中的协议库选择,QUIC协议软件实现、落地技术架构和性能优化。

随着互联网的快速发展,基础网络环境也在发生变化,WEB网络协议也经历了HTTP1.0、HTTP1.1、HTTP2.0以及即将迎来HTTP3.0; HTTP3.0将以QUIC协议替代TCP作为传输层,具备stream多路复用、握手0RTT、连接迁移以及用户态拥塞算法诸多优势。CDN产品关注QUIC协议演进并实践落地,从gQUIC协议到标准IETF QUIC协议已经部署在CDN边缘节点,并在短视频和图片业务场景实践有不错的收益。

在1月12日的「阿里云CDN产品发布会-新一代传输协议QUIC让CDN更快一步」之上,阿里云技术专家淮叶分享了QUIC技术及其应用落地实践。本文根据分享内容梳理,包括以下三个部分:

  • QUIC协议介绍,包括协议诞生历史、基础特性、相比TCP有哪些优势,以及QUIC协议可以应用在哪些业务场景
  • CDN QUIC技术落地实践,包括协议库选择,QUIC协议软件实现以及QUIC落地技术架构,以及QUIC性能优化,QUIC产品如何接入使用
  • CDN QUIC技术落地场景,主要介绍阿里巴巴集团业务使用QUIC加速后的收益,以及背后的一些优化措施

QUIC协议介绍

当我们访问视频网站和APP应用时,经常会遇到各种各样的性能问题,网页加载慢、视频卡顿、网络出错,其中关键影响因素就是网络协议。

HTTP 协议作为互联网web协议,经历了几次重要的升级:

HTTP1.0 -> HTTP1.1:支持长连接,请求pipeline特性,通过减少了TCP三次握手,降低连接建立的开销

HTTP -> HTTPS:增加TLS层握手,传输内容加解密,因增加安全特性,故增加建连延迟

HTTP1.1 -> HTTP2:H2特性是请求数据流的多路复用与头部压缩,提高了单连接的并发能力

从HTTP1.0升级到HTTP2,其中传输层协议没有变化都是基于TCP协议。TCP协议是可靠传输协议,需要三次握手状态,还有队头阻塞问题,为了解决这些问题,基于UDP设计实现的一种可靠传输协议——QUIC协议应运而生。因此,HTTP协议再次升级。

HTTP2->HTTP3:HTTP3基于QUIC协议,因此具备QUIC协议的传输特性,解决TCP队头阻塞问题,具备TLS1.30-RTT、H2多路复用能力,还具备连接迁移能力。QUIC协议已于2021年5月正式标准化,编号为RFC9000。

QUIC 协议解决了哪些问题

1. 低连接延时

QUIC 基于 UDP,无需 TCP 连接,最好情况下,QUIC 可以做到 0RTT 开启数据传输。而基于 TCP 的 HTTPS,即使在TLS1.3的early data下仍然需要 1RTT 开启数据传输。然而对于常见的 TLS1.2 完全握手的情况,则需要 3RTT 开启数据传输。

2. 无队头阻塞

虽然 HTTP2 实现了多路复用,但是传输层依然使用的是TCP,一旦出现某个报文丢包,将会影响多路复用下的所有请求流。然而QUIC 基于 UDP,在设计上就解决了队头阻塞问题。同时HTTP3使用 QPACK 编码替换 HPACK 编码,在一定程度上也减轻了 HTTP 请求头的队头阻塞问题。

3. 用户态拥塞控制

QUIC 的传输控制不再依赖内核的拥塞控制算法,而是实现在应用层上。这意味着可以根据不同的业务场景,实现配置不同的拥塞控制算法以及参数,甚至同一个业务的不同QUIC连接也可以使用不同的拥塞控制算法。

4. 连接迁移

当实际用户的网络发生变化时,从 WIFI 网络切换到 4G 网络时,用户地址发生变化,基于 TCP 的 HTTP 协议无法保持连接的存活;而QUIC 基于连接 CID 作为连接标识, 仍然可以保证连接存活和数据正常收发。

QUIC协议与TCP协议对比

既然QUIC协议设计初衷是解决传输层协议问题,与其竞对的就是TCP协议,那么从传输协议特性分析两种协议设计差异,可得出以下对比:

  1. QUIC为每个加密级别使用单独的包号空间,除了0-RTT和1-RTT密钥使用相同的包号空间,隔离的包号空间可以确保使用一种加密级别发送包的ACK, 不会引起使用其他加密级别发送的包的虚假重传问题。
  2. QUIC的包号严格按照包号空间递增,直接编码传输顺序。报文号越高表示报文发送时间越晚,报文号越低表示报文发送时间越早。当一个包含应答帧的包被检测到丢失时,QUIC会在一个新的包中包含必要的帧,并添加一个新的包号,从而消除了当收到应答时确认哪个包的不确定性。因此,可以进行更精确的进行RTT测量,可以轻松地检测到虚假重传。
  3. Quicack帧包含类似于TCP选择性应答(sack)的信息。然而QUIC不允许数据包的确认被违背,这大大简化了双方的实现,并降低了发送方的内存压力。
  4. 与TCP的三个SACK范围相反,QUIC支持许多ACK范围。在高丢包环境中,这种方法可以加快恢复速度,减少虚假重传。
  5. TCPRTT测量使用发送包和确认包时间戳计算,未考虑主机延迟问题,QUIC使用ACKDelay机制,使得路径RTT测量更加准确。
  6. QUIC使用PTO探测超时机制,代替TCP的RTO&TLP。
  7. TCP使用一个包的最小拥塞窗口。如果丢失单个数据包意味着发送方需要等待PTO来恢复,当接收方延迟确认时,发送一个单一的ack-eliciting包也增加了引起额外延迟。因此,QUIC建议最小拥塞窗口为两个包。虽然这增加了网络负载,但它被认为是安全的,因为在持续拥塞的情况下,发送方仍然会以指数方式降低发送速率。

QUIC协议可以加速哪些场景

  • 动态请求(API和信令传输场景):降低动态交互耗时
  • 短视频:提升首屏秒开率,降低卡顿率
  • 图片文件下载:降低文件下载总耗时
  • 直播:降低播放卡顿率,提升推流稳定性

CDN QUIC技术落地实践

关于协议库如何选择?

QUIC 协议栈的实现版本库很多,但协议功能实现的全面性各有不同,通过QUIC协议互通性测试报告,可以了解各协议库的QUIC特性支持程度。

CDN在QUIC协议上的实践路线,是从gQUIC版本开始调研实现,然后跟进QUIC标准化进度,然后支持 IETFQUIC标准,并实现HTTP3接入服务。选择gQUIC的原因是GOOGLE是QUIC协议的开创者,基于chromium实现的QUIC协议栈最早,功能最齐,实现上也最为标准,因此选择了它。

关于IETFQUIC协议版本,NGINX官方已实现了一个基础版本,生产环境使用仍然存在很多问题没解决,拥塞控制算法没有实现;但从QUIC协议互通测试报告看,QUIC协议实现比较全面,并且性能也不错,相信NGINX官方很快就会把QUIC分支合入主干。同时,补全了其缺失功能,比如拥塞算法。

gQUIC&IETFQUIC兼容架构

我们选择了两套不同的QUIC协议栈实现版本,来分别支持gQUIC和IETFQUIC,其中gQUIC版本支持Q039,Q043,Q046,IETFQUIC支持h3-29quicv1。

gQUIC协议库,自从2018年调研嵌入到CDN服务,我们从chromium裁剪出net网络库部分,开发QUIC模块,以及自研拥塞算法。随着IETFQUIC协议草案逐渐成熟,2020年RFC草案基本定稿,CDN也开始IETFQUIC实现调研,我们基于NGINX官方QUIC版本进行深度开发,解决QUIC加密库、拥塞算法、资源运维等问题,达到CDN上线标准。现在CDN QUIC同时支持gQUIC和IETFQUIC两种版本,客户接入无需更换域名,更换调度域。(CDN实现已经做了协议分流)

CDN QUIC技术架构实现

技术架构实现分为两个组件:QUIC-LB 和 QUIC-Server

QUIC-LB: 主要实现根据QUIC连接CID选择后端QUIC-Server逻辑

QUIC-Server:实现QUIC协议栈特性,并且根据连接CID选择已建立会话的worker进行服务

在 CDN QUIC 技术落地实践中,我们面临一个难题是QUIC传输带来的CPU资源损耗高于TCP协议栈的CPU消耗,QUIC 协议将 TCP协议栈 的特性从内核移到了应用层,从目前开源 QUIC 实现版本来看,性能相比 TCP 还有差距。因为TCP长期使用以来,从协议栈到网卡经过了非常多的优化,相比之下,UDP的优化很少。除了内核和硬件外,QUIC 协议的性能也与其实现有关,不同的实现版本可能也会有很大的差距。

所以对 QUIC 的传输性能,通过火焰图进行分析,找出了一些影响 QUIC 性能的关键点:

  • SSL加密算法的开销:

对称加解密也10%左右的开销;优化措施,不同场景选择不同加密算法,实验环境下对各加密算法进行性能测试,AES在cpu 指令优化下,性能提升20%,chacha20针对移动端有优化

  • UDP 收发包的开销:

针对大文件下载的情况,sendmsg占比很高,可以达到 30%以上;优化措施,开启GSO模式,相比单包发送,性能提升2-3倍

  • QUIC协议栈开销:

受协议栈自身实现的影响,如 ACK 的处理,MTU 探测和发包大小,内存拷贝等;优化措施,ACK 合并、调整udp payload size

CDN QUIC协议如何接入使用

1.CDN控制台,先申请开通,用户即可自助开启、关闭QUIC

2.测试工具,浏览器或者一些QUIC开源库工具,curl已经支持HTTP3

3.QUIC监控,可以从CDN内部监控系统查看QUIC连接异常问题

4.QUIC分析工具,wireshark最新版本已经支持QUIC协议分析

CDN QUIC产品的应用效果

CDN QUIC在阿里巴巴集团的一些业务上已经实践落地并取得了一些效果。例如:淘宝短视频业务在开启HTTP3后,客户端分片下载耗时下降 20%,播放器卡顿率下降 10%;支付宝图片下载业务在开启gQUIC后,小程序包下载耗时下降 25%,整体业务下载耗时下降 40%。

从不同业务实践中,CDN QUIC服务针对业务场景进行了全面优化,包括4个方面:

  • 连接优化0-RTT连接复用率,降低连接的延迟。
  • 加解密优化明文传输,可以减少加解密造成的一些影响。
  • 传输优化乱序报文缓存,针对特殊数据优先级需求进行调整。
  • 针对线上的不同业务场景调整参数,利用拥塞算法,提升在不同业务场景下的效果。

原文链接

本文为阿里云原创内容,未经允许不得转载。

QUIC技术创新 让视频和图片分发再提速的更多相关文章

  1. LiveVideoStackCon2021 北京站专访:从上云到创新,视频云的新技术、新场景

    伴随着视频技术的进步和标准的迭代,视频产业从模拟进入到数字时代,完成了从电影电视到互联网的媒介转换,并且衍生出了超高清.3D.AR/VR 等多种创新形态.特别是在后疫情的当下,我们可以看到音视频技术领 ...

  2. 你应该知道的2016年有关App开发的技术创新

    上一篇简述了2016年有关App产品的年中总结,这篇开始历数有关App开发的技术创新!无论你是创业者,还是程序员,无论你是否懂编程.写代码,利用APICloud平台数据撰写的年中总结,集合了移动应用创 ...

  3. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.

    提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...

  4. PostgreSQL视频去重 图片去重系列1

    PostgreSQL 在视频.图片去重,图像搜索业务中的应用 图片搜索 PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储 gist 索引方法(支持pa ...

  5. PostgreSQL 在视频、图片去重,图像搜索业务中的应用

    摘要: PostgreSQL 在视频.图片去重,图像搜索业务中的应用作者digoal日期2016-11-26标签PostgreSQL , Haar wavelet , 图像搜索 , 图片去重 , 视频 ...

  6. 下一代编解码技术Ali266在视频超高清领域的应用展望

    超高清与各领域的需求融合和创新正在发生. 2022年是一个体育大年,众多世界级体育赛事通过视频直播.转播等形式给观众带来畅爽的观看体验. 2022年北京冬奥会,实现了奥运会历史上首次赛事全程4K制作播 ...

  7. 共享业务稳定性测试&技术创新组

    本文其实是一篇招聘贴,不管你以前是做开发还是测试,都欢迎加入我们的小组. 2014年阿里巴巴的共享业务事业部有很大变化,共享的测试团队也做了一些调整,我不再担任共享业务的测试经理,但是仍然会留在共享测 ...

  8. CTO对话:云端融合下的移动技术创新

    云端融合真的来了?快听CTO们怎么讲云端融合下,技术创新怎么破? 快听CTO箴言  云喊了很多年,对于很多普通的技术人,心中有很多疑问:云端融合到底意味着什么,对公司的技术体系有什么影响,未来又会走向 ...

  9. IOS 视频分解图片、图片合成视频

    在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中经常遇到的问题,这篇博客就这两个部分对IOS视频图像的相互转换做一下分析. (1)视频分解图片 这里视频分解图片使用的是AVAssetI ...

  10. iOS实现视频和图片的上传

    关于iOS如何实现视频和图片的上传, 我们先理清下思路 思路: #1. 如何获取图片? #2. 如何获取视频? #3. 如何把图片存到缓存路径中? #4. 如何把视频存到缓存路径中? #5. 如何上传 ...

随机推荐

  1. 一个简单的RTMP服务器实现 --- RTMP与H264

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  2. NVIDIA Jestson TX2 配置cuda以及cudnn的坑 ( JetPack-L4T 、Error: downloading update lock、TX2,TX1,TK1相关资源信息)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. Avalonia 11.1.0-beta1 发布

    11.1.0-beta1 Avalonia 是 dotnet 的跨平台 UI 框架,提供灵活的样式系统,支持 Windows.macOS.Linux.iOS.Android 和 WebAssembly ...

  4. 【Leetcode】53. 最大子数组和

    题目(链接) 给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组是数组中的一个连续部分. 示例 1: 输入:nums = [-2,1,-3, ...

  5. 记录--ECharts — 饼图相关功能点(内环、外环、环形间隔、环形文字、轮播动画)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 记录一下在公司遇到的一些功能,以及相关实现 以上的内容我花了一周时间去实现的,自己也觉得时间很长,但主要因为很少使用ECharts,导致使 ...

  6. linux学习指令与现有环境解决问题笔记

    linux学习指令与现有环境笔记 注意:我将pytorch和cuda安装在了pytorch这个虚拟环境中 pytorch安装及注意问题 注意版本对应,稳定版2.0.1对应cuda11.7,别按错了 按 ...

  7. ArrayList,LinkedList,Vector三者的区别

    List 中元素是有序的,元素可以重复,因为该集合体有索引 ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高. 当元素放满了后,默认以原长度的 50%+1 的长度加长集合 ...

  8. 知识汇总:查看linux服务器系统命令

    要查看Linux服务器的系统信息,你可以使用多种命令来获取不同类型的信息.以下是一些常 用的命令和它们的用途: uname - 显示基本的系统信息 uname -a:显示所有的系统信息,包括内核名称. ...

  9. Python 潮流周刊第 45 期(摘要)+ 赠书 5 本《Python语言及其应用(第2版)》

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  10. OpenHarmony社区运营报告(2023年4月)

      本月快讯 • 2023年4月9日,OpenAtom OpenHarmony(以下简称"OpenHarmony")3.2 Release新版本发布.相比一年前的OpenHarmo ...