E百科 | 第2期 扒一扒能加速互联网的QUIC协议

简介: 众所周知,QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP、TLS、HTTP/2等协议的可靠性与安全性,可以有效减少连接与传输延迟,更好地应对当前传输层与应用层的挑战。目前阿里云CDN线上提供GQUIC版本服务,已经有Tbps级别的流量承载,并对客户来带了显著的延迟收益。本文将由低向上分层讨论QUIC协议的特点。

众所周知,QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP、TLS、HTTP/2等协议的可靠性与安全性,可以有效减少连接与传输延迟,更好地应对当前传输层与应用层的挑战。目前阿里云CDN线上提供GQUIC版本服务,已经有Tbps级别的流量承载,并对客户来带了显著的延迟收益。本文将由低向上分层讨论QUIC协议的特点。

作者:黎叔

QUIC协议是一系列协议的集合,主要包括:

  • 传输协议(Transport)
  • 丢包检测与拥塞控制(Recovery)
  • 安全传输协议(TLS)
  • HTTP3协议
  • HTTP头部压缩协议(QPACK)
  • 负载均衡协议(Load Balance)

本文针对QUIC的系列协议进行科普性简单介绍,细节读者仍然需要通读协议原文。本文基于quic的讨论均基于quic-34系列版本。

QUIC协议类似快递公司,在收到用户数据后,将数据打包,传输到对端,再进行拆包,将用户数据交给了最终目标用户。QUIC是基于UDP协议,实现了类似TCP的可靠传输,并在此基础上,结合HTTP3/QPACK,更好地服务互联网上海量的HTTP Request/Response需求。如其名发音,QUIC(quick),其目标就是希望比基于TCP的HTTP交互有更好的体验。

QUIC/HTTP3的特点:

  • 有序传输:用stream的概念,确保数据有序。不同的stream或者packet,不保证有序到达。
  • 报文压缩,提高荷载比率:比如QUIC引入了variable-length integer encoding。又比如引入QPACK进行头部压缩
  • 可靠传输:支持丢包检测和重传
  • 安全传输:TLS 1.3安全协议

分层的协议

QUIC是在UDP的基础上,构建类似TCP的可靠传输协议。HTTP3则在QUIC基础上完成HTTP事务。
网络总是分层讨论的,在此我们由低向上分层讨论quic协议

  • UDP层: 在UDP层传输的是UDP报文,此处关注的是UDP报文荷载内容是什么,以及如何高效发送UDP报文
  • Connection层: Connection通过CID来确认唯一连接,connection对packet进行可靠传输和安全传输
  • Stream层: Stream在相应的Connection中,通过StreamID进行唯一流确认,stream对stream frame进行传输管理
  • HTTP3层:HTTP3建立在QUIC Stream的基础上,相对于HTTP1.1和HTTP2.0,HTTP3提供更有效率的HTTP事务传输。HTTP3中通过QPACK协议进行头部压缩

UDP层

本章节讨论QUIC发包的UDP部分的相关问题。

UDP荷载大小

荷载大小受限于3个对象:QUIC协议规定;路径MTU;终端接受能力
1、QUIC不能运行在不支持1200字节的单个UDP传输网络路径上 QUIC有规定initial包大小不得小于1200,如果数据本身不足1200(比如initial ack),那么需要用padding方式至少填充到1200字节

2、QUIC不希望出现IP层分片现象本要求意味着udp交给ip层的数据不会大于1个MTU,假设mtu为1500,ipv4场景下,udp的荷载上限为1472字节(1500-20-8),ipv6下,udp荷载上限为1452(1500-40-8)。QUIC建议使用PMTUD以及DPLPMTUD进行mtu探测。在实战中,我们建议设置IPv6的MTU为1280,大于这个值,某些网络会存在丢包现象。

3、终端能接受 transport paraments的max_udp_payload_size(0x03)的是终端接受单个udp包大小的能力,发送端应当遵从这一约定。

UDP荷载内容

UDP荷载内容即为quic协议中的packet。协议规定,如果不超过荷载大小的限制,那么多个packet可以组成一个udp报文发出去。在quic实现中,如果每个udp报文只包含一个quic packet,会更容易出现乱序问题。

高效发UDP包

