4.1 客户端缓存

浏览器的缓存机制几乎是在万维网刚刚诞生时就已经存在,在HTTP协议设计之初,便确定了服务端与客户端之间“无状态”(Stateless)的交互原则,即要求每次请求是独立的,每次请求无法感知也不能依赖另一个请求的存在,这既简化了HTTP服务器的设计,也为其水平扩展能力留下了广袤的空间。但无状态并不只有好的一面,由于每次请求都是独立的,服务端不保存此前请求的状态和资源,所以也不可避免地导致其携带了重复的数据,导致网络性能降低。HTTP协议对此问题的解决方案便是客户端缓存,在HTTP从1.0到1.1,再到2.0版本的演进中,逐步形成了现在被称为“状态缓存”“强制缓存”(许多资料中简称为“强缓存”)和“协商缓存”的HTTP缓存机制。

状态缓存是指不经过服务器,客户端直接根据缓存信息对目标网站的状态判断,以前只有301/Moved Permanently(永久重定向)这一种;后来在RFC6797中增加了HSTS(HTTP Strict Transport Security)机制,用于避免依赖301/302跳转HTTPS时可能产生的降级中间人劫持(详见5.5节),这也属于另一种状态缓存。由于状态缓存所涉内容只有这么一点,后续我们就只聚焦讨论强制缓存与协商缓存两种机制。

无论是强制缓存还是协商缓存,原理都是在服务器对客户端请求的响应中附带一些条件,要求客户端在遇到相同的请求时,先判断一下条件是否满足,如果满足,就直接用上一次服务器给予的响应来代替,不必重新访问。这两种缓存机制的区别是它们采用了不同的判断条件来解决资源在客户端和服务器间的一致性问题。