65-http-16-通用首部字段

概述

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

列表

通用首部 作用(请求报文和响应报文都可能使用)
Cache-Control 控制缓存的行为
Connection 管理持久连接:决定当前的事务完成后,是否会关闭网络连接
Date 创建报文时间
Pragma 兼容HTTP/1.0字段:只用于请求报文,客户端要求中间服务器不返回缓存的资源
Trailer 允许发送方在分块发送的消息后面添加额外的元信息,常用于分块传输编码中。
Transfer-Encoding 规定了传输报文主体时采用的编码方式:chunked分块传输
Upgrade 要求客户端使用的升级协议,需配合Connection: Upgrade一起使用:websocket
Via 代理服务器相关信息,每经过一个代理服务器就会添加相关信息,用逗号分割
Warning 缓存相关问题的警告

Cache-Control

可缓存性

public(客户端、代理服务器都可利用缓存)

private(发起请求的浏览器才可以缓存,代理服务器不可用缓存)

no-cache(本地可以用使用缓存,但需要服务器验证后才能使用)

no-store(不做任何缓存)

到期

max-age=200(服务器缓存到期时间, 秒)

s-maxage=200 (代理服务器缓存的到期时间, 秒)

Connection

管理持久连接:决定当前的事务完成后,是否会关闭网络连接。

Http协议1.1之后默认都是keep-alive(持久连接),1.0则是close(非持久连接)。

Connection: keep-alive
Connection: close

Date

表明创建 HTTP 报文的日期和时间。

Date: Tue, 03 Jul 2012 04:40:59 GMT

Pragma

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

规范定义的形式唯一,如下所示。

Pragma: no-cache

该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。

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

Cache-Control: no-cache
Pragma: no-cache

Trailer

首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Content-Type: text/html
...
Transfer-Encoding: chunked
Trailer: Expires
...(报文主体)...
0
Expires: Tue, 28 Sep 2004 23:59:59 GMT

以上用例中,指定首部字段 Trailer 的值为 Expires,在报文主体之后(分块长度 0 之后)出现了首部字段 Expires。

Transfer-Encoding

规定了传输报文主体时采用的编码方式。

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

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800
Content-Type: text/javascript; charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
cf0 ←16进制(10进制为3312)
...3312字节分块数据...
392 ←16进制(10进制为914)
...914字节分块数据...
0

Upgrade

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

GET /index.htm HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
------------------>
<------------------
HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

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

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

Via

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

报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。

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

客户端: 
GET / HTTP/1.1

代理服务器A: 
GET / HTTP/1.1
Via: 1.0 gw.hackr.jp (Squid/3.1)

代理服务器B:
GET / HTTP/1.1
Via: 1.0 gw.hackr.jp (Squid/3.1), 1.1 a1.example.net(Squid/2.7)

源服务器

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

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

Warning

用于告知用户一些与缓存相关的问题的警告。

Warning 首部的格式如下。最后的日期时间部分可省略。

Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
Warning: 112 gw.hacker.jp:8080  "cache down" " Wed, 21 Oct 2015 07:28:00 GMT"

警告码表

警告码 警告内容 说明
110 Response is stale 响应已过期:由缓存服务器提供的响应已过期(设置的失效时间已过)。
111 Revalidation failed 再验证失败:由于无法访问服务器,响应验证失败。
112 Disconnection operation 断开连接操作:缓存服务器断开连接。
113 Heuristic expiration 试探性过期:响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
199 Miscellaneous warning 杂项警告:任意的警告内容
214 Transformation applied 使用了转换:由代理服务器添加,如果它对返回的展现内容进行了任何转换,比如改变了内容编码、媒体类型等。
299 Miscellaneous persistent warning 持久杂项警告:任意的警告内容