HTTP3详解

news/2025/1/2 16:10:56/

        最近网上看到了相关HTTP 3的文章,觉得很不错,这里整理记录一下,仅供学习参考

        你连 HTTP2 都还没搞明白,就有人开始谈 HTTP3 了,真让人火大。但 HTTP3 会受到关注也是有理由的:它速度很快。

1、很久以前

        谈未来之前,咱们先讲讲现实。你了解 HTTP 吗?这个定义于 1991 年的协议是用来管理 Web 的。它的全名是超文本传输​​协议,让你可以从网页中获取资源,网页数据从 Web 服务器传输到你的浏览器上。它基于较低级别的协议——TCP,这里是重点——而且它是无状态的。这意味着每个请求都是完全独立的。页面上显示的每个 GIF 图片都在互联网上独立存在,这对这些 GIF 图片本身来说是好事。但对我们来说,这样的一个系统是有些支离破碎的。

        问题在于每个请求一次只会查找一个文件。每次都要创建一个昂贵的 TCP 连接。想象一下,如果你的页面上有 10,000 个小技巧,这会是多么沉重的负担啊。

        我知道有很多人喜欢我上一篇文章中制作的图片,所以为了更好地向大家解释互联网的协议机制,这里我会再做一张图。

https://i-blog.csdnimg.cn/img_convert/1d5f1a980546cb6de8de249f3ff6238b.jpeg" width="500" />

        尽管浏览器可以同时发出六个不同的请求,但是 HTTP 仍然很慢,并且需要很多 TCP 连接。另外,我们开发人员通常不会在意这一点。我们喜欢在页面上塞满各种垃圾。比如说巨大的 jQuery 库,包含 300 个无用的 CSS 样式表,结尾是一个透明的 8 兆大 PNG 图。

        当谷歌发现我们在互联网上到处倾倒垃圾后,他们就开始搞一个称为 SPDY 的东西了。目的是什么呢?当然是加快互联网的速度。

        SPDY 是一个规范,建议继续使用 HTTP,但要更改一些规则。通过压缩标头、对请求进行优先级排序和多路复用,它将把所有 TCP 请求和连接变成单独的一个!

        具体来说,当你读取 HTML 时,浏览器会查看你在页面中要询问的所有内容。然后,它可以一次获取所有内容,这样就可以避免一个文件一个文件地获取了。

        HTTP2 的第一份草案基于 SPDY。HTTP2 很快被广泛采用,随后互联网上的一切变得快多了。今天,互联网上 42.7%的内容使用 HTTP2。

https://i-blog.csdnimg.cn/img_convert/bd0be2d2af324f83d125fb42a7a422bf.jpeg" width="500" />

2、关于 HTTP3

        HTTP2 是以 HTTP 为基础并改动一些规则的产物。HTTP3 也是如此。换句话说,解释清楚现状后,我就可以很容易地讲明白未来是什么样子的。

        谷歌是一个极客组织,他们永远不会停止脚步。SPDY 演变成为 HTTP2 后,他们认为它仍然不够快。因此,他们开始讨论 QUIC 这个项目。这是谷歌开发的第二项将成为 HTTP 协议的正式升级的技术。那么,这个协议有什么特别之处?

        HTTP3 的主要改进在传输层上。传输层不会再有我前面提到的那些繁重的 TCP 连接了。现在,一切都会走 UDP。

        顺便说一下,QUIC 的意思是“快速 UDP Internet 连接”。协议的这种更改将显著加快连接建立和数据传输的速度。然而,虽说 UDP 肯定更快、更简单,但它不具备 TCP 的可靠性和错误处理能力。

        TCP 必须进行多次往返,才能以方形且稳定的方式建立连接。UDP 不会顾虑那么多,而且它确实可以快速运行,代价是稳定性下降和丢包的风险。但是,UDP 能大大减少请求中的延迟。到同一服务器的重复连接的延迟几乎为零,因为不需要往返来建立连接。

https://i-blog.csdnimg.cn/img_convert/47e40fe175290fbf5465c2c677f29603.png" width="997" />

        HTTP3 是 HTTP2 的复用和压缩,协议从 TCP 更改为 UDP。然后,谷歌的那些人在协议中添加了他们做的层,以确保稳定性、数据包接收顺序及安全性。

        因此,HTTP3 在保持 QUIC 稳定性的同时使用 UDP 来实现高速度,同时又不会牺牲 TLS 的安全性。是的,在 QUIC 中就有 TLS1.3,你可以用它发起优雅的 SSL。这些层的底层机制是下面这样:

