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.hqwc.cn/news/511289.html

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

相关文章

Tomcat -2

① 单机反向代理 7-2 代理服务器 7-5 tomcat 设置 7-3 测试: 代理服务器那里写什么就显示什么 ② 多机反向代理 实现动静分离和负载均衡 7-2 nginx 7-3 7-5 测试: 看静态: 看动态: ③ 反向代理多机多级 7-2 7-1 和 7-4 7-3…

GIS之深度学习05:VisualStudio安装教程

在安装CUDA前,建议先安装VisualStudio,以防报错 VisualStudio安装步骤简单,但时间较长。。。。。。 正文开始: VisualStudio官网:Visual Studio: IDE and Code Editor for Software Developers and Teams 点击右上角…

Vscode连接外部虚拟环境

如果vscode工程目录里面有一个超级大的虚拟环境文件夹,怎么说都不是一件优雅的事,因此我们希望这个虚拟环境在工程目录外部,我们开始: 1. 复制虚拟环境目录路径:E:\envs\test 2. 在vscode中打开文件夹,CT…

37.云原生之springcloud+k8s+GitOps+istio+安全实践

云原生专栏大纲 文章目录 准备工作项目结构介绍配置安全测试ConfigMapSecret使用Secret中数据的方式Deployment使用Secret配置Secret加密 kustomize部署清单ConfigMap改造SecretSealedSecretDeployment改造Serviceistio相关资源DestinationRuleGatewayVirtualServiceServiceAc…

两天学会微服务网关Gateway-Gateway HelloWorld快速入门

锋哥原创的微服务网关Gateway视频教程: Gateway微服务网关视频教程(无废话版)_哔哩哔哩_bilibiliGateway微服务网关视频教程(无废话版)共计17条视频,包括:1_Gateway简介、2_Gateway工作原理、3…

职场高效人士的秘密:如何合理安排事情优先级

在职场中,面对繁杂的工作任务,如何合理安排事情的优先级,提高工作效率,成为每个职场人士必须面对的问题。本文将为您揭示职场高效人士的秘密,帮助您掌握合理安排事情优先级的技巧。 一、明确工作目标 在安排事情优先级…

Applied Energy+C论文复现:考虑泊位分配灵活性的港口综合能源系统优化调度程序代码!

程序结合了港口独特的工作属性,构建了泊位优化分配的模型,提出了考虑泊位优化和多能协同的港口综合能源运行优化模型。港口运营商根据多种能源供应的成本特性决策船舶停泊的开始/结束时间,改变港口的总负荷需求曲线。程序算例丰富…

【自然语言处理六-最重要的模型-transformer-下】

自然语言处理六-最重要的模型-transformer-下 transformer decoderMasked multi-head attentionencoder和decoder的连接部分-cross attentiondecoder的输出AT(Autoregresssive)NAT transformer decoder 今天接上一篇文章讲的encoder 自然语言处理六-最重要的模型-transformer-…

服务完善的智能组网系统?

智能组网是现代信息技术的重要组成部分,它通过将各种设备和计算机连接起来,实现高效的数据传输和远程通信。在一个全球化、高度互联的时代背景下,智能组网已经成为了各行各业的必需品。传统的组网方案往往面临着许多问题和挑战。为了解决这些…

用云手机进行舆情监测有什么作用?

在信息爆炸的时代,舆情监测成为企业和政府决策的重要工具。通过结合云手机技术,舆情监测系统在品牌形象维护、市场竞争、产品研发、政府管理以及市场营销等方面发挥着关键作用,为用户提供更智能、高效的舆情解决方案。 1. 品牌形象维护与危机…

Netty(1)nio

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 st…

场景问题: VisualVM工具Profiler JDBC不是真实执行的SQL

1. 问题 诡异的问题表象: 前端反馈分页接口的Total字段一直为0 使用Visualvm中的 Profiler 注入到应用后,查看JDBC监控得到了分页接口执行的SQL,复制出来执行是55. 此时还没有注意到 IN 的范围中有一个特别的值 NULL 🤨 2. 排查…