1.页面加载时间 (PLT) 减少 50%。
2.无需网站作者修改任何内容。
3.将部署复杂性降至最低,无需变更网络基础设施。
4.与开源社区合作开发此新协议。
5.收集真实性能数据,验证实验性协议是否有效。
HTTP/2 所有性能增强的核心在于新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输。
HTTP/2 中新的二进制分帧层突破了这些限制,实现了完整的请求和响应复用:客户端和服务器可以将 HTTP 消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。
将 HTTP 消息分解为很多独立的帧之后,我们就可以复用多个数据流中的帧,客户端和服务器交错发送和传输这些帧的顺序就成为关键的性能决定因素。 为了做到这一点,HTTP/2 标准允许每个数据流都有一个关联的权重和依赖关系:
每个数据流都拆分成很多帧,而这些帧可以交错,还可以分别设定优先级。 因此,所有 HTTP/2 连接都是永久的,而且仅需要每个来源一个连接,随之带来诸多性能优势。
流控制是一种阻止发送方向接收方发送大量数据的机制,以免超出后者的需求或处理能力:发送方可能非常繁忙、处于较高的负载之下,也可能仅仅希望为特定数据流分配固定量的资源。
HTTP/2 新增的另一个强大的新功能是,服务器可以对一个客户端请求发送多个响应。 换句话说,除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端明确地请求。
7.标头压缩
每个 HTTP 传输都承载一组标头,这些标头说明了传输的资源及其属性。 HTTP/2 使用 HPACK 压缩格式压缩请求和响应标头元数据,这种格式采用两种简单但是强大的技术:
定义:缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。
作用:
1.可以显著提高网站和应用程序的性能。
2.减少了等待时间和网络流量
3.减少了显示资源表示形式所需的时间。
4.是页面更加响应性。
5.缓解服务器端压力,提升性能。
1.浏览器缓存
2.代理缓存
3.网关缓存
4.CDN缓存
5.反向代理缓存
Service Worker Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。
Memory Cache 读取高效,但是持续性很短,一旦关闭 Tab 页面,内存中的缓存也就被释放了。
Disk Cache 读取速度慢,容量和存储时效性上有优势,
Push Cache 读取速度慢,容量和存储时效性上有优势,
http缓存分为强制缓存和协商缓存
强制缓存 强制缓存就是文件直接从缓存中获取,不需要发送请求
协商缓存 协商缓存意思是文件已经被缓存了,但是否从缓存中读取是需要和服务器进行协商,具体如何协商要看请求头/响应头的字段设置。 协商缓存还是会发送请求的。
强缓存-Cache-Control Cache-Control 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。
缓存请求指令
Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>
4.协商缓存生效过程
Cache-Control (低版本浏览器用的是Expires,了解即可)
是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发(对于前端开发来说,缓存越多越好,so...基本上和它说886)
他用的不是时效时间max-age
第一次请求的时候,返回给客户端数据和缓存的信息,也就是一个特定的缓存标识
客户端把这个缓存标识放到缓存数据库
再次请求时 客户端先把缓存标识也一起发给服务端,进行对比
客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
Etag (唯一标识)优先级更高
Last-Modified/If-Modified-Since 返回给客户端最后这个资源的修改时间,优先级没有Etag高
对比缓存标识生效不生效时,状态码200,服务端返回body和header
在对比缓存标识生效时,状态码为304,并且报文大小和请求时间大大减少。
原因是,服务端在进行标识比较后,只返回header部分,通过状态码通知客户端使用缓存,不再需要将报文主体部分返回给客户端。
比如页面引入了一个 JQuery,对于页面来说这个脚本就是一个工具库,基本上是不会发生变化的,对于这种资源可以将它的缓存时间设置得长一点,比如如下这个地址的脚本:
是一个注册在指定源和路径下的事件驱动 worker
;特点是:
worker
上下文,因此它不能访问 DOM
;API
(如 XHR
和 localStorage
)不能在 Service Worker
中使用;HTTPS
环境下才可以使用;说了这么多特点,那它和缓存有啥关系?其实它有一个功能就是离线缓存:Service Worker Cache
;区别于浏览器内部的 memory cache
和 disk cache
,它允许我们自己去操控缓存,具体操作过程可以参看 Using_Service_Workers;通过 Service Worker
设置的缓存会出现在浏览器开发者工具 Application
面板下的 Cache Storage
中。
是浏览器内存中的缓存,相比于 disk cache
它的特点是读取速度快,但容量小,且时效性短,一旦浏览器 tab
页关闭,memory cache
就将被清空。memory cache
会自动缓存所有资源嘛?答案肯定是否定的,当 HTTP
头设置了 Cache-Control: no-store
的时候或者浏览器设置了 Disabled cache
就无法把资源存入内存了,其实也无法存入硬盘。当从 memory cache
中查找缓存的时候,不仅仅会去匹配资源的 URL
,还会看其 Content-type
是否相同。
也叫 HTTP cache
是存在硬盘中的缓存,根据 HTTP
头部的各类字段进行判定资源的缓存规则,比如是否可以缓存,什么时候过期,过期之后需要重新发起请求吗?相比于 memory cache
的 disk cache
拥有存储空间时间长等优点,网站中的绝大多数资源都是存在 disk cache
中的。
浏览器如何判断一个资源是存入内存还是硬盘呢?关于这个问题,网上说法不一,不过比较靠谱的观点是:对于大文件大概率会存入硬盘中;当前系统内存使用率高的话,文件优先存入硬盘。
缓存按照缓存位置划分,其实还有一个 HTTP/2
的内容 push cache
,由于目前国内对 HTTP/2
应用还不广泛,且网上对 push cache
的知识还不齐全,所以本篇不打算介绍这块,感兴趣的可以阅读这篇文章:HTTP/2 push is tougher than I thought
https://juejin.cn/post/6844904135137951758
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。