缓存的处理步骤:

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权威指南----缓存的更多相关文章

  1. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  2. Struts2权威指南笔记

    Struts2权威指南笔记 1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也 ...

  3. Hadoop权威指南:MapReduce应用开发

    Hadoop权威指南:MapReduce应用开发 [TOC] 一般流程 编写map函数和reduce函数 编写驱动程序运行作业 用于配置的API Hadoop中的组件是通过Hadoop自己的配置API ...

  4. Hadoop权威指南:HDFS-数据流

    Hadoop权威指南:HDFS-数据流 [TOC] 剖析文件读取 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说, 这个对象是分布式文件系统的一个实例 ...

  5. 【HTTP权威指南】第1 章 HTTP 概述

    1.1 HTTP--因特网的多媒体信使 ................................................................................ ...

  6. 《HTTP权威指南》读书笔记(一)

    1.因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都搭上了名为MIME类型的数据格式标签.WEB服务器会为所有HTTP对象数据附加一个MIME类型.当Web浏览器从服务器中 ...

  7. 《http权威指南》读书笔记18

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  8. 《http权威指南》读书笔记17

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  9. 《http权威指南》读书笔记14

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

随机推荐

  1. Configure Puppet Master with Passenger and Apache on Centos

    What is Passenger? Passenger (AKA mod_rails or mod_rack) is an Apache 2.x module which lets you run ...

  2. 【log】log4j

    常用log4j.properties配置文件 log4j.rootLogger = info,console #指定serviceImpl层 日志输出 log4j.logger.com.sms.ser ...

  3. [Issue]repo/repo init-解决同步源码Cannot get http://gerrit.googlesource.com/git-repo/clone.bundle

    1. 前两天想搭建freescale L3.0.35_4.1.0_BSP包,结果LTIB环境搭建好,也编译出rootfs/uboot/kernel的Image了,但是准备移植uboot的时候发现ubo ...

  4. visual studio 声明数组太大,导致栈溢出

    在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分: 1.栈区(stack segment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等.在Windows下,栈是向 ...

  5. OAF_VO系列3 - Binding Style绑定方式

    在OAF VO开发中,Binding Style主要用于对VO的where clause做动态传值,总共有三种方式 1.       Oracle Named 2.       Oracle Posi ...

  6. VMWare虚拟机下RedHat 9.0linux的网络设置

    VMWare虚拟机下安装的RedHat 9.0 linux有三种方式实现上网,桥接.nat.host-only.本来想用桥接方式的,可总是因为配置网络出现问题而不能上网,还把 sygate4.5(代理 ...

  7. MDK+硬件仿真器实现debugprintf()-stm32

    MDK+硬件仿真器实现debugprintf()-stm32 1MDK工程设置如下 2其中stm32debug.ini文件内容为 /********************************** ...

  8. error-iis-Service Unavailable

    Service Unavailable Service Unavailable HTTP Error 503. The service is unavailable.

  9. GDI+ 中发生一般性错误。

    GDI+ 中发生一般性错误. “/wechat”应用程序中的服务器错误. GDI+ 中发生一般性错误. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及 ...

  10. 过滤3个字节以上的utf-8字符

    /** * 过滤掉超过3个字节的UTF8字符 * @param text * @return * @throws UnsupportedEncodingException */ public stat ...