你还在为 HTTP 的这些概念头疼吗?(一)

简介: 上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)

HTTP 标头

先来回顾一下 HTTP1.1 标头都有哪几种

HTTP 1.1 的标头主要分为四种,通用标头实体标头请求标头响应标头,现在我们来对这几种标头进行介绍

通用标头

HTTP 通用标头之所以这样命名,是因为与其他三个类别不同,它们不是限定于特定种类的消息或者消息组件(请求,响应或消息实体)的。HTTP 通用标头主要用于传达有关消息本身的信息,而不是它所携带的内容。它们提供一般信息并控制如何处理和处理消息。

尽管通用标头不会限定于是请求还是响应报文,但是某些通用标头大部分或全部用于一种特定类型的请求中。也就是说,如果某个通用标头出现在请求报文中,那么大部分通用标头都会显示在该请求报文中。响应报文也是一样的。

先列出来一个清单,讲明我们都需要介绍哪些通用标头

  • Cache-Control
  • Connection
  • Date
  • Pragma
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • Via
  • Warning

Cache-Control

缓存(Cache)是计算机领域里的一个重要概念,是优化系统性能的利器。不仅计算机中的 CPU 为了提高指令执行效率从而选择使用寄存器作为辅助,计算机网络同样存在缓存,下面我们就来介绍一下计算机网络中的缓存。

Cache-Control 是通用标头的指令,它能够管理如何对 HTTP 的请求或者响应使用缓存。

因为计算机网络中是可以有第三者出现的,也就是缓存服务器,这个指令通过影响请求/响应中的缓存服务器从而达到控制缓存的目的;不仅有缓存服务器,还有浏览器内部缓存也会影响链路的缓存。

这个标头中可以出现许多单独的指令,其详细信息可以在 RFC 2616 中找到,即使这是常规标头,某些指令也只能出现在请求或响应中。下表提供了一个 Cache-Control 选项的总结并告诉你如何去使用

请注意,在 Cache-Control 标头中只能出现一个指令,但是在消息中可以出现多个这样的标头。

微信图片_20220412194502.jpg

上面这个表格其实会有四种分类

  • 可缓存性:它们分别是 no-cacheno-storeprivatepublic
  • 缓存有效性时间:它们分别是 max-ages-maxagemax-stalemin-fresh
  • 重新验证并重新加载:它们分别是 must-revalidateproxy-revalidate
  • 其他:它们分别是 only-if-cachedno-transform

分别对表格中的内容进行一下详细介绍

no-cache

no-cache 很容易和 no-store 混淆,一般都会把 no-cache 认为是不缓存,其实不是这样。

使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源,例如下图所示

Cache-Control: no-cache

微信图片_20220412194509.jpg

举个例子你就明白了,No-Cache 就相当于是吃着碗里的,占着锅里的,如果锅里还有新的肉片,就先吃锅里的,如果锅里没有新的,再吃自己的,这里锅里的就相当于是源服务器产生的,碗里的就相当于是缓存的。

no-store

no-store 才是真正意义上的不缓存,每次服务器接受到客户端的请求后,都会返回最新的资源给客户端。

Cache-Control: no-store

max-age

max-age 可以用在请求或者响应中,当客户端发送带有 max-age 的指令时,缓存服务器会判断自己缓存时间的数值和 max-age 的大小,如果比 max-age 小,那么缓存有效,可以继续给客户端返回缓存的数据,如果比 max-age 大,那么缓存服务器将不能返回给客户端缓存的数据。

Cache-Control: max-age=60

如果 max-age = 0,那么缓存服务器将会直接把请求转发到服务器

Cache-Control: max-age=0

注意:这个 max-age 的值是相对于请求时间的

must-revalidate

表示一旦资源过期,缓存就必须在原始服务器上没有成功验证的情况下才使用其过期的数据。

Cache-Control: must-revalidate

no-storeno_cachemust-revalidatemax-age 可以一起看,下面是一个这四个标头的流程图


微信图片_20220412194514.jpg

public

public 属性只出现在客户端响应中,表示响应可以被任何缓存所缓存。在计算机网络中,分为两种缓存,共享缓存和私有缓存,如下所示

Cache-Control: public


微信图片_20220412194518.jpg

private

当指定 private 指令后,响应只以特定的用户作为对象,这与 public 的用法相反,缓存服务器只对特定的客户端进行缓存,其他客户端发送过来的请求,缓存服务器则不会返回缓存。

Cache-Control: private


微信图片_20220412194522.jpg

s-maxage

s-maxage 指令的功能和 max-age 指令的功能相同,不同点之处在于 s-maxage 不能用于私有缓存,只能用于多用户使用的公共服务器,对于同一用户的重复请求和响应来说,这个指令没有任何作用。

