浏览器缓存原理

文字版描述

①浏览器第一次访问服务器资源 /index.html

在浏览器中没有缓存文件,直接向服务器发送请求。

服务器返回 200 OK,实体中返回 index.html文件内容,并设置一个缓存过期时间,一个文件修改时间,一个根据index.html内容计算出来的实体标记Entity Tag,简称Etag。

浏览器将/index.html路径的请求缓存到本地。

②浏览器第二次访问服务器资源 /index.html

由于本地已经有了此路径下的缓存文件,所以这一次就不直接向服务器发送请求了。

首先,进行缓存过期判断。浏览器根据①中设置缓存过期时间判断缓存文件是否过期。

情景一:若没有过期,则不向服务器发送请求,直接使用缓存中的结果,此时我们在浏览器控制台中可以看到 200 OK(from cache) ,此时的情况就是完全使用缓存,浏览器和服务器没有任何交互的。

情景二:若已过期,则向服务器发送请求,此时请求中会带上①中设置的文件修改时间,和Etag

然后,进行资源更新判断。服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是不是没有被修改过;根据Etag,判断文件内容自上一次请求之后,有没有发生变化

情形一:若两种判断的结论都是文件没有被修改过,则服务器就不给浏览器发index.html的内容了,直接告诉它,文件没有被修改过,你用你那边的缓存吧—— 304 Not Modified,此时浏览器就会从本地缓存中获取index.html的内容。此时的情况叫协议缓存,浏览器和服务器之间有一次请求交互。

情形二:若修改时间和文件内容判断有任意一个没有通过,则服务器会受理此次请求,之后的操作同①

我的文字表达能力可能有限,为了尽量把这个流程描述清楚一点,下面

一图以蔽之

缓存相关首部字段

request缓存相关首部字段

① cache-control 用来做缓存过期判断

常用指令:

no-cache 不直接使用缓存,始终向服务器发起请求

max-age 缓存过期时间,是一个时间数值,比如3600秒,设置为0的时候效果等同于no-cache

s-maxage 给缓存代理用的指令,对直接返回资源的server无效,当s-maxage生效时,会忽略max-age的值

only-if-cached 若有缓存,则只使用缓存,若缓存文件出问题了,请求也会出问题

② Pragma 用来做缓存过期判断

它可以取值no-cache

这是一个http1.0遗留的字段,当它和cache-control同时存在的时候,会被cache-control覆盖

③ if-match / if-none-match 用来做资源更新判断

这个指令会把缓存中的Etag传给服务器,服务器用它来和服务器端的资源Etag进行对比,若不一致则证明资源被修改了,需要响应请求为 200 OK

④ if-modified-since 用来做资源更新判断

这个指令会把文件的上一次缓存中的文件的更新时间传给服务器,服务器判断文件在这个时间点后是否被修改,如果被修改过则需要响应请求为200 OK

response缓存相关首部字段

① cache-control 用来设置缓存过期时间

常用指令:

no-cache 让客户端不直接使用缓存,始终向服务器发起请求,不设置默认是这个,上边截图中的请求就是省略了,所以客户端不会直接使用缓存。

max-age 缓存过期时间,是一个时间数值,比如3600秒,设置为0的时候效果等同于no-cache

s-maxage 给缓存代理用的指令,对直接返回资源的server无效,当s-maxage生效时,会忽略max-age的值

private/public 默认是private,只在一个浏览器中缓存(+微信关注网络世界),设置为public时缓存可被多个用户共享

② Etag 用来设置根据资源内容生成的实体标签

这个值有强tag和弱tag,区别是计算方式不同,只有强tag才会在资源被更新的时候立即发生变化,请求首部中的if-match/if-none-match字段就会传回这个值给服务端

③ age

这个字段用来告诉客户端,这个response是在多久前被创建的,单位为秒,缓存服务器返回资源的时候必须创建此字段

实体首部缓存相关字段

response的head里边可能还包括实体首部,实体首部是紧跟在response首部后边的。

①last-modified-time ——用来设置资源最后修改时间

②Exprire —— 设置文件过期时间

这个字段的作用和cache-control相同,不同的是它直接指定一个缓存过期时间点,容易受客户端时间的影响。

这也是一个遗留的字段,和cache-control同时存在的时候会被后者覆盖

缓存配置的一些注意事项

① 只有get请求会被缓存,post请求不会

② Etag 在资源分布在多台机器上时,对于同一个资源,不同服务器生成的Etag可能不相同,此时就会导致304协议缓存失效,客户端还是直接从server取资源。可以自己修改服务器端etag的生成方式,根据资源内容生成同样的etag。

③ 系统上线,更新资源时,可以在资源uri后边附上资源修改时间、svn版本号、文件md5 等信息,这样可以避免用户下载到缓存的旧的文件

④ 观察chrome的表现发现,通过链接或者地址栏访问,会先判断缓存是否过期,再判断缓资源是否更新;F5刷新,会跳过缓存过期判断,直接请求服务器,判断资源是否更新。

