【http】缓存协议

✨ 专栏介绍

在当今互联网时代,计算机网络已经成为了人们生活和工作中不可或缺的一部分。而要实现计算机之间的通信和数据传输,就需要依靠各种网络协议来进行规范和约束。无论是浏览网页、发送电子邮件还是进行在线交流,都离不开各种各样的网络协议。在本专栏中,我们将深入学习各种常见的网络协议,如HTTP、TCP/IP、UDP、DNS等。我们将探索这些协议的工作原理、数据包结构、状态管理以及与其他协议的关系。此外,我们还将介绍网络安全和加密技术,以及常见的网络攻击和防御方法。通过学习这些内容,你将能够更好地理解计算机网络的运作原理,并能够应用这些知识来解决实际问题和优化网络性能。让我们一起开始探索网络协议的奥秘吧!点击订阅网络协议专栏


摘要

本文将深入探讨HTTP缓存协议的基本原理、缓存策略以及来自服务器和客户端的缓存指令。我们将详细解析缓存标志和相关头部字段,以帮助开发人员更好地理解和应用HTTP缓存机制。

1. 缓存的基本原理

HTTP缓存是一种机制,用于在客户端和服务器之间存储已请求资源的副本。当客户端再次请求相同资源时,可以直接从缓存中获取,而无需再次向服务器发送请求。这样可以减少网络流量、提高性能和用户体验,极大的降低了服务器的处理压力。

HTTP缓存的基本原理如下:

  • 客户端发送请求到服务器,并在响应中获取资源。
  • 服务器在响应中发送与资源相关的头部字段,用于控制资源的缓存行为。
  • 客户端根据这些头部字段来决定是否将资源保存到缓存中。
  • 当客户端再次请求相同资源时,会先检查是否存在有效的缓存副本。如果存在,则直接从缓存中获取资源。

2. 缓存策略

这里就设计到一个缓存策略的问题,这些问题包括:

  • 哪些资源需要加入到缓存,哪些不需要?
  • 缓存的时间是多久呢?
  • 如果服务器的资源有改动,客户端如何更新缓存呢?
  • 如果缓存过期了,可是服务器上的资源并没有发生变动,又该如何处理呢?
  • ...

为了有效利用HTTP缓存,需要制定适当的缓存策略。以下是常见的缓存策略:

  • 强制缓存:当资源被强制缓存在客户端时,下一次请求时将直接从客户端获取,而不发送请求到服务器。这是通过设置响应头部字段来实现的。
  • 协商缓存:当资源未被强制缓存在客户端时,客户端发送请求到服务器,并根据服务器返回的响应判断是否使用已有的副本。这是通过与服务器进行协商来实现的。

3. 来自服务器的缓存指令

服务器可以通过响应头部字段发送缓存指令,以指示客户端如何缓存资源。以下是常见的服务器缓存指令:

  • Cache-Control:这是最常用的服务器缓存指令,用于控制资源的缓存行为。常见的Cache-Control指令包括:

    • max-age:指定资源在客户端缓存中的有效期(以秒为单位)。例如,max-age=3600表示资源在客户端缓存有效期为3600秒。
    • no-cache:表示客户端不能直接使用已有的副本,需要先与服务器进行验证。
    • no-store:表示响应不能被任何形式的缓存进行保存,每次请求都需要从服务器获取最新版本。
  • ETag:ETag是服务器为每个资源分配的唯一标识符。它可以是资源内容的哈希值、版本号或任何其他能够唯一标识资源的字符串。当客户端再次请求资源时,可以将上次获取资源时服务器返回的ETag值发送给服务器,以便服务器判断资源是否发生了变化。如果ETag值匹配,服务器可以返回304 Not Modified,客户端可以直接从缓存中获取资源。

  • Date:Date是响应头部字段,表示响应生成的日期和时间。它通常由服务器自动生成,并用于协助缓存控制和验证机制。当客户端发送请求时,会将上次获取资源时服务器返回的Date值发送给服务器。这有助于服务器判断客户端请求是否在资源过期之前发出。 这些缓存指令和头部字段在HTTP协议中起着关键作用,帮助服务器和客户端进行缓存控制、协商和验证。

  • Last-Modified:Last-Modified是响应头部字段,表示资源的最后修改时间。服务器在响应中发送该字段,以便客户端在下一次请求时将该值发送回服务器进行协商缓存。当客户端再次请求资源时,可以将上次获取资源时服务器返回的Last-Modified值发送给服务器。如果资源在该时间之后未发生修改,服务器会返回304 Not Modified,客户端可以直接从缓存中获取资源。 这个字段用于协商缓存机制,通过比较资源的最后修改时间来判断是否需要重新获取资源。

  • Expires

    http1.0版本中,是通过Expires响应头来指定过期时间点的,例如:

    bash 复制代码
    Expires: Thu, 23 Apr 2023 22:08:38 GMT

    到了http1.1版本,已更改为通过Cache-Controlmax-age来记录了。

