HTTP报文内容解读

HTTP 通信过程包括从客户端往服务端的请求以及从服务器端返回客户响应。用于HTTP协议交互的信息被称为HTTP报文。HTTP报文本身是由多行数据构成的字符串文本。主要有Head和body两块

1. 请求报文的响应结构

首先了解HTTP报文结构

1
2
3
4
5
6
7
+----------------+     [报文首部]
| 报文首部 | 服务端或者客户端处理的请求响应的内容及属性。
+----------------+ [CR+LF]
| 空行(CR+LF) | 回车符和换行符
+----------------+ [报文主体]
| 报文主体 | 应该被发送的数据
+----------------+

请求报文和响应报文的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
请求报文
+----------------+ [报文首部]
| 报文首部 | +-------------------+
+----------------+ | 请求行 |
| 空行(CR+LF) | +-------------------+
+----------------+ | 各种部首字段 |
| 报文主体 | +-------------------+
+----------------+ | 其他 |
+-------------------+

响应报文
+----------------+ [报文首部]
| 报文首部 | +-------------------+
+----------------+ | 状态行 |
| 空行(CR+LF) | +-------------------+
+----------------+ | 各种部首字段 |
| 报文主体 | +-------------------+
+----------------+ | 其他 |
+-------------------+

请求行包含用于请求的方法,请求URI和HTTP版本;状态行包含表明响应结果的状态码,原因短语和HTTP版本;部首字段包含响应的各种条件和属性的各类部首(包含通用部首、请求部首、响应部首和实体部首);其他包括协议中未定义部首如cookie。

2. 编码提升传输效率

HTTP在传输数据时可以按照数据原貌进行传输,也可以在传输过程中通过编码提升传输效率。通过编码传输,能够有效的处理大量的访问资源。但是编码的操作需要计算机完成,因此会消耗更多的CPU计算资源。常用的内容格式编码有以下几种:

  • gzip (GUN zip)
  • compress(UNIX 系统的解压缩标准)
  • deflate(zlib)
  • identity(不进行编码)

HTTP报文和实体主体的区别

  • 报文(message):HTTP通讯中的基本单位。
  • 实体(entity):请求或响应的有效数据段。

通常报文主体是等于实体主体的,只有当传输过程中进行了编码操作时,实体主体的内容发生变化,才导致他和报文主体之间产生差异。若报文需要压缩是对实体内容进行压缩,得到报文内容。

同时HTTP通信过程中请求的资源可能需要很久全部完成传输,协议可以支持将数据块分割成多块,能够让浏览器逐步显示请求页面。这个能力叫做分块传输编码(Chunked Transfer Coding)。

3. 获取部分内容的范围请求

对于一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源(Range Request)。具体方法是在Head中使用部首字段Range来指定资源的byte范围。

  • 5001到10000字节
    1
    Range: bytes=5001-10000
  • 从5001到最后
    1
    Range: bytes=5001-
  • 从开始到3000字节和从5001到6000字节的多重范围
    1
    Range: bytes=-3000, 5001-6000

若请求可以正确响应返回206的响应报文,若无法响应返回完整的报文和200OK的状态码。

4. 内容协商返回最适合的内容

当浏览器的语言选项为中文时显示的语言为中文,当浏览器的语言设置为中文是访问会返回中文的web页面,是英文时则会返回英文的web页面。这样的机制称为内容协商。主要包含的部首字段如下:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商技术有以下三种类型:

  • **服务器驱动协商(Server-driven Negotiation)**:服务器端根据请求部首字段自动处理。
  • **客户端驱动协商(Agent-driven Negotiation)**:服务器端将所有的请求可能全部发送出来,客户端在页面选择,或者自动选择。
  • **透明协商(Transparent Negotiation)**:服务器端和客户端各自进行内容协商