Http协议缓存的处理机制

本文出自博客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.html

nate老师的Okhttp的实战课.
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值