QUIC的诞生

news2024/11/24 10:48:58

背景

自1999年HTTP/1.1被提出以来,它已经稳定地被使用超过了20个年头。不过经典并不意味着完美,HTTP/1.1中一个连接同一时刻只能处理一个HTTP请求,如果当前的请求没有结束之前,其他的请求只能处于阻塞状
态。这一“对头阻塞”问题便催生出了HTTP/2。

HTTP/2中加入了多路复用的特性,即一次性发送多个HTTP请求报文或者响应报文,从而解决了HTTP/1.1中的对头阻塞。不过,由于HTTP2和它的前辈们一样,底层都是用TCP作为传输层协议,所以HTTP/2虽然缓解了应用层的对头阻塞问题,但仍受困于TCP的固有缺陷——TCP对头阻塞。

终于,在2012年,一位名叫Jim Roskind的(前)谷歌软件工程师再次掀起了一场传输协议革命,一种全新的传输协议呼之欲出。

诞生

2012年4月,谷歌软件工程师Jim Roskind发布了名为QUIC: Design Document and Specification Rationale的设计文档[1]。Jim在其中提到设计QUIC的原因主要是SPDY在当时仍存在不少问题,如队头阻塞、拥塞控制不够灵活、使用TLS带来的额外时间损耗等,同时想要实现低时延、更好地支持移动端等功能。这篇文档中提出了基于UDP的QUIC连接(Connection)、连接标识符(CID,Connection IDentifier)、流(Stream)、各种类型的帧(Frames,如CONGESTION_CONTROL_FRAME、ACK_FRAME、CONNECTION_CLOSE_FRAME,不过部分帧在正式的QUIC协议中已被弃用)等概念,成为了日后标准化QUIC的雏形。

在2015年的更新中,Jim提到由于自己的工作重心需要转移到其他项目上,无法继续更新这篇文档,即使未来QUIC的具体实现可能与这篇文档会有些出入,但他坚信QUIC背后的设计理念(design philosophy)并不会改变。如今已成为RFC标准的QUIC协议更多代表了一种通用的传输协议(a general-purpose transport protocol),相比谷歌刚开始只是为了优化Chromium的目的更向前迈进了一步[2],但这篇设计文档仍可以算是奠定了QUIC整体设计思路的开山之作。
在这里插入图片描述

图1 QUIC: Design Document and Specification Rationale的设计文档

发展

2013年6月,Jim Roskind在Chromium Blog上发布了一篇题为Experimenting with QUIC的博客[3],正式向外界宣布谷歌正在对QUIC进行内部测试,并准备将其集成进一小部分的开发版本的Chrome(通过命令行形式进行开启)并在真实场景下测试。而从2014年开始,谷歌开始考虑逐步进行QUIC的大规模部署[4],一年后,谷歌开发人员又发布了一篇A QUIC update on Google’s experimental transport的博客[5],证实了过去这两年QUIC在实际环境中表现出了不错的实验结果。虽然在大规模部署过程中遇到了不少困难,但QUIC的应用体量仍势不可挡地从不到0.025%的Chrome用户,到2017年被几乎在所有的Chrome用户中使用,而且安卓系统的YouTube应用也使用了QUIC进行视频传输[6]。随着QUIC协议和测试数据的不断完善,更重要的是喜人的性能表现,在2017年的计算机网络与通信领域顶会SIGCOMM上,一众QUIC设计和开发人员联名发表了重磅论文:The QUIC Transport Protocol: Design and Internet-Scale Deployment,其中给出了在各类真实场景中,QUIC与TCP相比在搜索延迟、视频播放延迟和视频缓冲率等方面的对比数据,可以说是QUIC已落地并商用的官宣。

实际上,在这篇论文发表前,谷歌已于2015年开始与互联网工程任务组(IETF,Internet Engineering Task Force)合作,并于2015年6月提交了一份名为QUIC: A UDP-Based Secure and Reliable Transport for HTTP/2的互联网草案,虽然那是QUIC的主要目标还是为HTTP/2服务,但其中提到QUIC仍有望成为一种通用的传输协议(经历了漫长的6年时光后,QUIC在2021年5月终于从草案成为了RFC标准)。在随后的7月于布拉格(Prague)举行的IETF93会议上,则进行了第一场关于gQUIC测试的非正式讨论(Bar BoF)[7],这次讨论的目标主要有三个:
• 分享关于QUIC在实际部署中的性能和测试结果(To share the status of and results from QUIC deployment)
• 获得来自IETF社区的反馈(To get feedback from the IETF transport community)
• 评估各类独立应用对QUIC的兴趣如何(To gauge interest in independent implementations)
在这里插入图片描述

