就像在 curL 中一样,我们有一个绑定地址选项,我们可以使用某个接口下载。
例如,要从 eth0:0 下载,我们使用 $curl --interface eth0:0http://www.google.com
这样,我的目的是下载文件,但由于 curL 不支持分段下载,我不想使用它。我们对每个 IP 都有速度限制。为了克服这个限制,我可以启动许多这样的接口,并从每个接口下载文件的某些部分。
如何让其他下载管理器(如 AXEL)绑定到特定地址?我想了解一些想法,例如更改 BASH shell 中的变量,以便整个 shell 绑定到特定接口,比如说 eth0:1...
答案1
听起来你真正想要的是一个可以从不同界面分部分下载文件并在最后将它们连接在一起的应用程序。例如,如果你知道你的文件是 100MB,并且你想抓取大约 10MB 的块,那么你需要这样做:
1. start a download of bytes 0..10000000 on eth0, saving to filename.part1
2. start a download of bytes 10000001..20000000 on eth0:0, saving to `filename.part2
3. start a download of bytes 20000001..30000000 on eth0:1, saving to filename.part3
...
N-1. wait for all downloads to complete
N. join all filename.part* together to get filename.complete
我知道wget
可以恢复部分下载的文件。我很确定这是通过读取现有文件的末尾然后从下一个字节开始向服务器请求文件来实现的。
看起来curl
使用该选项支持部分下载--range <byterange>
。因此,您可以像这样编写上述步骤的脚本:
1. curl --interface eth0 --range 0,10000000 http://some.server.com/bigfile -o bigfile.part1
2. curl --interface eth0:0 --range 10000001,20000000 http://some.server.com/bigfile -o bigfile.part2
...
N. cat bigfile.part* > bigfile
注意事项:这并不总是有效;如果 HTTP/1.1 服务器未启用部分下载功能,则每次调用时都会获得整个文件。请参阅man curl
了解该--range
选项的详细信息。
编辑:示例中的固定字节范围
答案2
这里这是一篇关于使用 curl 拆分下载的博客文章。我尝试在 Windows 中操作,但无法成功,但使用 Linux 可能会成功。
答案3
首先,让我纠正一下你所说的几点。
1)curl 不支持分段下载-- Curl 支持下载特定范围的文件。但首先您需要验证服务器是否支持范围下载,如果支持,您可以通过传递带有curlRange: bytes=start-end
选项的 HTTP 标头来请求特定范围的文件。-H
2)我问的是一些想法,比如改变 BASH shell 中的变量,以便整个 shell 绑定到特定的接口-- 对于大多数变量来说,设置变量没有任何意义,除非应用程序使用某些函数getenv()
(如 C 语言)读取它们。
可能的解决方案
您绝对可以做的一件事是使用 curl 编写一个 shell 脚本,您可以使用--interface
选项绑定到特定接口并--header
使用选项请求特定范围。然后,您可以在可用的接口之间安排下载。但请稍等!您需要进行大量解析才能实现它。您可能希望解析输出ifconfig
以获取接口,并且您可能希望解析 curl 的输出以实现这样的下载器。此外,该应用程序具有很高的失败风险,因为它完全依赖于某些特定应用程序的输出。我的意思是,它们ifconfig
没有curl
关于如何生成输出的标准,但 HTTP 有固定的标准(RFC)。因此,与一些非标准化应用程序相比,解析 HTTP 消息的失败风险较低。
有任何像 Axel 这样的项目吗?
我开始研究一个项目,其用例与你问的一样。它完全用 C 语言编写。这是我的项目的链接,多接口下载器 (MID)https://github.com/m0hithreddy/MID。
MID 使用 SO_BINDTODEVICE 套接字选项绑定到特定接口,因此在大多数情况下您需要超级用户权限和 CAP_NET_RAW 功能(root 用户具有)。
MID确定下载时使用的网络接口,并采用两步分割下载内容。
- 第一步:将文件在网络接口之间进行分配(实时)。
- 第二步:进一步将文件分成几个HTTP 范围请求来自该特定界面(笔记:服务器应该首先支持他们,以使这一切成为可能)
MID支持HTTP和HTTPS协议。
干杯 :)
答案4
将 eth0:0 设为默认路由,而不是 eth0。命令如下:
netstat -rn
将显示您当前的默认接口。如果不是 eth0:0,请使用以下命令将其删除
route delete 0.0.0.0
然后添加类似
route add default eth0:0