HTTP协议:缓存

为什么需要缓存

Web缓存是可以自动保存常见文档副本的HTTP设备,它具有以下优点:

  • 缓存减少了冗余数据的传输

    很多客户端访问一个流行的原始服务器页面时,服务器会多次传输同一份文档,每次传送给一个客户端。一些相同的字节会在网络中一遍遍地传输,这些传输会耗尽昂贵的网路带宽,降低传输速度,加重Web服务器负载。

  • 缓存降低了对原始服务器的要求

  • 缓存缓解了带宽瓶颈问题
    很多网络为本地网络客户端提供的带宽比远程服务器带宽要宽。如果客户端能从一个快速局域网的缓存中得到一个副本,那么缓存就可以提高性能(尤其是传输比较大的文件)

  • 缓存降低了距离时延
    即使带宽不是问题,有时距离也能成为问题。将缓存放在附近的机房可以将文件传输的距离从数千英里缩短为数十米。

新鲜度检测

HTTP通过缓存将服务器文档的副本保留一段时间。在这段时间里,都认为文档是"新鲜的",缓存可以在不联系服务器的情况下,直接提供该文档。但一旦时间太长,超过新鲜度限值,就认为对象"过时"了。在提供该文档之前,缓存要再次与服务器进行确认,以查看文档是否发生了变化。

HTTP协议:缓存_第1张图片
新鲜度检测过程.png
  • 文档过期
    HTTP可以通过特殊的Cache-ControlExpires首部,给每个文档附加一个"过期时间"。说明在多长时间内可以将这些内容视为新鲜的。

    首部 描述
    Cache-Control:max-age max-age值定义了文档不再新鲜的最大合法生存时间(以秒单位)
    Expires 指定一个绝对的过期日期,如果过期日期已经过了,就说明文档不再新鲜了
再验证

缓存对副本进行再验证时,会向原始服务器发送一个小的再验证请求。其中最常用的方法是If-Modified-Since首部。将这个首部添加到GET请求中去:

  • If-Modified-Since

    If-Modified-Since: 
    如果从指定日期之后文档被修改过了,就执行请求方法。
    

    If-Modified-Since 是最常见的缓存再验证首部 If-Modified-Since。If-Modified-Since再验证通常被称为IMS请求。

    • 如果自指定日期之后,文档被修改了,If-Modified-Since条件为真,通常GET就会成功执行。携带新首部的新文档会被返回给缓存,新首部会包含一个新的过期日期。
    • 如果指定日期之后,文档没有被修改过,条件为假,会向客户端返回一个小的304 Not Modified响应报文,并不会返回文档主体。
  • If-None-Match

    If-None-Match:
    

    有些情况下仅使用最后修改日期进行再验证是不够的。HTTP允许用户对被称为"实体标签"的"版本标识符"进行比较。实体标签可能包含了文档的序列号或版本名等其他指纹信息。

HTTP协议:缓存_第2张图片
If-None-Match.png

HTTP并没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器的。但是客户端可以通过比较Date首部与当前时间进行比较,如果响应中的日期比较早,客户端就可以认为这是一条缓存的响应

缓存的处理步骤

Web缓存的基本工作原理大多比较简单,对一条HTTP GET报文的基本缓存处理步骤包括7个步骤:
【1】接收 -- 缓存从网络中读取抵达的请求报文。
【2】解析 -- 缓存对报文进行解析,提取出URL和各种首部。
【3】查询 -- 缓存查看是否有本地副本可用,如果没有,就获取一份副本。
【4】新鲜度检测 -- 缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。
【5】创建响应 -- 缓存通过网络将响应发回客户端。
【6】发送 -- 缓存可选地创建一个和日志文件条目描述这个事务。

HTTP协议:缓存_第3张图片
处理一个新鲜的缓存命中.png

你可能感兴趣的:(HTTP协议:缓存)