第三章 HTTP报文
HTTP报文的作用
HTTP报文时是HTTP进行请求和响应时用来交换信息的,可以理解它为搬东西的包裹,来搬运交换的信息
报文流
报文流
- HTTP报文在HTTP应用程序(客户端、服务器、代理)之间发送数据块,这些数据块以文本形式描述了报文的内容和含义。
- 这些报文在客户端、服务器、代理之间流动,称之报文流,用流入、流出、上游和下游这些术语描述报文流动的方向
报文如何流动
报文是由客户端流入服务器的
由客户端流入源端服务器,服务器处理完之后,流回(流出)用户的Agent代理中
报文流入源端服务器示意图:
所有报文都会向下游流动
所有报文的发送者都在接收者的上游
对于请求报文来说,客户端是发送者,对于响应报文来说,服务器端是发送者
报文向下游流动示意图:
报文的组成部分
报文语法
HTTP报文分为两类:
- 请求报文:客户端向web服务器请求一个动作
- 响应报文: 服务器将请求结果返回给客户端
请求和响应报文的基本报文结构相同,都是由三部分组成:
- 起始行:对报文进行描述
- 首部:一些属性
- 主体:数据【可选】
请求报文和响应报文只有起始行的语法不同
- 请求报文结构
<method> <request-url> <version>
<header>
<entity-body>
1
2
3
4
2
3
4
- 响应报文结构
<version> <status-code> <reason-phrase>
<header>
<entity-body>
1
2
3
4
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 | 指明资源最终修改的时间 |
- 拓展首部
规范中没有定义的新首部