和tcp不同,quic需要在应用层就完成udp数据组装,且每个udp报文不大于1个mtu,如果不加以优化,比如每个包直接用sendto/sendmsg发送,势必会造成大量的系统调用,影响吞吐

1、通过sendmmsg接口进行优化,sendmmsg可以将用户态的多个udp quic包通过一次系统调用发到内核态。内核态对于每个udp quic包独立作为udp包发出去

2、在1.)解决了系统调用次数问题,开启GSO可以进步一分包延迟到发给网卡驱动前一刻,可以进一步提高吞吐,降低CPU消耗

3、在2.)的基础上,现在主流网卡已经支持硬件GSO offload方案,可以进一步提高吞吐,降低cpu消耗

上面介绍的发送方式,事实上可以理解为udp burst发送方式,这带来了一个问题,拥塞控制需要pacing能力!

Connection层

在我们讨论时,可知1个udp报文里传输的其实是一个或多个quic协议定义的packet。那么在Connection这一层面,其实是以packet为单位进行管理的。一个packet到来,终端需要解析出目标ConnectionID(DCID)字段,并将该packet交给找到对应的quic connection。一个packet是由header加payload两部分组成。

connection id

不同于tcp的4元组唯一确认一条连接的方式,QUIC定义了一个和网络路由无关的ConnectionID来确认唯一连接的。这带来一个好处,可以在四元组发生变化时(比如nat rebinding或者终端网络切换wifi->4G),依然保持连接。当然,虽然连接状态依然保持,但由于路径发生变化,拥塞控制也需要能够及时调整。

packet头部

IETF的quic header分为两种类型,long header, short header。其中long header有分为 initial, 0rtt, handshake, retry四种类型。类型的定义可以直接参考rfc文档,此处不再赘述。

quic规定packet number始终为自增的,就算某个packet的内容为重传的frame数据,其packet number也必须自增,这相对于TCP来说,带来一个优点,能够更加精确的采集到路径的RTT属性。

packet number编解码: packet number是一个0~262 -1的取值范围,quic为了节约空间,在计算packet number时,引入了unacked的概念,通过截断(只保留有效bit位)的方式,只用了1-4个字节,即可以encode/decode出正确的packet number。rfc文档中有附录详细讲解了enc/dec的过程。

packet头在安全传输中是被保护对象,这也意味着在没有ssl信息的情况下,无法使用wireshake对packet进行时序分析。中间网络设备也无法向TCP那样获得packet number进行乱序重组。

packet荷载

在对packet进行解密,且去除掉packet header后,packet的荷载里就都是frame了(至少包括1个)。

如果packet的荷载里,不包括ACK, PADDING, and CONNECTION_CLOSE这种三种类型的帧,那么这个packet则被定义为ack-eliciting,意味着对端必须对这种packet生成相应的ack通知发送方,以确保数据没有丢失。

packet的荷载里frames的类型在多达30种类型,每种类型都有自己的应用场景,如ACK Frame用于可靠传输(Recovery),Crypto用于安全传输(TLS握手),Stream Frame用于业务数据传递,MAX_DATA/DATA_BLOCKED用于流控,PING Frame可以用于mtu探测,具体描述参考rfc文档。

安全传输

QUIC的安全传输依赖TLS1.3,而boringssl是众多quic实现的依赖库。协议对Packet的头部以及荷载均进行了保护(包括packet number)。TLS1.3 0RTT的能力,在提供数据保护的同时,能在第一时间(服务端收到第一个请求报文时)就将Response Header发给客户端。大大降低了HTTP业务中的首包时间。为了支持0RTT,客户端需要保存PSK信息,以及部分transport parament信息。

安全传输也经常会涉及到性能问题,在目前主流的服务端,AESG由于cpu提供了硬件加速,所以性能表现最好。CHACHA20则需要更多的CPU资源。在短视频业务上,出于对首帧的要求,通常直接使用明文传输。

Transport Paramenter(TP)协商是在安全传输的握手阶段完成,除了协议规定的TP外,用户也可以扩展私有TP内容,这一特性带来了很大的便利,比如:客户端可以利用tp告知服务端进行明文传输。

可靠传输

QUIC协议是需要像TCP能够进行可靠传输,所以QUIC单独有一个rfc描述了丢包检测和拥塞控制的话题,

