HTTP报文
用于HTTP协议交互的信息被称为报文。HTTP报文大致可分为报文首部和报文主体,两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
报文首部:服务器端或客户端需要处理的请求或响应的内容及属性。
CR+LF:CR(Carriage Return,回车符)LF(Line Feed,换行符)
报文主体:应被发送的数据。
编码提升传输速率
HTTP传输数据是可以原样传输,也可以进行编码提升传输速率,通过编码能有效处理大量的访问请求。但是编码操作需要计算机完成,因此消耗更多的CPU资源。
报文主体和实体主体的差异
报文(message):是HTTP通信的基本单位,由8位组字节流组成,通过HTTP通信传输。
实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
通常报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用内容编码:
- gzip(GUN zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分开传输编码
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。(懒加载是不是用了这个技术呢)
分块传输编码:将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小。实体主体最后一块使用“0(CR+LF)”来标记。
发送多种数据的多部分对象集合
HTTP协议使用多部分对象集合方法,使得发送一份报文主体内可含有多类型实体。通常在图片或文本文件等上传时使用。
multipart/form-data:在web表单文件上传时使用。
multipart/byteranges:状态码206(partial Content,部分内容)响应报文包含了多个范围的内容时使用。
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体起始行之前插入“--”标记(例如:--AaB03x、--THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“--”标记作为结束。
获取部分内容的范围请求
场景:解决下载文件中断后无需重头下载,提供一种可恢复机制。所谓恢复是指能从之前下载中断处恢复下载。
要实现该功能需要制定下载的范围实体。制定范围发送的请求叫做范围请求(Range Request)。
对一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。会用到首部字段Range来指定资源的byte范围。
指定5001~10000字节
Range: bytes=5001-10000
从一开始到3000字节和5000到7000字节的多重范围
Range: bytes=-3000, 5000-7000
针对范围请求,响应状态码为206 Partial Content。对于多重范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器端无法响应范围请求,则返回200 OK和完整实体内容。
内容协商
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言(中文网站和英文网站切换)、字符集、编码方式等作为判断的基准。
包含着请求报文中的某些字段(如下)就是判断基准:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
三种类型:
服务器驱动协商:以请求的首部字段做参考,服务器端自动处理。
客户端驱动协商:用户在网页显示的可选列表中自行选择。
透明协商:二者各自进行内容协商的一种方法。