HTTP 响应字段 Transfer-Encoding 赋值成 chunked 的作用介绍

举报
汪子熙 发表于 2023/12/01 20:17:14 2023/12/01
【摘要】 Transfer-Encoding: chunked 是 HTTP/1.1 协议中定义的一种数据传输方式。在 HTTP/1.1 之前,HTTP 协议的响应数据通常是一次性发送的,也就是说,服务器必须把所有的响应数据准备好后,一次性发送给客户端。这种方式的缺点是,如果响应数据很大,或者数据的产生需要花费一定的时间,那么服务器就需要维持一个开放的连接,等待所有数据准备就绪才能发送,这无疑会增加服...

Transfer-Encoding: chunked 是 HTTP/1.1 协议中定义的一种数据传输方式。在 HTTP/1.1 之前,HTTP 协议的响应数据通常是一次性发送的,也就是说,服务器必须把所有的响应数据准备好后,一次性发送给客户端。这种方式的缺点是,如果响应数据很大,或者数据的产生需要花费一定的时间,那么服务器就需要维持一个开放的连接,等待所有数据准备就绪才能发送,这无疑会增加服务器的负担,也会让客户端长时间等待,影响用户体验。

为了解决这个问题,HTTP/1.1 引入了 chunked 传输编码方式。所谓 “chunked”,就是将数据分块(chunk)传输。服务器在发送响应头时,不再提供 Content-Length 字段(或者 Content-Length 字段的值为 0),而是使用 Transfer-Encoding: chunked 字段,告诉客户端,响应数据将以多个块(chunk)的形式发送。每个数据块包含两部分:块大小和块数据。块大小是一个十六进制的数字,表示接下来的块数据的字节长度。块数据是实际的数据内容。每个块后面都跟一个空行(CRLF)。当所有的数据发送完毕后,服务器会发送一个大小为 0 的块,表示数据传输结束。

这种方式的优点是,服务器可以边产生数据边发送,不需要等待所有数据都产生完毕。客户端也可以边接收数据边处理,不需要等待所有数据都接收完毕。这样就可以减少服务器的负担,提高数据传输的效率,改善用户体验。

举例来说,如果服务器要发送的数据是 “Hello, World!”,并且服务器决定每 5 个字符作为一个块,那么服务器发送的数据可能是这样的(每行后面的 CRLF 在这里没有显示出来):

5
Hello
2
, 
5
World
1
!
0

客户端收到这些数据后,会根据块大小读取相应的块数据,然后把所有的块数据拼接起来,得到最终的数据 “Hello, World!”。

在实际应用中,Transfer-Encoding: chunked 常常用于发送动态生成的内容,比如网页的实时更新、视频的实时流、大文件的下载等。

以上就是 Transfer-Encoding: chunked 的基本含义和用法。希望对你有所帮助。要注意,虽然 chunked 传输编码方式很有用,但是并不是所有的 HTTP 客户端和服务器都支持这种方式,特别是一些旧的或者简单的 HTTP 客户端和服务器。在使用时,需要确保两端都支持 HTTP/1.1 协议才行。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。