浏览器与HTTP网络协议缓存原理分析 转自网界网:http://news.cnw.com.cn/news-china/htm2015/20151027_322909.shtml相关推荐

  1. 嵌入式操作系统VxWorks中网络协议存储池原理及实现

    嵌入式操作系统VxWorks中网络协议存储池原理及实现 周卫东 蔺妍 刘利强 (哈尔滨工程大学自动化学院,黑龙江 哈尔滨,150001) 摘  要  本文讨论了网络协议存储池的基本原理和在嵌入式操作系 ...

  2. 网络协议图形化分析工具EtherApe

    网络协议图形化分析工具EtherApe 在对网络数据分析的时候,渗透测试人员往往只关心数据流向以及协议类型,而不关心具体数据包的内容.因为这样可以快速找到网络的关键节点或者重要的协议类型. Kali ...

  3. UNIX 网络协议的深度分析

    https://www.ibm.com/developerworks/cn/aix/library/au-deepprotocolanalysis/index.html?mhq=http%E5%8D% ...

  4. 网络协议底层原理7——网络安全

    网络通信中面临的4种安全威胁: 截获:窃听通信内容 中断:中断网络通信 篡改:篡改通信内容 伪造:伪造通信内容 1.网络层 - ARP欺骗 ARP欺骗 (ARP spoofing),又称ARP毒化 ( ...

  5. 网络爬虫工作原理分析

    网络爬虫工作原理 1.聚焦爬虫工作原理及关键技术概述 网络爬虫是一个自动提取网页的程序,它为搜索引擎从Internet网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得 ...

  6. 西门子S7协议底层原理分析

    -Begin- 前言 前面我们对ModbusRTU协议.ModbusTCP协议.欧姆龙FinsTCP协议.三菱SLMP协议都做了说明: 今天我们来分享一下关于西门子S7协议的通信分析. 西门子作为一个 ...

  7. 实验二网络协议以太网帧分析

    实验二 以太网帧分析 实验目的:掌握以太网的帧首部格式,理解其功能与含义. 原理概述: 在有线局域网中,目前只有一种,即以太网.下图是以太网的帧格式. 实验内容步骤: IP地址用于标识因特网上每台主机 ...

  8. Mybatis3.4.x技术内幕(二十二):Mybatis一级、二级缓存原理分析

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis的一级缓存,指的是SqlSession级别的缓存,默认开启:Mybatis的二级缓存,指的是SqlSession ...

  9. 关于手游网络协议的简单分析

    前言 大多数加密方案都假定可信的发送者和接收者会通过一个不可信的通道通信. 虽然假设发送者会故意尝试愚弄接收者有点荒谬,但这确实是摆在开发者面前的问题.有些玩家是不可信的, 更糟的是, 他们能够通过客 ...

  10. httpinvoker远程调用超时_RPC远程过程调用协议工作原理分析

    1.RPC(Remote Procedure Call)定义 RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的 ...

最新文章

  1. 创业思维 - Qunar的故事
  2. android单个页面切换_MTransition是一个Android上的页面切换动画库
  3. 基本概念,BGP协议的特征和消息类型,状态转换?
  4. java ee会员功能项目_基于jsp的会员系统-JavaEE实现会员系统 - java项目源码
  5. DataGrid 中間隔色的實現
  6. nginx ruoyi 配置静态资源服务
  7. Linux中断子系统-通用框架处理
  8. 面向对象(final/抽象类/接口/内部类)
  9. Intel Core Enhanced Core架构/微架构/流水线 (4) - 流水线前端概述
  10. 蒙哥马利java算法_算法详解 - 蒙哥马利算法的概念与原理
  11. 陇东学院计算机学院教授有,陇东学院
  12. php分组统计求和,数据需求统计常用shell命令---AWK分组求和,分组统计次数
  13. ApacheMaven使用技巧
  14. Windows上WinRAR.exe命令行参数说明
  15. 【word 2016】保存太慢解决办法
  16. 阿里巴巴离职DBA职业生涯总结
  17. 愤世嫉俗的程序员,在网上当起了“键盘侠”
  18. 小米手环6NFC安装太空人表盘
  19. 如何给图片批量命名?其实方法很简单
  20. 【Nginx】Nginx在大型网络框架中的应用

热门文章

  1. xp打开html页面不正常显示不出来,xp打开网页图片加载不出来如何解决
  2. [hdu5285]wyh2000 and pupil
  3. WUST-CTF2020(武汉科技大学第一届WUST-CTF网络安全竞赛)WP
  4. dh模型表matlab,建立DH模型的三种方法以及区别
  5. 【typescript】infer的理解与使用
  6. Wince电源管理(五) ---- Windows CE设备驱动开发之电源管理
  7. 灵动ICPC冬令营基础-5
  8. 数字系统设计, 8个经典计数器电路方案合辑
  9. OpenGL递归细分四面体法绘制球体
  10. 数据分析——实习僧数据分析岗招聘信息分析