从拥堵到畅通:HTTP/2 如何解决 Web 性能瓶颈?

HTTP/2 相比 HTTP/1.1 引入了许多改进,旨在提高 Web 传输性能和用户体验。HTTP/1.1 存在的问题主要包括高延迟、头部阻塞、连接复用效率低等问题。HTTP/2 通过一系列的技术提升,解决了这些问题。我们来详细讲解从 HTTP/1.1 到 HTTP/2 的主要改进。

一、HTTP/1.1 的主要问题

  1. 队头阻塞(Head-of-line Blocking):
    • HTTP/1.1 中,所有请求都是串行处理的,即使浏览器可以并发发起多个请求,但每个连接只能处理一个请求。这意味着在同一个 TCP 连接中,一个请求没有完成时,后续请求必须等待。

想象你在一个高速公路收费站,每条车道只能一次通过一辆车。HTTP/1.1 就像这条高速公路,如果前面一辆车卡住了,后面的车都得等着。这就导致了队头阻塞,延迟了整个队伍的进展。

  1. 请求/响应头部开销大
    • HTTP/1.1 每次请求都会重复发送完整的请求头和响应头,即使同一个会话中多次请求的头部信息没有变化。这带来了不必要的网络传输开销。

每次你在同一个餐厅点餐时都要重新告诉服务员你是谁、坐在哪里,以及你不喜欢的配料。HTTP/1.1 的头部开销就像这种重复的信息传递,浪费了时间和资源。

  1. 连接复用问题
    • HTTP/1.1 中,浏览器为了并发请求资源,通常会为每个域名打开多个 TCP 连接,但 TCP 连接数有上限,连接过多会导致资源的争抢和延迟。

你在一家餐馆吃饭,这家餐馆的服务员数量有限,服务员就像 TCP 连接。当你需要点很多道菜(资源)时,餐馆为了尽快满足你的需求,会分配多个服务员来服务你。但由于服务员数量有限,其他顾客也在等着点餐,服务员来回奔波反而降低了效率。这就像 HTTP/1.1 中,浏览器需要频繁创建和管理多个连接,反而导致了资源争夺和延迟。

  1. 无优先级控制
    • HTTP/1.1 中无法有效地对请求进行优先级管理,所有请求被视为等同,无法灵活控制资源加载顺序。

想象一个快递员按照顺序处理所有包裹,无论紧急程度如何。这就像 HTTP/1.1,没有优先级,所有的请求被平等对待,即使某些请求更重要。

二、HTTP/2 的核心升级

HTTP/2 是在 2015 年作为 RFC 7540 发布的协议,它通过一系列技术改进,显著提升了 HTTP 的性能。HTTP/2 的设计基于 SPDY 协议,是谷歌提出的实验性协议,其很多技术后来被 HTTP/2 采纳。

2.1 二进制分帧层(Binary Framing Layer)

HTTP/2 就像是将所有信息包装在更小、更高效的快递盒中(帧),这些盒子可以同时运送,而且无需担心它们的顺序,因为它们会在目的地重新组装。这种二进制方式比文本更易于传输和解析。

HTTP/2 最大的变革是采用了二进制协议,而 HTTP/1.1 是基于纯文本的。二进制协议更易解析和处理,使得协议更加高效且易于扩展。

  • 二进制传输:HTTP/2 将所有的请求和响应都分割为更小的帧(Frame),这些帧以二进制格式传输。这与 HTTP/1.1 的纯文本协议不同,二进制协议解析速度更快。
  • 帧的概念:HTTP/2 中所有的数据传输都是基于帧(Frame)进行的。HTTP/2 把 HTTP 消息分解成帧,这些帧可以乱序发送,接收方根据帧的标识符重新组装消息。
2.2 多路复用(Multiplexing)

HTTP/2 就像是高速公路的升级版,现在每条车道可以同时通过多辆车,而不再受制于前面的车。多个请求和响应可以并发处理,减少了拥堵和延迟。

多路复用 是 HTTP/2 的核心特性之一。它允许在同一个 TCP 连接中并发处理多个请求和响应,解决了 HTTP/1.1 中的队头阻塞问题。

  • 多路复用解决的问题:HTTP/1.1 中,每个 TCP 连接一次只能处理一个请求。HTTP/2 则允许多个请求和响应共享同一个连接,不需要为每个请求创建单独的连接,从而减少了延迟和资源消耗。
  • 帧的流(Stream):在 HTTP/2 中,每个请求对应一个流(Stream),一个流可以由多个帧组成。这些流可以并发存在,不同的请求流不会相互阻塞。

