首部字段简介
HTTP 协议的请求和响应报文中必定包含 HTTP 首部,首部内容为客户端和服务器分别处理请求和响应提供所需要的信息,对于客户端普通用户来说,这些信息中的大部分内容都无须亲自查看。
而 HTTP 报文首部又分为起始行和首部字段两部分,请求报文的起始行包含 HTTP 请求方法、URL资源、客户端 HTTP 协议版本,响应报文的起始行包含服务器 HTTP 协议版本、状态码和原因短语,这些东西在前面的分享中都已经介绍过,今天我们来看首部字段。
HTTP 首部字段是构成 HTTP 报文的要素之一,在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用,比如报文主体大小、所使用的语言、认证信息、是否缓存、Cookie 等。
首部字段结构及分类
首部字段由字段名和字段值两部分构成,中间用冒号分隔,比如下面这种:
Connection: keep-alive
另外,单个 HTTP 首部字段可以有多个值,不同值之间通过逗号分隔:
Accept-Encoding: gzip, deflate
有些首部字段只能在请求报文中使用,有些首部字段只能在响应报文中使用,有些则既可以在请求报文中使用,又可以在响应报文中使用,基于使用场景可以将首部报文分为以下五类:
下面会具体介绍上述五种类型的首部字段,我们先从通用首部字段开始。
通用首部字段介绍
常见的通用首部字段如下表所示:
下面我们来详细介绍每个通用首部字段的使用。
1)Cache-Control
通过指定首部 Cache-Control 字段的指令值就能操作 HTTP 缓存的工作机制。
在请求报文首部,Cache-Control 可以包含以下指令:
在响应报文首部,Cache-Control 可以包含以下指令:
后面我们会结合 Cache-Control 与其他缓存相关首部字段(Expires、If-Modified-Since、Last-Modified、If-None-Match、Etag 等)介绍 HTTP 缓存的完整解决方案,这里先了解下其功能及指令即可。
2)Connection
Connection 首部字段的作用主要有两个:
3)Date
该字段用于标识创建 HTTP 报文的日期和时间。HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式:
Date: Fri, 19 Apr 2019 02:57:46 GMT
4)Pragma
Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义:
Pragma: no-cache
HTTP/1.1 中使用 Cache-Control: no-cache 来替代该字段的功能。
5)Trailer
该字段用于事先说明在报文主体后记录了哪些首部字段,可应用于 HTTP/1.1 版本的分块传输编码。
6)Transfer-Encoding
该首部字段规定了传输报文主体时采用的编码方式:
Transfer-Encoding: chunked
HTTP/1.1 版本的传输编码方式仅对分块传输编码有效。
7)Upgrade
用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
8)Via
该字段用于追踪客户端与服务器之间的请求和响应报文的传输路径(关于这一点我们在前面介绍 TRACE 请求方法时提到过)。报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。
此外,首部字段 Via 还可以避免请求回环的发生。
9)Warning
该字段从 HTTP/1.0 的响应首部字段 Retry-After 演变而来,通常会告知用户一些与缓存相关的问题的警告。
HTTP/1.1 定义了7种警告:
小结
在通用首部中,比较值得关注的首部字段是 Cache-Control 和 Connection,Connection 相对简单,在 HTTP/1.1 协议中,一般都是默认值 keep-alive,Cache-Control 相对复杂,指令值也很多,后面我们在介绍 HTTP 缓存实现机制与原理的时候会详细介绍该首部字段不同指令的使用。