如何通过HTTP从多个位置下载单个文件?

时间:2013-04-13 19:29:58

标签: http curl download wget

我需要快速下载一个大文件,但我能找到的所有来源都会限制带宽。它们中的每一个似乎都支持HTTP 1.1 Byte Serving(Range Requests),因为我可以暂停和恢复下载。如何从多个来源并行下载它?

2 个答案:

答案 0 :(得分:2)

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

服务器需要做什么?

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

什么是Range标题?

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

实际答案示例

我们的情况

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

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

多汁明细

首先,执行HTTP HEAD请求。获取“Content-Length”标题,并将该值除以您希望进行的并发并行连接的数量。对于此示例,Content-Length为15,我们希望建立3个连接,因此除以5。

现在预先确定您希望并行执行的请求数量。对于每个请求,将Range标头设置为“Range:bytes =”,跟随已经进行了多少次请求乘以上面找到的分割值。然后追加“ - ”后跟刚刚确定的值加上除以的值。 对于此示例,每个请求都应设置如下标头。

  1. Range: bytes=0-5
  2. Range: bytes=5-10
  3. Range: bytes=10-15
  4. 每个请求的响应应该是

    1. 堆栈
    2. Overf
    3. 低!!
    4. 本质上,我们只是符合范围规范(section 3.12 of RFC 2616)以及字节范围规范(RFC 2616的第14.35节)。

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

      免责声明:我从未真正尝试过,但它应该在理论上起作用

答案 1 :(得分:0)

我不能说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)中。