https://i-blog.csdnimg.cn/direct/fc08ab9ac3c54846913546a62896ccfd.png" width="1200" />

https://i-blog.csdnimg.cn/img_convert/fcf5054382be0354afa9faec733cc242.jpeg" width="1024" />

        2018 年,QUIC 演变成为 HTTP3。互联网工程任务组(Internet Engineerring Task Force)的那帮制定互联网协议的哥们同意了这个提案。这是个好消息,因为对于我们这些急躁的人们来说,互联网的速度永远都不够快。

        HTTP/3是HTTP协议的第三个主要版本,是由IETF(互联网工程任务组)制定的,基于QUIC协议的HTTP协议。QUIC是一个基于UDP的传输协议,由Google设计,旨在减少网络延迟,提高网络速度。

2.1、HTTP3 提升的点:

  • HTTP3 使用 stream 进一步扩展了 HTTP2 的多路复用。在 HTTP3 模式下,一般传输多少个文件就会产生对应数量的 stream。当这些文件中的其中一个发生丢包时,你只需要重传丢包文件的对应 stream 即可。

  • HTTP3 不再是基于 TCP 建立的,而是通过 UDP 建立,在用户空间保证传输的可靠性,相比 TCP,UDP 之上的 QUIC 协议提高了连接建立的速度,降低了延迟。

  • 通过引入 Connection ID,使得 HTTP3 支持连接迁移以及 NAT 的重绑定。

  • HTTP3 含有一个包括验证、加密、数据及负载的 built-in 的TLS安全机制。

  • 拥塞控制。TCP 是在内核区实现的,而 HTTP3 将拥塞控制移出了内核,通过用户空间来实现。这样做的好处就是不再需要等待内核更新可以实现很方便的进行快速迭代。

  • 头部压缩。HTTP2 使用的 HPACK,HTTP3 更换成了兼容 HPACK 的 QPACK 压缩方案。QPACK 优化了对乱序发送的支持,也优化了压缩率。

2.2、QUIC 为什么使用了 UDP

接下来我们来正式说一下 QUIC 为什么使用了 UDP 的问题,是因为以下几点:

  • 避免 ossification(僵化):QUIC 协议加密负载,也是避免协议僵化一种方式,比如当中间层处理 UDP 数据时,只需要按照数据包的方式去处理即可,不需要去关注内部层的具体信息。

  • 放弃改进 TCP 本身

  • 创新方向:QUIC 是由谷歌提出的,所以 UDP 是以浏览器为出发点,从协议、从浏览器方向来进行创新。

3、HTTP3优势

(一) 优势

  1. 减少网络延迟HTTP/3协议支持0-RTT连接,可以减少握手时间。
  2. 提高网络速度HTTP/3协议支持多路复用(传输层多路复用),可以减少网络拥塞。
  3. 提升网络安全HTTP/3协议支持加密,可以提高网络安全。

(二) 适用场景

  1. 高延迟网络HTTP/3协议适用于高延迟网络,可以减少网络延迟。
  2. 高拥塞网络HTTP/3协议适用于高拥塞网络,可以提升拥塞网络环境下的用户访问体验。
  3. 高并发场景HTTP/3协议能够在单个连接内,并行处理多个请求,且无队头阻塞问题。

(三) 浏览器支持

  1. Chrome:Chrome 73+ 开始支持 QUIC,但需要在 chrome://flags 中启用,Chrome 84+ 开始支持 HTTP/3。
  2. Firefox:Firefox 78+ 开始支持 HTTP/3。
  3. Edge:Edge 79+ 开始支持 HTTP/3。
  4. Opera:Opera 64+ 开始支持 HTTP/3。
  5. Safari:目前尚未支持(截止版本:v17.4.1)。

http3">4、如何开启HTTP/3

要开启HTTP/3,我们只需要选择一个支持HTTP/3的服务器,然后在服务器上配置HTTP/3即可。

