5

我需要快速下载一个大文件,但我能找到的所有资源都限制了带宽。它们中的每一个似乎都支持 HTTP 1.1 字节服务(范围请求),因为我可以暂停和恢复下载。如何从多个来源并行下载它?

4

2 回答 2

4

假设这是一个编程问题(假设这是 StackOverflow),我将解释如何而不是仅仅链接到利用这一点的下载加速器。

在服务器方面需要什么来做到这一点?

  • 支持RangeHTTP 标头的服务器。
  • 允许并发连接的服务器。通过使用基于端点或 IP 的限制服务器端,可以支持Range同时不允许多个同时连接。出于这个原因,我建议您设置一个简单的测试服务器,而不是在测试时从文件共享站点下载。

什么是Range标题?

Range如果未设置标头,则通过 HTTP 传输的数据按从文件开头开始的顺序发送。服务器上文件的第一个字节将是 HTTP 响应的第一个字节,服务器上文件的最后一个字节将是 HTTP 响应的最后一个字节。标Range头允许您指定字节应该从哪里开始发送,允许您“跳过”响应的开头。

实际答案示例

我们的情况

响应是纯文本。响应内容只有一个字“StackOverflow!!” 编码 ASCII,意味着每个字符是一个字节。因此,Content-Length标头的值是 15个八位字节(字节的另一个术语)。

我们将使用 3 个请求下载此文件。为了这个例子,我们会说它会快 3 倍,但你应该意识到这种方法会使非常小的文件的下载速度变慢。这是因为 HTTP 标头必须随每个请求以及 3 次握手一起发送。我们还将假设服务器支持 HEAD 请求,并且Content-Length标头与下载响应一起发送。最后,由于 HEAD 请求的原因,该请求将使用 GET 执行。但是,POST 有一些解决方法。

多汁的细节

首先,执行 HTTP HEAD 请求。取“Content-Length”标头并将该值除以您希望建立的并发并行连接的数量。对于这个例子,Content-Length是 15,我们希望建立 3 个连接,所以除以 5。

现在执行您希望并行执行的请求数量。对于每个请求,将Range标头设置为“范围:字节=”,然后是已经发出的请求数乘以上面找到的除值。然后附加“-”,后跟您刚刚确定的值加上除后的值。对于此示例,每个请求都应具有如下设置的标头。

  1. Range: bytes=0-5
  2. Range: bytes=5-10
  3. Range: bytes=10-15

每个请求的响应应该是

  1. 超频
  2. 低的!!

本质上,我们只是符合范围规范(RFC 2616 的第 3.12 节)以及字节范围规范(RFC 2616 的第 14.35 节)。

最后,附加每个请求的字节以形成最终的响应数据。

免责声明:我从未真正尝试过这个,但它应该在理论上有效

于 2013-04-13T19:32:11.863 回答
2

如果从多个来源获取,我不能说是否wget能够再次将文件放在一起。

以下示例显示了如何使用aria2c.

您将构建一个下载描述文件,然后将其传递给 aria,如下所示:

aria2c -i uri.txt --split=5 --min-split-size=1M --max-connection-per-server=5

哪里uri.txt可能包含

http://a.com/file1.iso http://mirror-1.com/file1.iso http://mirror-2.com/file1.iso
dir=/downloads
out=file1.iso

这将从 3 个不同的位置获取相同的文件,并将其放入名为 file1.iso (out) 的下载文件夹 (dir) 中。

于 2015-02-17T23:02:29.497 回答