从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能
一、前言
在最近使用Apipost时,突然注意到了http/1.1和http/2,如下图:

在我根深蒂固的记忆中,对于http的理解还停留在TCP协议、三次握手。由于我的好奇心,于是触发了我被动“开卷”,所以有了这篇文章,文章主要整理了我查阅资料的分享。
本文将详细讲解 HTTP/1.1、HTTP/2 和 HTTP/3 三个版本的演变过程及其在实际请求中的应用。
二、HTTP/1.1:最基础的协议
1. HTTP/1.1简介
HTTP/1.1 于1999年发布,成为了互联网中最广泛使用的协议版本。虽然它改进了 HTTP/1.0 的一些问题(例如引入持久连接),但在处理多个请求时依然存在显著的性能瓶颈。
2. HTTP/1.1的局限性
- 单连接请求:即使支持持久连接(keep-alive),HTTP/1.1 每个连接仍然只能处理一个请求。这意味着如果网页包含多个资源(如图片、脚本等),每个资源的请求都必须顺序执行。
- 头部冗余:每次请求都会发送相同的 HTTP 头部信息(如
User-Agent、Accept等),导致带宽浪费。 - 队头阻塞:当多个请求共享同一个连接时,前一个请求的响应必须完成后才能继续处理后续请求,造成延迟。
例子:HTTP/1.1 请求
假设你访问一个包含多个资源的网页,使用 HTTP/1.1 进行请求:
- 浏览器请求第一个资源:
GET /image1.jpg HTTP/1.1 - 服务器返回响应:
HTTP/1.1 200 OK - 浏览器请求下一个资源:
GET /style.css HTTP/1.1 - 服务器返回响应:
HTTP/1.1 200 OK
在这个过程中,每个请求都需要单独等待响应,造成了性能瓶颈。
三、HTTP/2:性能优化
1. HTTP/2简介
HTTP/2 于2015年发布,它的主要目标是优化 HTTP/1.1 中的性能瓶颈。通过引入 多路复用 和 头部压缩 等技术,HTTP/2 能够显著提高页面加载速度。
2. HTTP/2的优势
- 多路复用:多个请求和响应可以通过同一个连接并行传输,避免了 HTTP/1.1 中的队头阻塞问题。多个请求不再需要等待前一个请求完成,极大地提高了效率。
- 头部压缩:通过 HPACK 算法压缩 HTTP 请求头,减少了冗余数据的传输,进一步提高了带宽利用率。
- 流量优先级:HTTP/2 允许浏览器为不同的资源设置优先级,优先传输重要资源。
例子:HTTP/2 请求
在 HTTP/2 中,浏览器可以同时发起多个请求并通过同一个连接并行处理:
- 浏览器请求多个资源:
GET /image1.jpg HTTP/2GET /style.css HTTP/2GET /script.js HTTP/2
- 服务器并行响应这些请求:
HTTP/2 200 OK(for/image1.jpg)HTTP/2 200 OK(for/style.css)HTTP/2 200 OK(for/script.js)
通过这种方式,多个请求和响应可以并行处理,减少了页面加载时间。
四、HTTP/3:低延迟的时代
1. HTTP/3简介
HTTP/3 于2020年发布,基于 QUIC 协议,它不同于 HTTP/1.1 和 HTTP/2 使用的 TCP 协议,而是采用了 UDP 协议。通过减少连接建立的延迟,HTTP/3 提供了更低的延迟和更高的性能,尤其适合高丢包和高延迟的网络环境。
2. HTTP/3的优势
- 更低的延迟:使用 UDP 协议,建立连接的时间大幅减少,特别是对于高延迟或不稳定的网络环境,HTTP/3 提供了显著的性能提升。
- 更可靠的多路复用:QUIC 协议避免了 TCP 的拥塞控制和丢包问题,能更稳定地传输多个请求。
- 加密性能:HTTP/3 默认使用 TLS 1.3 协议进行加密,确保数据传输安全,同时减少了加密过程中的性能开销。
例子:HTTP/3 请求
当你访问支持 HTTP/3 的网站时,浏览器会通过 QUIC 协议快速建立连接:
- 浏览器通过 QUIC 建立连接。
- 浏览器并行请求多个资源:
GET /image1.jpg HTTP/3GET /style.css HTTP/3GET /script.js HTTP/3
- 服务器快速并行响应这些请求:
HTTP/3 200 OK
通过这种方式,HTTP/3 能减少连接建立的延迟并显著提高请求和响应的速度。
五、协议选择过程:浏览器如何决定使用哪个版本
浏览器在发起请求时会根据以下优先级选择协议版本:
1. 优先选择 HTTP/3
当浏览器和服务器都支持 HTTP/3 且网络环境支持 QUIC 协议时,浏览器会优先选择 HTTP/3。由于 QUIC 使用 UDP 协议,相较于 TCP,可以实现更低的连接延迟和更高的性能。
2. 如果 HTTP/3 不可用,则尝试 HTTP/2
如果 HTTP/3 不可用(例如,服务器不支持 QUIC 协议),浏览器会退回到 HTTP/2。HTTP/2 的多路复用和头部压缩技术能显著减少请求的延迟和带宽占用。
3. 如果 HTTP/2 也不可用,则回退到 HTTP/1.1
如果 HTTP/2 也不可用(例如,服务器只支持 HTTP/1.1),浏览器会使用 HTTP/1.1。尽管 HTTP/1.1 在性能上较为落后,但它仍然是目前最普遍支持的版本。
六、浏览器支持的协议版本
协议版本时间线与浏览器支持
| 协议版本 | 发布年份 | 主要特点 | 浏览器支持情况 |
|---|---|---|---|
| HTTP/1.1 | 1999年 | 最广泛使用的协议,支持持久连接。 | 几乎所有现代浏览器都支持。 |
| HTTP/2 | 2015年 | 引入多路复用、头部压缩等技术,优化性能。 | 主流浏览器(Chrome、Firefox、Edge、Safari…)全面支持。 |
| HTTP/3 | 2020年 | 基于QUIC协议,使用UDP,提供更低延迟和更高性能。 | Chrome、Firefox、Edge、Safari…支持,逐步普及。 |
七、总结
| 优先级 | 协议版本 | 说明 | 浏览器支持情况 |
|---|---|---|---|
| 1 | HTTP/3 | 优先选择,基于QUIC,提供低延迟和高性能 | Chrome、Firefox、Edge、Safari …支持 |
| 2 | HTTP/2 | 如果HTTP/3不可用,采用多路复用和头部压缩优化性能 | Chrome、Firefox、Edge、Safari …支持 |
| 3 | HTTP/1.1 | 如果HTTP/2不可用,回退到传统的HTTP协议,性能较低 | 所有现代浏览器都支持 |
最后:有点意外的是 HTTP/3 和 TCP协议 没有直接关系,需要重点更新一下记忆。
相关文章:
从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能
一、前言 在最近使用Apipost时,突然注意到了http/1.1和http/2,如下图: 在我根深蒂固的记忆中,对于http的理解还停留在TCP协议、三次握手。由于我的好奇心,于是触发了我被动“开卷”,所以有了这篇文章&…...
人工智能导论-第3章-知识点与学习笔记
参考教材3.2节的内容,介绍什么是自然演绎推理;解释“肯定后件”与“否定前件”两类错误的演绎推理是什么意义,给出具体例子加以阐述。参考教材3.3节的内容,介绍什么是文字(literal);介绍什么是子…...
游戏引擎 Unity - Unity 下载与安装
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
鼠标拖尾特效
文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果,能够为网页增添独特的视觉体验。它通常通过JavaScript和C…...
4 前置技术(下):git使用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 前言...
从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析
文章目录 引言项目功能介绍1. **文件操作**2. **文本编辑功能**3. **撤销与重做**4. **剪切、复制与粘贴**5. **文本查找与替换**6. **打印功能**7. **打印预览**8. **设置字体颜色**9. **设置字号**10. **设置字体**11. **左对齐**12. **右对齐**13. **居中对齐**14. **两侧对…...
解决国内服务器 npm install 卡住的问题
在使用国内云服务器时,经常会遇到 npm install 命令执行卡住的情况。本文将分享一个典型案例以及常见的解决方案。 问题描述 在执行以下命令时: mkdir test-npm cd test-npm npm init -y npm install lodash --verbose安装过程会卡在这个状态…...
DeepSeek 的含金量还在上升
大家好啊,我是董董灿。 最近 DeepSeek 越来越火了。 网上有很多针对 DeepSeek 的推理测评,除此之外,也有很多人从技术的角度来探讨 DeepSeek 带给行业的影响。 比如今天就看到了一篇文章,探讨 DeepSeek 在使用 GPU 进行模型训练…...
使用 Docker(Podman) 部署 MongoDB 数据库及使用详解
在现代开发环境中,容器化技术(如 Docker 和 Podman)已成为部署和管理应用程序的标准方式。本文将详细介绍如何使用 Podman/Docker 部署 MongoDB 数据库,并确保其他应用程序容器能够通过 Docker 网络成功连接到 MongoDB。我们将逐步…...
大模型训练(6):张量并行
0 英文缩写 Pipeline Parallelism(PP)流水线并行Tensor Parallel(TP)张量并行Data Parallelism(DP)数据并行Distributed Data Parallelism(DDP)分布式数据并行Zero Redundancy Opti…...
【力扣】238.除自身以外数组的乘积
AC截图 题目 思路 前缀积 前缀积指的是对于一个给定的数组arr,构建一个新的数组prefixProduct,其中prefixProduct[i]表示原数组从第一个元素到第i个元素(包括i)的所有元素的乘积。形式化来说: prefixProduct[0] ar…...
Nacos 的介绍和使用
1. Nacos 的介绍和安装 与 Eureka 一样,Nacos 也提供服务注册和服务发现的功能,Nacos 还支持更多元数据的管理, 同时具备配置管理功能,功能更丰富。 1.1. windows 下的安装和启动方式 下载地址:Release 2.2.3 (May …...
DeepSeek最新图像模型Janus-Pro论文阅读
目录 论文总结 摘要 1. 引言 2. 方法 2.1 架构 2.2 优化的训练策略 2.4 模型扩展 3. 实验 3.1 实施细节 3.2 评估设置 3.3 与最新技术的比较 3.4 定性结果 4. 结论 论文总结 Janus-Pro是DeepSeek最新开源的图像理解生成模型,Janus-Pro在多模态理解和文…...
【仿12306项目】基于SpringCloud,使用Sentinal对抢票业务进行限流
文章目录 一. 常见的限流算法1. 静态窗口限流2. 动态窗口限流3. 漏桶限流4. 令牌桶限流5. 令牌大闸 二. Sentinal简介三. 代码演示0. 限流场景1. 引入依赖2. 定义资源3. 定义规则4. 启动测试 四. 使用Sentinel控台监控流量1. Sentinel控台1.8.6版本下载地址2. 文档说明…...
【赵渝强老师】Spark RDD的依赖关系和任务阶段
Spark RDD彼此之间会存在一定的依赖关系。依赖关系有两种不同的类型:窄依赖和宽依赖。 窄依赖:如果父RDD的每一个分区最多只被一个子RDD的分区使用,这样的依赖关系就是窄依赖;宽依赖:如果父RDD的每一个分区被多个子RD…...
【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】
Jetson配置YOLOv11环境(6)PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…...
Verilog语言学习总结
Verilog语言学习! 目录 文章目录 前言 一、Verilog语言是什么? 1.1 Verilog简介 1.2 Verilog 和 C 的区别 1.3 Verilog 学习 二、Verilog基础知识 2.1 Verilog 的逻辑值 2.2 数字进制 2.3 Verilog标识符 2.4 Verilog 的数据类型 2.4.1 寄存器类型 2.4.2 …...
【阅读笔记】LED显示屏非均匀度校正
一、背景 发光二极管(LED)显示屏具有色彩鲜艳、图像清晰、亮度高、驱动电压低、功耗小、耐震动、价格低廉和使用寿命长等优势。LED显示图像的非均匀度是衡量LED显示屏显示质量的指标,非均匀度过高,会导致LED显示图像出现明暗不均…...
【Java异步编程】CompletableFuture基础(1):创建不同线程的子任务、子任务链式调用与异常处理
文章目录 1. 三种实现接口2. 链式调用:保证链的顺序性与异步性3. CompletableFuture创建CompletionStage子任务4. 处理异常a. 创建回调钩子b. 调用handle()方法统一处理异常和结果 5. 如何选择线程池:不同的业务选择不同的线程池 CompletableFuture是JDK…...
ESXI虚拟机中部署docker会降低服务器性能
在 8 核 16GB 的 ESXi 虚拟机中部署 Docker 的性能影响分析 在 ESXi 虚拟机中运行 Docker 容器时,性能影响主要来自以下几个方面: 虚拟化开销:ESXi 虚拟化层和 Docker 容器化层的叠加。资源竞争:虚拟机与容器之间对 CPU、内存、…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...
