侧边栏壁纸
  • 累计撰写 247 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

HTTP 报文首部字段(一):通用首部篇

kaixindeken
2021-04-23 / 0 评论 / 0 点赞 / 118 阅读 / 2,729 字

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

1.jpeg

而 HTTP 报文首部又分为起始行和首部字段两部分,请求报文的起始行包含 HTTP 请求方法、URL资源、客户端 HTTP 协议版本,响应报文的起始行包含服务器 HTTP 协议版本、状态码和原因短语。

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

首部字段结构及分类

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

Connection: keep-alive

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

Accept-Encoding: gzip, deflate

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

  • 通用首部字段:请求报文和响应报文都可以使用的首部字段;
  • 请求首部字段:从客户端向服务器发送请求报文时使用的首部字段;
  • 响应首部字段:从服务器端向向客户端返回响应报文时使用的首部字段;
  • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部字段;
  • 扩展首部字段:非 HTTP 协议标准规定的首部字段,通常由开发者创建,用于某些特殊用途,比如 Cookie、Set-Cookie。

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

通用首部字段

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

1.jpeg

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

Cache-Control

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

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

1.jpeg

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

1.jpeg

后面我们会结合 Cache-Control 与其他缓存相关首部字段(Expires、If-Modified-Since、Last-Modified、If-None-Match、Etag 等)介绍 HTTP 缓存的完整解决方案,这里先了解下其功能及指令即可。

Connection

Connection 首部字段的作用主要有两个:

  • 在客户端发送请求和服务器返回响应时,将 Connection 首部字段值设置为 Upgrade 可控制不再转发给代理的首部字段;
  • 可以通过设置该字段值为 keep-alive 来建立持久连接(HTTP/1.1 版本默认都是持久连接),客户端会在持久连接上连续发送请求;当服务器端想明确断开连接时,则指定 Connection 首部字段为 close。

Date

该字段用于标识创建 HTTP 报文的日期和时间。

HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式:

Date: Fri, 19 Apr 2019 02:57:46 GMT

Pragma

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

Pragma: no-cache

HTTP/1.1 中使用 Cache-Control: no-cache 来替代该字段的功能。

Trailer

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

Transfer-Encoding

该首部字段规定了传输报文主体时采用的编码方式:

Transfer-Encoding: chunked

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

Upgrade

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

Via

该字段用于追踪客户端与服务器之间的请求和响应报文的传输路径(关于这一点我们在前面介绍 TRACE 请求方法时提到过)。报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。

此外,首部字段 Via 不仅可用于追踪报文的转发,还可以避免请求回环的发生。

Warning

该字段从 HTTP/1.0 的响应首部字段 Retry-After 演变而来,通常会告知用户一些与缓存相关的问题的警告。

HTTP/1.1 定义了 7 种警告:

1.jpeg

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

0

评论区