丢包检测:协议利用两种方式来判断丢包是否发生:一种是基于ack的检测,通过time threshold和packet threshold根据已经到达的packet,推断在此包之前发出去的包是否丢失。第二种,在失去了参考包的情况下,那么只能通过PTO的方式来推断包是否丢失。一般来说,大量被触发的应该是ACK的检测方式。如果PTO被大量触发,会影响发包效率。

拥塞控制:QUIC针对TCP协议中的一些缺陷,专门做了优化。比如始终递增的packet number,丰富的ack range,host delay计算等。同时tcp的拥塞控制需要内核态实现,而QUIC在用户态实现,这大大降低了研究高效率的可靠传输协议的门槛。Recovery协议中,描述了newReno的实现方式。在GOOGLE chrome中,实现了cubic, bbr, bbrv2,而mvfst项目则更为丰富,包括了ccp, copa协议。

Stream层

stream是一个抽象的概念,它表达了一个有序传输的字节流,而这些字节其实就是由Stream Frame排在一起构成。在一个quic connection上,可以同时传输多条流。

Stream头部

在Quic协议里,stream分为单向流或双向流,又分为客户端发起或服务端发起。stream的不同类型定义在HTTP3中得到了充分的利用。

Stream荷载

Stream的荷载即为一系列Stream Frame,通过Stream Frame头部的Stream ID来确认单个流。
在TCP里,如果一个segment传递丢失,那么后续segment乱序到达,也不会被应用层使用,只到丢失的segment重传成功为止,因此TCP实现的HTTP2的多路复用能力受到制约。在QUIC协议中,有序的概念仅维护在单个stream中,stream之间和packet都不要求有序,假设某个packet丢失,只会影响包含在这个包里的stream,其他stream仍然可以从后续乱序到达的packet中提取到自己所需要的数据交给应用层。

HTTP3层

stream分类

在引入HTTP3后,stream的单向流类型被扩展成:控制流,Push流和其他保留类型。其中HTTP3的setting则是在控制流中传输,而HTTP数据传输是在客户端发起的双向流中,所以读者会发现,HTTP数据传输的stream id都是模4等于0的。

在引入QPACK后,单向流被进一步扩展了两个类型,encoder流,decoder流,QPACK中动态表的更新则依赖这两个流。

QPACK

QPACK的作用是头部压缩。类似HPACK,QPACK定义了静态表,动态表用于头部索引。静态表是针对常见的头部,协议预先定义的。动态表则是在该QUIC Connection服务HTTP过程中,逐渐建立的。QPACK所建立的Encoder/Decoder流是伴随用于HTTP事务的QUIC Connection生命周期。
动态表不是HTTP3能够运行的必须项,所以在某些QUIC开源项目中,并没有实现复杂的动态表功能。

在QPACK的动态表业务中,数据流,编码流,解码流3种对象共同参与,编码流和解码流负责维护动态表变化,数据流则解析出头部的索引号,去动态表中查询,得到最终的头部定义。

其他

Flow Control 流控

QUIC协议引入了flow control的概念,用于表达接收端的接受能力。流控分两级,Connection级别,和Stream级别。发送端发送的数据偏移量不能超过流控的限制,如果达到限制,那么发送端应该通过 DATA_BLOCKED/STREAM_DATA_BLOCKED来通知接收端。如果为了传输性能,接收端应该尽量保持限制足够大,比如达到max_data的一半时,就及时更新max_data传给发送端。如果接收端不希望太快接受数据,也可以利用流控对发送端进行约束。

QUIC版本

QUIC一开始由google主导设计开发,在chromium项目中,可以看到google quic(GQUIC)版本号被定义为Q039,Q043,Q046,Q050等。

随着IETF版本的QUIC推出,ietf quic(IQUIC)也有很多版本,如29,30,34(最新版)等,不同版本可能是无法互通的,比如不同版本安全传输的salt变量规定不一样。所以IQUIC引入了版本协商的功能,用于不同的客户端和服务端协商出可以互通的版本。

在实践中,还会遇到一个需求,要求一个服务能够同时服务GQUIC的不同版本,又能服务IQUIC的不同版本。这就要求服务在收取到packet后,需要对packet作出判断,分析出它属于iquic的,还是gquic的,然后进行逻辑分流。

