Http协议缓存的处理机制

来源:互联网 发布:淘宝网买电动车可靠吗 编辑:程序博客网 时间:2024/04/29 20:24

本文出自博客Vander丶CSDN博客,如需转载请标明出处,尊重原创谢谢

博客地址:http://blog.csdn.net/l540675759/article/details/61424285

导读

1.本文的研究环境是在Android客户端与服务器通信的基础上,进行研究.2.文章内大部分内容由作者经过学习,整理而成.如果有错误希望大家及时指明.3.如果对本文对于HTTP协议缓存的处理机制,感觉内容不够,请查看最后的参考文章.

Http协议缓存的处理机制

1.为什么要有缓存?2.浏览器的缓存工作原理.3.缓存引起的问题.4.缓存的相关字段.

为什么要有缓存(本地缓存)?

根据进来的请求,同时保存输出内容的副本,例:html页面,图片,文件(统称为副本),然后,当下一个请求来到的时候,如果是相同的URL,并且符合缓存规则,则直接使用副本响应访问请求,而不是向服务器再次发送请求.

使用缓存的好处:1.可以减小服务器的压力.2.节省客户端流量,避免重复请求同样的内容.

使用缓存可能引起的问题

使用缓存之后,如果处理不好的话,可能造成客户端展示数据和服务器的最新数据冲突,造成客户端显示数据过久.

缓存的相关原理

浏览器第一次请求数据

浏览器第一次请求数据

第一次进行数据请求时,由于本地无缓存数据,没有各类关键字比对的过程,浏览器正常向Web服务器进行请求

浏览器再次请求时:

浏览器再次请求数据

当浏览器再次请求时,这时候浏览器会根据请求头中的缓存的相关关键字来做出判断.

与缓存相关的请求头中的关键字

Expires:版本:HTTP1.0作用:指定缓存的到期时间,时间为从服务器返回的绝对时间.缺点:因为返回的缓存时间是从服务器端返回的绝对时间,所以和本地的时间产生误差,更改本地时间会对缓存的处理产生影响.

总结:现在大多数已经用Cache-Control关键字来代替,因为绝对时间的误差性.

额外补充一下:

Pragma:这个关键字是HTTP1.0是否使用缓存的字段.随着HTTP1.1版本的到来,都被Cache-Control进行来替代.
Cache-Control:版本:HTTP1.1作用:HTTP1.1用来对Expires取代的关键字.其有多种属性,可以很好的对浏览器缓存就行很好的控制.

Cache-Control关键字属性的介绍:

no-cache:见名知意,就意味当前客户端请求的同时,不需要使用缓存备份.
max-age:当前客户端请求时,会生成一个缓存的副本,副本过期的期限有该关键字设置的相对时间来决定.        例如:        Cache-Control:max-age=60        此时60就是缓存过期的时间为60s.
only-if-cached:告知服务器,若当前本地存在缓存,则无需去服务器请求数据.
max-state:正常来说,如果请求不到数据,不如展现缓存上的数据,max-state就是定义一个可以超出期限使用缓存的时间段.

Cache-Control关键字对于客户端来说已经能很好的控制缓存了,并且使用相对时间来进行对缓存的控制.

Last-Modified:作用:服务器将资源传递给客户端时,会将资源最后更改的时间以“Last-Modified: GMT”的形式加在实体首部上一起返回给客户端。客户端会为资源标记上该信息,下次再次请求时,会把该信息附带在请求报文中一并带给服务器去做检查.若传递的时间值与服务器上该资源最终修改时间是一致的,则说明该资源没有被修改过,直接返回304状态码即可。例:Last-Modified:Fri, 10 Feb 2017 03:26:50 GMT

Last-Modified比较服务器端的修改时间和客户端本地的时间,进行是否修改的判断.

ETag:作用:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。例:ETag:"589d32fa-bcf"

在是否使用缓存的判断中ETag也是一个比较的关键字,可以通过ETag来判断出该客户端本地缓存数据与服务器端数据是否是最新.

Date:作用:服务器端当前的时间戳,与客户端时间无关.
If-Modified-Since:作用:在请求头中存在,上面描述客户端最后一次请求该资源的时间,用于Last-Modified比对.
If-None-Match:作用:存在于请求头中,将当前客户端最后一次请求生成的ETag,用于和服务器返回的ETag的值进行判断.

缓存相关的实践

浏览器再次请求数据

上述就是一个使用缓存的例子,从缓存中获取当前资源.

与缓存相关的状态码

HTTP关于缓存的状态码

参考文章:

Web_HTTP缓存控制及为什么要缓存http://mikzhang.iteye.com/blog/2014951彻底弄懂HTTP缓存机制及原理http://www.cnblogs.com/chenqf/p/6386163.html浏览器 HTTP 协议缓存机制详解http://www.cnblogs.com/520yang/articles/4807408.html浅谈浏览器http的缓存机制http://www.cnblogs.com/vajoy/p/5341664.htmlnate老师的Okhttp的实战课.
2 0
原创粉丝点击