Http协议之缓存

简介:

先说缓存

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


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


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


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

再说304

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


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


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


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

wKiom1ba5tmSeVC3AAPtPVnn08o643.png

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

wKiom1ba5zWxdNCwAAMHDjDegAU819.png

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


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

如果不想被缓存呢?

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


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

wKiom1ba61uAAqUVAAT9_3yKXQA819.png可见,已经被缓存的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的流程如图:

wKiom1ba77rRl9_FAACX6fKue_Q664.png

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

wKioL1ba8G7hsyUdAABrc2JXSnU373.png




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

相关文章
|
5月前
|
缓存 负载均衡 网络协议
HTTP 与 SOCKS5 代理协议:企业级选型指南与工程化实践
面向企业网络与数据团队的代理协议选型与治理指南,基于流量特征选择HTTP或SOCKS5协议,通过多协议网关统一出站,结合托管网络降低复杂度,实现稳定吞吐、可预测时延与合规落地。
|
8月前
|
缓存 监控 搜索推荐
301重定向实现原理全面解析:从HTTP协议到SEO最佳实践
301重定向是HTTP协议中的永久重定向状态码,用于告知客户端请求的资源已永久移至新URL。它在SEO中具有重要作用,能传递页面权重、更新索引并提升用户体验。本文详解其工作原理、服务器配置方法(如Apache、Nginx)、对搜索引擎的影响及最佳实践,帮助实现网站平稳迁移与优化。
817 68
|
7月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
685 2
|
7月前
|
应用服务中间件
HTTP协议中常见的状态码
HTTP协议状态码分为1xx、2xx、3xx、4xx、5xx五类,常见状态码包括:101(请求已接受)、200(请求成功)、302(重定向)、400(请求错误)、401(未认证)、403(无权限)、404(资源不存在),以及500(服务器错误)、502(网关错误)、503(服务不可用)、504(网关超时)等。
405 0
|
7月前
|
网络协议 安全 网络安全
什么是HTTP协议
HTTP协议是超文本传输协议,基于TCP,规定了客户端与服务器端通信规则,但数据以明文传输,安全性低。HTTPS则通过SSL加密保障数据安全。两者默认端口不同,HTTP为80,HTTPS为443。HTTPS安全性更高,但消耗更多服务器资源。
257 0
|
7月前
|
数据采集 Web App开发 JSON
Python爬虫基本原理与HTTP协议详解:从入门到实践
本文介绍了Python爬虫的核心知识,涵盖HTTP协议基础、请求与响应流程、常用库(如requests、BeautifulSoup)、反爬应对策略及实战案例(如爬取豆瓣电影Top250),帮助读者系统掌握数据采集技能。
633 0
|
8月前
|
存储 网络协议 安全
HTTP 协议及会话跟踪机制详解
本文详解了 HTTP 协议的核心知识,包括其定义(超文本传输协议,基于 TCP,规定客户端与服务器通信规则)及与 HTTPS 的区别(安全性、端口、资源消耗)。 介绍了 GET 与 POST 请求的差异(参数限制、安全性、应用场景),以及 Restful 风格(通过 URL 定位资源,请求方式决定操作)。列举了常见 HTTP 状态码(如 200 成功、404 资源未找到),对比了转发与重定向的区别(服务器端一次请求 vs 客户端两次请求)。 还阐述了会话跟踪机制:Cookie 基于客户端存储,通过Set-Cookie和Cookie头实现,安全性较低;Session 基于服务端存储,依赖 C
700 1
|
9月前
|
缓存
HTTP协议深度剖析:常见请求头信息讲解
这就是HTTP请求头背后的工作原理,希望通过比作“邮差”和“标签”,可以让你对这个繁琐技术更有感触,更得心应手。尽管这些信息可能很琐碎,但了解了它们的含义和工作方式,就等于揭开了HTTP协议神秘的面纱,掌控了网络交流的核心。你还等什么,赶快动手尝试一下吧!
290 17
|
7月前
|
缓存 网络协议 UED
深度解析HTTP协议从版本0.9至3.0的演进和特性。
总的来说,HTTP的演进是互联网技术不断发展和需求日益增长的结果。每一次重要更新都旨在优化性能,增进用户体验,适应新的应用场景,而且保证了向后兼容,让互联网的基础架构得以稳定发展。随着网络技术继续进步,我们可以预期HTTP协议在未来还会继续演化。
869 0