click –> 带着问题学习~
前面介绍了报文的整体结构,这篇重心放在报文的头部。
1. 报文
用于HTTP协议交互的信息叫做报文
- 请求报文:由客户端发出的HTTP报文。
- 响应报文:由服务端返回的HTTP报文。
请求报文:
响应报文:
2. 请求报文和响应报文的头部内容组成
- 请求行:方法名、协议、协议版本、状态码、简短的解释语。
- 响应行:协议、协议版本、状态码、简短的解释语。
- 头部字段
- 其他:可能包含HTTP RFC 里维定义的头部。(
cookie
)
3.编码提升传输速率
报文主体和实体主体的差异
HTTP报文的主体用于请求传输和响应的实体主体。
通常报文主体等于实体主体。只有当传输中进行编码操作时,实体主体才会发生响应的变化,导致两者产生差异。(1)什么是报文主体(message)?
报文主体就是HTTP传输信息中的主体部分,是HTTP通信的基本单位,由8位组字节流组成。通过HTTP通信传输。(2)什么是实体主体(entity)?
实体主体作为请求和响应的有效载荷数据被传输。
4.压缩传输的内容编码
(1)什么是内容编码?
内容编码指明应用在实体内容上的编码格式,并把实体内容原样压缩。内容编码后的实体由客户端接收负责解码。
(2)常用的编码格式
- gzip (GUN zip)
- compress (UNIX 系统的标准压缩)
- deflate (zlib)
- identity (不进行编码)
(3)分块传输编码
由于请求的编码实体资源未全部接收完成之前,浏览器不会显示请求的页面。在请求大量数据时,将数据分块传输,能够让浏览器逐步的显示页面。这种把实体分块的编码叫做分块传输编码。
分块传输编码会将实体主体分为多块,每块用16进制来标记块的大小,结尾用
0+ 换行
标记。使用分块传输编码会在客户端对实体主体进行解码。
5.发送多种数据的多部分对象集合
发送一份报文可以包含多类型实体。多用于文件的上传。
多部分集合包含的对象如下;
multipart/form-data
web表单上传时使用
multipart/byteranges
响应报文包含了多个范围时使用
6.获取部分内容的范围请求 断点续传
要实现该功能需要制定下载的实体范围,这种制定范围发送请求叫做范围请求。
针对范围请求,服务器会返回状态码为206的报文,多重范围请求 响应会在头部 Content-Type 表明 multipart-byteranges 返回报文主体。如果服务端不支持范围请求则返回状态码200 OK并将所有报文一并返回。
执行范围时会使用头部字段 Range 来指定资源 byte 的范围。
Range格式:
5001-10000字节
Range : byte = 5001-10000
5000之后的
Range : byte = 5001-
0-3000字节,5001-10000字节
Range : byte=-3000,5001-10000
7.内容协商返回最合适的内容(类似于 Android 的国际化)
实现内容协商有三种方式:
服务器启动协商
以请求的头部字段作为参考在服务端自动处理头部字段 Accpet Accpet-Charset Accpet-Encoding Accpet-Language Conent-Language
- 客户端驱动协商
用户从浏览器的可选列表中手动选择,还可以用JavaScript脚本在页面自动选择。 - 透明协商
服务端和客户端驱动的结合体。由服务端和客户端各自进行协商的一种方法。