我需要快速下载一个大文件,但我能找到的所有来源都会限制带宽。它们中的每一个似乎都支持HTTP 1.1 Byte Serving(Range Requests),因为我可以暂停和恢复下载。如何从多个来源并行下载它?
答案 0 :(得分:2)
假设这是一个编程问题(假设这是StackOverflow),我将解释如何而不仅仅是链接到利用此功能的下载加速器。
服务器需要做什么?
Range
HTTP标头的服务器。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 =”,跟随已经进行了多少次请求乘以上面找到的分割值。然后追加“ - ”后跟刚刚确定的值加上除以的值。
对于此示例,每个请求都应设置如下标头。
Range: bytes=0-5
Range: bytes=5-10
Range: bytes=10-15
每个请求的响应应该是
本质上,我们只是符合范围规范(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)中。