带缓存的HTTP代理服务器(五)
项目地址:https://code.csdn.net/sakeven/httpproxy
关于WEB 缓存基础知识,请先阅读这篇文章:
https://www.mnot.net/cache_docs/ (或者中文版
http://www.cnblogs.com/xyjsw/archive/2010/01/27/1657825.html)
缓存代理
缓存代理通常规模较大,因为它要为成千上百的用户提供服务,也正因为此,它必须是一个共享缓存,它的每一个缓存副本必须可以为多用户使用。
基于此的一个重要作用是:可以明显地减少响应时间和降低网络流量。
缓存处理步骤
对一条HTTP GET报文的基本缓存处理过程包括7个步骤:
1. 接收——缓存从网络中读取抵达的请求报文。
2. 解析——缓存对报文进行解析,提取出URL和各种首部。
3. 查询——缓存查看是否已有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)。
4. 新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。
5. 创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文,
6. 发送——缓存通过网络将响应发回给客户端。
7. 日志——缓存可选地创建一个日志文件条目来描述这个事物。
这里我们需要重点关注的是新鲜度检测。
新鲜度检测
缓存是有有效期,在有效期内,缓存副本可以被任意多次使用,一旦过了有效期,就应该重校验这个缓存副本。
与缓存控制有关的响应首部:Cache-Control、Expires、Date。
Cache-Control:
public:表示可以被任何缓存器缓存
private:禁止响应被共有缓存器缓存
no-cache:强制每次请求必须向服务器验证
no-store:强制禁止响应被缓存
max-age=(秒)、s-maxage=(秒):报文创建后的相对过期时间,后者用于代理服务器缓存
Expires:指定绝对过期时间,如果Cache-Control中存在max-age或s-maxage,优先使用Cache-Control中的,而不是Expires。
Date:报文创建的日期和时间
利用上面几个响应首部,我们可以计算出缓存副本的有效期,当我们在有期内发起请求,我们可以直接提供缓存副本作为响应。
缓存重校验
与重校验有关的首部:
Last-Modified:文档最后修改时间
If-Modified-Since:用于发起条件请求,与Last-Modified配合使用。如果自上次请求之后,文档未被修改过,则服务器返回一条304 Not Modified响应;否则送回新的文档。
Etag:实体标签
If-None-Match:用于发起条件请求,实体标签在验证,与 Etag 配合使用,与If-Modified-Since类似。
以上两个用于重校验的条件请求因尽可能同时使用。
关于缓存这块的代码,还在进行中。
- 上一篇: web缓存技术和HTTP代理
- 下一篇: 带缓存的http代理服务器(二)