当前位置: 首页 > article >正文

HTTP/1.1 和 HTTP/2 的区别,HTTP/2 有哪些新特性?

HTTP/1.1 和 HTTP/2 的区别及新特性详解

一、核心区别:连接管理与多路复用

HTTP/1.1​ 使用「短连接」或「持久连接」,但每个 TCP 连接在同一时刻只能处理一个请求(HOL Blocking)。浏览器通常通过开启多个 TCP 连接(6-8个)缓解阻塞,但增加了服务器压力。

// HTTP/1.1 下需合并资源减少请求数(但可能影响缓存)
// 使用工具如 Webpack 合并 JS:
module.exports = {entry: './src/index.js',output: { filename: 'bundle.js' } // 所有模块打包成一个文件
};

HTTP/2​ 通过 ​二进制分帧层​ 实现多路复用,单个连接可并行处理数百个请求,彻底解决队头阻塞。资源无需合并,提升缓存利用率。

// HTTP/2 下拆分模块更优(利用细粒度缓存)
// Webpack 配置拆包:
module.exports = {optimization: {splitChunks: { chunks: 'all' } // 自动拆分公共依赖}
};

建议:迁移到 HTTP/2 后,停止使用雪碧图、合并 CSS/JS,改为独立文件 + 长期缓存(hash 文件名)。


二、头部压缩:HPACK 算法

HTTP/1.1​ 的头部以纯文本传输,重复头部(如 Cookie、User-Agent)造成冗余。
HTTP/2​ 使用 ​HPACK​ 算法,通过静态表(61个常用头)、动态表和 Huffman 编码压缩头部,减少 30%~90% 的开销。

# Nginx 配置(默认启用 HPACK)
server {listen 443 ssl http2;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;
}

注意:避免滥用 Cookie,控制 Header 大小(如用 JWT 替代 Session Cookie)。


三、服务器推送(Server Push)

HTTP/2​ 允许服务器主动推送资源,减少 RTT(Round-Trip Time)。适用于关键路径资源(如 CSS、字体)。

# Nginx 推送示例:当请求 index.html 时推送 style.css
location = /index.html {http2_push /static/style.css;
}
// Node.js 实现推送(使用 http2 模块)
const http2 = require('http2');
const server = http2.createSecureServer({ cert, key });
server.on('stream', (stream, headers) => {if (headers[':path'] === '/index.html') {stream.pushStream({ ':path': '/style.css' }, (pushStream) => {pushStream.respondWithFile('/static/style.css');});stream.respondWithFile('/index.html');}
});

建议

  1. 只推送 ​必定使用​ 的资源(如主文档关联的 CSS)
  2. 避免推送大文件或已缓存的资源
  3. 使用 preload 头部替代 Push(更灵活)
 

html

<!-- 使用 preload 提示浏览器预加载 -->
<link rel="preload" href="critical.css" as="style">

四、流优先级(Stream Priority)

HTTP/2​ 允许为每个流设置权重(1~256)和依赖关系,优化关键资源加载顺序。

 

javascript

// 前端通过 Importance 属性提示优先级
fetch('video.mp4', { importance: 'high' }); // 高优先级
fetch('analytics.js', { importance: 'low' });

注意:后端需正确配置优先级策略。例如,Nginx 默认根据资源类型分配优先级(CSS > 图片)。


五、实际开发注意事项
  1. 强制 HTTPS:主流浏览器只支持 HTTP/2 over TLS,需部署 SSL 证书(Let's Encrypt 免费)。
  2. 服务端兼容性:确认 CDN 和服务器支持 HTTP/2(如 Nginx >= 1.9.5)。
  3. 监控性能:使用 DevTools 的 Network 面板检查协议版本(h2 表示 HTTP/2),瀑布图分析流竞争。
  4. 避免反模式
    • 冗余推送:用 Chrome 的 Coverage 工具统计未使用代码,避免推送无用资源。
    • 过度分块:小文件过多增加头部开销(平衡缓存和请求数)。

六、迁移到 HTTP/2 的步骤
  1. 升级后端:配置 Nginx/Apache 启用 HTTP/2。
  2. 优化资源:拆分合并的文件,采用内容哈希命名(Webpack 的 [contenthash])。
  3. 测试推送:用 chrome://net-internals/#http2 检查推送是否生效。
  4. 压测评估:使用 h2load 或 wrk 对比性能提升。
# 示例:使用 h2load 压测
h2load -n 100000 -c 100 -m 100 https://yoursite.com

总结

HTTP/2 通过多路复用、头部压缩等特性大幅提升性能,但需调整传统优化策略(如放弃合并文件)。

合理使用 Server Push 和流优先级,结合 Preload/Prefetch 精细控制资源加载,同时注意避免过度推送和头部膨胀。实践中需综合监控、压测和渐进式迁移,才能最大化协议优势。

相关文章:

HTTP/1.1 和 HTTP/2 的区别,HTTP/2 有哪些新特性?

HTTP/1.1 和 HTTP/2 的区别及新特性详解 一、核心区别&#xff1a;连接管理与多路复用 HTTP/1.1​ 使用「短连接」或「持久连接」&#xff0c;但每个 TCP 连接在同一时刻只能处理一个请求&#xff08;HOL Blocking&#xff09;。浏览器通常通过开启多个 TCP 连接&#xff08;…...

Redis实战篇《黑马点评》8 附近商铺

8.附近商户 8.1GEO数据结构的基本用法 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据&#xff0c;常见的命令有 GEOADD&#xff1a;添加一个地理空间…...

【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡

【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作&#xff0c; 实战开发 导入项目 我把得到的项目解压到本地&#xff0c;我们开…...

通过ollama本地化部署deepseek后,通过API方式请求特别的慢

通过ollama本地化部署deepseek后&#xff0c;通过API方式请求特别的慢 一、现象二、原因分析 一、现象 deepseek火了之后&#xff0c;本地私有化部署大模型的门槛大大降低&#xff0c;即使是在家里的windows电脑&#xff0c;也非常简单就可以安装大模型并且使用&#xff0c;最…...

CSS3中布局方式说明

CSS3 提供了多种灵活的布局方式&#xff0c;适用于不同的场景和需求。以下是主要的布局方式及其特点&#xff1a; 1. Flexbox 布局&#xff08;弹性盒子&#xff09; 用途&#xff1a;一维布局&#xff08;水平或垂直方向排列元素&#xff09;。特点&#xff1a; 通过 display…...

kafka-web管理工具cmak

一. 背景&#xff1a; 日常运维工作中&#xff0c;采用cli的方式进行kafka集群的管理&#xff0c;还是比较繁琐的(指令复杂&#xff1f;)。为方便管理&#xff0c;可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak&#xff1a; cmak是 Yahoo 贡献的一款强大的 Apac…...

T41LQ专为人工智能物联网(AIoT)应用设计,适用于智能安防、智能家居、机器视觉等领域 软硬件资料+样品测试

君正&#xff08;Ingenic&#xff09;T系列芯片涵盖多个型号&#xff0c;每个型号根据不同应用需求提供了多个版本。以下是各型号及其主要版本&#xff1a; 1. T23系列&#xff1a; T23N&#xff1a;标准版&#xff0c;适用于移动摄像机、安全监控、视频通话和视频分析等应用…...

Unity中动态切换光照贴图LightProbe的方法

关键代码&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图&#xff1a;lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...

考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)

一、线性表基础概念 1.1 定义与分类 定义&#xff1a;线性表是由n&#xff08;n≥0&#xff09;个相同类型数据元素构成的有限序列&#xff0c;元素间呈线性关系。 分类&#xff1a; 顺序表&#xff1a;元素按逻辑顺序存储在一段连续的物理空间中&#xff08;数组实现&…...

C++基础知识(七)之STL算法、智能指针、文件操作、C++异常、断言

二十一、STL算法 STL提供了很多处理容器的函数模板&#xff0c;它们的设计是相同的&#xff0c;有以下特点&#xff1a; 1&#xff09;用迭代器表示需要处理数据的区间。 2&#xff09;返回迭代器放置处理数据的结果&#xff08;如果有结果&#xff09;。 3&#xff09;接受…...

vue3.2响应式优化

Vue 3.2 在响应式方面做了诸多优化&#xff0c;进一步提升了性能&#xff0c;下面为你详细介绍&#xff1a; 1. shallowReactive 和 shallowRef 的性能优势 原理&#xff1a;shallowReactive 和 shallowRef 是浅层响应式 API。shallowReactive 仅对对象的第一层属性进行响应式…...

【Linux】线程概念与控制

线程概念与控制 一.Linux线程概念1.什么是线程&#xff1f;2.分页式存储管理1.虚拟地址和页表的由来2.物理内存管理3.页表4.页目录结构5.两级页表的地址转换6.缺页中断(异常) 3.线程的优点(面试题)4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个…...

零基础学习Python之循环详解:从入门到实践_我的学习Python记录11

零基础学习Python之循环详解&#xff1a;从入门到实践_我的学习Python记录11 一、前言 最近我在学习Python&#xff0c;发现很多编程概念和用法都让我感到陌生&#xff0c;尤其是循环这个概念。今天&#xff0c;我将分享我学到的循环知识&#xff0c;希望能帮助到和我一样的初…...

电子电路中,正负双电源供电的需求原因

1. 允许信号双向摆动 - **交流信号的处理**&#xff1a;许多电路&#xff08;如音频放大器、运算放大器&#xff09;需要处理正负交替变化的交流信号&#xff08;例如声音信号、传感器输出&#xff09;。如果仅用单正电源&#xff08;如12V&#xff09;&#xff0c;信号的“负…...

ROS环境搭建

ROS首次搭建环境 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好&#xff0c;建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...

java后端开发day26--常用API(一)

&#xff08;以下内容全部来自上述课程&#xff09; 1.Math 1.简单介绍 是一个帮助我们用于进行数学计算的工具类私有化构造方法&#xff0c;所有的方法都是静态的 2.常用方法 不要背&#xff0c;忘了就查文档。 3.练习题 1.判断一个数是否为质数&#xff08;优化版&am…...

SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析

引言&#xff1a;接口测试的必要性 在微服务架构盛行的今天&#xff0c;SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测&#xff0c;使用OpenAPI规范打通测试全流程&#xff0c;让您的接口质量保障体系更加完备。…...

分布式中间件:Redis介绍

目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串&#xff08;String&#xff09; 哈希&#xff08;Hash&#xff09; 列表&#xff08;List&#xff09; 集合&#xff08;Set&#xff09; 有序集合&…...

Python中文自然语言处理库SnowNLP

SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库&#xff0c;专为处理中文文本而设计。它受到 TextBlob 的启发&#xff0c;但与 TextBlob 不同的是&#xff0c;SnowNLP 没有使用 NLTK&#xff0c;所有的算法都是自己实现的&#xff0c;并且自带了一些训练好的字…...

Linux-计算机网络.udp

1.收发函数: read&#xff08;&#xff09;/write () ///通用文件读写&#xff0c;可以操作套接字。 recv(,0) /send(,0) ///TCP 常用套机字读写 recvfrom()/sendto() ///UDP 常用套接字读写 ssize_t recv(int sockfd, void *buf, size_t len, …...

【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法

【大厂AI实践】清华&#xff1a;清华古典诗歌自动生成系统“九歌”的算法 &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...

Docker安装Postgres_16数据库

PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能&#xff0c;适用于各种规模的应用程序; 适用传…...

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua&#xff0c;然后打开lua文件的时候&#xff0c;如果lua代码引用了C#脚本的变量&#xff0c;经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示&#xff0c;这个提示看着比较烦人&#xff0c;我们可以通…...

快慢指针【等分链表、判断链表中是否存在环】

一、等分链表&#xff1a;找到链表的中间节点 Java 实现 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…...

doris:阿里云 DLF

阿里云 Data Lake Formation(DLF) 是阿里云上的统一元数据管理服务。兼容 Hive Metastore 协议。 什么是 Data Lake Formation 因此我们也可以和访问 Hive Metastore 一样&#xff0c;连接并访问 DLF。 连接 DLF​ 创建 DLF Catalog​ CREATE CATALOG dlf PROPERTIES ("…...

大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘

文章目录 一、架构设计深度解剖1.1 核心架构对比图谱1.2 动态MoE架构实现架构差异分析表 二、训练策略全面对比2.1 训练数据工程对比2.2 分布式训练代码对比DeepSeek混合并行实现GPT-4 Megatron实现对比 2.3 关键训练参数对比 三、性能表现多维评测3.1 基准测试全景对比3.2 推理…...

C语言基础知识02

格式化输入输出 函数名&#xff1a;printf&#xff08;&#xff09; 格式控制符&#xff1a;%c //把数据转换成字符型 cahr %d //把数据转换为有符号十进制整型 int short %ld // long %f //把数据转成单精度浮点型 flot %d //double %s …...

Linux的进程观:简单性如何成就强大性(三)

1. 环境变量 1.1. 基本概念 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪⾥&#xff0c;但是照样可以链接…...

element-ui infiniteScroll 组件源码分享

简单分享 infiniteScroll 组件源码&#xff0c;主要有以下四个方面&#xff1a; 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构&#xff1a; 二、页面属性。 2.1 infinite-scroll-disab…...

vulnhub靶场之【digitalworld.local系列】的bravery靶机

前言 靶机&#xff1a;digitalworld.local-bravery&#xff0c;IP地址为192.168.10.8 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机采用virtualbox虚拟机&#xff0c;网卡都为桥接模式 这里官方给的有两种方式&#xff0c;…...