zoukankan      html  css  js  c++  java
  • 浏览器缓存机制

     分级缓存策略图:

    浏览器缓存流程图:

    两个概念

      1、强缓存
      用户发送的请求,直接从客户端缓存中获取,不发送请求到服务器,不与服务器发生交互行为。

      2、协商缓存
      用户发送的请求,发送到服务器后,由服务器判定是否从缓存中获取资源。

      两者共同点:客户端获得的数据最后都是从客户端缓存中获得。

      两者的区别:从名字就可以看出,强缓存不与服务器交互,而协商缓存则需要与服务器交互。

    相关术语的解释

      1、Cache-control 

      Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。 
    cache-control 定义是:

      网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。 

    1)max-age: 设置缓存的最大的有效时间,单位为秒(s)。max-age会覆盖掉Expires
    2) s-maxage: 只用于共享缓存,比如CDN缓存(s -> share)。与max-age 的区别是:max-age用于普通缓存,
    而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖max-age 和 Expires.
    3) public:响应会被缓存,并且在多用户间共享。默认是public。
    4) private: 响应只作为私有的缓存,不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。
    5)no-cache: 指定不缓存响应,表明资源不进行缓存。但是设置了no-cache之后并不代表浏览器不缓存,而是在缓存前要向服务器确认资源是否被更改。
    因此有的时候只设置no-cache防止缓存还是不够保险,还可以加上private指令,将过期时间设为过去的时间。 6)no-store: 绝对禁止缓存。 7)must-revalidate: 如果页面过期,则去服务器进行获取。

    设置cache-control 的规则可以参见下图:

      2、Expires 
    Expires是RFC 2616(HTTP/1.0)协议中和网页缓存相关字段。用来控制缓存的失效日期,

    max-age和 expires 差不多,但是max-age级别高。expires是1.0提出来的如果有max-age,expires就差不多可以忽略掉。他们俩都是强的浏览器,他们俩不会去向服务端请求东西,直接去拿缓存,所以问题:如果服务端数据变化,但是有他俩的话还是直接拿缓存的。所以有了:

    last-modified/if-modified-since. 

     

      3、Last-Modified 
      在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客户端请求的资源,同时有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间。 

      客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问该时间之后文件是否有被修改过:

      如果服务器端的资源没有变化,则自动返回 HTTP 304(Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

     

      

     

     

     

      所以就有了etage

     

      4、Etag 

      HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。

     

  • 相关阅读:
    KVM---利用 libvirt+qemu-kvm 创建虚拟机
    docker---安装docker
    Ubuntu---VIM 常用命令
    Ubuntu--- 安装VMware 报错 Build enviroment error!
    Ubuntu---不能打开 exfat 文件系统格式的 U盘解决方法
    Ubuntu---gedit 打开windows 下 .txt 文件乱码的解决方法
    MCS-51单片机的串行口及串行通信技术
    MCS-51单片机的定时器/计数器
    MCS-51单片机的中断系统
    计算机网络——网络层
  • 原文地址:https://www.cnblogs.com/haonanZhang/p/9603512.html
Copyright © 2011-2022 走看看