QUIC应用及未来展望

目前阿里云CDN线上提供GQUIC版本服务,适用的产品包含静态内容分发(图片小文件、大文件下载、视音频点播)和动态内容分发(全站加速)。用户只需在CDN、全站加速控制台对域名开启【QUIC协议开关】功能,支持QUIC协议的客户端即可通过QUIC协议与阿里云CDN节点通信。

QUIC应用场景

图片小文件:明显降低文件下载总耗时,提升效率
视频点播:提升首屏秒开率,降低卡顿率,提升用户观看体验
动态请求:适用于动态请求,提升访问速度,如网页登录、交易等交互体验提升
弱网环境:在丢包和网络延迟严重的情况下仍可提供可用的服务,并优化卡顿率、请求失败率、秒开率、提高连接成功率等传输指标
大并发连接:连接可靠性强,支持页面资源数较多、并发连接数较多情况下的访问速率提升
加密连接:具备安全、可靠的传输性能

关于QUIC协议,目前阿里云CDN线上的QUIC已经有了Tbps级别的大流量验证,并为客户来带了显著的延迟收益。随着IETF标准的QUIC协议完善,阿里云也会尽快推出ietf quic服务,我们相信QUIC未来会成为互联网流量的主力成员。

后续阿里云CDN会在“阿里云Edge Plus”公众号中分享更多最新的产品能力、解决方案和技术实践,欢迎大家关注,与我们一起探讨。

原文链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“匿名句柄” 是一切皆文件背后功臣……

作者 | 奇伢 来源 | 奇伢云存储匿名 fd 的样子?我们经常在 /proc/${pid}/fd/ 下面能看到 anon_inode : 前缀的句柄,如下:rootubuntu:~/temp# ll /proc/5398/fdlr-x- 1 x x 64 Aug 4 9:9 8 -> anon_inode:inotify lrwx- 1 x x 64 Aug …

linux6.6 sudo环境变量,linux sudo环境变量设置

VS2010添加资源文件VS2010中资源文件管理在 双击打开Resources.resx 选择左上角资源文件类型 然后复制资源文件 粘贴到空白区域 则会自动生成资源文件代码 在项目中使用该资源文件时,通过global::P ...sublime text 2 配置php调试环境准备工作: 计算机中已经正确安装了php. 1.设…

Flink集成Iceberg在同程艺龙的实践

简介: 本文由同城艺龙大数据开发工程师张军分享,主要介绍同城艺龙 Flink 集成 Iceberg 的生产实践。 本文由同城艺龙大数据开发工程师张军分享,主要介绍同城艺龙 Flink 集成 Iiceberg 的生产实践。内容包括: 背景及痛点Flink Ice…

python编写加密程序_用Python实现一个简单的加密程序

生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库。 对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。 …

阿里巴巴开源容器镜像加速技术

简介: 近日阿里巴巴开源了其云原生容器镜像加速技术,其推出的overlaybd镜像格式,相比于传统的分层tar包文件格式,实现了基于网络的按需读取,从而使得容器可以快速启动。 近日阿里巴巴开源了其云原生容器镜像加速技术&…

Unity重写Inspector简化分组配置文件

Unity重写Inspector简化分组配置文件 重写Inspector创建分组管理配置文件创建修改参数参数对应类工程在我的资源中名为CreateConfig,免费下载 重写Inspector创建分组管理配置文件 创建 修改参数 参数对应类 using UnityEngine;public class GameConfig : Scriptab…

985大学的高材生只会写代码片段,丢人吗?

很多同学在学习编程的时候都会遇到各种各样的难题,比如:没有合适的资料、学习过于碎片化、资料的质量层次不齐、看了很多视频自己动手时却还是不会、接触不到完整项目、无法检测自己的编程水平是不是企业所认可的……最近,小郭和小解同学也遇…

python 生成器_Python生成器中的GeneratorExit

