为什么我们需要使用 HTTP/2

2025-06-07

为什么我们需要使用 HTTP/2

HTTP/2 是 HTTP 协议 15 年来首次重大升级。
在此期间,网站发生了翻天覆地的变化,外部图片、CSS 和 JavaScript 资源的数量逐年增长。HTTP/1.1 的设计初衷并非应对如此复杂的情况。HTTP/2 针对现代网站进行了优化,无需域名分片和文件串联等复杂技术即可提升性能。采用 HTTP/2 无需更改现有代码库即可提升网站速度。

测试结果

本次测试证明 HTTP/2 始终比 HTTP/1.1 更快

  • WiFi / 20Mbps 有线网络速度快 4 倍,服务器平均 ping 时间为 50ms
  • LTE 网络速度提升 6 倍,服务器平均 ping 时间为 90 毫秒
  • 3G网络速度提升15倍,服务器平均ping时间为120ms
  • 2G网络速度提升2倍,服务器平均ping值为400ms

HTTP/2 在 2G 网络上仅快 2 倍的原因是由于 EDGE 带宽限制,因为 170Kbps 链路迅速饱和。

HTTP/2 的主要目标是通过启用完整的请求和响应复用来降低延迟,通过高效压缩 HTTP 标头字段来最大限度地降低协议开销,并添加对请求优先级和服务器推送的支持。
为了实现这些需求,有大量其他协议增强功能的支持,例如新的流量控制、错误处理和升级机制,但这些是每个 Web 开发者都应该了解并在其应用程序中利用的最重要的功能。

HTTP/2 不会以任何方式修改 HTTP 的应用语义。所有核心概念,例如 HTTP 方法、状态码、URI 和标头字段,都保持不变。相反,HTTP/2 修改了数据在客户端和服务器之间的格式化(分帧)和传输方式,客户端和服务器共同管理整个流程,并将所有复杂性隐藏在新的分帧层中,避免应用程序遇到。因此,所有现有应用程序无需修改即可交付。

为什么不是 HTTP/1.2?

为了实现 HTTP 工作组设定的性能目标,HTTP/2
引入了一个新的二进制框架层,该层不向后兼容以前的 HTTP/1.x 服务器和客户端——因此主要协议版本增量为 HTTP/2。

也就是说,除非您
使用原始 TCP 套接字实现 Web 服务器(或自定义客户端),否则您将看不到任何区别:所有新的低级框架都由客户端和服务器代表您执行。唯一可观察到的区别是性能的提升以及新功能的可用性,例如请求优先级、流量控制和服务器推送!

HTTP/2 定义了请求优先级并支持取消,因此,如果应用程序需要呈现动态图库预览,它可以请求初始视图的高优先级图像,请求列表中的图像,如果用户离开或向下滚动列表,则取消其下载。

时间线

  • 2012 年 3 月:HTTP/2 提案征集
  • 2012 年 11 月:HTTP/2 初稿(基于 SPDY)
  • 2014 年 8 月:HTTP/2 草案 17 和 HPACK 草案 12 发布
  • 2014 年 8 月:HTTP/2 工作组最后一次征集意见
  • 2015 年 2 月:IESG 批准 HTTP/2 和 HPACK 草案
  • 2015 年 5 月:RFC 7540 (HTTP/2) 和 RFC 7541 (HPACK) 发布

HTTP/2 推送——机遇

HTTP/2 在很多方面都比 HTTP/1 有了巨大的性能提升,而服务器推送就是其性能提升的功能之一。

一个典型的(简化的)HTTP 请求/响应流程如下(下面的截图用于连接到 Hacker News):

  1. 浏览器请求 HTML 文档。
  2. 服务器处理请求并生成/发送 HTML 文档。
  3. 浏览器接收响应并解析 HTML 文档。
  4. 它识别呈现 HTML 文档所需的更多资源,例如样式表、图像、JavaScript 文件等。它会发送更多针对这些资源的请求。
  5. 服务器用相应的资源来响应每个请求。
  6. 浏览器使用 HTML 文档和相关资源呈现页面。

这意味着渲染一个 HTML 文档通常需要多次请求/响应,因为该文档还关联着其他资源,而浏览器需要这些资源才能正确渲染该文档。如果所有这些关联资源都能与原始 HTML 文档一起发送到浏览器,而无需浏览器主动请求,那就太好了。而这正是 HTTP/2 服务器推送的用途。

在 HTTP/2 中,服务器可以主动额外的资源与它认为浏览器稍后会请求的原始请求的响应一起推送。之后,如果浏览器确实需要这些资源,它只需使用已经推送的资源,而无需发送额外的请求。

文章来源:https://dev.to/grigorkh/why-we-need-to-use-http2-1124
PREV
使用 Angular 11 迁移和配置 Eslint 简介 迁移 自定义 ESLint 奖励:添加 Prettier 最终配置 结论 eslintrc.json 命令结果日志
NEXT
JavaScript 控制台不仅仅是 console.log()