`

HTTP协议:缓存

 
阅读更多

1.缓存的优点

1) 缓存减少了冗余的数据传输,节省了网络费用。

2) 缓存缓解了网络瓶颈的问题,不需要更多的网络带宽就能更快的加载页面。

3) 缓存降低了对原始服务器的要求,服务器可以更快的响应。

2.缓存分类

1)私有缓存

常见就是我们的浏览器里内置的缓存。

2)公有缓存

常见的就是代理缓存,不多介绍。

3.缓存的处理流程

 

处理流程图,如上所示,下面分步骤具体介绍:

1)请求处理

用户发起一个http请求,缓存获取到URL,根据URL查找是否有匹配的副本,这个副本可能在内存中,也可能在本地磁盘。

2) 新鲜度检测

如果缓存中存在所请求资源的副本,则进行新鲜度检测。新鲜度检测举个简单的例子,我们在商店买了一瓶汽水,汽水瓶上肯定会标有过期时间,我们会根据这个过期时间和现在的时间做对比,看看饮料过期了没,如果没过期,我们正常喝就行了,如果已经过期,我们肯定要找商家。。。其实这就是一个新鲜度检测的过程,HTTP请求的新鲜度检测流程也是这样的,HTTP发起一个请求时,发现缓存中有相应的副本,接着就会检查这个副本有没有过期,如果没有过期,直接使用。如果已经过期,则进行再验证。具体的实现在下面会介绍。

3)服务器再验证

缓存中的文档过期了并不代表他和服务器上的不一样,所以这个时候就需要问问服务器,过期的这段时间里这个文档到底有没有改变。如果改变了,缓存就会获取一份新的文档副本,然后发送给客户端。如果没有改变,缓存只需要获取新的首部,包括一个新的过期时间,并对缓存中的首部更新。

4)创建响应并返回

我们希望缓存看起来就像是来自原始服务器一样,缓存将已缓存的服务器响应首部作为响应首部,发送给客户端。

4.保质期的实现

HTTP中,通过Cache-Control首部和Expires首部为文档指定了过期时间,通过对过期时间的判断,缓存就可以知道文档是不是在保质期内。Expires首部和Cache-Control:max-age首部都是来告诉缓存文档有没有过期,为什么需要两个响应首部来做这件简单的事情了?其实这一切都是历史原因,Expires首部是HTTP 1.0中提出来的,因为他使用的是绝对日期,如果服务端和客户端时钟不同步的话(实际上这种情况非常常见),缓存可能就会认为文档已经过了保质期。HTTP 1.1为了修正这个问题,引入了Cache-Control:max-age首部,这个首部使用相对时间来控制保质期,让一切变得更加合理。举个例子,我们买了一瓶汽水,如果使用Expires首部来标注保质期,就会这么写:饮料过期时间:2012年12月21日,如果某个2货不知道今天多少号,他还真不知道这饮料过期没,我小时候饮料都这么写。后来,有个挺有名的卖牛奶的,大概就叫蒙牛,他发明了一种标注保质期的方法,他怎么搞了?他这么写:保质期:12个月,行,牛逼了,我牛奶一年前就生产出来的牛奶,今天要发给厂家,发之前,先往包装上印上生产日期(当然是印发货那天),然后告诉你,明年才过期,这多聪明,搞成相对的,毒死你。也许HTTP 1.1借鉴了这个伟大的发明,于是就有了Cache-Control:max-age首部。

 

5.服务器再验证的实现

缓存要问问服务器,牛奶已经过期了,到底还能不能喝。我说错了,是文档,不是牛奶。HTTP中,使用两个请求请首部来完成这个功能:If-Modified-Sice和If-None-Match。为啥又要两个首部来完成这个功能了?答案还是因为历史的原因。一开始使用 If-Modified-Sice:<date>首部,date是上一次缓存牛奶时,响应中Last-Modified首部的值。客户端拿着这个值,问服务器,这段时间内这个牛奶你有没有修改过?服务器看了看这个牛奶的修改时间,如果没有修改过,会返回一个304 Not Modified的响应;如果修改过,把最新的牛奶返回给客户端。后来,人们发现这样有问题,因为就算修改时间变化了,文档也不一定发生改变!于是乎,就有了 If-None-Match:<tag>首部,tag是上一次缓存文档时,响应中Etag的值,Etag是一种唯一标识资源的方式,就像java中的hashcode,如果hashcode不一样,那么两个对象肯定不一样!

6.试探性过期

如果响应中既没有Cache-Control:max-age首部又没有Expires首部,缓存可以计算出一个试探性最大使用期。这东西打个比方就是缓存会根据响应的Last-Modified来决定这文档靠不靠谱,需不需要再验证,如果Last-Modified中的日期是很早之前,那缓存就认为这文档挺靠谱,近期之内应该不会变化;如果Last-Modified中的日期是最近几天,那缓存可能就认为这文档可能经常改变,不靠谱。当然这么粗略的判断想想就知道不严谨,所以我们一定要设置Expires首部和Cache-Control首部。

7.写在最后

如果你是个好学者,看完这个文章,你可能会迫不及待的打开你的chrome浏览器,F12,观察oschina的HTTP信息。这个时候的你,肯定和几个月前的我一样茫然,因为你发现我上面讲的很多东西再这里被现实无情推翻了。看看这个讨论记录,这是几个月前我在OSC上问的。之所以会出现这个情况,是因为chrome为了保证牛奶的安全放心,所以他不太信任包装上的保质期标识,每次都问问服务器(再验证),牛奶有没有变化,没变化的话他就直接喝了!一切都是为了安全!

分享到:
评论

相关推荐

    HTTP拆分攻击技术:HTTP响应缓存与重定向攻击.docxHTTP拆分攻击技术:HTTP响应缓存与重定向攻击all.docxHTTP拆分攻击技术:HTTP响应缓存与重定向攻击-(10).HTTP

    HTTP拆分攻击技术:HTTP响应缓存与重定向攻击_(2).HTTP协议基础及安全问题.docx HTTP拆分攻击技术:HTTP响应缓存与重定向攻击_(3).HTTP响应缓存机制详解.docx HTTP拆分攻击技术:HTTP响应缓存

    14-HTTP协议:看个新闻原来这么麻烦1

    HTTP协议中的缓存机制非常重要,它允许客户端存储服务器响应,减少不必要的网络传输,提高性能。例如,当访问一个网页时,如果该页面的部分内容如图片或CSS文件在之前已经被缓存,浏览器就不会再次从服务器下载,...

    Android http缓存实现

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

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

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

    http.rar_HTTP ppt_HTTP协议_http://brow

    在我们的主题“http.rar_HTTP ppt_HTTP协议_http://brow”中,我们可以深入探讨HTTP协议的特点及其在网页浏览中的作用。 1. 浏览器/服务器模式: HTTP协议采用的是客户端-服务器模型。在这个模型中,客户端(通常...

    Http页面缓存机制(转)

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

    认清http协议本质

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

    HTTP协议分析报告

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

    将缓存加载 IIS

    **IIS(Internet Information Services)** 是微软公司提供的一个用于发布Web应用程序的服务器软件,它在Windows操作系统上运行,提供HTTP、HTTPS等网络协议服务。IIS加缓存的实践是为了提升网站性能,减少服务器...

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

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

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

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

    互联网缓存实践

    2. 协商缓存:若资源过期,浏览器会发送请求到服务器,服务器根据ETag或Last-Modified判断是否更新。 五、数据库缓存 数据库缓存如Redis、Memcached,将热点数据存储在内存中,提供快速查询。它们支持多种数据结构...

    网络协议源代码

    通过分析HTTP协议的源代码,可以理解请求方法(GET、POST等)、状态码(200、404等)和报头的实现细节。 3. FTP协议:FTP(文件传输协议)用于在网络上进行文件传输。其源代码可能包含用户认证、数据连接建立、命令...

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

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

    缓存基础 (附PPT下载)

    3. **缓存一致性**:多副本环境下,如何保证所有缓存节点的数据一致性,例如使用MESI协议来维护CPU缓存的一致性。 **缓存的挑战** 1. **缓存污染**:非热点数据占据了缓存空间,导致真正需要的热点数据无法有效...

    网络技术协议-HTTP协议

    ### 网络技术协议-HTTP协议详解 #### HTTP协议概述 HTTP(HyperText Transfer Protocol)是一种用于万维网(World Wide Web, WWW)数据传输的应用层协议,它定义了客户端与服务器之间的通信规则。HTTP协议是基于...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics