`
yuzhi2217
  • 浏览: 35076 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HTTP协议 (四) 缓存

    博客分类:
  • HTTP
 
阅读更多

缓存的概念

缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有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缓存协议原理解析及应用

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

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

    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迫切需要一个新的版本,以便使两个通信应用程序能够确定彼此的真实性能。

    p54 - p70 缓存一致性协议

    p54 - p70 缓存一致性协议

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

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

    A s p超级缓存类

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

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

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

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

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

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

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

    计算机网络-HTTP协议实验报告

    计算机网络——HTTP协议实验报告 第一关:HTTP 基本请求与应答 第二关:HTTP 协议缓存的响应分析 第三关:HTTP 协议对长文件的处理 第四关:对嵌入对象网页处理 第五关:HTTP认证

    http协议抓包

    HttpWatch是强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理....每一个HTTP记录都可以详细的分析其 Cookies、消息头、字符查询等信息。支持HTTPS及分析报告输出为XML、CSV等格式。

    HTTP协议详解

    超 文本传输协议(HTTP)是一种为分布式,合作式,超媒体信息系统。它是一种通用的,无状态(stateless)的协议,除了应用于超文本传输外,它也 可以应用于诸如名称服务器和分布对象管理系统之类的系统,这可以通过...

    iOS利用NSURLProtocol缓存数据的源代码

    这是利用NSURLProtocol协议来实现数据离线缓存的代码, 代码实现了根据某个URL的后缀名来确定是否缓存这个URL, 缓存是永久缓存,直到主动清除缓存数据为止。 代码同时实现了 HTTP请求的 206 请求的部分数据缓存的...

    Android在线视频播放之边缓存边播放

    最真实的流媒体协议传输格式并不是普通的http方式,而是rtsp,那样的话得搭建专门的流媒体服务器,成本比较高,采用普通的http方式,实现的是一种伪流媒体传输,但是对于常用的视频缓存播放也足够了。

Global site tag (gtag.js) - Google Analytics