(一) 可供选择的服务器

  1. NginxNginx 1.16.1+ 开始支持 HTTP/3
  2. CaddyCaddy 0.11.0+ 开始支持 HTTP/3
  3. ApacheApache 2.4.39+ 开始支持 HTTP/3

(二) 搭建Nginx服务器环境

由于我使用的是Nginx服务器,所以本文以Nginx服务器为例,记录一下开启HTTP/3的完整旅程。

为了方便服务部署,我们选择基于Docker容器的方式部署Nginx服务器。

5、常见问题

        配置没问题,服务也正常启动了,在检验的时候发现只用到了HTTP/2,没有使用HTTP/3协议!!!
        原因1: 使用了代理,但是代理未支持HTTP/3
        原因2: 服务端存在防火墙,防火墙只放行了TCP:443,未放行UDP:443端口

        如果本地存在代理,无法验证,可以通过这个在线工具来验证网站是否已启用了HTTP/3

6、结语

   HTTP协议在近十年发生了很大变化,整体方向都是为了降低延迟、提升响应速度和网络利用率,下面我们从网络链接的角度来看看HTTP协议的改进:

  1. HTTP/1.1中引入了keep-alive使得TCP链接可以被多个请求复用,解决了每个http请求都需要建立TCP链接的三次握手和断开链接的四次挥手的开销。
  2. HTTP/2在链接优化方面主要引入了http多路复用,解决了HTTP/1.1同一个TCP链接上的HTTP请求都需要串行(HTTP队头阻塞)的问题。
  3. HTTP/3在链接优化方面,引入了基于UDPQUIC协议,解决了TCP队头阻塞的问题。

        HTTP3 代表着充满魅力的未来,它的 HTTP 基础潜能已经被谷歌的那些极客发挥到极致。在撰写本文时,只有 4.6%的互联网内容在使用 HTTP3,但这个数字在未来几年中可能会增长许多。本文只是简单谈了谈这方面的知识,但如果你想了解更多,网上有很多的文章可供你参考。

7、参考

https://www.jesuisundev.com/en/understand-http3-in-5-minutes

让网站支持HTTP/3

QUIC/HTTP3 协议简析 - 又拍云


http://www.ppmy.cn/news/1559423.html

相关文章

ES7+ React/Redux/GraphQL/React-Native snippets 使用指南

VS Code React Snippets 使用指南 目录 简介基础方法React 相关React Native 相关Redux 相关PropTypes 相关控制台相关React 组件相关 简介 ES7 React/Redux/GraphQL/React-Native snippets 是一个用于 VS Code 的代码片段插件,它提供了大量用于 React 开发的代…

asp.net 高校学生勤工俭学系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

Linux | 零基础Ubuntu卸载MySQL Server 零痕迹

目录 介绍 移除MySQL软件包 自动移除依赖项 清理残留文件 检查是否还有残留文件 重启系统 介绍 难免会出现一些迷人的操作,让整个数据库都作废了,又改不了文件,修复不了问题,只能重装了,但又卸载不干净&#xf…

Rust : tokio中select!

关于tokio的select宏,有不少的用途。包括超时和竞态选择等。 关于select宏需要关注,相关的异步条件,会同时执行,只是当有一个最早完成时,会执行“抛弃”和“对应”策略。 说明:对本文以下素材的来源表示感…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度(最好)时间复杂度(最坏)时间复杂度(平均)辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

【SpringBoot】Java中isEmpty使用不当报错空指针

业务场景: 查询区域列表接口,为了提高接口TPS,选择将列表数据加入缓存。 1、请求该接口时,首先查询redis,如果redis不为空,则获取redis中key对应的value值,转换为特定结构返回前端。 2、如果red…

docker compose deploy fate cluster

官方文档 写的不清晰 KubeFATE,用于生成部署脚本,链接 部署机就是下载了 KubeFATE的主机;运行机就是要安装fate容器的主机(部署机和运行机可以相同) 两个主机:并非必须 centos7,Ubuntu也行Doc…

uniapp下拉选择组件

目录 背景 实现思路 代码实现 配置项 使用 尾巴 背景 最近遇到一个这样的需求,在输入框中输入关键字,通过接口查询到结果之后,以下拉框列表形式展现供用户选择。查询了下uni-app官网和项目中使用的uv-ui库,没找到符合条件的…