http缓存机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http缓存机制相关的知识,希望对你有一定的参考价值。

1.什么是http协议?

http(超文本传输协议)(typerText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

简单点说就是浏览器和服务器之间的双向通信,http(应用层)是基于tcp/ip(传输层)协议基础上的。

2.http请求的时候与tcp的关联:

当浏览器需要向服务器获取网页数据的时候,会发出一次http请求,http会通过tcp建立起一个到服务器的链接通道,当本次请求需要的数据完毕后,http就会立刻将tcp链接断开。此过程非常短,所以就有了http是一个无状态的链接。

3.http协议的特点:

1.支持客户端和服务端模式。(支持什么)

2.简单快速:请求数据时,只需要发送请求路径和请求方法。方法有:get,post,head。每种方法规定了与服务器联系的类型不同,由于http协议简单,是的http服务器的程序规模小,因而通信速度快。(只需要方法和路径就可以了。)

3.无状态:http协议是无状态协议,意思就是http协议对于事物处理没有记忆能力。意味着,它每次都要重新传数据,这样就会导致每次链接传送的数据量增大。(没有记忆)

4.无连接:就像上面说的,http协议每次只能处理一个请求,服务器处理完客户的请求,并收到客户的应答后,就会立刻断开链接。这种方式可以节省传输时间。(一次性)

5.灵活: http协议之所以灵活是因为它允许传输任意类型的数据对象,正在传输的类型由content-type加以标记。(什么类型的数据对象都可以。)

 

4.一次完整的http请求的7个步骤

1.建立tcp链接。

2.web浏览器向web服务器发送请求指令。

3.web浏览器向web服务器发送请求信息头。

4.web服务器应答。

5.web服务器返回信息头。

6.web浏览器得到返回的信息头之后发送请求数据。

7.web服务器关闭tcp链接。

 

5.http缓存机制

1.毕竟http协议这个东西是浏览器和服务器的双向通信工具,既然是通信那么肯定会有信号慢点时候,那么就自然而然造成了用户体验不好了,所以要是有缓存机制的话,那么就方便很多了,(1.不用再跑来跑去不断请求,2.用户体验也好,速度快。)

>>此图第一次请求。

技术分享图片

第一次请求好理解的,没有缓存就直接请求,而且还进行缓存协商。把一些缓存相关的头部信息返回给浏览器.。以便再次请求使用。

 

1.先说说http报文(请求报文,响应报文)。

1.请求报文:由请求行,请求头,空行,请求数据4个部分组成。以下4中格式。

技术分享图片
<request-line> 请求行
<headers> 请求头
<blank line> 空格
<request-body> 请求数据

1.1请求行是由(1.请求方法字段(get,post,head,delete,..),2URL字段,3.http协议版本号)组成,用空格号分隔。例如:get /index.html HTTP/1.1

1.2介绍下head字段,它类似get请求,但是服务器接受head请求时只会返回响应头,不会返回请求数据内容,所以一般想要查看页面的状态码时,使用head非常高效。

 

1.2.请求头是由关键字/值组成。请求头通知服务端有关客户端请求的信息。例如

use-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个ip地址,即虚拟主机。

列子:
Cache-Control:private, max-age=10
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Tue, 21 Feb 2017 03:05:37 GMT
Expires:Tue, 21 Feb 2017 03:05:47 GMT
Last-Modified:Tue, 21 Feb 2017 03:05:37 GMT
Proxy-Connection:Keep-Alive
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-UA-Compatible:IE=10
 
1.3.空行最后一个请求头之后是一个空行,发送回车符和换行符。通知服务器不再有请求头。
 
1.4.请求数据请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
 
2.http响应报文
http响应报文由三个部分组成(状态行,响应头,响应数据)。其实跟请求报文唯一的区别就是第一个。
 
2.1状态行(看状态码吧。)
 
3.现在进入缓存机制。
我们现在重点说说第二次请求。
1.借用一下二次请求图
技术分享图片
 
我们在第一次请求时,服务器可以在响应中包含缓存的相关HTTP头。这些http头会告诉浏览器是否以及如何缓存资源。
 
2.下面列出关于缓存的http headers(http头)出现在什么地方。
2.1Cache-control              响应
2.2Expires                         响应
2.3Last-Modified               响应
2.4if-Modified-Since          请求
2.5ETag                             响应
2.6if-None-Match               请求
 
1.Cache-control
在chrome调试器中,可以在response中找到Cache-control。
它的值有public | private | no-cache,no-store | max-age=n
 
public:是指资源应该被缓存,并且代理服务器也可以缓存。
 
private:资源可以被缓存,但是只有本地客户端可以缓存,中间代理服务器不可缓存。
 
no-cache,no-store:是指资源不应该被缓存,
 
max-age=n:是指缓存多长时间,n的单位是秒。
    1. Cache-Control : public, max-age=60
      告诉浏览器,当前资源应该被缓存,同时也告诉代理服务器(假如有的话)也可以缓存这个资源。缓存应该在60秒后过期。

    2. Cache-Control : private, max-age=60
      告诉浏览器,当前资源应该被缓存,同时也告诉代理服务器(假如有的话)不要缓存这个资源。缓存应该在60秒后过期。

    3. Cache-Control : no-cache, no-store 告诉浏览器以及代理服务器,不要缓存这个资源。

 
2.Expires
这个是http1.0比较合适,到和http1.1已经不合适了,但是还是要介绍下。 它是相对于max-age的另外一种指示过期时间的方式,max-age表示多少时间后过期,而expires表示在某个日期时间点后过期。
打个比方,max-age相当于“保质期6个月”,expires相当于“在此日期之前”饮用。max-age优先级高。
限制:max-age和Expires设置的缓存过期时间最多为一年(365天),如果多于这个值则浏览器有可能会忽略。
 
3.Last-Modified和if-Modified-Since
 
Last-Modified出现在响应中,告诉浏览器当前资源的最后修改时间,例如:
Last-Modified:Mon, 03 Jan 2012 17:45:57 GMT

 而If-Modified-Since出现在下次请求中,询问服务器当前缓存的资源是否已经过期,例如:

 

If-Modified-Since: Mon, 03 Jan 2012 17:45:57 GMT

 

如果资源没有过期,则服务器应该返回304,不需要返回资源的内容。如果已过期,则服务器应该返回资源的内容到浏览器,并且返回200 HTTP状态码。

 

Last-Modified和If-Modified-Since配套使用,可以在保证不会误用缓存里的过期资源的前提下,减少服务器向浏览器发送的数据量,以及由于服务器在缓存未过期的情况下只需要返回304 HTTP状态码,而不需要返回整个资源的内容,也给了服务器优化的机会。
 

ETag 和 If-None-Match

Last-Modified 和 If-Modified-Since是用日期时间判断一个缓存的资源是否有效。ETag和If-None-Match则是用内容摘要作为判定的依据。内容摘要是指为一个资源的内容产生一串比较短的数字,当内容变化时,产生的数字串也会改变。内容摘要的算法有很多种,较常见的是SHA-1哈希算法、CRC32等。

ETag包含在服务器的响应中,为内容摘要。在下一次请求中,If-None-Match的值为上次的ETag的值。服务器根据If-None-Match的值(即内容摘要)判断缓存的资源是否有效。

 

同时说明一点:ETag比Last-Modified优先级高。

304状态码

304状态码("Not Modified")表示资源(相对于缓存过的)没有被修改过。

静态资源

对于那些不经常改变的静态资源,比如CSS、图片、动画等,应尽可能地利用缓存。因为这些资源通常很大而且几乎每个页面可能都会用到,缓存会大大提高系统效率。对于这些资源,响应中应该包含如下内容:

Cache-Control:public; max-age=31536000
Expires: Mon, 25 Jun 2013 21:31:12 GMT

 

max-age=31536000意味着31536000秒(也就是一年)后缓存失效。这里尤为注意不能设置成多于一年,因为RFC上限制了最大只能是一年,超过一年的情况不同的浏览器处理策略不同,有些直接就忽略了Cache-Control。

动态资源

对于动态内容,需要依据内容的实际情况,定义合适的max-age。例如对于SNS网络中的时间线通常可以设置成几秒。

私有内容

对于需要登录才能访问到资源,Cache-Control应该设置成private以禁止代理服务器缓存这些资源,否则会威胁信息安全。

禁用缓存

某些情况下需要禁止使用缓存,则应该把Cache-Control设置成"no-cache, no-store",如下所示。

Cache-Control:no-cache, no-store

 



以上是关于http缓存机制的主要内容,如果未能解决你的问题,请参考以下文章

[转]浏览器缓存机制

彻底理解浏览器的缓存机制(http缓存机制)

浏览器缓存机制(HTTP缓存机制)

HTTP缓存机制

HTTP学习彻底弄懂 Http 缓存机制 - 浏览器缓存机制详解

HTTP学习彻底弄懂 Http 缓存机制 - 浏览器缓存机制详解