C. HTTP 报文内的 HTTP 信息

153 阅读3分钟

HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回 客户端的响应。本章就让我们来了解一下请求和响应是怎样运作的。

Http报文

本质: HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本;

结构: HTTP 报文大致可分为报文首部(header)报文主体(body)两块。两者由最初出现的空行(CR+LF)来划分。并不一定要有报文主体。

CR: 回车 \r
LF: 换行 \n

image.png

接下来,看一对儿请求报文&返回报文实例。 image.png image.png

请求行: 包含用于请求的方法,请求 URI 和 HTTP 版本。

image.png

状态行: 包含表明响应结果的状态码,原因短语和 HTTP 版本。

image.png

首部字段: 包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部

编码

目的

提升传输效率以及安全性。节约网络带宽。

报文主体与实体主体

HTTP报文主要用于传输实体主体。通常情况下,报文实体等于实体主体,当传输中进行编码操作时,实体主体会发生变化,会有所差异。

报文:

由8位字节流组成。

实体:

作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部实体主体组成。

压缩传输的 「内容编码」

内容编码指明应用在实体内容上的编码格式。编码的是实体主体。

常用的内容编码:gzip、compress、deflate、identify

分割发送的 「分块传输编码」

在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前, 浏览器无法显示请求页面。在传输大容量数时数据通过把数据分割成多块,能够让浏览器逐步显示页面。

分块传输编码会将实体主体分成多个部分(块),每一块都会用十六 进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

分割关键:(实体主体分割)

  • 报文序号;
  • 报文大小,16进制;
  • 端口号

实体类型(多部分对象集合)

数据类型

MIME把数据分为8大类,每个大类下再细分为多个子类。清晰传输数据的格式。

image.png

多部分对象集合的每个部分类型中,都可以含有首部字段。另外,可 以在某个部分中嵌套使用多部分对象集合。

multipart/form-data

web表单文件上传时使用,其中boundary是指定后端拆包分割标识。 指定标识: boundaray=xxxxxx 分段标识: --xxxxx 结束标识: --xxxxx--

form-data报文实例如下:

image.png

multipart/byteranges

状态码 206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。

报文实例如下:

image.png image.png

获取部分内容的 「范围请求」

Req
GET Range: bytes=5001-10000

Res
Content-Range: bytes 5001-10000/10000
Content-Length: 5000
Content-Type: image/jpg

请求参数解释:

  • Range:bytes属性指定资源的比特范围
【指定比特区间】bytes=5001-10000
【指定某比特值之后全部】bytes=5001-
【指定某比特值之前全部】bytes=-3000
【指定多重比特范围】bytes=-3000,5000-10000

针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。

「内容协商」返回最适合的内容

  • Accept
  • content-Type
  • Accept-Charset
  • Accept-Encoding
  • Content-Encoding
  • Accept-Language
  • Content-Language

image.png