强缓存和协商缓存分别是什么?

浏览器缓存分为强缓存和协商缓存,两者有两个比较明显的区别:

  1. 如果浏览器命中强缓存,则不需要给服务器发送请求,尽管会返回请求状态码200(from cache);
  2. 协商缓存有服务器决定是否使用缓存,客户端和服务器之间会发生一次通讯,如果命中协商缓存,则服务器返回304。

强缓存

强缓存是根据返回头中的Expires 或者 Cache-Control 两个字段来控制的,都是表示资源的缓存有效时间。

  • Expires是HTTP1.0的规范,返回一个GMT格式的时间字符串,如Expires:Mon,18 Oct 2022 23:59:59 GMT ,表示资源失效的时间,如果当前的时间戳在这个时间之前,则命中强缓存。问题在于服务器和客户端之间的绝对时间偏差可能较大,导致缓存混乱。
  • Cache-Control是HTTP1.1的规范,一般用max-age字段来表示相对时间,比如 Cache-Control:max-age=3600 代表资源的有效期是 3600 秒。并且返回头中的 Date 表示消息发送的时间,表示当前资源在 Date ~ Date +3600s 这段时间里都是有效的。

如果 Cache-Control与 Expires 同时存在的话, Cache-Control 的优先级高于 Expires 。

协商缓存

协商缓存是由服务器来确定缓存资源是否可用。

  • Last-Modified/If-Modified-Since 二者的值都是 GMT 格式的时间字符串,Last-Modified标记了文件最后的修改时间,然后在下一次请求时请求头带上If-Modified-Since,其值为本地保存的Last-Modified,告诉服务器我本地缓存最后的修改时间,服务器如果判断文件未修改,则命中协商缓存,返回304 Not Modified状态码,浏览器就不再请求资源,直接使用本底的缓存;如果文件修改,则返回资源内容,新的 Last-Modified 会在 response header 返回,并在下次请求之前更新本地缓存的 Last-Modified,下次请求时,If-Modified-Since会启用更新后的 Last-Modified。缺点是最小判断步长为1秒,无法判断1秒内的多次变化。
  • Etag/If-None-Match,对于每一个文件,服务器根据文件本身算出一个哈希值(一般来说是哈希结构)并通过 Etag字段返回给浏览器,然后下一次请求后请求头带上 If-None-Match 字段,服务器会通过比较两者是否一致来判定文件内容是否被改变。与 Last-Modified 不一样的是,当服务器返回 304 Not Modified 的响应时,由于在服务器上ETag 重新计算过,response header中还会把这个 ETag 返回,即使这个 ETag 跟之前的没有变化。缺点是计算Etag值有性能损耗。

你可能感兴趣的:(缓存,http,网络协议)