写点什么

HTTP/2 推送之难,远超想象

  • 2017-06-11
  • 本文字数:11023 字

    阅读完需:约 36 分钟

在讨论页面加载性能问题时,我经常听到有人说“HTTP/2 推送可以解决这问题”,但我对这个技术的了解不多,于是打算深入研究一下。

HTTP/2 推送远比我最初想象中更复杂,也更底层,但最让我措手不及的地方在于,这种技术在不同浏览器上的表现竟然有这么大的差别,本来我还觉得这技术已经足够成熟,可以在生产环境中使用了。

本文并不是那种认为“HTTP/2 推送一无是处”的吐槽文。我觉得 HTTP/2 推送真的很强大,以后还会更加完善,但并不算能解决所有问题的万灵药。

完整的 Fetch 路径

在页面和目标服务器间,横亘着一系列可能拦截请求的缓存和其他机制:

当人们希望尝试或向别人解释 Git 或其他看得见的东西时,通常会使用类似上面这样的流程示意图,在本来就懂的人看来,这样的示意图一目了然,但不懂的人往往会一头雾水。如果你也有这种感觉,那要先说声抱歉了!希望下文能帮你更好地理解。

HTTP/2 推送的工作原理

  • 页面:嘿 example.com,能把你的首页让我看一看吗?
  • 服务器:没问题!哦,在我给你发送首页的同时,还需要发送一些样式表、图片、JavaScript,以及一些 JSON。
  • 页面:额,好的。
  • 页面:我已经看到 HTML 了,但貌似还需要一个样式……哦,好像你已经发过来了,酷!

服务器响应请求时,可以顺便包含额外的资源。例如包含一系列请求报头,这样稍后浏览器就知道如何匹配不同报头。这些额外的资源位于缓存中,当浏览器请求的资源与缓存中的匹配时即可直接从缓存中获取。

这种方法可以改善性能,原因在于可以提前发送可能需要的资源,而不需要等待浏览器索取,因此可以提高页面加载速度。

多年来我对 HTTP/2 推送的了解仅限于此,听起来挺简单,但魔鬼往往隐藏在细节中……

任何东西都可以使用推送缓存

HTTP/2 推送是一种底层网络功能,用到网络栈的任何东西都可以使用该功能。但只有确保一致性以及可预测性,才能发挥最大作用。

我试着推送一些资源,并通过下列方式收集:

  • fetch()
  • XMLHttpRequest
2017-06-11 17:164767
用户头像

发布了 283 篇内容, 共 124.4 次阅读, 收获喜欢 63 次。

关注

评论

发布
暂无评论
发现更多内容

AHPA:开启 Kubernetes 弹性预测之门

阿里巴巴云原生

阿里云 Kubernetes 云原生 AHPA 弹性预测

Go学习笔记——条件判断if

为自己带盐

Go 学习笔记 3月月更

理解Restful风格

蜜糖的代码注释

RESTful 接口规范 REST API 3月月更

CNI 这么多,怎么选?| 容器网络系列第1期

BoCloud博云

Kubernetes 容器云 cni 容器网络平台

面试官:对于宏任务和微任务,你知道多少?

是乃德也是Ned

JavaScript 面试 前端 ES6 Promise

程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis

华为云数据库小助手

性能分析 GaussDB GaussDB ( for Redis ) 华为云数据库 开源Redis

科技创新力强,旺链科技创始人刘涛荣登G60科创走廊创业榜单

旺链科技

区块链 产业区块链 创新创业

虎符交易所完成2月HOO回购 HOO单月涨幅高达40%

区块链前沿News

Hoo 虎符交易所 平台币

云原生小课堂 | Envoy请求流程源码解析(二):请求解析

York

云原生 istio 网络 envoy Service Mesh (ASM)

重点操作之上线、恢复、部署 - 大屏云极简使用手册

shulinwu

信息安全无小事!教你如何做日志脱敏

卢永德

豆瓣9.6分,Scala编程圣经第5版重磅来袭!

博文视点Broadview

尚硅谷Maven新版视频教程发布

@零度

maven

程序设计优化之管道数据流

有道技术团队

java培训:Redis和Mysql数据怎么保持一致

@零度

MySQL redis JAVA开发

Java 8 Stream 从入门到进阶——像SQL一样玩转集合

Geek_rze78a

Java JAVA stream

优雅的DO,VO,DTO转换工具MapStruct

卢永德

3月月更

AI算力加速之道

安第斯智能云

人工智能 深度学习 异构计算

一文带你了解动态数组方法实现

xiaoyu

数据结构 算法 数组 java; 动态数组

web前端培训:react基础面试题分享

@零度

前端开发 React

upload上传文件类型的限制的几种方式(element)

lo

JavaScript

HarmonyOS UI组件在线预览,程序员直呼“不要太方便~”

HarmonyOS开发者

UI HarmonyOS

大数据Flink培训:维表Join/双流Join的方法

@零度

flink join 大数据开发

web技术分享| WebRTC控制摄像机平移、倾斜和缩放

anyRTC开发者

前端 音视频 WebRTC 摄像头 web技术分享

31 家企业入选阿里云首期云原生加速器,共建云原生行业新生态

阿里巴巴云原生

阿里云 云原生 云原生加速器 招募 行业生态

优雅的编码习惯总是让人心情愉悦(Shell篇)

XinXing

Shell Code 优雅 脚本 规范

黄东旭当选 CCF 数据库专业委员会、开源发展委员会、大数据专家委员会执行委员

PingCAP

OpenHarmony开源开发者成长计划 | 知识赋能第四期课程——标准系统HDF开发

Anna

直播 赋能 OpenHarmony

作为前端上传图片的两种方法

小学僧

3月程序媛福利 3月月更

在 Nebula K8s 集群中使用 nebula-spark-connector 和 nebula-algorithm

NebulaGraph

数据库 开源 分布式系统 图数据库

这场汇聚行业顶级大咖的Meetup,有哪些不容错过的干货?| IDP Meetup 01

Baihai IDP

人工智能 AI 生态 Meetup

HTTP/2推送之难,远超想象_Google_Jake Archibald_InfoQ精选文章