性能收益

  • 大幅减少网络延迟,尤其是在资源较多的网页中(例如多个 CSS、JavaScript 文件以及图片)。
  • 用户体验上,页面内容能够同时加载,减少了等待时间,特别是在弱网环境中效果尤为显著。

测量方式

  • 网页加载时间(Page Load Time):使用浏览器开发者工具或性能监测工具(如 Lighthouse)测量页面首次加载完成时间。
  • 网络请求耗时(Request Timing):通过工具如 Chrome DevTools 观察请求的延迟变化。
2.3 头部压缩(Header Compression)

在 HTTP/2 中,你只需要告诉服务员一次你不喜欢的配料,以后再点餐时服务员会自动记住,不用重复说明。HPACK 算法帮助压缩并记住头部信息,减少了冗余数据的传输。

HTTP/2 使用 HPACK 算法 对请求和响应头部进行压缩,减少了头部的冗余信息传输,从而降低了带宽占用和延迟。

  • HPACK 压缩算法:HTTP/2 将头部信息进行压缩,并且在多个请求之间共享头部数据。例如,如果多个请求的头部是相同的,HTTP/2 只会在首次请求时发送完整的头部信息,后续请求只需发送差异部分或引用之前的头部数据。
  • 头部复用:HTTP/2 允许复用同一个 TCP 连接下的请求头部信息,从而减少重复发送不必要的头部数据。

性能收益

  • 在带宽有限或移动网络中,头部压缩可以显著减少传输数据量,尤其是在频繁的请求中,如 REST API 通信、大量资源加载等。
  • 提升网页性能,减少请求开销,特别是在多次请求同一站点的场景下。

测量方式

  • 网络带宽使用情况:使用 Chrome DevToolsNetwork 标签页查看资源的实际传输大小,比较 HTTP/1.1 和 HTTP/2 下头部大小。
  • 请求头大小变化:对比 HTTP/1.1 和 HTTP/2 下的每个请求头部开销,尤其是重复请求下的数据量减少情况。
2.4 请求优先级(Stream Prioritization)

HTTP/2 允许你为快递包裹设置优先级,重要的包裹会被优先送达。这让关键资源可以更快地加载,提高用户的感知体验。

HTTP/2 引入了 请求优先级 的概念,允许客户端根据请求的重要性设置优先级,从而让服务器在响应时优先处理关键资源,如页面的核心 HTML、CSS 文件等。

  • 优先级控制:客户端可以为每个流分配一个优先级。浏览器可以优先请求 CSS、JS 或 HTML 文件,而将图像等资源放在次要位置,提高页面加载速度。

性能收益

  • 提升用户感知性能(感知页面加载速度),尤其是对首屏内容或关键资源的提前加载,加快页面渲染。

测量方式

  • 关键渲染路径时间:通过 Lighthouse 或 WebPageTest 测量关键 CSS 和 JS 资源加载的时间变化。
  • 首屏加载时间:使用 First Contentful Paint (FCP) 来衡量首屏内容加载的改进情况。
2.5 服务器推送(Server Push)

想象你刚进家门,服务员已经把你最常点的菜摆在桌子上。HTTP/2 的服务器推送功能让服务器在你还没请求某些资源时,提前把它们发送给你,加快了页面加载速度。

HTTP/2 引入了 服务器推送 功能。服务器在接收到客户端的某个请求后,可以主动向客户端推送与请求相关的资源,而无需等待客户端单独请求这些资源。

  • 服务器推送的场景:例如,当客户端请求一个 HTML 文件时,服务器可以立即推送相关的 CSS 和 JS 文件,而无需等待客户端分析完 HTML 后再请求这些资源。
  • 提升加载性能:服务器推送减少了客户端请求资源的延迟,从而加快了页面加载速度。

性能收益

  • 减少了资源请求的等待时间,提升首屏加载速度。特别是在页面首次访问时,服务器推送可以提前加载关键资源,减少 RTT(Round Trip Time)。

测量方式

  • 首次渲染时间(First Contentful Paint, FCP):通过工具如 Lighthouse 测量页面首次有内容呈现到屏幕的时间。
  • 首字节时间(Time to First Byte, TTFB):通过 Chrome DevTools 或其他监测工具,比较启用服务器推送后的首字节时间是否有所减少。
2.6 更安全的传输(HTTPS 优化)

