计算机网络协议系列 - HTTP 协议篇:HTTP 报文首部之通用首部字段篇

- 1 min

计算机网络协议系列(三十七)

首部字段简介

HTTP 协议的请求和响应报文中必定包含 HTTP 首部,首部内容为客户端和服务器分别处理请求和响应提供所需要的信息,对于客户端普通用户来说,这些信息中的大部分内容都无须亲自查看。

img

而 HTTP 报文首部又分为起始行和首部字段两部分,请求报文的起始行包含 HTTP 请求方法、URL资源、客户端 HTTP 协议版本,响应报文的起始行包含服务器 HTTP 协议版本、状态码和原因短语,这些东西在前面的分享中都已经介绍过,今天我们来看首部字段。

HTTP 首部字段是构成 HTTP 报文的要素之一,在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用,比如报文主体大小、所使用的语言、认证信息、是否缓存、Cookie 等。

首部字段结构及分类

首部字段由字段名和字段值两部分构成,中间用冒号分隔,比如下面这种:

Connection: keep-alive

另外,单个 HTTP 首部字段可以有多个值,不同值之间通过逗号分隔:

Accept-Encoding: gzip, deflate

有些首部字段只能在请求报文中使用,有些首部字段只能在响应报文中使用,有些则既可以在请求报文中使用,又可以在响应报文中使用,基于使用场景可以将首部报文分为以下五类:

下面会具体介绍上述五种类型的首部字段,我们先从通用首部字段开始。

通用首部字段介绍

常见的通用首部字段如下表所示:

img

下面我们来详细介绍每个通用首部字段的使用。

1)Cache-Control

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

在请求报文首部,Cache-Control 可以包含以下指令:

img

在响应报文首部,Cache-Control 可以包含以下指令:

img

后面我们会结合 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种警告:

img

小结

在通用首部中,比较值得关注的首部字段是 Cache-Control 和 Connection,Connection 相对简单,在 HTTP/1.1 协议中,一般都是默认值 keep-alive,Cache-Control 相对复杂,指令值也很多,后面我们在介绍 HTTP 缓存实现机制与原理的时候会详细介绍该首部字段不同指令的使用。

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora