22 | 冷链周转:HTTP的缓存代理
Nov 2 · 10min
归纳
- 计算机领域里最常用的性能优化手段是“时空转换”,也就是“时间换空间”或者“空间换时间”,HTTP 缓存属于后者;
- 缓存代理是增加了缓存功能的代理服务,缓存源服务器的数据,分发给下游的客户端;
- “Cache-Control”字段也可以控制缓存代理,常用的有“private”“s-maxage”“no-transform”等,同样必须配合“Last-modified”“ETag”等字段才能使用;
- 缓存代理有时候也会带来负面影响,缓存不良数据,需要及时刷新或删除。
缓存代理服务
在 HTTP 的缓存体系中,缓存代理的身份十分特殊,它“既是客户端,又是服务器”,同时也“既不是客户端,又不是服务器”。
源服务器的缓存控制
- Cache-Control:
- private:只能存在客户端
- public:可以存在缓存服务器
- proxy-revalidate:缓存服务器专属只要求代理的缓存过期后必须验证,客户端不必回源,只验证到代理这个环节就行了
- s-maxage:控制代理缓存时间
- no-transform:专属,禁止图片之类的进行缓存
客户端缓存控制
- “max-stale”的意思是如果代理上的缓存过期了也可以接受,但不能过期太多,超过 x 秒也会不要。
- “min-fresh”的意思是缓存必须有效,而且必须在 x 秒后依然有效。
个人理解
- 浏览器拿到网址以后
- 浏览器查找缓存,1.如果有直接放回,2.如果没有,那么通过域名查找
- dns寻址操作,1.本地有缓存直接,2.无缓存/缓存过期 -> 本地dns服务器 -> 根dns -> 顶级dns -> 权威
- 准备建立http请求
- 准备请求头,Cache-Control属性,no-stroe, no-cache, noly-if-cached等。
- 如果缓存过期,需要携带if-None-Match或者if-modifid-since等字段进行校验
- 与代理服务器建立tcp三次握手
- 代理服务器,查看请求头是否可以使用缓存,1.有缓存,可用,不可用,2.无缓存
- 不可用/无缓存:与源服务器建立tcp连接,
- 无缓存:源服务器发生响应报文,代理服务器通过Cache-Control进行操作
- 不可用:通if-Nono-match等字段进行校验,如果没有变化返回304,如果有更新与无缓存操作一致
- 返回个代理服务器,查看Cache-Control,是否可以存为公共资源,存储时间等
- 返还给客户端,如果是304直接渲染。响应中会重新携带Cache-Control如时间等,进行缓存。
- tcp四次挥手断开链接
CC BY-NC-SA 4.0 2021 © Promise L