一篇文章带你搞定 HTTP/1.1 通用首部字段

文章目录

    • 1. Cache-Control
    • 2. Connection
    • 3. Date
    • 4. Pragma
    • 5. Trailer
    • 6. Transfer-Encoding
    • 7. Upgrade
    • 8. Via
    • 9. Warning

通用首部字段是指,请求报文和响应报文双方都会使用的首部。

1. Cache-Control

通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第1张图片

指令的参数是可选的,多个指令之间通过“,”分隔。首部字段Cache-Control的指令可用于请求及响应时。

在这里插入图片描述
Cache-Control指令一览:

一篇文章带你搞定 HTTP/1.1 通用首部字段_第2张图片
一篇文章带你搞定 HTTP/1.1 通用首部字段_第3张图片
表示是否能缓存的指令

一篇文章带你搞定 HTTP/1.1 通用首部字段_第4张图片
当指定使用public指令时,则明确表明其他用户也可利用缓存。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第5张图片
当指定private指令后,响应只以特定的用户作为对象,这与public指令的行为相反。

缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第6张图片
使用no-cache指令的目的是为了防止从缓存中返回过期的资源。

客户端发送的请求中如果包含no-cache指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。

如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。

在这里插入图片描述
由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。

控制可执行缓存的对象的指令

一篇文章带你搞定 HTTP/1.1 通用首部字段_第7张图片
当使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息。

因此,该指令规定缓存不能在本地存储请求或响应的任一部分。

指定缓存期限和认证的指令

一篇文章带你搞定 HTTP/1.1 通用首部字段_第8张图片
s-maxage指令的功能和max-age指令的相同,它们的不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器[插图]。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。

另外,当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第9张图片

当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。

当服务器返回的响应中包含max-age指令时,缓存服务器将不对资源的有效性再作确认,而max-age数值代表资源保存为缓存的最长时间。

应用HTTP/1.1版本的缓存服务器遇到同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略掉Expires首部字段。而HTTP/1.0版本的缓存服务器的情况却相反,max-age指令会被忽略掉。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第10张图片
min-fresh指令要求缓存服务器返回至少还未过指定时间的缓存资源。

比如,当指定min-fresh为60秒后,在这60秒以内如果有超过有效期限的资源都无法作为响应返回了。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第11张图片
使用max-stale可指示缓存资源,即使过期也照常接收。

如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale指定的时间内,仍旧会被客户端接收。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第12张图片
使用only-if-cached指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第13张图片
使用must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。

若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条504(Gateway Timeout)状态码。

另外,使用must-revalidate指令会忽略请求的max-stale指令(即使已经在首部使用了max-stale,也不会再有效果)。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第14张图片
一篇文章带你搞定 HTTP/1.1 通用首部字段_第15张图片
一篇文章带你搞定 HTTP/1.1 通用首部字段_第16张图片
通过cache-extension标记(token),可以扩展Cache-Control首部字段内的指令。

如上例,Cache-Control首部字段本身没有community这个指令。借助extension tokens实现了该指令的添加。如果缓存服务器不能理解community这个新指令,就会直接忽略。因此,extension tokens仅对能理解它的缓存服务器来说是有意义的。

2. Connection

Connection首部字段具备如下两个作用。

  • 控制不再转发给代理的首部字段
    一篇文章带你搞定 HTTP/1.1 通用首部字段_第17张图片
    在客户端发送请求和服务器返回响应内,使用Connection首部字段,可控制不再转发给代理的首部字段(即Hop-by-hop首部)。
  • 管理持久连接
    一篇文章带你搞定 HTTP/1.1 通用首部字段_第18张图片
    HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第19张图片
HTTP/1.1之前的HTTP版本的默认连接都是非持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。

如上图①所示,客户端发送请求给服务器时,服务器端会像上图②那样加上首部字段Keep-Alive及首部字段Connection后返回响应。

3. Date

首部字段Date表明创建HTTP报文的日期和时间。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第20张图片
一篇文章带你搞定 HTTP/1.1 通用首部字段_第21张图片

4. Pragma

Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第22张图片
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第23张图片
所有的中间服务器如果都能以HTTP/1.1为基准,那直接采用Cache-Control: no-cache指定缓存的处理方式是最为理想的。但要整体掌握全部中间服务器使用的HTTP协议版本却是不现实的。因此,发送的请求会同时含有下面两个首部字段。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第24张图片

5. Trailer

一篇文章带你搞定 HTTP/1.1 通用首部字段_第25张图片
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码时。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第26张图片
以上用例中,指定首部字段Trailer的值为Expires,在报文主体之后(分块长度0之后)出现了首部字段Expires。

6. Transfer-Encoding

一篇文章带你搞定 HTTP/1.1 通用首部字段_第27张图片
首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。

HTTP/1.1的传输编码方式仅对分块传输编码有效。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第28张图片
以上用例中,正如在首部字段Transfer-Encoding中指定的那样,有效使用分块传输编码,且分别被分成3312字节和914字节大小的分块数据。

7. Upgrade

首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第29张图片
上图用例中,首部字段Upgrade指定的值为TLS/1.0。请注意此处两个字段首部字段的对应关系,Connection的值被指定为Upgrade。Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade。

对于附有首部字段Upgrade的请求,服务器可用101 SwitchingProtocols状态码作为响应返回。

8. Via

使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。

报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。这个做法和traceroute及电子邮件的Received首部的工作机制很类似。

首部字段Via不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第30张图片
上图用例中,在经过代理服务器A时,Via首部附加了“1.0 gw.hackr.jp (Squid/3.1)”这样的字符串值。行头的1.0是指接收请求的服务器上应用的HTTP协议版本。接下来经过代理服务器B时亦是如此,在Via首部附加服务器信息,也可增加1个新的Via首部写入服务器信息。

Via首部是为了追踪传输路径,所以经常会和TRACE方法一起使用。比如,代理服务器接收到由TRACE方法发送过来的请求(其中Max-Forwards: 0)时,代理服务器就不能再转发该请求了。这种情况下,代理服务器会将自身的信息附加到Via首部后,返回该请求的响应。

9. Warning

HTTP/1.1的Warning首部是从HTTP/1.0的响应首部(Retry-After)演变过来的。该首部通常会告知用户一些与缓存相关的问题的警告。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第31张图片
Warning首部的格式如下。最后的日期时间部分可省略。

一篇文章带你搞定 HTTP/1.1 通用首部字段_第32张图片

你可能感兴趣的:(java,http,网络)