Connection:Keep-Alive 和 Transfer-Encoding: chunk

本文深入探讨了HTTP中Keep-Alive机制的工作原理,重点介绍了如何利用Content-Length和Transfer-Encoding:chunk来判断数据传输是否完成,以及这两种方式的具体实现。

问题:

    在HTTP早期每个HTTP请求都会打开一个TCP socket连接,传输完数据之后服务端主动断开这个TCP链接。如果HTTP头部有 Connection:Keep-Alive 这个字段,那么客户端和服务器之间用于传输数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接,省去了重新建立TCP连接的消耗。那么问题来了,如果是Keep-Alive的话,客户端是如何判断这次请求已经传输完所有数据呢?


回答:

    方法也是很简单,如果是一些静态的资源例如,图片,文档,我们通过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 。除非发送者知道接收者能够解析该类型,否则不能使用该类型。
  • 由服务器关闭连接确定消息长度。(注意:关闭连接不能用于确定请求消息的结束,因为服务器不能再发响应消息给客户端了。)
     4·如何判断一次请求结束
  •  对于非持久链接,服务端主动断开
  • 对于持久链接(Keep-Alive),如果有Content-Length则根据,没有的话看Transfer-Encoding: chunk

PS:     

    每个TCP/HTTP连接上同时只能有一个请求 / 响应,这意味着完成响应之前,这个连接不能用于其他请求

引用:

rfc2616

Transfer-Encoding - MDN

WiKi

HTTP 协议中的 Transfer-Encoding

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值