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 标头中只能出现一个指令,但是在消息中可以出现多个这样的标头。
上面这个表格其实会有四种分类
可缓存性
:它们分别是no-cache
、no-store
、private
和public
缓存有效性时间
:它们分别是max-age
、s-maxage
、max-stale
、min-fresh
重新验证并重新加载
:它们分别是must-revalidate
和proxy-revalidate
其他
:它们分别是only-if-cached
和no-transform
分别对表格中的内容进行一下详细介绍
no-cache
no-cache
很容易和 no-store
混淆,一般都会把 no-cache
认为是不缓存,其实不是这样。
使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源,例如下图所示
Cache-Control: no-cache
举个例子你就明白了,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-store
、no_cache
、 must-revalidate
和 max-age
可以一起看,下面是一个这四个标头的流程图
public
public
属性只出现在客户端响应中,表示响应可以被任何缓存所缓存。在计算机网络中,分为两种缓存,共享缓存和私有缓存,如下所示
Cache-Control: public
private
当指定 private
指令后,响应只以特定的用户作为对象,这与 public
的用法相反,缓存服务器只对特定的客户端进行缓存,其他客户端发送过来的请求,缓存服务器则不会返回缓存。
Cache-Control: private
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
表示的是格林威治标准时间,这个时间要比北京时间慢八个小时