Performance 内容长度标头与分块编码

Performance 内容长度标头与分块编码,performance,http,chunked-encoding,content-length,Performance,Http,Chunked Encoding,Content Length,我正试图权衡设置内容长度HTTP头与使用分块编码从服务器返回[可能]大文件的利弊。其中一个需要使用持久连接来符合HTTP 1.1规范。我认为内容长度标题的优点是: 下载对话框可以显示准确的进度条 客户端预先知道文件是否太大,无法接收 缺点是在返回对象之前必须计算对象的大小,这并不总是实用的,而且可能会增加服务器/数据库的利用率。分块编码的缺点是在每个分块和下载进度条之前添加分块大小的开销很小。有什么想法吗?对于这两种方法,我可能没有想到的任何其他HTTP注意事项?一定要使用内容长度。由此产生

我正试图权衡设置
内容长度
HTTP头与使用分块编码从服务器返回[可能]大文件的利弊。其中一个需要使用持久连接来符合HTTP 1.1规范。我认为
内容长度
标题的优点是:

  • 下载对话框可以显示准确的进度条
  • 客户端预先知道文件是否太大,无法接收

缺点是在返回对象之前必须计算对象的大小,这并不总是实用的,而且可能会增加服务器/数据库的利用率。分块编码的缺点是在每个分块和下载进度条之前添加分块大小的开销很小。有什么想法吗?对于这两种方法,我可能没有想到的任何其他HTTP注意事项?

一定要使用内容长度。由此产生的服务器利用率几乎不存在,对用户的好处将是巨大的

对于动态内容,添加压缩响应支持(gzip)也非常简单。这需要输出缓冲,而输出缓冲又为您提供了内容长度。(不适用于文件下载或已压缩的内容(声音、图像))

还可以考虑添加对部分内容/字节范围服务的支持,即重新启动下载的功能。(该示例使用PHP,但适用于任何语言)。提供部分内容时需要内容长度

当然,这些都不是灵丹妙药:对于流媒体,使用输出缓冲或响应大小是毫无意义的;对于大文件,输出缓冲没有意义,但内容长度和字节服务有很大意义(可以重新启动失败的下载)


就个人而言,只要我知道内容长度,我就会提供内容长度;对于文件下载,检查文件大小对于资源来说是无关紧要的。结果:用户有一个确定的进度条(由于gzip,动态页面下载速度更快)。

如果事先知道内容长度,那么我当然更喜欢它,而不是成批发送。如果在本地磁盘文件系统或数据库中存在静态文件,那么任何自尊心强的编程语言和RDBMS都提供了预先获取内容长度的方法。你应该利用它

另一方面,如果内容长度事先确实不可预测(例如,当您打算将多个文件压缩在一起并作为一个文件发送时),则分块发送可能比在服务器内存中缓冲或先写入本地磁盘文件系统更快。但这确实会对用户体验产生负面影响,因为下载进度未知。不耐烦的人可能会中止下载并继续前进


提前知道内容长度的另一个好处是能够恢复下载。我在你的博文历史中看到,你的主要编程语言是Java;您可以找到一篇包含更多技术背景信息的文章和一个Java Servlet示例。

内容长度

内容长度
标头确定请求/响应正文的字节长度。如果忽略指定
内容长度
头,HTTP服务器将隐式添加
传输编码:chunked
头。
内容长度
传输编码
标题不应一起使用。接收器将不知道主体的长度,也无法估计下载完成时间。如果确实添加了
内容长度
标题,请确保它与整个正文(以字节为单位)相匹配,如果不正确,则表示未定义接收者的行为

Content-Length
头将不允许流式传输,但它对于希望支持部分内容服务的大型二进制文件非常有用。这基本上意味着可恢复下载、暂停下载、部分下载和多宿主下载。这需要使用一个名为
Range
的附加标题。这种技术被称为

传输编码

使用
传输编码:chunked
允许在单个请求或响应中进行流式传输。这意味着数据以分块的方式传输,并且不影响内容的表示

HTTP客户机正式用于发送带有
TE
头字段的请求,该字段指定客户机愿意接受哪种类型的传输编码。这并不总是发送的,但是大多数服务器都假定客户端可以处理
分块的编码

chunked
传输编码更好地利用了持久性TCP连接,HTTP 1.1默认情况下假定为true

内容编码

也可以压缩分块或非分块数据。这实际上是通过
内容编码
头完成的

请注意,
内容长度
等于
内容编码后的正文长度
。这意味着如果您已经压缩了响应,那么长度计算将在压缩后进行。如果要计算长度,您需要能够在内存中加载整个身体(除非您在其他地方有该信息)

当使用分块编码进行流时,压缩算法还必须支持在线处理。谢天谢地,gzip支持流压缩。我相信内容首先被压缩,然后被分割成块。这样,块被接收,然后被解压缩以获得真实的内容。如果是另一种方式,您将得到压缩流,然后解压缩将得到块。这没有道理

典型的压缩流响应可能具有以下标头:

Content-Type: text/html
Content-Encoding: gzip
Transfer-Encoding: chunked
从语义上讲,
Co的用法