详细介绍:【计算机网络】什么是强缓存和协商缓存?它们的工作原理是什么?

【简要回答】

1、解释强制缓存是什么

解释Expires和Cache-Control字段,描述前者的1个缺点和后者的1个优点

2、解释协商缓存是什么

解释Last-Modified和Etag字段,描述前者的2个缺点和后者的2个优点

描述两个字段的达成流程

3、总结:

优先级、实际应用中如何配合使用、注意点


【详细回答】
强制缓存:

浏览器判断缓存没有过期,就直接用缓存,这个主动权在浏览器手里。

强制缓存通过2个字段实现:Expires和Cache-Control

1、Expires的实现流程:过期时间,时间点,绝对时间

2、Cache-Control的实现流程:过期时间,时间段,相对时间

区别:他们俩的区别就是Cache-Control能更好的处理服务器与客户端时间不一致问题,由于Expires 是依赖客户端的系统时间来判断是否过期的,若是客户端时间设置不准确,缓存策略可能失效。


协商缓存:

源于加了一个协商的过程,就叫做协商缓存。在缓存过期以后,浏览器需要咨询服务器,是否可以使用缓存,服务器返回304就是告诉浏览器可以直接使用缓存,否则服务器就会返回资源

协商缓存经过2个字段实现:Last-Modified和Etag

  1. Last-Modified的实现流程:最后修改时间

浏览器首次请求某个资源的时候,服务器就会返回资源并且在响应头中附加Last-Modified这个响应头
这个资源结果的修改时间就是他指的
浏览器收到这个资源后,会将这个资源保存在本地缓存中
同时浏览器会记住该资源的Last-Modified

之后如果浏览器再次请求同一个资源的话
他会发送一个带有If-Modified-Since这样一个字段的请求头
其中就包含上次响应得到的Last-Modified

服务器收到这个字段之后,会检查两个资源的Last-Modified字段是否相同
相同的话,就证明这个记录没有被服务器修改过就是如果
通过就返回给浏览器304,告诉他能够使用缓存

倘若对比的时间不相同,证明这个资源被修改了
那么服务器就会返回200,和新的资源,并在响应头中更新Last-Modified

如果浏览器接收到304,那么他就会直接采用缓存
如果收到200,那么浏览器就会接收资源并且更新缓存

但是这样的缓存有2个缺点:
秒级,因此他无法感知秒级以下的更新就是Last-Modified的最小单位
这就意味着如果在同一秒里,我对文件进行多次修改,就会被视为没有变化
这样即使资源修改了,依然不会返回新的资源

另一个,基于他是以更改档案的修改时间来判断的,
故而在文件内容本身不修改的情况下,依然有可能更改这个记录的修改时间
比如修改了一个文件名,再改回来,
这样就造成了,该文件的内容明明没有修改,但是缓存依旧是失效的

  1. Etag的完成流程:服务器根据资料内容生成的唯一标识

浏览器首先请求某个资源,继而服务器返回该资源
并且在响应头中附加Etag这个字段
指的是服务器根据记录内容生成的唯一标识

浏览器收到该资源之后,会把这个资源保存在本地缓存
同时浏览器会记住该资源的Etag值
之后浏览器再次请求同一个资源
就会发送一个带有If-None-Match这个字段的请求头
其中具备了上次请求得到的Etag值

服务器就收到这个请求后,先检查服务器里这个资源的Etag值
是否与If-None-Match这个字段里面的Etag值相同

若是相同的话,就证明这个资源没有被修改,会返回给浏览器304
如果不同的话,就证明这个资源被修改了,就返回200并新的附带资源内容和新的Tag值

浏览器如果收到304,就使用本地缓存
浏览器收到200,就会接收新的资源并且接收缓存

区别:在没有修改档案内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求;可能有些文件是在秒级以内修改的,Etag能检查到的粒度是秒级的,客户端在 1 秒内能刷新多次;因此,Etag的优先级高于Last-Modified。


总结一下:

Cache-Control字段优先级高于Expires,Etag字段优先级高于Last-Modified。

通过为了达到最佳的性能和用户体验,比如可以设置一个较短的强缓存有效期,并使用第二个协商缓存作为补充,这样允许确保在强缓存过期之后,仍然能够验证资源的有效性。

要求注意的是,协商缓存这两个字段都要求配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。


posted @ 2025-08-14 12:02  yfceshi  阅读(24)  评论(0)    收藏  举报