HTTP报文
用于HTTP协议交互的信息称为HTTP报文。请求端的HTTP报文叫做
请求报文
,响应端的叫做
响应报文
。HTTP报文本身是由多行数据构成的字符串文本。
HTTP报文可以分为报文首部和报文主体两块内容,
但是不一定要有报文主体
请求报文和响应报文的结构
请求报文的实例:
第一行请求行:请求方法、HTTP版本和请求URI
其余的有
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。
- 其他:可能包含HTTO的RFC里未定义的首部,如Cookie。
响应报文类似。
编码提升传输速率
HTTP在传输数据时可以按照数据原貌直接传输,也可以在传输过程中
通过编码提升传输u速率
。
在传输时编码,能有效地处理大量的访问请求。
报文主体和实体主体的差异
-
报文(message)
是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。 -
实体(entity)
作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
报文就是一个传输单位,用于传输(请求或响应的)实体。
通常,报文主体就是实体主体,只有传输中进行编码后,实体主体会因此发生变化,此时报文主体才不等于实体主体。
压缩传输的内容编码
HTTP协议中有一种被称为内容编码的功能可以进行类似ZIP压缩文件的操作。
内容编码指明应用在实体内容上的编码格式,并压缩实体信息,内容编码后的实体由客户端接受并负责解码。
常用的内容编码格式有以下几种:
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分块传输编码
在HTTP通信中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面,通过
把数据分割成多块,能够让浏览器逐步显示页面
。
这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。
分块传输编码会将
实体主体
分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会用“0(CR+LF)”来标记。
发送多种数据的多部分对象集合
举例:邮件里可以包含多种数据(文字,图片,文件等),这是由于MIME(多用途因特网邮件扩展)机制,而在MIME中会使用 多部分对象集合的方法来容纳不同类型的数据。
相应地,HTTP协议中也有多部分对象集合,发送地一份报文主体内可含有多类型实体,通常在上传图片或文本文件时使用。
多部分对象集合包含的对象如下:
-
multipart/form-data
在Web表单文件上传时使用 -
multipart/byteranges
状态码206(Partial, Content, 部分内容)响应报文包含了多个范围的内容时使用。
使用方法:
boundary
字符串的作用:
划分多部分对象集合指明的各类实体。
boundary一般由一个字符串构成,用于分割各个实体,是封装边界。在各个实体的起始行之前插入:
--boundary
,实体的最后插入
--boundary--
标记作为结束,如:
--ac23cs01 …………--ac23cs01--
boundary参考文章
获取部分内容的范围请求
在网络上下载一个体积大的图片或文件时,如果下载过程出现了中断,需要一种可恢复的机制来保证
能从之前下载中断处恢复下载
。
指定”下载的实体范围“的请求叫做
范围请求(Range Request)
。
如上图所示,执行范围请求时,会用到首部字段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 + 完整的实体内容。
内容协商返回最合适的内容
根据浏览器的默认语言,访问同一URI的Web页面时,会显示对应语言的页面,这样的机制称为
内容协商(Content Negotiation)
。
内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
包含在请求报文中的部分首部字段就是判断的基准
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术有以下三种类型:
-
服务器驱动协商(Server-driven Negotiation)
由服务器端进行内容协商,以请求首部字段为参考,在服务器端自动处理。 -
客户端驱动协商(Agent–driven Negotiation)
由客户端进行内容协商的方式。用户可以从浏览器显示的选项列表中手动选择,或者利用JavaScript进行选择,如按OS的类型、浏览器的类型等自动切换PC页面或手机页面。 -
透明协商(Transparent Negotiation)
是上述两种方式的结合体,服务器端和客户端各自进行内容协商。