QUIC来了!

news2024/11/18 1:28:32

什么是QUIC

        QUIC,快速UDP网络连接(Quick UDP Internet Connection)的简称,即RFC文档描述它为一个面向连接的安全通用传输协议。其基于UDP协议实现了可靠传输及拥塞控制,简单来说,QUIC = TCP + TLS。

为什么有了QUIC

        HTTP2.0为了为了解决HTTP1.x请求队头阻塞的问题(收到前一个请求的响应才允许发送下一个请求),抽象出了stream的概念。在一条HTTP连接中支持多条stream,每条stream可以单独发送请求而与其它stream互不干扰,这样就可以同时发生多个请求,而不必非要等到收到响应,提高了发送效率。

        但是,虽然应用层不存在队头阻塞的问题了,由于HTTP底层是TCP协议,多个stream仍然是复用一条TCP连接,所以当多个请求到达服务端,接收队列可能是这个样子的:

        看到了吧,虽然请求二的的包都已经完整,但由于前面有一个5号包迟迟没有到来,导致这个请求被阻塞,这就是TCP队头阻塞问题。QUIC设计出来的目的这就人尽皆知了

协议栈

        谁都知道TCP在传输层,HTTP在应用层,TLS在之间的安全套接层,那么QUIC在哪一层呢?

        ヽ(゚Д゚)ノ 不好意思,上错图了,是这张才对: 

        QUIC在UDP之上,属于应用层,HTTP3基于QUIC实现。

QUIC特性

快速握手

        众所周知TCP需要三次握手,对于开启了TCP Fast Open选项的TCP连接来说,建立可靠连接需要1个RTT。但安全连接的建立TLS握手一般需要2个RTT,如此总共就是3个RTT才能建立安全、可靠的连接。那么QUIC呢?        

1-RTT 

  1. 客户端发送一个包含QUIC版本号、客户端传输参数、加密扩展(包括TLS 1.3的Client Hello消息)的QUIC初始包(Initial packet)。这个包使用QUIC特定的初始密钥进行加密,这些密钥是从客户端的连接ID和QUIC版本号派生的。Client Hello中包括TLS协议版本、支持的密码套件、压缩方法、扩展、客户端随机数等信息。
  2. 服务器收到客户端的初始包后,发送一个包含自己的传输参数和加密扩展(包括TLS 1.3的Server Hello消息)的QUIC初始包以及Handshake packet。Server Hello中包括服务器选择的密码套件、服务器随机数、服务器证书、证书验证和加密扩展。Handshake packet,其中包含加密的扩展和TLS握手的其余部分,如服务器的Finished消息。
  3. 客户端收到服务器的初始包和Handshake packet后,验证服务器证书和Finished消息。然后,客户端发送包含TLS 1.3的Client Finished消息的Handshake packet,完成TLS握手。此时,客户端和服务器都有了足够的信息来生成最终的加密密钥,用于保护QUIC通信。

        一旦TLS握手完成,客户端和服务器就可以开始使用1-RTT密钥来加密和解密数据包,进行安全的数据传输。

0-RTT

        在先前的成功的QUIC连接中,客户端和服务器通过完整的1-RTT握手建立了一个安全的会话,并且客户端和服务器互相缓存了对端的协商参数,这个参数包含了用于将来0-RTT握手的必要信息。

  1. 当客户端希望重新连接到服务器时,它使用保存的服务器参数计算出前一个1-RTT阶段的会话密钥,用这个密钥加密数据发送。同时,开启一个1-RTT的协商流程。
  2. 服务器接收到客户端的0-RTT数据后,使用存储的会话信息来解密和处理这些数据。同时,也会响应客户端的1-RTT握手。

        新的握手流程跟初始的1-RTT握手没什么两样,只是已经开始携带数据了。新的握手完成后,会话密钥切换为新的,保证前向安全。