虽然 HTTP/2 规范本身并不强制使用 HTTPS,但绝大多数浏览器要求在 HTTPS 下才支持 HTTP/2。这意味着使用 HTTP/2 的网站默认启用了更安全的加密传输。

  • TLS 加密:HTTP/2 通过 TLS(通常是 1.2 或更高版本)进行加密,确保数据在传输过程中是安全的。
  • 减少握手开销:虽然 HTTP/2 使用加密传输,但通过减少 TCP 连接数量和多路复用,可以减少 TLS 握手次数,降低性能开销。

三、性能提升的评估方式

为了评估 HTTP/1.1 到 HTTP/2 的性能提升,开发者可以通过以下几种方法来进行量化分析:

  1. Web 性能测试工具

    • 使用工具如 WebPageTestGoogle LighthouseGTmetrix 等,进行 HTTP/1.1 和 HTTP/2 的对比测试。这些工具可以提供详细的页面加载时间、首屏时间、资源加载时间等性能指标。
  2. 浏览器开发者工具

    • 浏览器的开发者工具(如 Chrome DevTools)可以在 Network 标签页中查看 HTTP 请求的时长、连接数、数据大小和握手时间,方便对比 HTTP/1.1 和 HTTP/2 的性能。
  3. 性能监控平台

    • 通过集成性能监控工具(如 New RelicDatadogPingdom)监测线上应用的真实用户性能数据,观察 HTTP/2 部署前后页面加载时间的变化。
  4. 真实用户测试(RUM)

    • 通过部署 RUM(Real User Monitoring)工具,采集用户在 HTTP/1.1 和 HTTP/2 下的实际体验数据,包括页面加载时间、资源加载速度等。

四、HTTP/2 的实际效果

通过上述技术改进,HTTP/2 在以下几个方面表现更佳:

  • 提高了并发性:通过多路复用技术,HTTP/2 可以在同一 TCP 连接中同时传输多个请求和响应,避免了 HTTP/1.1 中的队头阻塞问题。
  • 减少了延迟:服务器推送、请求优先级以及头部压缩等技术降低了传输延迟,使得资源加载更加高效。
  • 带宽占用降低:头部压缩和数据帧分割技术减少了网络传输中的冗余信息,从而降低了带宽占用。
  • 性能优化:HTTP/2 在大多数情况下提供比 HTTP/1.1 更好的页面加载性能,尤其是在资源较多、请求较频繁的场景下表现尤为明显。

五、HTTP/1.1 和 HTTP/2.0 的比较总结

特性HTTP/1.1HTTP/2
传输格式纯文本二进制
请求/响应处理串行(队头阻塞)并行(多路复用)
头部压缩使用 HPACK 算法进行压缩
连接复用多个 TCP 连接并发请求单一 TCP 连接中的多路复用
请求优先级
服务器推送
安全性支持 HTTP 和 HTTPS默认使用 HTTPS 加密

六、总结

HTTP/2 的升级主要解决了 HTTP/1.1 中的性能瓶颈问题,包括队头阻塞、头部冗余、连接复用等问题。通过二进制分帧、多路复用、头部压缩、服务器推送和请求优先级控制,HTTP/2 实现了更高效的资源传输,提升了 Web 页面加载速度和整体用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146032.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe出现This unlicensed Photoshop app has been disabled

Adobe Acrobat或Photoshop软件突然出现This unlicensed Photoshop app has been disabled 症状 解决方法 删除软件安装目录下的AcroCEF和acrocef_1l两个子文件夹。主要是为了删除AcroCEF.exe。 如果存在复发,则删除xxxxxxx\AdobeGCClient\AdobeGCClient.exe。 不…

Win10 安装VS Code

一、软件介绍 Visual Studio Code(简称VS Code)是一个由微软开发的免费、开源的代码编辑器。它支持Windows、Linux和macOS操作系统,并且提供了许多功能,使其成为许多开发者的首选开发工具。以下是VS Code的一些主要特点&#xff…

如何在 Debian 系统中启用 root 用户的 SSH 登录功能?

本章教程主要介绍如何在 Debian 上启用 root 用户通过 SSH 登录功能。 注意:root 用户通过 SSH 登录可能会带来安全风险,建议仅在必要时使用,并确保有足够的安全措施。 1. 编辑 SSH 配置文件: 使用文本编辑器打开 SSH 配置文件:sudo vi /etc/ssh/sshd_config2. 修改 Permi…

14_Python面向对象

