ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入剖析 HTTP/2 为什么比 HTTP/1 更快:system-design-101 图解指南

深入剖析 HTTP/2 为什么比 HTTP/1 更快:system-design-101 图解指南 后端文档教程【免费下载链接】system-design-101Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.项目地址https://gitcode.com/GitHub_Trending/sy/system-design-101点击查看免费下载HTTP/2 于 2015 年发布是自 HTTP/1.1 以来 Web 协议最重要的一次升级。它并未改变 HTTP 的语义方法、状态码、URL 结构都保持不变却在传输层引入了二进制分帧、多路复用、流优先级、Server Push 与 HPACK 头压缩五大核心特性从根本上解决了 HTTP/1.x 时代的队头阻塞与连接利用率低下问题。这篇指南基于本仓库的 what-makes-http2-faster-than-http1.md 图解文档逐层拆解这些特性及其代价帮助你理解 Web 性能优化的关键路径并能直接应用到 Web 服务器调优与接口设计实践中。一、HTTP/1 的瓶颈为什么它慢在深入 HTTP/2 的加速机制之前需要先理解 HTTP/1.x 慢在哪里。HTTP/1 诞生于 1996 年HTTP/1.1 次年跟进二者都基于 TCP 提供可靠的连接并引入了持久连接persistent connections、管道化pipelining与 Header 的概念参见仓库中的 http1-http2-http3.md。即便如此HTTP/1.1 仍有三个致命短板队头阻塞Head-of-Line Blocking同一 TCP 连接上的请求必须串行处理前一个请求未响应后续请求只能排队等待导致连接资源被大量浪费。连接利用率低浏览器为规避串行阻塞通常为同一域名建立多个 TCP 连接并发 6 个左右但每个连接依然独占带宽与服务器资源。Header 冗余每次请求都要重复发送 User-Agent、Cookie、Accept 等 Header单个页面往往包含几十个请求重复传输的 Header 字节数极为可观。HTTP/2 正是针对以上三点逐一给出工程化解决方案。二、Binary Framing Layer二进制分帧让消息可切片HTTP/2 的底层改变是引入了Binary Framing Layer二进制分帧层。HTTP/1.x 使用文本格式以换行符分隔的纯文本行来组织报文HTTP/2 则将消息编码为二进制格式并进一步切分成更小的单元——帧frame。帧是 HTTP/2 中数据传输的最小单位每个帧都带有帧头标明所属的流 ID、帧类型与长度。每个请求/响应消息HTTP message由一个或多个帧组成通过同一个 TCP 连接传输。二进制格式比文本格式更容易被程序高效解析无需逐字符扫描边界解析速度更快处理更高效。从实现角度看帧的最小单位化是整个 HTTP/2 性能体系的基石——没有可细分的帧就没有下文的多路复用与流优先级。三、Multiplexing多路复用单连接并发传输有了 Binary Framing Layer 的支撑HTTP/2 实现了真正的多路复用Multiplexing在一个 TCP 连接上可以同时交错传输多个请求和多个响应。客户端与服务端在传输过程中可以**交错interleave不同流的帧接收方再根据帧头中的流 ID 将其重组reassemble**为完整的消息。相比 HTTP/1 的串行队列多路复用让带宽被多个请求同时利用一个慢的大文件下载不再阻塞后续所有请求浏览器也无需再为每个请求单独建立 TCP 连接。结果是握手次数、连接数、服务器资源占用全面下降吞吐量显著提升。这是 HTTP/2 相较 HTTP/1 提速的核心来源。需要留意多路复用解决的是HTTP 层的队头阻塞由于底层仍依赖 TCPTCP 层的队头阻塞某个丢失的数据包会阻塞其后所有流的交付依然存在这也是 HTTP/3 改用基于 UDP 的 QUIC 的动机之一详见 http1-http2-http3.md。四、Stream Prioritization流优先级按权重分配带宽当同一连接上并发多个请求时并非每个请求都同等重要。HTTP/2 提供**流优先级Stream Prioritization**机制让开发者可以自定义流或请求的相对权重relative weight与依赖关系高优先级的流如首屏关键 CSS、JS可以获得更多帧的发送配额服务端会优先发送高优先级请求的帧。低优先级的资源如图片、分析脚本在关键资源就绪后再补充发送。权重与依赖关系通过帧内的优先级信息表达客户端可以动态调整。正确设置优先级可以显著缩短关键渲染路径Critical Rendering Path的耗时让用户更快看到首屏内容错误地设置例如把可延迟资源设为最高优先级反而会拖慢整体体验。五、Server Push服务端推送主动下发后续资源由于 HTTP/2 允许在同一个请求下返回多个并发响应服务端可以在响应客户端请求页面的同时**主动推送Server Push**该页面后续大概率会用到的额外资源如 CSS、JS、图片而不是等客户端解析完 HTML 再发起新一轮请求。收益省去客户端发现资源 → 发起请求 → 等待响应的多个 RTT往返时延尤其对高延迟网络收益明显。代价与注意点推送会占用连接带宽与服务器资源若客户端缓存中已有该资源推送就属于浪费。实践中需要谨慎控制推送范围例如仅推送小体积、高确定性资源并关注各浏览器对 Server Push 的支持与缓存行为配合缓存策略避免过度推送。六、HPACK头部压缩削减重复传输HTTP/1 的 Header 是纯文本逐字节传输重复度高、浪费带宽。HTTP/2 引入专用压缩算法HPACK对 Header 进行压缩静态表Static Table为 61 个最常见的 Header 字段如:method: GET、content-type预置索引直接用 1 字节的整数索引替代整个字段。动态表Dynamic Table连接建立后双方共同维护一个动态索引表将连接内新出现的字段增量加入索引后续请求只需发送索引号。哈夫曼编码对表外字段进行哈夫曼编码进一步压缩字节。防 CRIME 攻击设计HPACK 不使用压缩 Cookie、Authorization 等敏感内容避免引入类似 CRIME 的压缩侧信道漏洞。在多请求场景几十个请求共享同一套 Header下HPACK 可将 Header 体积削减 90% 以上显著节省带宽这正是它对 HTTP/1 提速的又一关键贡献。七、特性总览五大加速机制一览特性核心作用对应 HTTP/1 的痛点Binary Framing Layer将消息编码为二进制并切分为帧提升解析效率文本解析开销Multiplexing单连接多请求并发交错传输队头阻塞、连接数过多Stream Prioritization按权重优先传输关键请求的帧无差异化调度Server Push随主响应主动推送后续资源额外 RTT 往返HPACK静态表 动态表 哈夫曼编码压缩 HeaderHeader 冗余浪费带宽八、并非银弹HTTP/2 也可能慢正如关联文档强调的即便拥有上述特性HTTP/2 在特定技术场景下依然可能慢。常见原因包括TCP 队头阻塞底层仍是 TCP丢包重传会阻塞同一连接上所有流的交付高丢包率的弱网场景下多路复用反而可能放大单个丢包的影响。服务器实现质量调度算法、帧缓冲区、优先级实现优劣不一劣质实现可能退化到接近 HTTP/1 的表现。Server Push 滥用推送未命中缓存的资源会浪费带宽推送体积过大的资源会挤占关键资源带宽。TLS/连接开销部分实现强制要求 TLSTLS 握手本身有额外成本。因此开发者在落地 HTTP/2 时必须测试与优化才能最大化收益例如开启合理的流优先级、谨慎使用 Server Push、配合 CDN 与缓存策略仓库中的 top-5-common-ways-to-improve-api-performance.md 提到的 gzip 等负载压缩与缓存思路同样适用并通过真实场景的压测验证效果而不是盲目相信换协议即快。九、延伸阅读HTTP/3 与协议演进HTTP/2 用 TCP 之上的二进制分帧解决了 HTTP 层的队头阻塞但 TCP 层的队头阻塞依然存在。HTTP/3 转而使用 Google 主导的QUIC协议QUIC 构建在 UDP 之上将连接建立、加密与传输控制合并在更少的往返中完成并让每个流独立传输、互不阻塞。关于 HTTP/1 → HTTP/2 → HTTP/3 的完整演进脉络可继续阅读仓库中的 http1-http2-http3.md本仓库的 README.md 中的 API and Web Development 分类还收录了 HTTP Header、浏览器渲染how-does-the-browser-render-a-web-page.md、WebSocket 与 SSEshortlong-polling-sse-websocket.md等关联主题可帮助你建立完整的 Web 性能知识体系。小结HTTP/2 的提速并非来自某单一魔法而是二进制分帧打底、多路复用提效、流优先级调度、Server Push 省 RTT、HPACK 压带宽五位一体的系统性工程。理解每个特性的适用边界与代价配合持续测试与调优才能真正把 HTTP/2 的潜力转化为用户可感知的加载速度提升。赞分享后端文档教程【免费下载链接】system-design-101Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.项目地址https://gitcode.com/GitHub_Trending/sy/system-design-101点击查看免费下载相关推荐system-design-101 深度解读HTTP/1 → HTTP/2 → HTTP/3 协议演进全景system design 101 深度解读HTTP/1 → HTTP/2 → HTTP/3 协议演进全景 HTTP 是万维网数据传输的基石。本文基于 sys后端文档教程如何实现Docker Compose零停机部署docker-rollout的终极指南 如何实现Docker Compose零停机部署docker rollout的终极指南 在现代应用部署中服务中断意味着用户流失和业务损失。 docker开发工具py-googletrans HTTP/2支持揭秘为什么比其他库更快更稳定py googletrans HTTP/2支持揭秘为什么比其他库更快更稳定 想要体验 免费且无限制 的谷歌翻译API吗py googletrans是一个功能上一篇3分钟学会智能图像分层Layerdivider让复杂插画一键变可编辑PSD下一篇Layerdivider智能图像分层工具将单张图片转换为可编辑PSD图层创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表