连接迁移

        考虑到现在普通使用移动互联,一会在家连个wifi,一会出门自动换到4G或者5G,进个奶茶店又连上了WIFI。如果使用TCP连接,那么会连接多次断开重连,造成不好的用户体验。因此,QUIC支持了连接迁移的功能。

        传统的 TCP 协议是以四元组(源 IP 地址、源端口号、目的 ID 地址、目的端口号)来标识一条连接,那么一旦四元组的任何一个元素发生了改变,这条连接就会断掉,那么这条连接中正在传输的数据就会断掉,切换到新的网络后可能需要重新去建立连接,然后重新发送数据。这将会导致用户的网络会“卡”一下。

        新时代的QUIC 不再以四元组作为唯一标识,转而使用连接 ID 来标识一条连接,这样无论你的网络如何切换,底层的IP端口如何变化,QUIC依然是稳如老狗

无队头阻塞

        正如开篇所说,HTTP2.0由于底层使用TCP连接,所以存在传输层的队头阻塞问题,导致后到的同个连接里的请求无法及时处理,基于UDP的QUIC自然不存在这个问题了,实际实现中,QUIC中的每个stream都会维护一个自身的接收窗口,请求组包完整后可以立即处理,跟其它请求彻底撇清关系

包序号递增

        TCP为了保证可靠性,使用了基于字节序号的Seq及Ack来确认消息的有序到达。

        QUIC同样是一个可靠的协议,不同的是,它使用Packet Number代替了TCP的Seq,并且每个Packet Number 都严格递增,也就是说就算Packet N 丢失了,重传的Packet N的Packet Number已经不是N,而是一个比N 大的值。而TCP呢,重传包的Seq和原始的包的Seq是一样的,也正是由于这个特性,导致TCP重传存在歧义。具体的,可能影响RTT等参数的计算,导致拥塞避免算法不够准确。

        具体的,QUIC通过Stream ID及Offset 来确定重传的数据包位于原始数据包的哪个位置。

可定制化的拥塞控制算法

        不同于TCP实现在内核层,跟内核深度绑定,想要修改协议复杂度可想而知,且现网设备也不是那么容易替换的,存在很大的成本问题。QUIC使用可插拔的拥塞控制,相较于TCP,它能提供更丰富的拥塞控制信息。QUIC带有收到数据包与发出ACK之间的时延信息。这些信息能够帮助更精确的计算 RTT。另外,QUIC ACK包的 Frame 支持256个NACK 区间,相比于TCP的SACK(Selective Acknowledgment)更精细,可以让client和server更清楚的确认哪些包已经被对方收到。

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

总结

        QUIC的改进之处还不止这些,更多的细节还需要深入的了解。QUIC 协议的出现,简直为HTTP3铺平了道路!冲浪速度又要进一步提升啦!

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

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

相关文章

京津冀国际光伏展

京津冀国际光伏展是一个国际性的光伏展览会,旨在推动京津冀地区光伏产业的发展,促进国内外光伏技术的交流与合作。展览会通常包括展览展示、技术交流、高层论坛等环节,吸引了来自全球各地的光伏企业、科研机构、行业专业人士等参观和参与。 京…

抖店入驻费用是多少?新手入驻都有哪些要求?2024费用明细!

我是电商珠珠 我做电商做了将近五年,做抖店做了三年多,期间还带着学员一起做店。 今天,就来给大家详细的讲一下在抖音开店,需要多少费用,最低需要投入多少。 1、营业执照200元左右 就拿个体店举例,在入…

软件测试的基本流程是什么?软件测试流程详细介绍

软件测试和软件开发一样,是一个比较复杂的工作过程,如果无章法可循,随意进行测试势必会造成测试工作的混乱。为了使测试工作标准化、规范化,并且快速、高效、高质量地完成测试工作,需要制订完整且具体的测试流程。 01…

融云IM五折限量优惠,史无前例底价助力应用出海

各位疯狂心动的开发者们,不是你没有原则,实在是融云给的太多啦! 即日起,新项目上线使用融云 Global IM UIKit(👉了解更多),可申请融云 IM 国内 5 折、海外 6 折优惠,尽享…

Ambari动态给YARN分配计算节点

1.前言 YARN可用的计算节点数量并不总是等于 Hadoop集群节点数量,可以根据业务需求分配 YARN计算节点数量。 这里首先介绍一些前置知识: YARN中 ResourceManager 和 NodeManager是两个核心组件,其中 ResourceManager负责集群资源的统一管理…

算法学习01:排序二分

算法学习01:排序&&二分 前言 提示:以下是本篇文章正文内容: 一、排序 1.快速排序 2.归并排序: 二、二分 1.整数 2.浮点数 总结 提示:这里对文章进行总结: 记忆模版!!&am…

