day03|计算机网络重难点之HTTP中常见的状态码、什么是强缓存和协商缓存
6.HTTP中常见的状态码有哪些?
常用的包括以下几个:
200:表示客户端请求成功
201:创建了新资源。
204 :无内容,服务器成功处理请求,但未返回任何内容。
301:永久重定向
302: 临时重定向
304:请求的内容没有修改过,所以服务器返回此响应时,不会返回网页内容,而是使用缓存
401:请求需要身份验证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503: 服务不可用
7.什么是强缓存和协商缓存
强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少 服务器 的 负担、提高网页加载速度。
1.强缓存:是指浏览器在请求资源时,先检查本地缓存是否存在该资源的副本,且该资源是否有效。如果有效,浏览器直接从本地缓存中获取资源,不需要请求到服务器。
常见的强缓存策略有两种:
- Expires 强缓存:它是HTTP/1.0协议中的字段,它告诉浏览器 资源过期的时间。当浏览器再次请求该资源时,会先比较当前时间与过期时间。如果未过期则直接使用本地缓存,如果过期则向服务器发出请求。这里有一个巨大的漏洞:"如果本地时间不准怎么办?",所以目前已经被废弃了。
- Cache-Control 强缓存:它是HTTP/1.1协议中的字段,它可以设置多个指令来控制缓存行为。常用指令有:max-age、no-cache、no-store等。其中,max-age指令告诉浏览器资源的有效期,no-cache指令告诉浏览器不使用强缓存,而是使用协商缓存
2.协商缓存:是指当强缓存失效的时候,浏览器向服务器发送请求,通过ETag 和 Last-Modified等HTTP响应头,向服务器验证 资源是否已被修改。
如果资源没有被修改,服务器返回 304 Not Modified 状态码,告知浏览器 使用 本地缓存;如果资源被修改了,则服务器返回新的资源,然后浏览器更新本地缓存。协商缓存这种方式需要和服务器进行通信,但是可以确保客户总是能获取最新的资源。
协商缓存 主要有两种:
-
第一种是基于Last-Modified 的协商缓存:
- Last-Modified 的含义是 资源 最后被修改的时间,包含在响应头部中
- 当客户端 读取到 Last-Modified的时候,会在这上面的时间 作为下一次请求中的字段 If-Modified-Since 的值
- 服务器对比 If-Modified-Since值与当前资源的Last-Modified 值。如果没有变化,表示资源没有被修改,返回状态码 304 Not Modified。如果这个值不同,说明资源已经被修改了,此时服务器会给浏览器正常返回资源并返回200状态
- 但是这种协商缓存有两个缺点:
- 因为它是根据文件的修改时间来判断的,但是可能存在文件修改时间已经更新,而文件内容却不变的情况,比如说修改文件名再改回来。这样就会导致文件内容没有改变,但是缓存依然失效
- 因为它是以秒为单位来记录文件修改时间的,所以文件在几百毫秒内被修改的话,并不会被记录。所以会出现 即使内容被修改了,依然不返回新资源的 情况。
-
第二种是基于 ETag 的协商缓存:它是指将原来的比较时间戳 改成了 比较文件指纹,也就是 根据文件内容 计算出 唯一的哈希值
- ETag 就是文件指纹,也就是 该资源的唯一标识符。ETag是根据文件计算出的哈希值,被服务器连同资源一起 发给客户端
- 客户端 将响应得到的ETag值 放在 请求头部 的 If-None-Match 字段中
- 服务器比较 请求中的 If-None-Match 值与 当前资源的 ETag 值,如果指纹一致,则说明资源没有发生变化,返回状态码 304 Not Modified。如果指纹不一致,则说明资源已被修改,那么服务器就会将 新的文件指纹 放入 响应头部的 ETag中,最后返回给客户端
如图: