HTTP基础之十三(Entities和Encodings)

Message就是一个集装箱,Entities就是里面的货物。一个简单的Message和Entities:

HTTP/1.1定义了10种主要的Entity Header:

Content-Type:消息Entity类型  Content-Length:Message的长度  Content-Language:适合人识别Message的最佳的语言

Content-Encoding:表示传输过程中针对Message的操作(转码,压缩等)

Content-Location:可替换的请求URL

Content-Range:如果当前只是一部分Entity,这个表示当前Entity的范围以及总的范围,例如Content-Range:bytes 0-499/1234

Content-MD5:Entity Body的校验和

Last-Modified:内容创建或修改的时间

Expires:过期时间

Allow:允许的Method

ETag:唯一标识当前Entity

Cache-Control:缓存设置

 

Content-Length

这个头表示了entity body的大小(单位字节),如果是压缩或转码,则表示压缩或转码以后的大小。

Content-Length与持久连接:在持久连接数上,响应一个接着一个,客户端可以通过Content-Length来判断当前响应消息的结束位置,以及下一个响应消息的起始位置,没有Content-Length头,则不能判断。有一种情形在没有Content-Length头也可以判断,就是使用chunked encoding。没一个块的大小可以知道,总的块数是可以计算的。当Content-Length没有被正确传递时就会引发错误。

 

内容转码(Encoding)

转码不仅仅是编码,还有对内容的压缩,加密,混淆等,可以理解为对内容的各种操作。转码过程如下:

① 服务器生成原始消息,具有原始的Content-Type,Content-Length头

② 原始服务器或下游的代理服务器对内容进行转码,具有Content-Type,和新的Content-Length,并且添加一个Content-Encoding头,这样客户端接收到消息就知道对应的解码处理。

③ 客户端收到转码以后的消息,解码得到原始响应消息

 

Content-Encoding

gzip:GUN zip转码

compress:Unix文件压缩

deflate:压缩为zlib格式

identity:没有进行任何转码

 

Accept-Encoding

客户端用来告诉服务器端能够接受的转码方式,默认值为*(接受任何转码)

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0

q表示优先级(0——1),*表示任何其它的转码方式

 

Transfer转码(chunked)

内容转码跟内容本身的格式紧密相关,例如gzip对文本文件有效,但是对于jpeg格式的图片就没有太大作用。Transfer转码(Chunked)也是可逆的(可解码)。两个表示传输转码的header:Transfer-Encoding和TE。chunked转码是将消息切分为多个已知大小的块,然后依次把这些块发送出去。chunked转码是一种传输转码形式,是消息的一个属性,并不是body的属性。Transfer-Encoding是在HTTP/1.1里面引入的。

 

Chunking和持久化连接

在非持久化连接上,客户端不需要知道body的size,因为客户端会一直读取body直到服务器关闭连接。

在持久化连接上,客户端必须知道Content-Length(在接收之前)。chunked转码提供了一种方式,在持久化连接上也不需要Content-Length。因为每个chunked的大小是已知的,服务器动态生成内容,并且进行chunked,缓冲这些chunk然后发送,直到发送完整个body,最后发送一个size为0的chunk,这样客户端就知道已经接收完成。当前的连接仍然保持opened,等待下一次发送响应消息。

最后一个chunk比较特殊,size为0. (CRLF表示回车换行符) Trailer块可选

 

应用Transfer Encoding需要遵循如下规则

① 必须包含头Transfer-Encoding:chunked

② 对同一个消息一次只能使用一次传输转码

 

作者:张雪飞
出处:https://zhangxuefei.site/p/1115
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注