图2 第一篇关于QUIC的草案,从时间轴上可以看出其于2015年6月发布
谷歌工程师Jana Iyengar(后来跳槽到了美国知名云计算服务商Fastly)在这次的Bar BoF上首先做了题为“QUIC: Redefining Internet Transport”的报告[8],从宏观上对QUIC的关键特性,QUIC的性能表现,QUIC的可靠性以及QUIC的未来发展方向四个方面对QUIC进行了阐述;而微软架构师Christian Huitema(已于2016年9月从微软退休)则展示了QUIC在Windows上一些实验性测试的结果;最后,谷歌软件工程师Ian Swett阐述了QUIC中拥塞控制和丢包恢复相关机制的说明。这次的BoF举行地非常成功,正如Jana Iyengar后来在博客[9]中提到,正是许多机构对QUIC前景的看好以及对QUIC加速落地的渴望,加速了未来几年内QUIC协议的标准化,让QUIC本身作为一种独立的传输层协议从庞大的gQUIC框架中脱离出来,不再为HTTP所专属,而是成为一种通用的传输协议。

蜕变

就在IETF93的BoF举行后的第二年,谷歌趁热打铁向IETF连续提交了4篇草案[10],分别关于QUIC协议、TLS在QUIC中的使用、QUIC中的丢包恢复机制,以及HTTP/2与QUIC的映射关系。在此基础上,随着QUIC在谷歌内部的越发普及,以及越来越多的性能测试数据被披露,QUIC越发有望成为一种标准的传输层协议。2016年7月在柏林举行的IETF96会议上,来自谷歌和QUIC社区的开发人员们举行了一场声势浩大的且正式的BoF研讨会(此次研讨会大约有400位与会者)。这次研讨会上IETF确认将QUIC“招致麾下”,同时与会人员一致同意希望创建一个专门管理QUIC进展的工作组。众望所归,在同年11月于韩国首尔举行的IETF97会议上特许成立了QUIC工作组(QUIC working group)。这两次会议标志着QUIC通过了IETF标准化考量,开始走上标准化的正轨,成为IETF准备制定并推广的互联网标准协议之一。
在这里插入图片描述

图3 IETF96上的正式BoF研讨会,Adam Roach摄
在这里插入图片描述

