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');}
});
建议:
- 只推送 必定使用 的资源(如主文档关联的 CSS)
- 避免推送大文件或已缓存的资源
- 使用
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 > 图片)。
五、实际开发注意事项
- 强制 HTTPS:主流浏览器只支持 HTTP/2 over TLS,需部署 SSL 证书(Let's Encrypt 免费)。
- 服务端兼容性:确认 CDN 和服务器支持 HTTP/2(如 Nginx >= 1.9.5)。
- 监控性能:使用 DevTools 的 Network 面板检查协议版本(h2 表示 HTTP/2),瀑布图分析流竞争。
- 避免反模式:
- 冗余推送:用 Chrome 的
Coverage工具统计未使用代码,避免推送无用资源。 - 过度分块:小文件过多增加头部开销(平衡缓存和请求数)。
- 冗余推送:用 Chrome 的
六、迁移到 HTTP/2 的步骤
- 升级后端:配置 Nginx/Apache 启用 HTTP/2。
- 优化资源:拆分合并的文件,采用内容哈希命名(Webpack 的
[contenthash])。 - 测试推送:用
chrome://net-internals/#http2检查推送是否生效。 - 压测评估:使用
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 的区别及新特性详解 一、核心区别:连接管理与多路复用 HTTP/1.1 使用「短连接」或「持久连接」,但每个 TCP 连接在同一时刻只能处理一个请求(HOL Blocking)。浏览器通常通过开启多个 TCP 连接(…...
Redis实战篇《黑马点评》8 附近商铺
8.附近商户 8.1GEO数据结构的基本用法 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据,常见的命令有 GEOADD:添加一个地理空间…...
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作, 实战开发 导入项目 我把得到的项目解压到本地,我们开…...
通过ollama本地化部署deepseek后,通过API方式请求特别的慢
通过ollama本地化部署deepseek后,通过API方式请求特别的慢 一、现象二、原因分析 一、现象 deepseek火了之后,本地私有化部署大模型的门槛大大降低,即使是在家里的windows电脑,也非常简单就可以安装大模型并且使用,最…...
CSS3中布局方式说明
CSS3 提供了多种灵活的布局方式,适用于不同的场景和需求。以下是主要的布局方式及其特点: 1. Flexbox 布局(弹性盒子) 用途:一维布局(水平或垂直方向排列元素)。特点: 通过 display…...
kafka-web管理工具cmak
一. 背景: 日常运维工作中,采用cli的方式进行kafka集群的管理,还是比较繁琐的(指令复杂?)。为方便管理,可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak: cmak是 Yahoo 贡献的一款强大的 Apac…...
T41LQ专为人工智能物联网(AIoT)应用设计,适用于智能安防、智能家居、机器视觉等领域 软硬件资料+样品测试
君正(Ingenic)T系列芯片涵盖多个型号,每个型号根据不同应用需求提供了多个版本。以下是各型号及其主要版本: 1. T23系列: T23N:标准版,适用于移动摄像机、安全监控、视频通话和视频分析等应用…...
Unity中动态切换光照贴图LightProbe的方法
关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...
考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)
一、线性表基础概念 1.1 定义与分类 定义:线性表是由n(n≥0)个相同类型数据元素构成的有限序列,元素间呈线性关系。 分类: 顺序表:元素按逻辑顺序存储在一段连续的物理空间中(数组实现&…...
C++基础知识(七)之STL算法、智能指针、文件操作、C++异常、断言
二十一、STL算法 STL提供了很多处理容器的函数模板,它们的设计是相同的,有以下特点: 1)用迭代器表示需要处理数据的区间。 2)返回迭代器放置处理数据的结果(如果有结果)。 3)接受…...
vue3.2响应式优化
Vue 3.2 在响应式方面做了诸多优化,进一步提升了性能,下面为你详细介绍: 1. shallowReactive 和 shallowRef 的性能优势 原理:shallowReactive 和 shallowRef 是浅层响应式 API。shallowReactive 仅对对象的第一层属性进行响应式…...
【Linux】线程概念与控制
线程概念与控制 一.Linux线程概念1.什么是线程?2.分页式存储管理1.虚拟地址和页表的由来2.物理内存管理3.页表4.页目录结构5.两级页表的地址转换6.缺页中断(异常) 3.线程的优点(面试题)4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个…...
零基础学习Python之循环详解:从入门到实践_我的学习Python记录11
零基础学习Python之循环详解:从入门到实践_我的学习Python记录11 一、前言 最近我在学习Python,发现很多编程概念和用法都让我感到陌生,尤其是循环这个概念。今天,我将分享我学到的循环知识,希望能帮助到和我一样的初…...
电子电路中,正负双电源供电的需求原因
1. 允许信号双向摆动 - **交流信号的处理**:许多电路(如音频放大器、运算放大器)需要处理正负交替变化的交流信号(例如声音信号、传感器输出)。如果仅用单正电源(如12V),信号的“负…...
ROS环境搭建
ROS首次搭建环境 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好,建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...
java后端开发day26--常用API(一)
(以下内容全部来自上述课程) 1.Math 1.简单介绍 是一个帮助我们用于进行数学计算的工具类私有化构造方法,所有的方法都是静态的 2.常用方法 不要背,忘了就查文档。 3.练习题 1.判断一个数是否为质数(优化版&am…...
SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析
引言:接口测试的必要性 在微服务架构盛行的今天,SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测,使用OpenAPI规范打通测试全流程,让您的接口质量保障体系更加完备。…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
Python中文自然语言处理库SnowNLP
SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库,专为处理中文文本而设计。它受到 TextBlob 的启发,但与 TextBlob 不同的是,SnowNLP 没有使用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字…...
Linux-计算机网络.udp
1.收发函数: read()/write () ///通用文件读写,可以操作套接字。 recv(,0) /send(,0) ///TCP 常用套机字读写 recvfrom()/sendto() ///UDP 常用套接字读写 ssize_t recv(int sockfd, void *buf, size_t len, …...
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...
Docker安装Postgres_16数据库
PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统(RDBMS),以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能,适用于各种规模的应用程序; 适用传…...
VSCode 移除EmmyLua插件的红色波浪线提示
VSCode 中安装插件EmmyLua,然后打开lua文件的时候,如果lua代码引用了C#脚本的变量,经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示,这个提示看着比较烦人,我们可以通…...
快慢指针【等分链表、判断链表中是否存在环】
一、等分链表:找到链表的中间节点 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 一样,连接并访问 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
格式化输入输出 函数名:printf() 格式控制符:%c //把数据转换成字符型 cahr %d //把数据转换为有符号十进制整型 int short %ld // long %f //把数据转成单精度浮点型 flot %d //double %s …...
Linux的进程观:简单性如何成就强大性(三)
1. 环境变量 1.1. 基本概念 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接…...
element-ui infiniteScroll 组件源码分享
简单分享 infiniteScroll 组件源码,主要有以下四个方面: 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构: 二、页面属性。 2.1 infinite-scroll-disab…...
vulnhub靶场之【digitalworld.local系列】的bravery靶机
前言 靶机:digitalworld.local-bravery,IP地址为192.168.10.8 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机采用virtualbox虚拟机,网卡都为桥接模式 这里官方给的有两种方式,…...