贪心算法(区间问题)

452. 用最少数量的箭引爆气球 题目(求无重复区间) 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着…

一文2500字从0到1使用JMeter进行接口测试教程!

安装 使用JMeter的前提需要安装JDK,需要JDK1.7以上版本目前在用的是JMeter5.2版本,大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin,双击jmeter.bat启动运行 启动后默认为英文版本,可通过Options – Cho…

关于拖拽功能

文章目录 写在前面自己手动实现拖拽的demo技术细节:Js中拖拽(拉)事件(drag 和 drop)浏览器兼容性拖拽Api的介绍拖拽流程1.dragstart事件2.dragenter事件3.dragover事件4.drop事件(必须要dragover事件触发)5.dragend事件MDN关于拖拽的解析 相关…

独立游戏《星尘异变》UE5 C++程序开发日志2——创建并编写一个C++类

在本篇日志中,我们将要用一个C类来实现一个游戏内的物品,同时介绍UCLASS、USTRUCT、UPROPERTY的使用 一、创建一个C类 我们在UE5的"内容侧滑菜单"中,在右侧空白中右键选择"新建C类",然后可以选择一个想要的…

GEE代码条带问题——sentinel-1接缝处理的问题

问题 我有兴趣确定 NDVI 损失最大的年份。我创建了一个函数来收集所有陆地卫星图像并应用预处理。当我导出结果以识别 NDVI 损失最大年份时,生成的数据产品与陆地卫星场景足迹有可怕的接缝线。造成这种情况的原因是什么以及如何调整代码? sentinel1数据…

大模型基础应用框架(ReACT\SFT\RAG)创新及零售业务落地

如何将大语言模型的强大能力融入实际业务、产生业务价值,是现在很多公司关注的焦点。在零售场,大模型应用也面临很多挑战。本文分享了京东零售技数中心推出融合Agent、SFT与RAG的大模型基础应用框架,帮助业务完成大模型微调、部署和应用&…

华为数通方向HCIP-DataCom H12-821题库(多选题:61-80)

第61题 ACL 可分为如下哪些类别? A.用户自定义 ACL B.基本 ACL C.二层ACL D.高级ACL 【参考答案】ABCD 【答案解析】 A. 用户自定义 ACL (User-defined ACL): 这是用户根据自身需求自定义的 ACL,用于实现特定的访问控制策略。B.基本 ACL (Standard ACL): 基本 ACL 是基于源 …

逆向案例四、进阶,爬取精灵数据咨询前五十页数据

python代码示例: import csv import execjs import requests f open(精灵数据.csv,w,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[标题,发布时间,新闻来源,详情页链接,转自,点击量,新闻作者,发布时间小时,]) csv_writer.writeheader() data [] for pa…

HTTP/2、HTTP/3分别解决了什么问题

总的来说就是HTTP/1.1是请求-响应模型导致队头阻塞问题,HTTP2是TCP层面导致队头阻塞问题 HTTP/2 多路复用,解决了HTTP/1.1队头阻塞问题 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应&…

【 10X summary report】怎么看?详细解读笔记

报告内容 在开始正式的分析之前,需要查看在对齐和计数过程中生成的任何总结统计信息。下图是由Cell Ranger工具创建的10X总结报告,在从10X scRNA-seq实验生成计数矩阵时会生成。 The left half of the report describes sequencing and mapping statist…

php开发项目 docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

服务器或者存储上传的word,ppt和excel表格需要截取内容展示的时候,就需要管理后台每次上传文件时根据不同文件类型截取图片保存起来,并讲图片的地址保存到数据字段中.网上搜索了很多相关文章遇到的坑不少,经过2天时间终于完成了,将代码和遇到的问题完整记录下来. 本文用的…

基于SpringBoot+MYSQL的医护人员排班系统

基于springboot的医护人员排班系统录像 1、 前言介绍 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足,创建了一个计算机管理医护人员…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油…

企业内部培训考试系统题库导入功能设计

企业内部培训考试系统可自建题库,企业可以将已有的试题资源快速导入系统,系统具备智能选题功能,可以根据预设条件自动从题库中抽取试题,生成试卷,可以充分利用已有的教育资源,避免重复劳动,提高…