作者: gycgycgyc | 来源:发表于2017-10-12 10:36 被阅读19次

    HTTP及HTTP缓存机制(前端)

    HTTP

    HTTP是一种获取网络资源的协议,是Web上获取数据交换的基础。

    客户端通常是浏览器,当输入URL时,浏览器发起一个请求,以获取HTML文档,服务端收到请求后,生成相应的HTML文档,返回给浏览器。浏览器解析返回的HTML文档,并根据文档中的资源信息发送其他的请求获取这些资源,例如CSS,js,图片等。浏览器根据这些资源绘制页面。

    从输入URL到html 页面加载的详细过程:

    1. 加载资源:
      浏览器根据DNS服务器得到域名的IP地址;
      向这个IP地址的机器发送http请求;
      服务器接收、处理并返回http请求;
      浏览器得到返回内容。
    2. 渲染页面:
      根据 html 结构生成 DOM 树;
      根据 CSS 生成 CSSOM(CSS对象模型);
      将 DOM 和 CSSOM 整合生成 RenderTree(渲染树);
      根据 RenderTree 开始渲染和展示(布局渲染树Layout、绘制渲染树Painting);
      遇到<script>标签时,会执行 并阻塞渲染。
    HTTP协议是无状态,有会话的

    HTTP协议是无状态的。在同一个连接中,两个成功执行的请求之间是没有关系的。对服务器来说,它并不知道这两个请求来自同一个连接。为了解决这个问题,可以使用cookie和session创建有状态的会话,也可以在请求头中添加token来解决这个问题。

    var request  = new XMLHttpRequest();
    request.open('GET', '', true);
    request.setRequestHeader('Authorization', '');
    request.send();
    
    代理服务器

    在浏览器和服务器之间可能存在代理服务器,其作用:
    (1) 缓存
    (2) 过滤,像反病毒扫描
    (3)负载均衡,让多个服务器服务不同的请求
    (4)对不同资源的权限控制
    (5)登录,允许存储历史信息

    HTTP缓存机制

    比如获取一个html页面,一张图片,一个js文件,都要遵循这个协议。这些文件的特点是不经常变化。将这些不常变化的文件存储起来,对客户端来说是优化用户体验的好方法。

    HTTP缓存有多种规则,根据是否需要重新从服务器发起请求来分类:强制缓存对比缓存

    已存在缓存数据时,仅强制缓存:

    强制缓存

    已存在缓存数据时,仅对比缓存:

    对比缓存

    以上我们会发现两种缓存规则的不同。强制缓存如果生效,不需要再和服务器发生交互,而对比缓存不论是否失效,都需要和客户端发生交互。
    两种缓存规则可以同时存在,强制缓存优先级高于对比缓存。当执行强制缓存规则,如果缓存生效,直接使用缓存,不再执行对比缓存规则。

    强制缓存

    强制缓存机制下,如果缓存数据没有失效,可以直接使用缓存数据,那么浏览器是如何知道缓存数据是否失效呢?
    我们知道,在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息会包含在响应的header中。
    对于强制缓存,响应的header中,会有两个字段来标明失效规则(Expires/Cache-Control),在开发者工具中,可以看到网络请求的详细信息。

    Expires

    Expires值为服务器返回的到期时间,即下一次请求的时候,如果请求时间小于Expires值,就直接使用缓存数据。
    不过Expires是 HTTP 1.0 的东西,现在浏览器默认使用 HTTP 1.1,所以它的左右基本忽略。
    另一个问题是,到期时间是由服务端返回的,客户端的时间跟服务端时间可能有误差,这样会导致缓存命中的误差。
    所以,HTTP 1.1 中,使用 Cache-Control 替代。

    Cache-Control

    Cache-Control常见的取值有private,public,no-cache,max-age,no-store,默认值为private

    private    客户端可以缓存
    public     客户端和代理服务器都可以缓存
    max-age=xxxx   缓存的内容将在xxxx秒后失效
    no-cache   需要使用对比缓存来验证缓存数据
    no-store   所有内容都不会缓存,强制缓存和对比缓存都不会触发
    

    浏览器获取的时间是客户端的时间,和后端的时间可能存在出入。而且用户可以随意修改客户端的时间。于是,服务器返回了一个绝对时间,所以就返回了Cache-Control: max-age:600(毫秒),浏览器

    对比缓存

    ···
    ···
    ···

    引申

    (1)http header中与缓存有关的key:

    Cache-Control:资源可以通过设置Cache-Control这个HTTP header来定义其缓存策略。
    Pragma: http1.0字段,Pragma:no-cache, 作用和Cache-Control:no-cache相同。
    Expires: http1.0字段,指定缓存的过期时间。
    Last-Modified: 资源最后一次的修改时间。
    ETag: 唯一标识请求资源的字符串。

    (2)缓存协商策略用于重新验证缓存资源是否有效, 有关的key:

    If-Modified-Since:缓存校验字段, 值为资源最后一次的修改时间, 即上次收到的Last-Modified值。
    If-Unmodified-Since:与If-Modified-Since相同,而处理方式与之相反。
    If-Match:缓存校验字段, 值为唯一标识请求资源的字符串, 即上次收到的ETag值。
    If-None-Match:与If-Match相同,而处理方式与If-Match相反。

    相关文章

      网友评论

        本文标题:

        本文链接:https://www.haomeiwen.com/subject/vntbyxtx.html