HTTP实体与编码方式

如果把HTTP报文想像成箱子,HTTP实体就是箱子中的货物,而编码对HTTP实体而言至关重要。

http实体的组成

实体由实体首部与实体主体组成,通常是下列格式:

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

HTTP基础实体头部字段

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                      指出应该如何缓存该文档

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可以用于散列关键字,用快速定位文档并消除重复。 

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的形式向客户端说明可以接受的范围。 

Accept-Encoding

用于说明客户端支持的编码方式,服务器根据要求对响应主体应用对应的编码方式,如果没有指明Accept-Encoding,则表面客户端接受任何编码方式。