Cache-Control: s-maxage=60

min-fresh

min-fresh只能出现在请求中,min-fresh 要求缓存服务器返回 min-fresh 时间内的缓存数据。例如 Cache-Control:min-fresh=60,这就要求缓存服务器发送60秒内的数据。

Cache-Control: min-fresh=60

max-stable

max-stable 只能出现在请求中,表示客户端会接受缓存数据,即使过期也照常接收。

Cache-Control: max-stable=60

only-if-cached

这个标头只能出现在请求中,使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。

Cache-Control: only-if-cached

proxy-revalidate

proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

Cache-Control: proxy-revalidate

no-transform

使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。

Cache-Control: no-transform

Connection

HTTP 协议使用 TCP 来管理连接方式,主要有两种连接方式,持久性连接非持久性连接

持久性连接

持久性连接指的是一次会话完成后,TCP 连接并未关闭,第二次再次发送请求后,就不再需要建立 TCP 连接,而是可以直接进行请求和响应。它的一般表示形式如下

Connection: keep-alive

从 HTTP 1.1 开始,默认使用持久性连接

keep-alive 也是一个通用标头,一般 Connection 都会和 keep-alive 一起使用,keep-alive 有两个参数,一个是 timeout;另一个是 max,它们的主要表现形式如下

Connection: Keep-Alive

Keep-Alive: timeout=5, max=1000
  • timeout: 指的是空闲连接必须打开的最短时间,也就是说这次请求的连接时间不能少于5秒,
  • max: 指的是在连接关闭之前服务器所能够收到的最大请求数。

非持久性连接

非持久性连接表示一次会话请求/响应后关闭连接的方式。HTTP 1.1 之前使用的连接都是非持久连接,也就是

Connection: close

Date

Date 是一个通用标头,它可以出现在请求标头和响应标头中,它的基本表示如下

Date: Wed, 21 Oct 2015 07:28:00 GMT

表示的是格林威治标准时间,这个时间要比北京时间慢八个小时

微信图片_20220412194534.jpg

            </div>
目录
相关文章
|
3月前
|
网络协议 网络性能优化
说一说http的发展史
说一说http的发展史
简要概括一下 HTTP 的特点?HTTP 有哪些缺点?
简要概括一下 HTTP 的特点?HTTP 有哪些缺点?
|
存储 缓存
当我们在谈论HTTP缓存时我们在谈论什么
在浏览器众多缓存中的HTTP缓存可能很多人对这个的概念并没有很清晰,每个人都知道进入一次网页之后再刷新一次页面,加载速度会比首次加载快非常多,每个人都知道这是浏览器缓存的magic,但是对此背后的原因可能不甚了解... 当我们在谈论HTTP缓存时我们在谈论什么: 我们实际上是在谈论下面这两种情况: 缓存流程: 浏览器第一次请求资源时: 浏览器第一次请求资源时,必须下载所有的资源,然后根据响应的header内容来决定,如何缓存资源。可能采用的是强缓存,也可能是弱缓存 浏览器后续请求资源时的匹配流程:
377 0
当我们在谈论HTTP缓存时我们在谈论什么
|
XML 缓存 移动开发
你还在为 HTTP 的这些概念头疼吗?(二)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
91 0
你还在为 HTTP 的这些概念头疼吗?(二)
|
算法 网络协议 安全
你还在为 HTTP 的这些概念头疼吗?(三)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
143 0
你还在为 HTTP 的这些概念头疼吗?(三)
|
XML 存储 缓存
你还在为 HTTP 的这些概念头疼吗?(四)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
94 0
你还在为 HTTP 的这些概念头疼吗?(四)
|
缓存 网络协议
你还在为 HTTP 的这些概念头疼吗?(一)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
83 0
你还在为 HTTP 的这些概念头疼吗?(一)
|
网络协议 安全
《面试官:你如何理解HTTP协议?》
《面试官:你如何理解HTTP协议?》
|
网络协议
重温HTTP,你到底做了什么?(上)
之前在回忆面试题的时候,面试官曾经问过我关于网络协议的一些东西,回答的当时感觉自己很垃圾,然后面试结束之后,自行百度,翻阅书籍,然后做了细致的整理,现在我就来分享给大家。
重温HTTP,你到底做了什么?(上)
|
网络协议 区块链
重温HTTP,你到底做了什么?(下)
之前在回忆面试题的时候,面试官曾经问过我关于网络协议的一些东西,回答的当时感觉自己很垃圾,然后面试结束之后,自行百度,翻阅书籍,然后做了细致的整理,现在我就来分享给大家。
重温HTTP,你到底做了什么?(下)