搜索
您的当前位置:首页正文

深入理解HTTP协议及原理分析之缓存

来源:知库网

缓存的目 的是减少相应延迟 和 减少网络带宽消耗, 比如css、js、图片这类静态资源应该进行缓存。

实际项目 一般使用反向代理服务器(如nginx、apache等) 进行缓存。

关键字:

cache-control, expire, if-none-match, if-modified-since, etag, last-modified

请求处理过程:

当一个用户发起一个静态资源请求的时候,浏览器会通过以下几步来获取资源

3.缓存失败阶段:当服务器发现请求的资源已经修改过,或者这是一个新的请求(在本来没有找到资源),服务器则返回该资源的数据,并且返回200, 当然这个是指找到资源的情况下,如果服务器上没有这个资源,则返回404

经过上面的流程整理,我们会有以下几个问题需要处理.

1.本地缓存阶段,如何判断资源在本地是否过期?

2.协商缓存阶段,如何判断本地资源是否和服务器的资源是否一样?

expire:

cache-control:

该头部有过个值,下面我们来看下各个值的作用

1.Public

指示响应可被任何缓存区缓存。

2.Private

指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

3.no-cache

指示请求或响应消息不能缓存

4.no-store

用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存

5.max-age

指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

6.no-transform

不允许转换存储系统

7.must-revalidate

使得客户端再次浏览当前页时必须发送相关 HTTP 头信息到服务器进行验证,然后才决定是否加载客户端本地 cache

if-modified-since 和 last-modified:

把其内容值和资源同时保存起来.

当用户第二发送资源请求(假设这里expire没有生效或者已经过期), 浏览器在本地找到了一个相同的资源,但是不能确定该资源是否和服务器上的一样(有可能在两次访问期间,服务器上的资源已经被修改过),此时浏览器发送请求的时候,请求头内会

附带一个if-modified-since的请求头, 这个头部的内容就是上一次last-modified返回的值, 服务器把这个头的值和请求资源的最后修改时间对比,如果两个值相同,则认为资源没有修改,将会返回304,让浏览器使用本地资源.否则服务器将返回资源,而且

返回200状态

if-none-match 和 etag:

其实这两个头部和if-modified-since, last-modified的工作原理是一样的, if-none-match作为请求头, etag作为响应头.既然工作原理一样, 为什么etag这对头部会出现呢?

原因在于, last-modified请求头的内容是以文件最后修改的时间作为对比的,但是unix系统里面, 文件修改的时间只保存到了秒. 如果某些应用内存在1秒内对文件做了多次修改,这样last-modified是不能完成比较功能的.所以要引入一个新的机制(原因可能不止这一个);

etag的值一般由3个数值组成,资源的inode值, 最后修改时间, 资源大小,以16进制组成一个字符串, 例如:1a-182b-10f; 但这个格式不是固定的, 只要保证该值的唯一性,但不限格式.

浏览器中的操作对缓存的影响:

1.强制刷新 – 当按下ctrl+F5来刷新页面的时候, 浏览器将绕过各种缓存(本地缓存和协商缓存), 直接让服务器返回最新的资源;

2.普通刷新 – 当按下F5来刷新页面的时候,浏览器将绕过本地缓蹲来发送请求到服务器, 此时, 协商缓存是有效的

3.回车或转向 – 当在地址栏上输入回车或者按下跳转按钮的时候, 所有缓存都生效

cache-control 和 expire:

1.两者都是控制本地缓存的头部两者同时存在的时候

2.expire会被cache-control的max-age覆盖

3.expire的值是一个确定的日期, 而max-age的值是一个以秒为单位的数字访问, 表示生存时间.

4.expire只针对静态资源, 而cache-control针对所有页面,但默认为所有的动态页面不缓存(例如php页面).

Pragma 和 cache-control:

if-modified-since 和 if-none-match的优先级:

服务器会优先验证if-modified-since请求头,再验证if-none-match,但是必须要两者头通过验证的时候才返回304,其中一个验证失败,都将返回新资源和200状态;

Top