问题:
回答:
方法也是很简单,如果是一些静态的资源例如,图片,文档,我们通过Cotnent-Length来判断。这个前提是服务器清楚知道内容的大小,万一服务器不知道呢?那么这个时候就要祭出武器Transfer-Encoding: chunk。
1·Transfer-Encoding
Transfer-Encoding 字面意思是传输编码,指定form的编码来安全地将entity传输到用户。而Content-Encoding是对实体(entity)进行压缩编码。两者经常一起配合使用。使用Content-Encoding来对分块内容进行压缩
Transfer-Encoding: chunk--分块编码
2·Transfer-Encoding: chunk 格式
chunk-size CRLF
chunk-data CRLF
chunk-size CRLF
chunk-data CRLF
.............
0CRLF
CRLF
3·如何判断http消息的大小、消息的数量
- 任何不含有消息体的消息(如1XXX、204、304等响应消息和任何头(HEAD,首部)请求的响应消息),总是由一个空行(CLRF)结束。
- 如果出现了Transfer-Encoding头字段 并且值为非“identity”,那么transfer-length由“chunked” 传输编码定义,除非消息由于关闭连接而终止。
- 如果出现了Content-Length头字段,它的值表示entity-length(实体长度)和transfer-length(传输长 度)。如果这两个长度的大小不一样(i.e.设置了Transfer-Encoding头字段),那么将不能发送Content-Length头字段。并 且如果同时收到了Transfer-Encoding字段和Content-Length头字段,那么必须忽略Content-Length字段。
- 如果消息使用媒体类型“multipart/byteranges”,并且transfer-length 没有另外指定,那么这种自定界(self-delimiting)媒体类型定义transfer-length 。除非发送者知道接收者能够解析该类型,否则不能使用该类型。
- 由服务器关闭连接确定消息长度。(注意:关闭连接不能用于确定请求消息的结束,因为服务器不能再发响应消息给客户端了。)
- 对于非持久链接,服务端主动断开
- 对于持久链接(Keep-Alive),如果有Content-Length则根据,没有的话看Transfer-Encoding: chunk
PS:
每个TCP/HTTP连接上同时只能有一个请求 / 响应,这意味着完成响应之前,这个连接不能用于其他请求
引用: