HTTP报文内的HTTP信息
HTTP报文:用于HTTP协议交互的信息,是由多行数据构成的字符串文本(用CR+LF作换行符)。
结构:报文首部+空行+报文主体(非必需)
请求报文:客户端的HTTP报文。 报文首部的内容:请求行,请求首部字段,通用首部字段,实体首部字段,其他。
响应报文:服务器端的HTTP报文。 报文首部的内容:状态行,响应首部字段,通用首部字段,实体首部字段,其他。
编码提升传输速率
HTTP在传输数据时可以进行编码来提升传输速率。编码的操作需要计算机来完成,因此会消耗更多的CPU等资源。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接受并负责解码。
常见的内容编码有:gzip(GNU zip)、compress(UNIX系统的标准压缩)、deflate(zlib)、identity(不进行编码)。
分块传输编码(Chunked Transfer Coding):一种把实体主体分块的功能。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会用“0(CR+LF)”来标记。
由客户端进行解码。
HTTP/1.1中存在传输编码(Transfer Coding)的机制。它可以在通信时按照某种编码方式传输,但只定义作用域分块传输编码中。
发送多种数据的多部分对象集合
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
multipart/form-data:在Web表单文件上传时使用。
multipart/byteranges:状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
范围请求(Range Request)
问题:下载一个图片发生中断时,需要重新下载。
解决:指定下载的实体范围。
比如:对于一个1000字节的图片,下载到一半时发生网络中断,待网络恢复时可以只请求下载501~1000字节内的资源。
执行范围请求时,会用到首部字段Range来指定资源的byte范围。
#5001~10000字节 Range: bytes=5001-10000 #从5001字节之后全部的 Range: bytes=5001- #从一开始到3000字节,和5000-7000字节的多重范围 Range: bytes=-3000, 5000-7000
针对范围请求,相应会返回状态码为206 Partial Content的响应报文。
对于多重范围的范围请求,相应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码 200 OK和完整的实体内容。
内容协商(Content Negotiation)
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。
用处:当浏览器的默认语言为英语或中文,访问相同URI的Web页面,会显示对应的英语班或中文版Web页面。
三种类型:
1.服务器驱动协商(Server-driver Negotiation):由服务器端进行内容协商。以浏览器发送的首部字段作为判定的依据,并不一定能筛选出最优的内容。
2.客户端驱动协商(Agent-driver Negotiation):由客户端进行内容协商的方式。用户从浏览器显示的可选列表中手动选择。
3.透明协商(Transparent Negotiation):是服务器驱动和客户端驱动的结合体,由服务器端和客户端各自进行内容协商的一种方法。