我写了一个关于Python生成器的测试程序.但是我得到了一个不期望的错误.我不知道如何解释它.我来告诉你代码: def countdown(n): logging.debug("Counting down") while n > 0: try: yield n except GeneratorExit: logging.error("GeneratorExit&…

快手基于RocketMQ的在线消息系统建设实践

简介: 快手需要建设一个主要面向在线业务的消息系统作为 Kafka 的补充,低延迟、高并发、高可用、高可靠的分布式消息中间件 RocketMQ 正是我们所需的。 作者:黄理 黄理,10多年软件开发和架构经验,热衷于代码和性能优…

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

简介: 本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来搭建自己的 RocketMQ 监控系统。RocketMQ 在线可交互教程现已登录知行动手实验室&#xff…

c语言结构体函数平面向量加法公式,插值 拟合 符号变量与符号表达式 微积分 解方程 向量运算...

7.1.1 分段线性插值所谓分段线性插值就是通过插值点用折线段连接起来逼近原曲线,这也是计算机绘制图形的基本原理。实现分段线性插值不需编制函数程序,MATLAB自身提供了内部函数interp1其主要用法如下:interp1(x,y,xi) 一维插值◆ yiinterp1(…

Redis 很屌,不懂使用规范就糟蹋了

作者 | 码哥 来源 | 码哥字节❝这可能是最中肯的 Redis 使用规范了一网友昨天和我说,公司凌晨 12 点之后,网站用户量暴增,出现了一个技术故障,用户无法下单,当时老大火冒三丈!经过查找发现 Redis 报 C…

python统计字符在文件中出现的次数_一文搞定统计字符串中某字符出现的频次

下面是统计字符串中某字符出现的次数的方法 方法1: 这个方法相当简单,零基础自学编程,代码写成这样能满足需求,但它逐个逐个计数,比较笨拙。rlt {} for i in content: if i in rlt.keys(): rlt[i] 1 else: rlt[i] 1…

深度 | 数据仓库分层存储技术揭秘

简介: 作者: 沄浩、士远 一 、背景 据IDC发布的《数据时代2025》报告显示,全球每年产生的数据将从2018年的33ZB增长到2025年的175ZB,平均每天约产生491EB数据。随着数据量的不断增长,数据存储成本成为企业IT预算的重…

android tab 切换动画,Android之ViewPager+TabLayout组合实现导航条切换效果(微信和QQ底部多标签切换)...

前言之前在另外一篇中用Fragment和button实现了点击切换Fragment的效果,比较简陋。这次改用ViewPagerTabLayout 实现联动的效果。实现效果ViewPager 多个页面滑动TabLayout 和 ViewPager绑定,实现Fragment和标签绑定TabLayout的自定义标签以及选中颜色改…

5G 和云原生时代的技术下半场,视频化是最大最新的确定性

简介: 随着 5G/ 芯片 / 区块链等等新技术的不断成熟、云计算的普及和云原生时代带来的诸多便捷,开发者和架构师们眼前的挑战也不再只是 0-1 的建设问题,技术如何更多地带来业务价值成为了一个值得讨论的话题。阿里巴巴集团研究员,…

linux unzip命令不存在_15个常用基础命令Linux(很多人不知道!)

Linux 是码农最常用的的OS,很多操作都是命令行,所以很有必要熟练和理解其中一些重要的命令。这里会介绍一些。这里讲的所有都基于bash,mac也可以使用。!!这件事发生了几次? 输入并运行一条长命令后,您发现您忘记在开头添加sudo。 …

云安全的新战场上,要靠什么来抵御威胁

当谈及安全产业,你脑海里能够想到哪些事情?是红黑大战的攻防演练,还是PC上的各种安全软件?事实上,安全的范围远超我们的想象,安全产业也一直在背后,默默的保护在互联网生活的周围。 互联网的发…

函数计算助力高德地图平稳支撑亿级流量高峰

简介: 2020 年的“十一出行节”期间,高德地图创造了记录 ——截止 2020 年 10 月 1 日 13 时 27 分 27 秒,高德地图当日活跃用户突破 1 亿,比 2019 年 10 月 1 日提前 3 时 41 分达成此记录。 期间,Serverless 作为其中…

阿里云李克:阿里云边缘云计算的技术和实践

简介: 李克:边缘计算的核心目标是推动人、事、物的快速决策。 在4月7日下午举办的边缘计算论坛上,阿里云资深技术专家李克为我们带来了《阿里云边缘云计算的技术和实践》为题的精彩演讲。 备受关注的2021全球分布式云大会北京站于4月7日隆重…