传输编码: 分块传输

60
我试图更好地了解“Transfer-Encoding:chunked”,参考了一些文章:http://zoompf.com/blog/2012/05/too-chunky"Transfer-Encoding: chunked" header in PHP
我仍然没有很清楚的概念。我理解设置这种编码允许服务器将内容分块传递给浏览器,并导致网站响应式地部分渲染内容。
如果我有一个提供动态内容(例如基于JSF的Web应用程序)并托管在IBM WAS上的Web应用程序,大多数Web页面都是设计为提供包含大量CSS和JS文件+动态内容的丰富静态内容。如何为我的页面设置传输编码'chunked'?换句话说:
您如何决定哪个页面将具有“Transfer-Encoding:chunked”,以及如何为该页面设置它?
您的个人经验对我来说肯定是有价值的。
2个回答

52

Transfer-Encoding: chunked 不是实现渐进式呈现所必需的。然而,当在发送最初的字节之前还不知道内容的总长度时,它是必需的。


你能通过编程为你的网页启用这个功能吗? - Vicky
2
这取决于您的Web服务器。通常,在您开始发送数据而不知道长度时,它会自动使用。 - Julian Reschke

13

当服务器需要发送大量数据时,使用分块编码(chunked encoding)是因为服务器不确定数据的大小(长度)。在HTTP术语中,当服务器发送响应时,Content-Length头被服务器省略。相反,服务器以十六进制格式写入当前块的长度,后跟\r\n和块,再后面是\r\n(内容以十六进制块大小开头,然后是块)。

此功能可用于渐进式呈现;但是服务器需要尽可能多地刷新数据,以便客户端可以逐步呈现内容(对于html,css等情况)

在服务器向客户端推送大量数据时,通常会使用此功能 - 通常是较大的大小(兆/千兆字节)

Mozilla文档


1
“通常是以千兆为单位”,应该是以兆为单位,如果有的话。;) 但这甚至不一定是关于大小的:它与时间同样重要,因此客户端可以在不知道整个响应的确切大小之前继续处理接收到的部分。 - Sz.
@Webjockey,我在想客户端是否需要将数据分块发送到服务器。似乎只有服务器实现了分块。 - hipeople321
Web浏览器内置了分块解码算法,如https://tools.ietf.org/html/rfc7230#section-3.3.1所述。我不知道Web服务器是否实现了这种算法。或者,您可以使用带有自定义边界标头名称的mutipart/form-data,但是您将不得不自己实现如何保存按自定义边界标头名称分隔的大文件接收的内容。 - webjockey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接