HTTP权威指南----缓存
缓存的处理步骤:
1、接收----缓存从网络中读取抵达的请求报文
2、解析----缓存对报文进行解析,提取出URL和各种首部
3、查询----缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)
4、新鲜度检测----缓存查看已缓存的副本是否足够新鲜,如果不是,就询问原始服务器是否有任何更新
5、创建响应----缓存会用新的首部和已缓存的主体来构建一条响应报文
6、发送----缓存通过网络将响应发回给客户端
7、日志----缓存可选的创建一个日志文件条目来描述这个业务
注意:1、HTTP响应报文的首部字段中,用Cache-Control、Age、Expires等首部表示新鲜度信息相关内容,通过via首部表示实体内容由该代理缓存提供。
2、缓存不应该调整Date首部,Date首部表示的是原始服务器最初产生这个对象的日期,这样可以在客户端中看出资源产生的最初日期。
以用Google explorer访问www.sina.com.cn为例:报文截图如下:

这里注意到一点:Date字段说明是2016.9.30 8:54在Nginx服务器上缓存获取的,而我请求的时间也有截图,为下午5:01分,X-Cache应该为Server端自定义的扩展首部,说明了缓存服务器的名字。
expires字段指绝对过期时间,应该很好理解,而Cache-control字段的max-age=60指相对过期时间,单位为秒,即60秒。
以上说明,新浪网主页面信息在早上9点左右更新了一次。之后就是到了要核对的时间了,我们每次请求,缓存服务器都应该去原始服务器去核对信息,看这份文档是否发生了变化,进行“服务器再验证”。截图中很明显,文档已经过期,但是原始服务器对文档并没有做出改动(应该返回304 not modified),可是缓存服务器为什么没有修改过期时间呢? 根据书中所提,缓存服务器验证之后应该对expires首部进行更新的,可是这里没有。(why?) 随后我又去搜狐、百度、csdn、博客园等抓包看,发现它们的响应报文的Expires首部也基本都是在9点左右,所以我觉得可能是中间复杂的网络架构中的某个代理做了统一的限制,之后在回忆这个问题吧。。。。
这里再说一下关于验证的:关于验证有两种方式:
1、通过首部If-Modified-Since:<Date>再验证
Date为截图中Last-modified指定的日期,如果没有被修改,应该返回304 not modified
2、通过首部If-None-Match:<ETag>再验证
ETag为实体的版本信息或者为“指纹信息”,如果没有被修改,应该返回304 not modified,如果被修改会返回200 OK,并且附加新的ETag。(实体标签再验证是为了弥补当服务器提供的文档的修改发生在亚秒级的情况的不足,以秒为单位不够用)
书中指出,HTTP/1.1中的应用程序都应该使用Cache-Control:no-cache,表明每次缓存服务器都应该与原始服务器进行再验证。(可是实际并不是这样,试了大部分网站,如新浪、搜狐网、百度网、csdn、博客园、斗鱼、全民,只有斗鱼和全民两个直播网站没有指出Cache-control,其他指出的值都为max-age)
控制缓存的优先级递减顺序:
Cache-Control:no-store ---> no-cache ---> must-revalidate ---> max-age ---> expires:<date> ----> 不附加缓存过期信息,让缓存确定自己的过期日期。
下面是一个容易记住的大致的缓存GET请求流程图:

HTTP权威指南----缓存的更多相关文章
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- Struts2权威指南笔记
Struts2权威指南笔记 1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也 ...
- Hadoop权威指南:MapReduce应用开发
Hadoop权威指南:MapReduce应用开发 [TOC] 一般流程 编写map函数和reduce函数 编写驱动程序运行作业 用于配置的API Hadoop中的组件是通过Hadoop自己的配置API ...
- Hadoop权威指南:HDFS-数据流
Hadoop权威指南:HDFS-数据流 [TOC] 剖析文件读取 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说, 这个对象是分布式文件系统的一个实例 ...
- 【HTTP权威指南】第1 章 HTTP 概述
1.1 HTTP--因特网的多媒体信使 ................................................................................ ...
- 《HTTP权威指南》读书笔记(一)
1.因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都搭上了名为MIME类型的数据格式标签.WEB服务器会为所有HTTP对象数据附加一个MIME类型.当Web浏览器从服务器中 ...
- 《http权威指南》读书笔记18
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- 《http权威指南》读书笔记17
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- 《http权威指南》读书笔记14
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
随机推荐
- 获取网页URL地址及参数等的两种方法(js和C#)
转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...
- C基础--函数指针的使用
之前在看代码的时候,看了函数指针的使用,大体分为如下几类: 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰: 函数指针作为另一个函数的参数,用作回调: lin ...
- mysql 常用操作(整理)
原文地址:http://blog.csdn.net/lxh090821/article/details/9410943 1 登录数据库 格式: mysql -h主机地址 -u用户名 -p用 ...
- "XX cannot be resolved to a type "eclipse报错及解决说明
转自:http://zhaoningbo.iteye.com/blog/1137215 引言: eclipse新导入的项目经常可以看到“XX cannot be resolved to a type” ...
- 【原】sql 将某列拼成一个字符串
SQL Server中,写存储过程,时常会碰到这样一个需求:从某个表中取某一列,然后需要将这一列数据以某种形式拼成一个字符串,以供后面使用,下面这种方法能够实现此需求. --取说明书模块枚举,结果格式 ...
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
- 【JavaScript】字符串处理函数集合
var $string = {}, toString, template, parseURL, buildURL, mapQuery, test, contains, trim, clean, cam ...
- 转-Android联网 — HttpURLConnection和HttpClient选择哪个好?
http://www.ituring.com.cn/article/199619?utm_source=tuicool 在Android开发中,访问网络我们是选择HttpURLConnection还是 ...
- 4个理由告诉你Java为何排行第一
Java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式.忽略它的年龄不看,Java依然排行第一.它的实用性.性能和向后兼容性都彰显其价值所在.2016年伊始,标志着我们已经走过了 ...
- Jmeter监控服务器性能
JMeter是一款压力测试工具,我们也可以用它来监控服务器资源使用情况.JMeter正常自带可以通过Tomcat的/manager/status来监控服务资源使用情况.这种情况只能监控Tomcat支持 ...