计算机网络笔记:HTTP协议关于缓存

强缓存

强缓存分为两种情况,一种是发送HTTP请求,一种不需要发送。

首先检查强缓存,这个阶段不需要发送HTTP请求。通过查找不同的字段来进行,不同的HTTP版本所以不同。

HTTP1.0版本,使用的是Expires,HTTP1.1使用的是Cache-Control。

  • Expires

Expires即过期时间,时间是相对于服务器的时间而言的,存在于服务端返回的响应头中,在这个过期时间之前可以直接从缓存里面获取数据,无需再次请求。比如下面这样:

Expires:Mon, 29 Jun 2022 11:10:23 GMT
表示该资源在2022年7月29日11:10:23过期,过期时就会重新向服务器发起请求。

这个方式有一个问题就是服务器的时间和浏览器的时间可能并不一致,所以HTTP1.1提出新的字段代替它。

  • Cache-Control

HTTP1.1版本中,使用的就是该字段,这个字段采用的时间是过期时长,对应的是max-age。

Cache-Control:max-age=6000

上面代表该资源返回后6000秒,可以直接使用缓存。

注意点

当Expires和Cache-Control同时存在时,优先考虑Cache-Control。如果当缓存资源失效了,也就是没有强缓存,接下来就进入协商缓存。

协商缓存

当强缓存失效后,浏览器在请求头中携带响应的缓存Tag来向服务器发送请求,服务器根据对应的tag,来决定是否使用缓存。

缓存分为两种,Last-ModifiedETag。两者各有优势。

  • Last-Modified

    • 这个字段表示的是最后修改时间。在浏览器第一次给服务器发送请求后,服务器会在响应头中加上这个字段。
    • 浏览器接收到后,如果再次请求,会在请求头中携带If-Modified-Since字段,这个字段的值也就是服务器传来的最后修改时间。
    • 服务器拿到请求头中的If-Modified-Since的字段后,其实会和这个服务器中该资源的最后修改时间对比:如果请求头中的这个值小于最后修改时间,说明是时候更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。否则返回304,告诉浏览器直接使用缓存。
  • ETag

    • ETag是服务器根据当前文件的内容,对文件生成唯一的标识,比如MD5算法,只要里面的内容有改动,这个值就会修改,服务器通过把响应头把该字段给浏览器。
    • 浏览器接受到ETag值,会在下次请求的时候,将这个值作为If-None-Match这个字段的内容,发给服务器。
    • 服务器接收到If-None-Match后,会跟服务器上该资源的ETag进行比对,如果两者一样的话,直接返回304,告诉浏览器直接使用缓存如果不一样的话,说明内容更新了,返回新的资源,跟常规的HTTP请求响应的流程一样。

两者对比

  • 性能上Last-Modified优于ETagLast-Modified记录的是时间点,而Etag需要根据文件的MD5算法生成对应的hash值。

  • 精度上ETag优于Last-ModifiedETag按照内容给资源带上标识,能准确感知资源变化,Last-Modified在某些场景并不能准确感知变化,比如编辑了资源文件,但是文件内容并没有更改,这样也会造成缓存失效。Last-Modified 能够感知的单位时间是秒,如果文件在 1 秒内改变了多次,那么这时候的Last-Modified并没有体现出修改了。

  • 最后,如果两种方式都支持的话,服务器会优先考虑ETag

缓存位置

缓存位置种类,优先级从高到低排列分别:Service Worker——Memory Cache——Disk Cache——Push Cache

  • Service Worker
    这个应用场景比如PWA,它借鉴了Web Worker思路,由于它脱离了浏览器的窗体,因此无法直接访问DOM。它能完成的功能比如:离线缓存、消息推送和网络代理,其中离线缓存就是·Service Worker Cache·。

  • Memory Cache
    指的是内存缓存,从效率上讲它是最快的,从存活时间来讲又是最短的,当渲染进程结束后,内存缓存也就不存在了。

  • Disk Cache
    存储在磁盘中的缓存,从存取效率上讲是比内存缓存慢的,优势在于存储容量和存储时长。

    Disk Cache VS Memory Cache 两者对比

    • 内容使用率高的话,文件优先进入磁盘。
    • 比较大的JS,CSS文件会直接放入磁盘,反之放入内存。
  • Push Cache
    推送缓存,是针对HTTP/2标准下的推送资源设定的 ,是浏览器缓存的最后一道缓存机制,是在设置了Last-Modifed但没有设置Cache-Control或者Expires时触发,也就是只拿到最后更新时间,但没有设置过期时间,这种情况下浏览器会有一个默认的缓存策略push cache,自动设置过期时间:(Date - Last-Modified)*0.1,也就是当前时间减去最后更新时间后再乘10%。这种策略只在会话session中存在,会话结束就被释放了。

猜你喜欢

转载自blog.csdn.net/weixin_40119412/article/details/130447474
今日推荐