`

HTTP协议 (四) 缓存

 
阅读更多

阅读目录

  1. 缓存的概念
  2. 缓存的好处
  3. Fiddler可以方便地查看缓存的header
  4. 如何判断缓存新鲜度
  5. 通过最后修改时间,判断缓存新鲜度
  6. 与缓存相关的header
  7. ETag
  8. 浏览器不使用缓存
  9. 直接使用缓存,不去服务器端验证
  10. 如何设置IE不使用缓存
  11. 公有缓存和私有缓存的区别

 

缓存的概念

缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。

http中具有缓存功能的是浏览器缓存,以及缓存代理服务器

 

http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。

缓存的好处

缓存的好处是显而易见的, 好处有,

1. 减少了冗余的数据传输,节省了网费。

2. 减少了服务器的负担, 大大提高了网站的性能

3. 加快了客户端加载网页的速度

 

Fiddler可以方便地查看缓存的header

Fiddler中把header都分门别类的放在一起,这样方便查看。

 

如何判断缓存新鲜度

Web服务器通过2种方式来判断浏览器缓存是否是最新的。

第一种, 浏览器把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉Web服务器。

第二种, 浏览器把缓存文件的ETag, 通过header "If-None-Match", 来告诉Web服务器。

 

通过最后修改时间, 来判断缓存新鲜度


1. 浏览器客户端想请求一个文档,  首先检查本地缓存,发现存在这个文档的缓存,  获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。

2. Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 如果时间是一样的, 说明缓存还是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本。如下图。

3. 假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端, 如下图。

 

实例: 打开Fiddler, 然后打开博客园首页。然后F5刷新几次浏览器。 你会看到博客园首页也用了缓存。

 

与缓存有关的header

我们来看看每个header的具体含义。

Request

Cache-Control: max-age=0 以秒为单位
If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT 缓存文件的最后修改时间。
If-None-Match: "0693f67a67cc1:0" 缓存文件的Etag值
Cache-Control: no-cache 不使用缓存
Pragma: no-cache 不使用缓存
   

 

 

    

 

 

 

Response

Cache-Control: public 响应被缓存,并且在多用户间共享,  (公有缓存和私有缓存的区别,请看另一节
Cache-Control: private 响应只能作为私有缓存,不能在用户之间共享
Cache-Control:no-cache 提醒浏览器要从服务器提取文档进行验证
Cache-Control:no-store 绝对禁止缓存(用于机密,敏感文件)
Cache-Control: max-age=60 60秒之后缓存过期(相对时间)
Date: Mon, 19 Nov 2012 08:39:00 GMT 当前response发送的时间
Expires: Mon, 19 Nov 2012 08:40:01 GMT 缓存过期的时间(绝对时间)
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT 服务器端文件的最后修改时间
ETag: "20b1add7ec1cd1:0" 服务器端文件的Etag值

 

 

 

 

 

 

 

 

 

 

如果同时存在cache-control和Expires怎么办呢?
浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires  

 

ETag

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。

ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。

为什么使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。

1. 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。

2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。

3. 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。

 

实例, 打开Fiddler, 打开博客园首页。  你可以看到很多图片,或者CSS文件都是用了缓存。 这些都是通过比较ETag的值,来判断文件是否更新了。

 

浏览器不使用缓存

CTRL+F5强制刷新浏览器,或者设置IE。  可以让浏览器不使用缓存。

1. 浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache.   明确告诉Web服务器,客户端不使用缓存。 

2. Web服务器将把最新的文档发送给浏览器客户端.

 

实例:

打开Fiddler, 打开博客园首页, 然后按CTRL+F5强制刷新浏览器,你将看到

Pragma: no-cache的作用和Cache-Control: no-cache一模一样。 都是不使用缓存。 

Pragma: no-cache 是HTTP 1.0中定义的, 所以为了兼容HTTP 1.0. 所以会同时使用Pragma: no-cache和Cache-Control: no-cache

 

直接使用缓存,不去服务器验证

按F5刷新浏览器和在地址栏里输入网址然后回车。 这两个行为是不一样的。

按F5刷新浏览器, 浏览器会去Web服务器验证缓存。

如果是在地址栏输入网址然后回车,浏览器会"直接使用有效的缓存", 而不会发http request 去服务器验证缓存,这种情况叫做缓存命中,如下图

 

实例: 比较第一次访问博客园主页和第二次博客园主页

1. 启动Fiddler, 用firefox打开博客园主页, 发现有50多个session。

2. 按CTRL+X将Fiddler中的所有session删除。 关闭firefox,重新打开一个firefox,打开博客园主页。   发现只有30多个session.

分析;  少了的session是因为firefox直接用了缓存,而没有发http request。

 

 

如何设置IE不使用缓存

打开IE。点击工具栏上的, 工具->Internet选项->常规->浏览历史记录 设置. 选择“从不”。然后保存。

然后点击“删除”  把Internet临时文件都删掉 (IE缓存的文件就是Internet临时文件)。

 

公有缓存和私有缓存的区别

Cache-Control: public 指可以公有缓存, 可以是数千名用户共享的。

Cache-Control: private 指只支持私有缓存, 私有缓存是单个用户专用的。

分享到:
评论

相关推荐

    Apache PHP利用HTTP缓存协议原理解析及应用

    Apache PHP利用HTTP缓存协议原理解析及应用

    存储模型与缓存一致性协议

    多处理器环境下的存储模型与缓存一致性协议的分析。

    p54 - p70 缓存一致性协议

    缓存一致性协议 缓存一致性协议是计算机体系结构中的一个重要概念,它解决了多核 CPU 中 Cache 和内存之间的一致性问题。在多核 CPU 中,每个核都有自己的 L1/L2 Cache,这些 Cache 之间可能会出现不一致的情况,...

    HTTP协议分析报告

    (1) HTTP超文本传输协议用于定义web页面(超文本)在网络上的交互方式的应用层协议,使用客户/服务器的工作方式。HTTP协议定义了web客户端(浏览器)如何向web站点请求web网页以及web服务器如何将web页传送给客户...

    5-3JMM-CPU缓存一致性协议MESI.mp4

    5-3JMM-CPU缓存一致性协议MESI.mp4

    ARP缓存中毒实验报告.docx

    ARP缓存是ARP协议的重要组成部分。一旦MAC地址和IP地址之间的映射被解析为执行ARP协议的结果,映射将被缓存。因此,如果映射已经在缓存中,则不需要重复ARP协议。然而,由于ARP协议是无状态的,所以高速缓存可能会被...

    浅析http协议、cookies和session机制、浏览器缓存.docx

    浅析http协议、cookies和session机制、浏览器缓存.docx

    Fiddler之HTTP协议缓存、压缩与URL Encode

    HTTP协议中的缓存  HTTP缓存:当web请求到达缓存时,如果本地有“已缓存”,就可以从本地缓存设备提取文档,而不需要从服务器中提取  缓存的优点:  1.减少冗余的数据传输,节省传输时间  2.减少了服务器的负担...

    HTTP协议-中文版

    但是,HTTP/1.0没有充分考虑到分层代理,缓存的作用以及对稳定连接和虚拟主机的需求。并且随着不完善的应用程序的激增,HTTP/1.0迫切需要一个新的版本,以便使两个通信应用程序能够确定彼此的真实性能。

    http协议doc文档

    但是,http/1.0 没有充分考虑到分层代理、高速缓存的作用以及对稳定连接和虚拟主机的需求。 http/1.1 协议与 http/1.0 相比,要求更为严格,以确保各项功能得到可靠实现。实际的信息系统除了简单的检索外,要求更多...

    计算机网络-基础知识及Http协议

    计算机网络基础知识及Http协议 计算机网络是一种使用公共通信媒体,连接多个计算机和设备的系统,旨在实现资源共享、信息交换和通信。计算机网络的基础知识包括网络结构、协议、应用层、运输层、网络层、链路层和...

    Go-vegamcache是一个使用gossip协议构建的分布式内存中golang缓存库

    vegamcache是一个使用gossip协议构建的分布式内存中golang缓存库

    A s p超级缓存类

    本人编写的Asp超级缓存类,之所以叫超级,是因为本缓存类不同于普通的缓存类。...本类使用HTTP协议中的缓存标志来控制缓存。若合理使用,则极大的减轻服务器带宽及CPU压力。有效的提升每秒处理页数。

    基于Linux的HTTP协议实现方案及性能改进的研究.pdf

    基于Linux的HTTP协议实现方案及性能改进的研究 本文研究基于Linux的HTTP协议实现方案及性能改进。通过使用Linux套接字编程接口实现HTTP协议的实啦方案,解决了浏览器与服务器之间的信息交换问题。文章还讨论了如何...

    http协议-缓存控制:etag If-None-Match / Last-Modified If-Modified-Since

    NULL 博文链接:https://hyj1254.iteye.com/blog/1161000

    论文研究-流媒体服务缓存代理系统的设计及RTSP协议实现 .pdf

    流媒体服务缓存代理系统的设计及RTSP协议实现,陈振,贺建军,网络边沿缓存能够加速流媒体的传输,它是一种提高Internet上流媒体服务性能的技术。为了减少流媒体服务启动延时与抖动,降低流媒体�

    2005,我们“芯芯”相印——双核心CPU缓存数据一致性浅析.pdf

    MESI 协议将缓存分为四种状态:Modified(已修改)、Exclusive(独占)、Shared(共享)和Invalid(无效)。当一个CPU核心需要访问缓存时,MESI 协议可以确保缓存数据的一致性。 MOESI 协议是 AMD 的一种 Cache ...

    2024年浏览器缓存HTTP缓存机制(面试常考).zip

    浏览器缓存【2024年浏览器缓存/HTTP缓存机制(面试常考)简介】 内容概要: 这篇博客为网络技术初学者提供了一个全面的理解浏览器缓存和HTTP缓存机制的指南。通过通俗易懂的语言,本博客介绍了浏览器缓存的工作原理...

    有赞多级缓存解决方案怎么做的,你知道吗.docx

    存储层提供基础的 KV 数据存储能力,代理层为应用层提供统一的缓存使用入口及通信协议,应用层提供统一客户端给应用服务使用,内置“热点探测”、“本地缓存”等功能,对业务透明。 TMC 的本地缓存功能是通过对原生...

Global site tag (gtag.js) - Google Analytics