面向过程与面向对象 在编程范式(programming paradigms)中,面向过程(Procedural Programming)和面向对象(Object-Oriented Programming,简称OOP)是两种主要的编程风格。 Python是一…

vulnhub(12):bob 1.0.1(gpg文件解密)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.169 Host is up (0.00020s latency). ​ 169是新出现的机器,他就是靶机 nmap端口扫描 nmap -Pn -sV 192.168.72.169 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap…

力扣最热一百题——除自身以外数组的乘积

目录 题目链接:238. 除自身以外数组的乘积 - 力扣(LeetCode) 题目描述 示例 提示: 解法一:左右数组(小型动态规划) 实现思路 Java写法: 运行时间 C写法: 运行时…

虚拟现实与PD协议快充

随着虚拟现实(VR)技术的不断进步,索尼的PlayStation VR2(简称PS VR2)凭借其卓越的性能和沉浸式体验,在游戏界引起了广泛关注。为了进一步拓展PS VR2的应用范围,索尼推出了PS VR2适配器&#xff…

IS-ISv4/6双栈

文章目录 IS-ISv4/6双栈实验要求配置 IS-ISv4/6双栈 实验要求 配置双栈 R1、2、3、4配置 IS-ISv4 和 IS-ISv6,配置IPv6多拓扑 上面为Level-1类型、中间为Level-1-2、下面是Level-2类型 还有就是说ATT位置1有一定要求连接L1/2连接L1或者L2类型路由器,至…

简单题94. 二叉树的中序遍历 (python)20240921

问题描述: #### python: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution(…

统信服务器操作系统【搭建FTP】设置介绍

如何在操作系统上安装vsftp服务。设置匿名用户登录、设置授权用户密码访问功能,并介绍使用匿名方式、授权用户方式访问vsftp服务。本文适用于A、D、E三个服务器操作系统版本,除安装方式的差异,其他设置均相同。 文章目录 功能概述一、功能介绍二、准备环境三、安装步骤1. 在…

pg_start_backup

pg_start_backup()函数在主库上发起一个在线备份,命令执行成功后,将数据文件拷贝到备份接口中 select pg_start_backup(full0918,false,false); 以上会话不要关闭,复制数据目录。 cp -r /pgdata/data/postgres-f66f5f7a/ /opt/qfusion/mnt/st…

光伏开发:一分钟生成光伏项目报告

传统光伏项目报告的编制往往需要收集大量数据、进行复杂计算与分析,耗时长且易受人为因素影响。自动生成光伏项目报告,依托大数据、云计算、人工智能等先进信息技术,实现了对光伏项目关键参数的快速分析、评估与预测。 一、核心功能与流程 1…

Leetcode面试经典150题-39.组合总数

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…

汇川AM400脉冲轴控制(轴控功能块ST源代码)

汇川AM400如何和编程软件通信连接 汇川AM400PLC如何和编程软件通信连接_汇川am400读取程序-CSDN博客文章浏览阅读159次。本文介绍了如何使用CODESYS编程软件与汇川AM400PLC进行通信连接,包括扫描网络、修改IP地址、刷新日志和下载监控程序的步骤。同时,文章提到了CODESYS编程…

python-3n+1数链/233

一:3n1数链题目描述 在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。现在我们就有这样一个问题,问题如下&#…

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战 秒懂大纲提出背景解法拆解全流程优化和医学关系 创意 秒懂大纲 ├── DoG框架【主题】 │ ├── 背景【研究背景】 │ │ ├── LLMs的局限性【问题描述】 │ │ │ …

go 读取excel

一、安装依赖 go get github.com/tealeg/xlsx二、main.go package mainimport "fmt" import "github.com/tealeg/xlsx"type Student struct {Name stringSex string }func (student Student) show() {fmt.Printf("Name:%s Sex:%s\r\n", stude…

消灭病毒gamedemo

DestoryVirus 一、AudioSourceManager using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioSourceManager : MonoBehaviour {public static AudioSourceManager Instance { get; private set; }public SoundPlayer soundPla…

JavaWeb初阶 day1

目录 tomcat目录结构 tomcat:web服务器软件 项目部署的方式 直接将项目放到webapps下 配置conf/server.xml文件 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 静态项目和动态项目 Servlet Servlet执行原理 Servlet方法(生命周期&#x…

Linux入门学习:make/Makefile(Linux项目自动化构建工具)

文章目录 1. makefile文件语法2. make clean工程清理3. 细节语法4. make原理 ⭕背景: 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中&#xff0c…