QUIC来了!

什么是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.mzph.cn/news/720075.shtml

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

相关文章

MySQL 的备份方式

MySQL 的备份方式 1. 逻辑备份 逻辑备份是指将数据库中的数据导出为可读的 SQL 语句,通过这些语句可以还原数据库的结构和数据。 使用 mysqldump 工具进行逻辑备份 - **命令示例:**mysqldump -u [username] -p [database_name] > backup_file.sql- …

Spring中的数据校验---JSR303

介绍–什么是JSR303 JSR 303是Java中的一项规范,用于定义在Java应用程序中执行数据校验的元数据模型和API。JSR 303的官方名称是"Bean Validation",它提供了一种在Java对象级别上执行验证的方式,通常用于确保输入数据的完整性和准…

飞链云共创伙伴亮相温州大学,全国首个AIGC大学俱乐部成立!

在这个充满创新活力的时代,我们见证了一个又一个里程碑式的事件。3月3日,温州大学AIGC俱乐部的成立仪式盛大举行,这标志着全国首个AIGC大学俱乐部的诞生。更让人激动的是,飞链云AI共创伙伴——应流(广州)科…

PFA晶圆夹在半导体芯片制造中的应用

随着半导体技术的不断进步,晶圆制造作为集成电路产业的核心环节,对生产过程的精密性和洁净度要求日益提高。在众多晶圆制造工具中,PFA(全氟烷氧基)晶圆夹以其独特的材质和性能,在近年来逐渐受到业界的广泛关…

【Datawhale组队学习:Sora原理与技术实战】AIGC技术基础知识

AIGC是什么 AIGC全称叫做AI generated content,AlGC (Al-Generated Content,人工智能生产内容),是利用AlI自动生产内容的生产方式。 在传统的内容创作领域中,PGC(Professionally-generated Content,专业生…

Untiy 使用AVProVideo插件获取视频的长度

AVPro Video是Unity中一个非常流行的视频插件,可在Unity项目中实现高性能的视频播放功能,功能强大且易用。 如图所示,如果我要获取该视频的长度,方法是很简单的。 1、创建一个测试脚本: using RenderHeads.Media.AVP…

vue3+uniapp在微信小程序实现一个2048小游戏

一、效果展示 二、代码 <template><view class"page"><view class"top"><view class"score">得分:{{total}}</view><view class"time">用时:{{allTime}}s</view></view><view cl…

力扣 单词搜索

判断当前单元格(r,c)的字符与字符串待匹配字符word[idx]是否匹配 如果不匹配&#xff0c;直接回退到上一个单元格与字符 如果匹配&#xff0c;搜索相邻单元格与下一个待匹配字符word[idx1] class Solution { public:int dx[5]{0,0,1,-1};int dy[5]{1,-1,0,0};int flag0;bool d…

Https SSL证书 本地化OCSP地址是什么

OCSP地址即SSL证书中的OCSP验签服务器 最近在做的一个项目上线&#xff0c;前线反馈某些地区访问网站显示白屏&#xff0c;直接影响当地用户使用。公司系统是使用公司自研专用的浏览器登录的&#xff0c;是基于早期谷歌浏览器的开源组件开发的&#xff0c;常出现谷歌访问正常而…

DataWorks(ODPS)性能优化技巧指南

使用阿里云DataWorks进行数据处理的时候&#xff0c;有时候会遇到一个sql或pyodps&#xff08;本质上还是转化为sql&#xff09;执行很长的情况&#xff0c;这个时候有必要对代码进行性能优化。 一、打开ODPS运行评估报告 一个sql脚本执行完毕后&#xff0c;在运维中心的周期…

94. 7张图掌握后端服务重构技巧

文章目录 导言一、逻辑模块重构二、存储模块重构三、逻辑与存储模块联合重构总结 原文地址&#xff1a;7张架构图掌握后端服务重构技巧 导言 随着项目发展&#xff0c;现有模块不再符合需求&#xff0c;重构后端服务必要性拉满。&#x1f468;‍&#x1f4bb; 重构过程中&am…

蓝桥杯练习系统(算法训练)ALGO-992 士兵杀敌(二)

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 南将军手下有N个士兵&#xff0c;分别编号1到N&#xff0c;这些士兵的杀敌数都是已知的。   小工是南将军手下的军师&…

数据中心在高性能计算(HPC)中的作用

高性能计算&#xff08;HPC&#xff09;已成为解决复杂问题、推动科学研究、人工智能和其他各种应用领域的关键工具。要确保高性能计算系统的高效运行&#xff0c;需要专门的基础设施和支持。数据中心在满足高密度计算、管理散热和提供强大带宽方面起着关键作用。本文探讨了数据…

langchain学习笔记(十一)

关于langchain中的memory&#xff0c;即对话历史&#xff08;message history&#xff09; 1、 Add message history (memory) | &#x1f99c;️&#x1f517; Langchain RunnableWithMessageHistory&#xff0c;可用于任何的chain中添加对话历史&#xff0c;将以下之一作为…

串的定义及BF算法

定义 BF算法——朴素查找算法——也叫做串的模式匹配算法 其应用特别多&#xff0c;比如经常在一篇文章里面搜索一些东西&#xff0c;&#xff08;比如文章里的某个内容&#xff0c;或某些关键字词出现的位置&#xff0c;次数等&#xff09; 之前我们大多数情况下是用来搜索关…

基于Springboot的助农管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的助农管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【项目实践】如何解决并发场景下数据一致性问题

1.背景 并发写场景下&#xff0c;由于微服务的系统环境复杂&#xff0c;不可避免的会出现 【机器、缓存、数据库、依赖服务】等出现问题&#xff0c;导致数据不一致的情况产生。 影响大且广&#xff1a; 1、数据不一致问题在线上可能会产生故障 2、数据不一致会导致长尾错误…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

项目中如何优雅的使用枚举类型

原文链接&#xff1a;赵侠客 前言 枚举类型在开发中是很常见的&#xff0c;有非常多的应用场景&#xff0c;如状态管理、类型分类、权限控制、配置管理、错误码管理、日志级别等。正确合理的使用枚举可以给我们带来非常多的好处&#xff1a; 增强代码可读性&#xff1a;枚举可…

pandas.DataFrame新增列、dropna()方法-丢弃含空值的行、列;inf的处理技巧

在Dataframe中新添加一列 直接指明列名&#xff0c;然后赋值就可 import pandas as pddata pd.DataFrame(columns[a,b], data[[1,2],[3,4]]) data >>> dataa b 0 1 2 1 3 4 添加一列’c‘&#xff0c;赋值为空白值。打印出来 data[c] data >>>…