第三章 HTTP报文

HTTP报文的作用

HTTP报文时是HTTP进行请求和响应时用来交换信息的,可以理解它为搬东西的包裹,来搬运交换的信息

报文流

报文流

  • HTTP报文在HTTP应用程序(客户端、服务器、代理)之间发送数据块,这些数据块以文本形式描述了报文的内容和含义。
  • 这些报文在客户端、服务器、代理之间流动,称之报文流,用流入、流出、上游和下游这些术语描述报文流动的方向

报文如何流动

报文是由客户端流入服务器的

由客户端流入源端服务器,服务器处理完之后,流回(流出)用户的Agent代理中

报文流入源端服务器示意图: 报文流入源端服务器示意图

所有报文都会向下游流动

所有报文的发送者都在接收者的上游
对于请求报文来说,客户端是发送者,对于响应报文来说,服务器端是发送者

报文向下游流动示意图: 报文向下游流动

报文的组成部分

报文语法

HTTP报文分为两类:

  • 请求报文:客户端向web服务器请求一个动作
  • 响应报文: 服务器将请求结果返回给客户端

请求和响应报文的基本报文结构相同,都是由三部分组成:

  1. 起始行:对报文进行描述
  2. 首部:一些属性
  3. 主体:数据【可选】

请求报文和响应报文只有起始行的语法不同

  • 请求报文结构
<method> <request-url> <version>
<header>

<entity-body>
1
2
3
4
  • 响应报文结构
<version> <status-code> <reason-phrase>
<header>

<entity-body>
1
2
3
4

下面是对各部分的简要说明:

字段名 描述
方法(method) HTTP请求方法
请求url (request-url) 请求资源的路径
版本(version) 使用的HTTP版本,格式为: HTTP/<主要版本号>.<次要版本号>
状态码(status-code) 数字HTTP状态码,用于描述请求过程的状态,比如成功、失败
原因短语(reason-phrase) 上面数字状态码的简短文本描述
首部(header) 可以有0或多个首部。格式为: <名字>:<值>,以空行结束
主体(entity-body) 包含由任意数据组成的数据块,并不是所有报文都有主体

请求和响应报文示例: 请求和响应报文示例

起始行

上面我们知道HTTP报文分为请求报文和响应报文两类,而且只有起始行不同

这里我们是请求报文的起始行为请求行,响应报文的起始行为响应行

HTTP报文-首部部分

HTTP报文的首部字段向请求和响应报文中添加一些附加信息,本质上来说,它们只是一些<名字>/<值>对的列表

首部分类

HTTP规范定义了几种首部字段,应用程序也可以随意发明自己所用的首部

  • 通用首部

既可以出现在请求报文中,也可以出现在响应报文中

字段 描述
Cache-Control 通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
Connection 控制不在转发给代理的首部字段;管理持久连接。
Data 表明创建HTTP报文的时间和日期。
Pragma 只用在客户端发送的请求中,所有的中间服务器不返回缓存的资源。
Trailer 事先说明报文主体后记录了哪些首部字段。同样可以用在分块传输编码时。
Transfer-Encoding 规定了传输报文主体时采用的编码方式。
Upgrade 用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信。
Via 为了追踪客户端与服务器之间的请求和响应报文的传输路径。
Warning 通常会告知用户一些与缓存相关的问题的警告
  • 请求首部

提供请求相关的信息

字段 描述
Accept 该字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
Accept-Charset 用来通知服务器用户代理支持的字符集及字符集的相对优先顺序,可一次性指定多种字符集。
Accept-Encoding 用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。
Accept-Language 用来告知服务器用户代理嫩巩固处理的自然语言集(中文或英文等),以及自然语言集的相对优先级。
Authorization 用来告知服务器,用户代理的认证信息。
Expect 客户端使用首部字段Except来告知服务器,期望出现的某种指定行为。
From 用来告知服务器使用用户代理的用户的电子邮件地址。
Host 告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须包含在请求内的首部字段。
If-Match 类似于If-xxx这样的请求首部,可以称为条件请求。
If-Modified-Since 告知服务器若该字段值早于资源的更新时间,则希望能处理该请求。
If-None-Match 该字段值得实体标记值与请求资源的ETag不一致时,它就告知服务器处理该请求。
If-Range 它告知服务器若指定的If-Range字段值和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之则返回全体资源。
If-Unmodified-Since 告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。
Max-Forwards 通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应。
Proxy-Authorization 客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。
Range 告知服务器资源的指定范围。
TE 告知服务器客户端能够处理响应的传输编码方式及相对优先级。
User-Agent 将创建请求的浏览器用户代理名称等信息传达给服务器
  • 响应首部

提供响应相关的信息

字段 描述
Accept-Ranges 用来告知客户端服务器是否能够处理范围请求,以指定获取服务器端某个部分的资源。
Age 告知客户端,源服务器在多久前创建了响应。单位秒。
ETag 告知客户端实体标识,它是一种可将资源以字符串形式做唯一标识的方式。
Location 可以将响应接收方引导至某个与请求URI位置不同的资源。
Proxy-Authenticate 把由代理服务器所要求的认证信息发送给客户端。
Retry-After 告知客户端应该在多久之后再次发送请求。
Server 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary 可对缓存进行控制,源服务器回向代理服务器传达关于本地缓存使用方法的命令。
WWW-Authenticate 用于HTTP访问认证
  • 实体首部

描述主体的长度和内容,或者资源自身

字段 描述
Allow 用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。
Content-Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式。(gzip/compress/deflate/identity)
Content-Language 告知客户端,实体主体使用的自然语言。(中文或英文等语言)
Content-Length 表明了实体主体部分的大小。
Content-Location 给出与报文主体返回资源对应的URI。
Content-MD5 是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
Content-Range 针对范围请求,返回响应时使用的首部字段,能告知客户端作为相应返回的实体的哪个部分符合范围请求。
Content-Type 说明了实体主体内对象的媒体类型,该字段用type/subtype形式赋值。
Expires 会将资源失效的日期告知客户端。
Last-Modified 指明资源最终修改的时间
  • 拓展首部

规范中没有定义的新首部