1 HTTP 报文
- 定义:用于HTTP协议交互的信息被称为HTTP报文。
- 请求报文和响应报文:请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。
2 请求报文及响应报文的结构
3 编码
- 作用:在传输过 程中通过编码提升传输速率。
- 缺点:编码的操作需要计算机来完成,因此会消耗更多的CPU等资源。
3.1 实体
- 定义:报文中实际关于有效载荷数据的部分,实体分为实体首部和实体主体。
- 实体首部:是报文首部中描述实体主体的部分。
- 报文主体和实体主体的差异:实体主体指的是未经过传输编码处理的原始数据,而报文主体则则是实际传输的有效载荷数据部分,可能包含传输编码处理过的数据。
3.2 内容编码
- 作用:保持实体信息原样进行压缩
- 常用的内容编码:
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
3.3 分块传输编码
- 作用:把数据分割成多块进行分次传输
- 使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。
- 优点:在数据大小未知或数据未完全准备好的情况下就能进行响应,能够让浏览器逐步显示页面。
HTTP/1.1 中存在一种称为传输编码(Transfer Coding)的机制,它可 以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
4 多部分对象集合
-
作用:一次发送多种类型的实体
-
集合包含的对象:
-
multipart/form-data:在Web表单文件上传时使用。
-
multipart/byteranges:状态码 206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
-
-
规则:
- 使用boundary字符串来划分多部分对象集合指明的各类实体。在 boundary 字符串指定的各个实体的起始行之前插入“–”标记(例如:- -AaB03x、–THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“–”标记(例如:–AaB03x–、-- THIS_STRING_SEPARATES–)作为结束。
- 多部分对象集合的每个部分类型中,都可以含有首部字段。
5 范围请求
-
定义:指定范围发送的请求叫做范围请求(Range Request)。
-
作用:一种可恢复的机制,一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。可以解决下载出现中断的问题。
-
格式:
-
范围请求的响应:
- 会返回状态码为206 Partial Content的响应报文。
- 对于多重范围的范围请求,响应会在首部字段ContentType标明multipart/byteranges后返回响应报文。
- 如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。
6 内容协商
- 作用:返回最合适的内容,包括响应资源的语言、字符集、编码方式等。
- 判断基准:某些首部字段
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
- 类型:
- 服务器驱动协商(Server-driven Negotiation)
- 由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不 一定能筛选出最优内容。
- 客户端驱动协商(Agent-driven Negotiation)
- 由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选择。比如按 OS 的类型或浏览器类型,自行切换成 PC 版页面或手机版页面。
- 透明协商(Transparent Negotiation)
- 是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。