图4 IETF97会议QUIC研讨现场(截取自Jari Arkko推特,https://twitter.com/jariarkko/status/798324032672133120?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E798324032672133120%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.ietf.org%2Fblog%2Freflections-ietf-97%2F)

从2016年11月发布第一篇QUIC草案(draft-ietf-quic-transport-00),到2021年5月QUIC正式成为了征求意见(RFC,Request for Comments,许多公共网络研究社区会通过其发布正式出版物),并发布了意味着QUIC Version1正式标准化的RFC9000(同时发布的还有支撑标准RFC9001、RFC9002和RFC8999。RFC8999规定了与QUIC协议版本无关的一些规则,RFC9001规定了QUIC如何与TLS之间进行映射、RFC9002规定了QUIC协议中所使用的丢失恢复机制与拥塞控制),在这几年间,仍属于草案的QUIC协议就得到了无数研究人员和开发者的关注,这在IETF历史上实属罕见。有一个现象可以证明这一点:在QUIC草案不断翻新的过程中,RFC中的关键词“MUST”, “MUST NOT”, “SHOULD”, “SHOULD NOT”等词出现的频率都在不断变高,第十四篇中这些词的频率就足足比第一篇高了不止两倍[11]。
在这里插入图片描述

图5 draft-ietf-quic-transport从第一篇草案到RFC9000,属于QUIC的“心路历程”。截取自https://datatracker.ietf.org/doc/rfc9000/
在这里插入图片描述

图6 在QUIC草案不断翻新的过程中一些关键词的变化

功到自然成。正是凭借这许多研究人员的不懈努力,QUIC最终从青涩走向成熟,从初出茅庐到现在的后生可畏,从最初谷歌提出专注于优化HTTP/2性能的gQUIC,到如今通过IETF成为标准传输协议。

注:

[1]https://docs.google.com/document/d/1RNHkx_VvKWyWg6Lr8SZ-saqsQx7rFV-ev2jRFUoVD34/edit#
[2]谷歌提出的QUIC(快速UPD网络连接“Quick UDP Internet
Connections”的缩写)主要是为了提高使用HTTP的Chromium的性能,俗称gQUIC;而IETF发布的QUIC则是一种通用传输协议,能使用它的应用层不仅限于HTTP协议,俗称iQUIC
[3]https://blog.chromium.org/2013/06/experimenting-with-quic.html
[4]参见2017年SIGCOMM上的汇报https://www.ietf.org/proceedings/99/slides/slides-99-maprg-the-quic-transport-protocol-design-and-internet-scale-deployment-01.pdf
[5]https://blog.chromium.org/2015/04/a-quic-update-on-googles-experimental.html
[6]参见论文The QUIC Transport Protocol: Design and Internet-Scale
Deployment [7]Bar BOF中文可以翻译成“非正式兴趣小组”。BOF是“Birds of a Feather
Sessions”的缩写,Birds of a
Feather通常指一群个性很相似、有类似想法的人。BOF指这帮人在没有事先安排会议日程的情况下聚在一块讨论某些问题的非正式研讨会。具体介绍参见RFC6771:https://datatracker.ietf.org/doc/html/rfc6771
[8]汇报PPT参见https://docs.google.com/presentation/d/15e1bLKYeN56GL1oTJSF9OZiUsI-rcxisLo9dEyDkWQs/edit#slide=id.g99041b54d_0_0
[9]https://www.fastly.com/blog/maturing-of-quic
[10]这四篇草案的地址分别是:https://datatracker.ietf.org/doc/html/draft-hamilton-quic-transport-protocol-00,https://datatracker.ietf.org/doc/html/draft-thomson-quic-tls-00,https://tools.ietf.org/html/draft-iyengar-quic-loss-recovery-00,https://tools.ietf.org/html/draft-shade-quic-http2-mapping-00
[11] Piraux M , Coninck Q D , Bonaventure O . Observing the
Evolution of QUIC Implementations[C]// 2018.

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

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

相关文章

权限管理的配置思路

1.在main.js中引入permission.js 2.permission.js中通过vuex中getters.access_token进行路由的重定向 直接import ‘.permission’

MSF基本使用和控制台命令

前言 ● Msfconsole使用接口 ○ 最流行的用户接口 ○ 几乎可以使用全部MSF功能 ○ 控制台命令支持TAB自动补全 ○ 支持外部命令的执行(系统命令等) ○ 点击鼠标启动 / msfconsole -h -q -r -v / exit ○ help / ? / help vulns 控制台命令 …

【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解)

【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解) 众所周知,如果已知三个点的坐标,到一个未知点的距离,则可以利用以距离为半径画圆的方式来求得未知点坐标。 如果只有两个已知点,则…

【Array数组】面试前基础知识点深度记忆总结

写本篇博客的原因是发现有人遇到了以下误区, 1、在我面试别人的过程中,我想让他说一下数组的一些内置方法和含义,然后他条例思路不太清晰,跳动着说,所以遗漏了很多,或许按照es5到es6是一个指导顺序&#xf…

51单片机——独立按键实验,小白讲解,相互学习

按键介绍: 按键是一种电子开关,使用时轻轻按开关按钮就可式开关接通,当松手时,开关断开。开发板上使用的按键及内部简易图如下图: 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态&#xf…

Pandas-根据数据表1中的字段a,筛选出数据表2中也包含字段a的数据

前言 本文是该专栏的第18篇,后面会持续分享python的数据分析知识,记得关注。 假设现在有个数据分析的需求,如下: 数据表1中有几十万条数据,数据表2中有几万条数据,两张数据表1和2有两个相同的字段phone,现在需要将数据表1和数据表2中,phone字段存在相同的行,保留下来…

redis集群操作

Redis集群1 集群2 集群架构图3 集群细节4 集群搭建4.1.创建集群4.2.查看集群状态4.3.添加主节点4.4.添加从节点4.5.删除副本节点4.6.集群在线分片1 集群 Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,支持slave-master选举…

Nmap系统扫描实战

