`
cppmule
  • 浏览: 447315 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

HTTP协议之缓存

    博客分类:
  • HTTP
 
阅读更多

之前写过一个篇 【HTTP协议详解】 ,这次继续介绍HTTP协议中的缓存机制。HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提高网站的性能非常有帮助。 本文介绍浏览器和Web服务器之间如何处理"浏览器缓存",以及控制缓存的http header.

本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这工具,可以先参考[Fiddler教程] 。在看本文的时候, 请务必打开Fiddler来实践。


阅读目录

  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 指只支持私有缓存, 私有缓存是单个用户专用的。

 

如果您看了本篇博客,觉得对您有所收获,请点击右下角的 [推荐]

如果您想转载本博客,请注明出处

如果您对本文有意见或者建议,欢迎留言

感谢您的阅读,请关注我的后续博客

分类: HTTP协议
绿色通道: 好文要顶 关注我 收藏该文
分享到:
评论

相关推荐

    Android http缓存实现

    HTTP缓存主要遵循HTTP协议中的缓存控制机制,如ETag、Last-Modified等头信息。下面将详细讨论Android中如何实现HTTP缓存。 1. **Android HTTP缓存的基本概念** - **HTTP缓存策略**:主要有两种,一是强缓存(Cache...

    认清http协议本质

    要认清HTTP协议的本质,我们需要从以下几个关键点入手: 1. 请求与响应模型:HTTP通信基于请求-响应模型。客户端发起一个HTTP请求到服务器,服务器处理请求并返回一个HTTP响应。请求由方法(如GET、POST)、URL、...

    Http页面缓存机制(转)

    在HTTP协议中,缓存主要分为两种类型:强缓存和协商缓存。 ### 2. 强缓存 强缓存依赖于HTTP协议中的两种头字段:`Expires` 和 `Cache-Control`。当浏览器向服务器发送请求时,如果本地有资源的缓存,并且缓存未...

    页面的缓存与不缓存设置及html页面中meta的作用

    综上所述,页面的缓存与不缓存设置是通过HTTP协议头和HTML的`meta`标签来实现的,这涉及到多个层次的缓存策略,包括浏览器、中间缓存服务器和Web服务器。理解并正确运用这些设置,对于提高网站性能和用户体验至关...

    iOS开发缓存机制之—内存缓存机制

    1. `NSURLRequestUseProtocolCachePolicy`:这是默认的缓存策略,遵循HTTP协议的缓存规则,如Expires和ETag等头信息来决定是否使用缓存数据。 2. `NSURLRequestReloadIgnoringCacheData`:完全忽略缓存,每次都从...

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

    HTTP协议是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。在HTTP中,缓存控制是优化网络性能的重要机制,它允许客户端(如浏览器)存储服务器响应,并在后续请求时利用...

    Loadrunner负载测试 浏览器缓存设置

    在LoadRunner中,可以通过在HTTP协议初始化函数(http_init())中设置`web_set_sockets_option("HDR_RESERVE", "0")`来实现这一目标,这样将确保每次请求都发送完整的HTTP头,包括那些控制缓存的头。 2. **启用缓存...

    消除浏览器的301重定向缓存

    浏览器的301重定向缓存是基于HTTP协议的。HTTP协议中,301状态码表示永久重定向,也就是说,浏览器会将原来URL永久地重定向到新的URL。这个过程中,浏览器会将重定向的结果缓存在缓存中,以便加快网页的加载速度。 ...

    带有本地缓存机制的http连接框架

    在Android中,常见的HTTP连接框架有Volley、OkHttp、Retrofit等,这些框架都提供了对HTTP协议的良好支持,并且具有异步处理、请求队列、错误处理等功能。 二、本地缓存机制 本地缓存机制在移动应用中起到关键作用...

    http协议中文版(http协议中文版)

    1. **无状态**:HTTP协议自身不维护连接状态,每次请求和响应都是独立的,服务器不会记住之前请求的信息。为了实现状态保持,开发者通常会使用Cookie或Session。 2. **简单快速**:设计时主要考虑快速传输,对数据...

    HTTP协议分析报告

    - **实验目的**: 掌握HTTP协议获取网页的过程,了解HTTP请求报文和响应报文的格式,熟悉HTTP1.0与HTTP1.1的区别,验证HTTP缓存的有效性。 - **实验原理**: 使用Wireshark工具抓取网络数据包,分析HTTP协议的交互过程...

    PHP禁止缓存如何禁止页面缓存

    3. **HTTP头部**:HTTP协议中的请求和响应都包含头部信息,用于传输额外的信息,例如内容类型、编码方式等。 #### 二、禁止页面缓存的方法 在PHP中,可以通过设置HTTP头部信息来控制浏览器的缓存行为。以下是一些...

    缓存_缓存_

    而缓存一致性协议,如MESI(Modified、Exclusive、Shared、Invalidated)协议,用于确保多处理器系统中缓存数据的一致性。 在Web开发中,HTTP缓存是常见的应用,通过设置HTTP头信息(如Cache-Control、ETag等),...

    服务器缓存设置 工具

    HTTP 协议提供了缓存控制头,如 `Cache-Control`、`ETag` 和 `Last-Modified`,用于管理缓存的有效性和更新。 2. **数据库缓存**:例如 MySQL 的 InnoDB 缓存、Redis 或 Memcached,它们存储数据库查询结果,避免...

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

    本文将深入探讨HTTP协议的几个核心概念:HTTP头、Cookies、Session机制以及浏览器缓存。 首先,HTTP请求头和响应头是HTTP协议的重要组成部分,它们包含了关于请求和响应的元信息。在请求头中,例如`GET`方法、`Host...

    深入了解http协议

    HTTP协议允许客户端缓存资源,通过Cache-Control和ETag等头部字段控制缓存策略。这可以减少网络带宽消耗和提高页面加载速度。 **HTTP协议的应用场景** HTTP协议广泛应用于网页浏览、API交互、文件下载、流媒体服务...

    HTTP协议详解PDF可打印版RFC2616

    3. **缓存机制**:HTTP协议支持缓存,通过Cache-Control、ETag、If-None-Match等首部字段实现资源的有效期管理和验证。 4. **连接管理**:HTTP/1.1默认使用持久连接,但可通过Connection首部字段关闭。Keep-Alive...

Global site tag (gtag.js) - Google Analytics