Connection:Keep-Alive 和 Transfer-Encoding: chunk

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

    在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

HTTP/1.1 200 Server: nginx Date: Sun, 02 Jan 2000 07:51:17 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Content-Security-Policy: default-src 'self' https://*.tplinkcloud.com/;script-src 'self' 'unsafe-eval' 'sha256-7W9UiBaYGlOHpT1aQBLegqffUVHbYq6/ZAb+ErjUb40=' 'sha256-VGQ8jNTL2g0e8wPwOgyCQJDqhuRgfV7gRYexcBkBe4Y=' 'sha256-x2jgB1zBLi30IsfY+VNgWjwBGeHPJxOSrzl+IdsT6k0=' 'sha256-0AHZXO4clnpdcxqdmASPBEp4JCIrtaxIX/mUuL1kzZw=' 'sha256-lfXlPY3+MCPOPb4mrw1Y961+745U3WlDQVcOXdchSQc=';style-src 'self' 'unsafe-inline';connect-src 'self' https://*.tplinkcloud.com/ https://*.tplinkcloud.com:8843/ wss://*.tplinkcloud.com/ https://*.tiles.mapbox.com https://api.mapbox.com https://events.mapbox.com ;frame-src 'self' data:;img-src 'self' https://*.tplinkcloud.com/ https://*.mzstatic.com/ https://play-lh.googleusercontent.com/ data: blob:;child-src blob: ;worker-src blob: ;media-src 'self' https://*.tplinkcloud.com/ data: blob:;object-src 'self' data: blob: Referrer-Policy: no-referrer Strict-Transport-Security: max-age=15552000; includeSubDomains X-Content-Type-Options: nosniff X-DNS-Prefetch-Control: off X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Robots-Tag: noindex 124 {"errorCode":0,"msg":"Success.","result":{"controllerVer":"6.0.0.400","apiVer":"3","configured":false,"type":18,"supportApp":true,"omadacId":"bccc8875e205be4452b35a010558b3f7","registeredRoot":false,"omadacCategory":"advanced","mspMode":false,"omadaCloudUrl":"https://omada.tplinkcloud.com"}} 0 怎么把这种格式的响应的响应体解析出来
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值