今天继续给大家介绍渗透测试相关知识,本文主要内容是Nmap系统扫描实战。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权设备…

解决Win系统cad激活安装失败问题,AutoCad 2022 中文/英文正式详细安装教程

Autodesk AutoCAD 2022简称“cad 2022”是一款功能强大的CAD三维绘图辅助设计软件。autocad 2022适用于二维绘图、详细绘制、设计文档和基本三维设计,广泛应用于机械设计、工业制图、工程制图、土木建筑、装饰装潢、服装加工等多个行业领域。CAD2022新特征&#xff…

线径看板帮助电线电缆厂提高生产效率的工作原理

当今,市场上出现了越来越多的电线电缆品牌,电线电缆市场的竞争越来越激烈,电线厂家稍有不慎,出现了产品不规范、不合格的异常情况,就很可能会被市场淘汰,被消费者所抛弃。那么,要怎样才能够保障…

MVC(Model,View,Controller)

MVC是指Model(模型层,数据),View(视图层),Controller(控制层) 核心是DispathcherServlet(一个Servlet) (1) 客户端的请求提交给DispathcherServlet (2)DispathcherServl…

【动态规划篇】斐波那契数列拆分词句三角矩阵

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

基于Java(JSP+Servlet)+Mysql实现的(Web)简易的工资管理系统【100010062】

1.问题描述 一个公司下分为若干部门,每个部门有若干职员和经理,每个部门经销若干种商品。工资由基本工资、产品销售业绩奖、若干种保险的扣除等组成。其中的销售业绩奖按以下方式设计:职员按其完成额的 5% 提成,经理按其部门完成…

string.IsNullOrEmpty和string.IsNullOrWhiteSpace的区别

string.IsNullOrEmpty和string.IsNullOrWhiteSpace 本人一直使用的是string.IsNullOrEmpty方法来判断字符串是否为空. 在插件中发现另外一种写法: string s1 null; string s2 string.Empty; string s3 ""; strin…

精通MyBatis原理,看这两篇就够了!(二)

本文是关于MyBatis源码的第二篇,解读了MyBatis的核心执行SQL流程,对源码做了详细注释。内容较长,推荐电脑阅读。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达执行阶段流程第一篇文章讲解了Mybatis启动…

【jdk11+jprofiler 11进行java程序性能调优案例之--内存溢出原因分析】

1.安装jprofiler jprofiler_windows-x64_11_0_2.exe 2.使用KeyGen.exe生成注册码然后输入 3.idea中安装jprofiler插件 File-->Setting-->Plugins 搜索jprofiler插件然后安装 4.以一个内存溢出的程序为例子进行分析(一直分配内存,List容器引用着Student导致…

Java创建线程的三种方式

Java创建线程的三种方式 一、通过Thread类的方式进行创建 步骤: 1、创建Thread的子类,重写run方法,run方法就表示线程需要完成的任务 2、创建Thread实例,也就是创建线程对象 3、使用start来启动线程(线程启动的唯一方…

显著性分析

选择图 为什么要分Non-parametric & parametric 方法 为了找到更符合数据的分析方法。每个方法有自己的假设&#xff0c;如果违背了结果会不精准。 Sign Test 是一个可以用于任何数据分布情况的pairwise 方法。 检查normality: Sample 数量 < 50,适用 Shapiro-Wilk&am…

【Kotlin 协程】Flow 操作符 ① ( 过渡操作符 | map 操作符 | transform 操作符 | 限长操作符 | take 操作符 )

文章目录一、过渡操作符1、map 操作符2、transform 操作符二、限长操作符 ( take 操作符 )一、过渡操作符 过渡操作符 相关概念 : 转换流 : 使用 过渡操作符 转换 Flow 流 ;作用位置 : 过渡操作符作用 于 流的上游 , 返回 流的下游 ;非挂起函数 : 过渡操作符 不是挂起函数 , 属…

大话JMeter2|正确get参数传递和HTTP如何正确使用

上节课展示了JMeter的基础用法&#xff1a;录制回放功能&#xff0c;断言&#xff0c;聚合报告。但是在无UI下如何进行接口的访问呢&#xff1f;如何正确get参数传递和HTTP如何正确使用。尤其是在无UI下进行接口的访问。小哥哥带着你用漫画来学习JMeter&#xff0c;让你在轻松的…