Http协议之缓存

先说缓存

缓存是一个好东西,比如说用nginx做一个代理服务器,如在nginx.conf文件里做好缓存的设置,那么这台代理服务器同时也是一个缓存服务器,会把配置文件里的对应需要被缓存的文件缓存配置上的时间。这样的话,若被缓存的文件恰巧是用户访问的对象的话,就不用大费周折的跑去再找服务器去要,直接缓存服务器就可以提供了。


缓存服务器可以提供一部分文件,用户本身的浏览器也具备缓存的能力。比如可以保存微博用户名和密码,或者支付宝的用户名和密码,等等等等。


多用缓存,就少用TCP,毕竟一次TCP就要三次握手,然后完事还要四次挥手。使用缓存不但节省了服务器的运转,还降低了延迟,又节省了带宽消耗。这么一想,缓存好处真是顶呱呱。


前面说过,默认情况下第一次登陆某个网页,如果此网页会成功打开的话,也意味着GET方法成功,返回的状态码就是200。如果网页上有很多的图片,这些图片也成功都打开的话,那么对应每个图片的状态码也都是200。这个时候,这些图片就会被浏览器缓存到电脑的对应文件夹里。以后再次访问这个网站的时候,就会发现,对于这个网站的状态码依旧是200,但是对于那些图片的状态码是304。

再说304

304,就是“客户端已经执行了GET,但文件未变化,可以直接从本地提取”。


但是电脑是如何知道这些图片是没有变化的呢?这里要注意,不是服务器知道电脑缓存的内容和服务器的内容一模一样,服务器是不知道用户电脑里的任何事情,不然的话,个人电脑里的资料全部外泄了。那样的服务器是病毒服务器。


那么图片是如何被确定没有被更改过呢,那是因为返回头文件里,会有一个叫Etag的东西,他是一个一大串的字符串,这个东西也叫做“指纹”,服务器获得用户端的GET请求的时候,会对照这个“指纹”,如果“指纹”没有发生变化,那么这个图片在服务器上的样子和客户端的样子肯定也是没有变化,于是就可以直接从用户端自己提取了。


举个例子,第一次登陆一个网站,里面有一张叫apple的图片,对于图片来说,方法是GET,状态码是200,同时在回复头信息里获得了ETag。

Http协议之缓存

在浏览器里不清除cookie,刷新这个网站,获得的情况如下图:

Http协议之缓存

这时对于这个图的状态码就是304,而且在客户端的要求信息里也有标记:上一次修改的时间和如果没有改变的话,ETag的内容。


就这样,一些被压缩过的图片或者GIF动图就被缓存下来,虽然这些文件单个看起来不大,但是要知道一个网站每天要面对成千万上亿的观众,所以说,这种积少成多的文件量其实是很惊人的。

如果不想被缓存呢?

但是有些信息是不可以被缓存的,比如说验证码,每一次登陆都需要验证码,而这些验证码是需要到服务器上去验证的。这些不被缓存的内容是可以在Nginx.conf或者 Apache的配置文件里做进一步修改的。


举个例子,还是上面的网页,加入了一个GIF文件,但是在设置文件里设置GIF文件不参与缓存。那么在不删除cookie和cache的情况下,刷新这个页面,得到如下结果:

Http协议之缓存可见,已经被缓存的apple图像和GIF都是GET的方法,但是一个因为被缓存了,所以状态码是304,另一个就是200。

说一说cookie和session。

之前在linux笔试题里有问过这个问题,那里的评析里已经写了一点,这里再重复一遍。


Cookie和Session都是缓存的东西,他俩也是保证Http协议是一个无状态协议的重要元素。但是两者是有不同的,不同的表现如下:

1)Cookie是保存在客户端的,而Session是保存在缓存服务器里的;

2)因为Session是保存在缓存服务器里,是面对各个用户的,因为缓存服务器会给每一个访问过的用户搭配一个ID,用SessionID来区别不同的用户,当用户自己禁用cookie的时候,缓存服务器可以依旧SessionID来发送缓存文件;

3)重要文件保存在Session上,不重要的保存在cookie上,毕竟黑客黑进你的个人电脑要比黑进一个服务器要困难上那么一点;

4)网络服务器用http头信息想客户端发送cookies,在客户端,由浏览器将这些cookies解析并保存成一个又一个本地文件,Session在http协议里是没有被定义的。


Cookie的流程如图:

Http协议之缓存

Session的流程如图,sessionid是以cookie的形式存在在请求上的:

Http协议之缓存




 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1747941

上一篇:C语言易错点解析(一)


下一篇:Android中关于dip和px以及转换的总结