一、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缓存相关推荐

  1. 计算机网络-自顶向下-Web应用2(Cookie、Web缓存、条件GET详解)

    Web应用2 计算机网络所有笔记链接 Cookie技术 前面提到HTTP的服务是 无状态的,这简化了服务器的设计,但是Web站点还是很有必要具有能够识别用户的功能的.比如说你至少能够把我密码啥的记录了 ...

  2. web页面上数据是否进行缓存要怎么判断_前端要知道的网络知识五:详细的介绍web缓存...

    Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有"已缓存的"副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关 ...

  3. Web缓存相关知识整理

    一.前言  工作上遇到一个这样的需求,一个H5页面在APP端,如果勾选已读状态,则下次打开该链接,会跳过此页面.用到了HTML5 的本地存储 API 中的 localStorage作为解决方案,回顾了 ...

  4. 了解浏览器cookie以及浏览器缓存

    Cookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新 ...

  5. 第五阶段-第五阶段高性能分布式缓存Redis

    第五阶段 大型分布式系统缓存架构进阶 文章目录 第五阶段 大型分布式系统缓存架构进阶 第一部分 Redis 快速实战 第一节 缓存原理与设计 1.1 缓存基本思想 1.11 缓存的使用场景 1.12 ...

  6. 开发人员需知的Web缓存知识(转)

    什么是Web缓存,为什么要使用它? 缓存的类型: 浏览器缓存: 代理服务器缓存: 网关缓存: Web缓存无害吗?为什么要鼓励缓存? Web缓存如何工作 如何控制缓存和不缓存: HTML Meta标签 ...

  7. 针对不同的Cookie做页面缓存

    有时我们需要为PC浏览器及移动浏览器生成不同的页面,为了提高性能,不能每次请求都去判断User-Agent,通常用一个 Cookie 标记一下客户端是否是移动客户端,这样只需要读取这个 Cookie ...

  8. (转载)Web 开发人员需知的 Web 缓存知识

    什么是Web缓存,为什么要使用它? Web缓存游走于服务器和客户端之间.这个服务器可能是源服务器(资源所驻留的服务器Add),数量可能是1个或多个:这个客户端也可能是1个或多个.Web缓存就在服务器- ...

  9. 面向站长和网站管理员的Web缓存加速指南

    2019独角兽企业重金招聘Python工程师标准>>> 原文(英文)地址: http://www.mnot.net/cache_docs/  版权声明:署名-非商业性使用-禁止演绎 ...

最新文章

  1. 软件测试女孩学适合吗
  2. php ssd性能影响,SATA SSD有无缓存,是否影响速度性能实例
  3. 多delegate使用
  4. Java代码优化思路(JVM的角度)
  5. centos下cmake安装
  6. mysql 查看root_Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
  7. 群赛 ZOJ3741(dp) ZOJ3911(线段树)
  8. 矩池云中Tensorflow指定GPU及GPU显存设置
  9. Z600服务器是阵列硬盘,Z600 使用SAS卡,SAS硬盘组Raid 5
  10. 5号字对应的数字字号_我想要个字号对照表,就比如五号字对应10.5磅,更详细一点的更好...
  11. uni-app-地图中心设置图标-获取坐标
  12. 使用gatekeeper限制kubernetes创建特定类型的资源
  13. 计算机中用函数排序,编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出。...
  14. Linux下四款常见远程工具比较
  15. 微信编辑器实用小功能
  16. 科研实验用,TPGS-COOH羧基修饰维生素E聚乙二醇琥珀酸酯
  17. MonoDevelop花括号(大括号)自动补全
  18. python两列时间间隔计算器_在python中有效地比较两列中的每对日期
  19. python每行输出10个数据_python 如何重复地在一行输出数据?
  20. Exact Audio Copy

热门文章

  1. DateTools使用「日期工具库」
  2. spring中的事务配置
  3. UITableView当数据很少的时候,去掉多余的cell分割线
  4. NSKeyedUnarchiver简单的数据存储
  5. Android布局之weight属性解析
  6. KS007基于JSP实现人个人博客系统
  7. 新手探索NLP(八)——序列标注
  8. Node.js获取本机IP
  9. Kubernetes 笔记 01 初识 Kubernetes 新时代的领航者
  10. wpf--------------datagrid全选反选 多选进行删除操作 前后台