Content-Length:实体的大小

Content-Length与持久连接

Content-Length首部对于持久连接是必不可少的。如果响应通过持久连接传送,就可能有另一条HTTP响应紧随其后。客户端通过Content-Length首部就可以知道报文在何处结束,下一条报文从何处开始。因为连接是持久的,客户端无法依赖连接关闭来判别报文的结束。如果没有Content-Length首部,HTTP应用程序就不知道某个实体主体在哪里结束,下一条报文从哪里开始。

内容编码

HTTP允许对实体主体的内容进行编码,比如可以使之更安全或进行压缩以节省空间。如果主体进行了内容编码,Content-Length首部说明的就是编码后(encoded)的主体的字节长度

实体摘要

尽管HTTP通常都是在像TCP/IP这样的可靠传输协议之上实现的,但仍有很多因素会导致报文的一部分在传输过程中被修改,比如有不兼容的转码代理,或者中间代理有误,等等。为检测实体主体的数据是否被不经意(或不希望有)地修改,发送方可以在生成初始的主体时,生成一个数据的校验和,这样接收方就可以通过检查这个校验和来捕获所有意外的实体修改了。
服务器使用Content-MD5首部发送对实体主体运行MD5算法的结果。只有产生响应的原始服务器可以计算并发送Content-MD5首部。中间代理和缓存不应当修改或添加这个首部,否则就会与验证端到端完整性的这个最终目的相冲突。Content-MD5首部是在对内容做了所有需要的内容编码之后,还没有做任何传输编码之前,计算出来的。

媒体类型和字符集

Content-Type首部字段说明了实体主体的MIME类型。[插图]MIME类型是标准化的名字,用以说明作为货物运载实体的基本媒体类型(比如:HTML文件、MicrosoftWord文档或是MPEG视频等)
常用的媒体类型:
image.png

文本的字符编码

Content-Type首部还支持可选的参数来进一步说明内容的类型。charset(字符集)参数就是个例子,它说明把实体中的比特转换为文本文件中的字符的方法:
image.png

多部分表格提交

当提交填写的HTTP表格时,变长的文本字段和上传的文件都作为多部分主体里面独立的部分发送,这样表格中就可以填写各种不同类型和长度的值。
HTTP使用Content-Type:multipart/form-data或Content-Type:multipart/mixed这样的首部以及多部分主体来发送这种请求,举例如下:
image.png其中的boundary参数说明了分割主体中不同部分所用的字符串
比如我们使用chrome上传文件时,会有类似下面的例子:
image.png

内容编码

HTTP应用程序有时在发送之前需要对内容进行编码。例如,在把很大的HTML文档发送给通过慢速连接连上来的客户端之前,服务器可能会对它进行压缩,这样有助于减少传输实体的时间。服务器还可以把内容搅乱或加密,以此来防止未经授权的第三方看到文档的内容。
常用的内容编码类型:
image.png

传输编码和分块编码

内容编码,是对报文的主体进行的可逆变换。内容编码是和内容的具体格式细节紧密相关的。传输编码也是作用在实体主体上的可逆变换,但使用它们是由于架构方面的原因,同内容的格式无关。使用传输编码是为了改变报文中的数据在网络上传输的方式。
image.png
HTTP协议中只定义了下面两个首部来描述和控制传输编码。

  1. Transfer-Encoding,告知接收方为了可靠地传输报文,已经对其进行了何种编码。
  2. TE,用在请求首部中,告知服务器可以使用哪些传输编码扩展。

下面的例子中,请求使用了TE首部来告诉服务器它可以接受分块编码并且愿意接受附在分块编码的报文结尾上的拖挂:
image.png对它的响应中包含Transfer-Encoding首部,用于告诉接收方已经用分块编码对报文进行了传输编码:
image.png

分块编码

分块编码把报文分割为若干个大小已知的块。块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了。允许服务器把主体逐块发送,说明每块的大小就可以了。
比如一个如下http响应:
image.png

范围请求

http允许客户端实际上只请求文档的一部分,或者说某个范围。
有了范围请求,HTTP客户端可以通过请求曾获取失败的实体的一个范围(或者说一部分),来恢复下载该实体。
比如:
image.png
在本例中,客户端请求的是文档开头4000字节之后的部分,在客户端收到了开头的4000字节之后就失败的情况下,可以使用这种形式的范围请求。

差异编码(重点)

如果客户端有一个页面的已过期副本,就要请求页面的最新实例。如果服务器有该页面更新的实例,就要把它发给客户端,哪怕页面上只有一小部分发生了改变,也要把完整的新页面实例发给客户端。
若改变的地方比较少,与其发送完整的新页面给客户端,客户端更愿意服务器只发送页面发生改变的部分,这样就可以更快地得到最新的页面。差异编码是HTTP协议的一个扩展,它通过交换对象改变的部分而不是完整的对象来优化传输性能。
一个使用差异编码的例子:
image.png
客户端在If-None-Match首部中使用的是它所持有页面版本的唯一标识,这个标识是服务器之前响应客户端时在ETag首部中发送的。客户端是在对服务器说:“如果你那里页面的最新版本标识和这个ETag不同,就把这个页面的最新版本发给我。”如果只有If-None-Match首部,服务器将会把该页面的最新版本完整地发给客户端。
不过,如果客户端想告诉服务器它愿意接受该页面的差异,只要发送A-IM首部就可以了。A-IM是Accept-Instance-Manipulation(接受实例操控)的缩写。形象比喻的话,客户端相当于这样说:“哦对了,我能接受某些形式的实例操控,如果你会其中一种的话,就不用发送完整的文档给我了。”在A-IM首部中,客户端会说明它知道哪些算法可以把差异应用于老版本而得到最新版本。服务端发送回下面这些内容:一个特殊的响应代码——226 IM Used,告知客户端它正在发送的是所请求对象的实例操控,而不是那个完整的对象自身

字符集与HTTP

字符集是把字符转换为二进制码的编码,HTTP字符集的值说明如何把实体内容的二进制码转换为特定字母表中的字符。
把二进制码转换为字符要经过两个步骤:image.png

内容协商技术

共有3种不同的方法可以决定服务器上哪个页面最适合客户端:让客户端来选择、服务器自动判定,或让中间代理来选。这3种技术分别称为客户端驱动的协商、服务器驱动的协商以及透明协商
image.png