4. 客户端的缓存指令

客户端可以通过请求头部字段发送缓存指令,以告知服务器其拥有的资源副本情况。以下是常见的客户端缓存指令:

  • If-Modified-Since:用于协商缓存,客户端将上次获取资源时的Last-Modified值发送给服务器。服务器会比较资源的最后修改时间,如果未发生变化,则返回304 Not Modified,客户端可以直接从缓存中获取资源。
  • If-None-Match:用于协商缓存,客户端将上次获取资源时的ETag值发送给服务器。服务器会比较资源的ETag值,如果匹配,则返回304 Not Modified,客户端可以直接从缓存中获取资源。

如何判断缓存是否有效呢?

缓存有效

就是把max-age + Date,得到一个过期时间,看看这个过期时间是否大于当前时间,如果是,则表示缓存还没有过期,仍然有效,如果不是,则表示缓存失效。

当浏览器发现缓存有效时,完全不会请求服务器,直接使用缓存即可得到结果

此时,如果你断开网络,会发现资源仍然可用

这种情况会极大的降低服务器压力,但当服务器更改了资源后,浏览器是不知道的,只要缓存有效,它就会直接使用缓存

缓存无效

当浏览器发现缓存已经过期,它并不会简单的把缓存删除,而是问问服务器,我这个缓存还能继续使用吗?

于是,浏览器向服务器发出了一个带缓存的请求,又称之为协商缓存

带缓存的请求则是加上If-Modified-SinceIf-None-Match的请求头。

服务器可能会产生两个情况:

  • 缓存已经失效 (200)
  • 缓存仍然有效(304)

5. 缓存标志

HTTP协议中使用一些标志来表示资源是否被缓存或如何进行缓存。以下是常见的缓存标志:

  • Public:表示响应可以被任何中间代理服务器(如CDN)和客户端进行缓存。
  • Private:表示响应只能被特定用户代理(如浏览器)进行缓存。
  • No-Cache:表示响应不能被直接使用,需要先与服务器进行验证。
  • No-Store:表示响应不能被任何形式的缓存进行保存。

结论

HTTP缓存协议是提高性能和用户体验的重要机制。通过理解缓存的基本原理、制定适当的缓存策略以及使用服务器和客户端的缓存指令,开发人员可以更好地利用HTTP缓存机制。同时,了解和使用缓存标志可以更精确地控制资源的缓存行为。通过合理应用HTTP缓存协议,我们可以减少网络流量、提高性能,并提供更好的用户体验。


😶 写在结尾

前端设计模式专栏

设计模式是软件开发中不可或缺的一部分,它们帮助我们解决了许多常见问题,并提供了一种优雅而可靠的方式来构建应用程序。在本专栏中,我们介绍了所有的前端设计模式,包括观察者模式、单例模式、策略模式等等。通过学习这些设计模式,并将其应用于实际项目中,我们可以提高代码的可维护性、可扩展性和可重用性。希望这个专栏能够帮助你在前端开发中更好地应用设计模式,写出高质量的代码。点击订阅前端设计模式专栏

Vue专栏

Vue.js是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动和组件化的方式,使开发者能够更轻松地构建交互性强、可复用的Web应用程序。在这个专栏中,我们将深入探讨Vue.js的核心概念、组件开发、状态管理、路由和性能优化等方面的知识。我们将学习如何使用Vue.js构建响应式的用户界面,并探索其强大的生态系统,如Vue Router和Vuex、Pinia。通过学习这些内容,你将能够成为一名熟练的Vue.js开发者,并能够应用这些知识来构建复杂而高效的Web应用程序。点击订阅Vue专栏

JavaScript(ES6)专栏

JavaScript是一种广泛应用于网页开发和后端开发的脚本语言。它具有动态性、灵活性和易学性的特点,是构建现代Web应用程序的重要工具之一。在这个专栏中,我们将深入探讨JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6(ECMAScript 2015)及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。点击订阅JavaScript(ES6)专栏

相关推荐
石牌桥网管6 小时前
OpenSSL 生成根证书、中间证书和网站证书
网络协议·https·openssl
阑梦清川12 小时前
JavaEE初阶---网络原理(五)---HTTP协议
网络·http·java-ee
材料苦逼不会梦到计算机白富美12 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
Java 第一深情12 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
阿尔帕兹12 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
FeelTouch Labs13 小时前
Netty实现WebSocket Server是否开启压缩深度分析
网络·websocket·网络协议
HBryce2413 小时前
缓存-基础概念
java·缓存
千天夜14 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
follycat15 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
earthzhang202116 小时前
《深入浅出HTTPS》读书笔记(5):随机数
网络协议·http·https