Lambda博客
  • 自我介绍
  • SSR
    • 浅谈SSR
  • React
    • 页面路由——React-Router
    • 管好你的状态——React-Redux
    • 一个哪行——React详解
    • 左膀右臂一个不少——React初探
  • 问题记录
    • js-xlsx实现纯前端导出excel表格
    • 前端开发需要了解的东西
    • 打造高性能网站
  • JavaScript学习笔记
    • 语法和API
    • js-垃圾回收
    • 收集的JS使用技巧
    • 执行机制
    • 原型和原型链
    • 执行上下文
    • 事件循环
    • JavaScript手写代码
    • 43道JS面试题
    • 悄悄的带走了你的东西——闭包详解
    • 你是个富二代吗?——JavaScript作用域链
    • 捉摸不透的女生——JavaScript类型转换
    • 这是你的女神!——JavaScript
  • 网络学习笔记
    • 强不强——HTTP-协商缓存VS强缓存
    • 网络缓存
    • 我要飞的更高——计算机网络
    • 快点!再快点!——CDN
    • 喜怒哀乐多状态——HTTP状态码
    • 你会爱上我的(ಥ_ಥ) ——TCP详解
    • 隔壁老王想篡位?门都没有——同源策略
  • 软技能
  • 安全专题
    • 保护好自己——网站安全,预防
  • 浏览器兼容性
    • 我是个好人——浏览器兼容性
  • 多图片加载——懒加载详解
  • 数据结构
  • Node
    • Node初探
  • Typescript
    • JS Plus 真香——初探 TypeScript
  • 设计模式
    • 不要花里胡哨,要一套一套——设计模式(1)
    • 学会“套路”——设计模式(2)
  • Vue
    • 实操实干——vue实例记录
    • 停下来,问问自己——Vue-刨根问底
    • 你有喘息的机会吗?——Vue,逐步了解
    • 你累吗?来来来,安利框架——Vue-初次见面
  • 小程序
    • 今天天气怎么样——记一次小程序开发
  • Webpack
    • 蛋糕分割整合工具——Webpack-前端工程化
  • 你一块,我一块——Web-modules 前端模块化
  • HTML5
    • 你会画小猪佩奇吗?—— canvas
    • 画个矢量图——HTML5-SVG
    • 听说你爱闹腾——HTML5-多媒体
    • 动画神器——HTML5-requestAnimationFrame
    • 留下痕迹——HTML5-客户端存储
    • 你知道指北针吗?——HTML5-DeviceMotionEvent
    • 你在哪啊?我在这啊——HTML5-Geolocation
    • 你到这,你到那——HTML5-拖拽
    • 你从这,到那——HTML5-拖拽上传文件
    • 开启前端之路——HTML 标签
  • 瀑布流(无限滚动)
  • 我是怎么来的?——浏览器渲染原理
  • Css
    • 由大变小,你行吗 —— 移动端
    • 动起来,这样比较炫—— CSS3 动画
    • 请不要拐弯抹角 —— CSS3 选择器
    • 想炫吗?—— CSS3 属性
    • 最后的最后——CSS自问自答
    • 万事开头难?——深入学习前端常见布局
    • 一入前端深似海——BFC剖析
    • 还有哪些好玩的东西——CSS提升
    • 那些好看的页面是怎么形成的——CSS 初识
  • 拿个小本本记下——Cookie
由 GitBook 提供支持
在本页
  • HTTP-协商缓存VS强缓存
  • 浏览器缓存
  • 强缓存
  • 协商缓存
在GitHub上编辑
  1. 网络学习笔记

强不强——HTTP-协商缓存VS强缓存

HTTP-协商缓存VS强缓存

缓存的作用不言而喻,能够极大的改善网页性能,提高用户体验

浏览器缓存

当第一次请求数据时,通过返回的响应头告诉浏览器如何缓存资源,可能采用的是强缓存,也可能告诉浏览器是协商缓存。

当浏览器在请求资源时,回显获取到该资源缓存的header信息,判断是否是强缓存,如果命中直接从缓存中获取资源信息,本次请求不会和服务器之间通信。

强缓存

第一次访问服务器取到数据之后,在过期时间内不会再次去重复请求。

HTTP 1.0 (Expires)

在 HTTP 1.0 版本中,强缓存通过 Expires 响应头来实现。Expires 表示未来资源会过期的时间。当发起请求的时间超过了 Expires 设定的时间,则表示资源缓存到期,会发送请求到服务器重新获取资源。如果发送请求时间在Expires限定时间内,浏览器会直接读取本地缓存数据库中的信息。

HTTP 1.1 (Cache-Control)

在 HTTP 1.1 版本中,强缓存通过 Cache-Control 响应头来实现

  • private 客户端可以缓存,服务器不能缓存

  • public 客户端和代理服务器均可缓存

  • max-age 缓存的资源将在设定时间后过期

  • no-cache 不使用本地缓存,使用协商缓存

  • no-store 直接禁止浏览器缓存数据

如果 Cache-Control 与 Expires 同时存在的话,Cache-Control 的优先级较高

总结

强制缓存只有在首次请求才会和服务器通信,读取缓存资源时不会发出任何请求,资源的状态码为200,HTTP 1.1 版本的实现优先级会高于 HTTP 1.0 版本的实现

协商缓存

首先协商缓存在每次读取数据时都会和服务器通信,并且会增加缓存标识。在第一次请求资源时,服务器会返回资源,并且返回一个资源缓存标识,当第二次请求资源时,浏览器会首先将缓存标识发送给服务器,服务器拿到标识后会进行匹配,如果不匹配,表示资源有更新,服务器会将新数据和新的缓存标识返回到客户端,如果标识匹配,表示资源没有更新,并且返回 304 状态码,浏览器就读取本地缓存数据

HTTP 1.0 (Last-Modified/If-Modified-Since)

在 HTTP 1.0 版本中,第一次请求资源时服务器通过 Last-Modified 来设置响应头缓存标识,并且把资源最后修改的时间作为值填入,然后将资源返回给浏览器。第二次请求时,浏览器会带上 IF-Modified-Since 请求头去访问服务器,服务器会将 If-Modified-Since 中携带的时间尽心匹配,如果不一致,服务器返回新的资源,并且将Last-Modified 值更新,作为响应头返回浏览器。如果时间一致,表示资源没有更新,服务器返回 304 状态码,浏览器取本地缓存数据。

HTTP 1.1 (Etag/If-None-Match)

在 HTTP 1.1 版本中,服务器通过 Etag 来设置响应头缓存标识。 Etag 的值有服务端生成。第一次请求时,服务器会将资源和 Etag 一并返回给浏览器,浏览器将两者缓存到本地缓存数据库。在第二次请求时,浏览器会将 Etag 信息放在 If-None-Match 请求头去访问服务器,服务器收到请求后,会将服务器中的标识进行比对,如果不相同,服务器返回更新的资源和新的 Etag,如果相同,服务器返回 304 状态码,浏览器读取缓存。

总结

协商缓存每次请求都会与服务器交互,第一次是拿数据和标识,第二次开始就是浏览器询问服务器是否更新的过程。每次请求都会传输数据,如果命中缓存,资源状态码为 304,HTTP 1.1 版本的实现优先级会高于 HTTP 1.0 版本的实现

上一页网络学习笔记下一页网络缓存

最后更新于3年前