五、cookie和web缓存
一、cookie
因为HTTP是无状态的,但是网站希望可以识别用户和与用户交互的内容,因此,大多数网站都用了cookie来跟踪用户,来管理用户的状态。示意图如下
cookie有四个部分组成:1、HTTP响应报文中的cookie首部行。2、HTTP请求报文的cookie首部行。3、用户主机中的cookie文件。4、网站的后端数据库
用cookie跟踪用户的过程如下图
上图中,假设用户访问过eBay并且第一次访问Amazon,那么当第一次访问Amazon时,web服务端会产生一个唯一的识别码,web服务端的数据库通过该识别码产生一个表。在HTTP响应报文中的set-cookie字段会将cookie设置为该识别码1678。当用户的浏览器收到该响应报文后,浏览器会把set-cookie字段中的识别码写入cookie文件。之后,当用户再次访问Amazon时,浏览器会查询cookie文件并找到Amazon对应的cookie值,然后放到用户的请求报文中的cookie字段,发给Amazon服务器。这样,Amazon就知道该cookie对应的用户的行为记录在web后端cookie对应的表中,从而知道用户在Amazon都干了啥。然后可以通过用户的行为给用户定向推荐或者服务。
示例
下面的报文是访问某个网站时,cookie跟踪用户的过程
1、当第一次访问某个网站时,web服务端发出的响应报文如下,可以看到set-cookie字段被设置
2、当再次发送HTTP请求时,请求报文的cookie字段已经被设置,和服务器发送的响应报文的set-cookie字段的值相同
3、当过了十几分钟之后再次访问该网站后,请求报文中的cookie被设置成之前的值
cookie是一把双刃剑,网站可以通过cookie更好的服务,但是同时cookie也泄露了用户的隐私,如果cookie被劫持,那么第三方就可以将cookie写入到对应网站的HTTP请求报文中,从而可以不用知道用户的账号密码就可以直接登录某个网站,具体过程见博客https://www.cnblogs.com/AirCrk/p/6051829.html
二、web缓存
如果每个主机访问web网页时都直接向服务端请求,那么服务端的通信量就会大大增加并需要额外的费用增加带宽。此外,如果客户端发送响应报文后,服务端可能会因为各种原因并不能很快的发送响应报文,增加用户的等待时间,用户体验差。为解决这两个问题,web缓存出现了
web缓存也叫代理服务器。web缓存中存储的是用户最近请求过的对象或者资源。用户可以配置浏览器的代理服务器。配置之后,当访问一个网页时的过程如下:
1、浏览器会创建一个到缓存服务器的TCP连接,并向缓存发送一个HTTP请求报文
2、web缓存服务器会对本地资源进行检查,看看是否存在请求资源的副本,如果有,web缓存服务器就向浏览器发送HTTP响应报文
3、如果没有,web缓存服务器会向真正的web服务器发起TCP连接,并发送HTTP请求报文,真正的web服务器收到请求后,向web缓存服务器发送HTTP响应报文
4、当web缓存服务器收到HTTP的响应报文后,web缓存服务器备份一份资源并向客户端浏览器发送HTTP响应报文发送该副本资源
示意图如下
客户端、web缓存和真正的服务器三者之间的关系如下图
即便缓存服务器内有缓存,也不能保证每次都会返回OK。因为这关系到被缓存资源的有效性。当源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前的“旧”资源了。
即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取“新”资源。
示意图
缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。
和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。
报文示例
以下报文是访问http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html时的报文
可见第一次请求时的响应报文返回OK,第二次请求的响应报文返回了一个304 Not Modified
第一次响应OK的报文如下
第二次请求的报文如下
可见,在第二次请求报文中出现了If-Modified-Since: Sat, 09 Jan 2021 06:59:01 GMT\r\。If-Modified-Since字段表示自从某个时间点之后,如果请求的资源被修改过,真正的服务端才会通过HTTP响应报文发送该资源给客户端浏览器
第二次响应报文如下
服务端发来HTTP/1.1 304 Not Modified\r\n,这意味着在第二次请求报文中If-Modified-Since字段的时间点之后,该资源没有被修改,所以,Web服务器通过web缓存发送该资源的副本给客户端,而且从响应报文中也可以看出,该响应报文没有携带资源
所以,通过上述分析,web缓存的作用实质是起到一个分流的作用,减缓web服务器的压力。通过缓存可以减少Web服务器数据传输,节省流量和带宽,缓解Web服务器带宽的瓶颈以及数据拥塞。对Web服务器的要求降低了。缓存也降低了延时, 因为从较远的地方传送响应报文会慢一些
参考
《图解HTTP》
《计算机网络自顶向下方法》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
五、cookie和web缓存相关推荐
- 计算机网络-自顶向下-Web应用2(Cookie、Web缓存、条件GET详解)
Web应用2 计算机网络所有笔记链接 Cookie技术 前面提到HTTP的服务是 无状态的,这简化了服务器的设计,但是Web站点还是很有必要具有能够识别用户的功能的.比如说你至少能够把我密码啥的记录了 ...
- web页面上数据是否进行缓存要怎么判断_前端要知道的网络知识五:详细的介绍web缓存...
Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有"已缓存的"副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关 ...
- Web缓存相关知识整理
一.前言 工作上遇到一个这样的需求,一个H5页面在APP端,如果勾选已读状态,则下次打开该链接,会跳过此页面.用到了HTML5 的本地存储 API 中的 localStorage作为解决方案,回顾了 ...
- 了解浏览器cookie以及浏览器缓存
Cookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新 ...
- 第五阶段-第五阶段高性能分布式缓存Redis
第五阶段 大型分布式系统缓存架构进阶 文章目录 第五阶段 大型分布式系统缓存架构进阶 第一部分 Redis 快速实战 第一节 缓存原理与设计 1.1 缓存基本思想 1.11 缓存的使用场景 1.12 ...
- 开发人员需知的Web缓存知识(转)
什么是Web缓存,为什么要使用它? 缓存的类型: 浏览器缓存: 代理服务器缓存: 网关缓存: Web缓存无害吗?为什么要鼓励缓存? Web缓存如何工作 如何控制缓存和不缓存: HTML Meta标签 ...
- 针对不同的Cookie做页面缓存
有时我们需要为PC浏览器及移动浏览器生成不同的页面,为了提高性能,不能每次请求都去判断User-Agent,通常用一个 Cookie 标记一下客户端是否是移动客户端,这样只需要读取这个 Cookie ...
- (转载)Web 开发人员需知的 Web 缓存知识
什么是Web缓存,为什么要使用它? Web缓存游走于服务器和客户端之间.这个服务器可能是源服务器(资源所驻留的服务器Add),数量可能是1个或多个:这个客户端也可能是1个或多个.Web缓存就在服务器- ...
- 面向站长和网站管理员的Web缓存加速指南
2019独角兽企业重金招聘Python工程师标准>>> 原文(英文)地址: http://www.mnot.net/cache_docs/ 版权声明:署名-非商业性使用-禁止演绎 ...
最新文章
- 软件测试女孩学适合吗
- php ssd性能影响,SATA SSD有无缓存,是否影响速度性能实例
- 多delegate使用
- Java代码优化思路(JVM的角度)
- centos下cmake安装
- mysql 查看root_Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
- 群赛 ZOJ3741(dp) ZOJ3911(线段树)
- 矩池云中Tensorflow指定GPU及GPU显存设置
- Z600服务器是阵列硬盘,Z600 使用SAS卡,SAS硬盘组Raid 5
- 5号字对应的数字字号_我想要个字号对照表,就比如五号字对应10.5磅,更详细一点的更好...
- uni-app-地图中心设置图标-获取坐标
- 使用gatekeeper限制kubernetes创建特定类型的资源
- 计算机中用函数排序,编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出。...
- Linux下四款常见远程工具比较
- 微信编辑器实用小功能
- 科研实验用,TPGS-COOH羧基修饰维生素E聚乙二醇琥珀酸酯
- MonoDevelop花括号(大括号)自动补全
- python两列时间间隔计算器_在python中有效地比较两列中的每对日期
- python每行输出10个数据_python 如何重复地在一行输出数据?
- Exact Audio Copy