HTTP实体与编码

Http报文如同箱子,http实体则是箱中货物,http编码对实体至关重要。

Http实体

Http实体由实体首部与实体主体构成:

Content-type:text/plain        |            首部
Content-length:18              |            首部
                               |            空白行(CRLF)
HELLO                          |            实体主体

实体头部字段

HTTP/1.1版本定义了10个基本实体首部字段:

Content-Type                       实体中所承载的对象的类型
Content-Length                     所有实体主体的长度或大小
Content-Language                   与所传送对象最相配的人类语言
Content-Encoding                   对象数据所做的任意变换(比如:压缩)
Content-Location                   一个备用位置,请求时可通过它获得对象
Content-Range                      如果这是部分实体,这个首部说明这是整体的哪个部分
Content-MD5                        实体主体内容的校验和
Last-Modified                      所传输内容在服务器上创建或最后修改的日期时间
Expires                            实体数据将要失效的日期时间
Allow                              该资源所允许的各种请求方法,如:GET、HEAD
ETag                               实例的唯一验证码(没有正式定义为首部)
Cache-Control                      指出应该如何缓存该文档

Http Content-Length

Content-Length指出主体字节大小,若实体被gzip压缩,大小是压缩后的大小。用于检测服务器报文传输完整性。对共享持久性连接(keep-alive)的多个报文进行正确分段。

通常缓存代理服务器不会为没有显示设置Content-Length的http主体做缓存,以此减小缓存内容为截尾报文的风险。

错误的Content-Length比没有更糟糕。

使用持久连接(keep-alive),通常要正确设置Content-Length,若采用分块编码(chunked encoding)时,则不用设置Content-Length,分块数据对每块大小都有说明。

报文中含有描述传输编码的Transfer-Encoding(即不采用默认HTTP“恒等”编码)时,实体应由一个称为“零字节块”(zero-byte chunk)的特殊模式结束。

报文使用multipart/byteranges(多部分/字节范围)媒体类型,且没有使用Content-Length指出主体长度,那么每个部分都要说明自己的大小。

实体摘要

很多因素会导致报文在传输中被修改,检测实体是否被修改,可使用Content-MD5对实体执行MD5算法进行发送。

这一结果只能由原始服务器发出,中间代理和缓存不应参与。

对执行了编码的内容,应在编码后传输前对编码内容做MD5运行。

如:对gzip压缩内容做MD5,MD5可以用于散列关键字,快速定位文档并消除重复。

Http Content-Type

Content-Type说明主体MIME类型,MIME类型是标准化名字,以说明实体基本媒体类型。

Content-Type值是标准化MIME类型,在互联网号码分配机构(IANA)中注册。

MIME类型由一个主媒体类型及斜杠后的子类型构成,子类进一步描述媒体类型。

Content-Type支持可选参数进一步说明内容类型。如:charset。

MIME中multipart可以包含多个报文,合在一起作为单一报文传输,每一部分都是独立的,有各自的描述与内容集。

不同部分间使用分界字符串连接。

Http支持多部分主体提交,通常在form表单提交或多文档分段响应中。

form表单多部分提交Content-Type:multipart/form-data或Content-Type:multipart/mixed

多部分范围响应Content-Type:multipart/byteranges,客户端可同时连接到多个服务器,为加速下载文档可从不同服务器下载同一个文件的不同部分。

服务器可通过在响应中包含Accept-Ranges的形式向客户端说明可接受的范围。

Http Accept-Encoding

用于说明客户端支持的编码方式,服务器根据要求对响应主体使用相应编码,若没有指明Accept-Encoding,则认为客户端接受任意编码方式。