aria2
大文件、慢速服务器、大量下载、种子
- 服务器限制单个连接速度时,最多快 10 倍
- 内置 BitTorrent、Metalink 和镜像支持
- 一台可以通过 RPC 控制的下载服务器
三者都能在命令行下载文件,但它们是为不同的任务设计的。我们在同一台机器、同样的测试服务器上把它们放在一起运行,并记录下每一个数字。
aria2
wget
curl
镜像站和网盘经常限制单个连接的速度。我们的测试服务器在 24 MiB/s 的线路上允许每个连接 2 MiB/s。文件大小:50 MB。
| 工具 | 命令 | 秒 |
|---|---|---|
| wget | 24.0 | wget URL · 24.0 秒 |
| curl | 24.0 | curl -O URL · 24.0 秒 |
| aria2,1 个连接 | 24.1 | aria2c URL · 24.1 秒 |
| aria2 -x16 -s16 | 12.2 | aria2c -x16 -s16 URL · 12.2 秒 |
| aria2 -x16 -s16 -k1M | 2.3 | aria2c -x16 -s16 -k1M URL · 2.3 秒 |
只用一个连接时,三者都要 24 秒:速度由服务器决定。aria2 用 16 个连接花了 12.2 秒,因为它默认的 -k 20M 只把 50 MB 的文件拆成 2 个分块。加上 -k1M 后,它用满了全部 16 个连接,2.3 秒就完成了。
从一台服务器下载二十个 2 MB 的文件,该服务器给每个请求增加 80 ms 延迟,并把每个连接限制在 2 MiB/s。wget 和普通的 curl 一个接一个地下载;curl --parallel 和 aria2 同时下载多个。
| 工具 | 命令 | 秒 |
|---|---|---|
| wget -i | 21.8 | wget -i urls.txt · 21.8 秒 |
| curl,逐个下载 | 21.9 | xargs -n1 curl -O < urls.txt · 21.9 秒 |
| curl --parallel | 5.5 | curl --parallel --parallel-max 5 -O … · 5.5 秒 |
| aria2c -i | 4.5 | aria2c -i urls.txt · 4.5 秒 |
| aria2c -i -j16 -x4 | 2.0 | aria2c -i urls.txt -j16 -x4 -k1M · 2.0 秒 |
aria2 默认同时运行 5 个下载,在同样的并发数下比 curl --parallel 略快。加上 -j16 -x4 后,它达到了线路上限:2.0 秒,而 wget 需要 21.8 秒。五次运行得到的文件完全一致。
在一台不限速的本地服务器上,三者下载 50 MB 文件都不到一秒,wget 和 curl 比 aria2 略快一点,因为 aria2 会先为文件预留磁盘空间。如果一个连接已经能跑满你的带宽,增加连接数也不会更快。
在同一次 HTTP 下载过程中测量。“自身内存”是程序为自己分配的内存;总量还包括共享的系统库。
wget 最精简。aria2 需要更多内存,因为它要随时准备好下载引擎、磁盘缓存和 BitTorrent 代码,但 4.5 MiB 仍然很小:aria2 官方给出的数字是 4–9 MiB。
我们在限速下载进行到一半时中断每个工具,然后重新启动。三者最终都得到了正确的文件:wget 用 -c,curl 用 -C -,aria2 用 -c。aria2 即使不加 -c 也能断点续传,因为它的 .aria2 控制文件记录了哪些分块已经完成。注意 aria2 会先预留完整的文件大小,所以未下载完的文件已经显示为最终大小。
很多下载链接会重定向到镜像。wget 和 aria2 默认跟随重定向。curl 不会:不加 -L 时,它保存了一个空文件,退出码却仍然是 0,脚本根本发现不了。用 curl 下载时请始终加上 -L。
对照每个工具的文档核对,并尽可能实际运行验证。
| aria2 | wget | curl | |
|---|---|---|---|
| 一个文件用多个连接下载 | 支持 | 不支持 | 不支持 |
| 同时从多个镜像下载一个文件 | 支持 | 不支持 | 不支持 |
| BitTorrent 和磁力链接 | 支持 | 不支持 | 不支持 |
| Metalink | 支持 | 部分版本 | 不支持 |
| 断点续传 | 支持 | 支持 | 支持 |
| 远程控制(RPC) | 支持 | 不支持 | 不支持 |
| 镜像整个网站 | 不支持 | 支持 | 不支持 |
| 上传、25+ 种协议、API | 不支持 | 不支持 | 支持 |
| 大多数 Linux 系统预装 | 不支持 | 支持 | 支持 |
除最后两行外,每一行都在我们的测试服务器上运行过,数值换成了我们自己的;每条命令都得到了正确的文件。
| 任务 | wget | curl | aria2c |
|---|---|---|---|
| 下载一个文件 | wget URL | curl -O URL | aria2c URL |
| 以其他文件名保存 | wget -O name.iso URL | curl -o name.iso URL | aria2c -o name.iso URL |
| 保存到指定文件夹 | wget -P dir URL | curl --output-dir dir -O URL | aria2c -d dir URL |
| 断点续传 | wget -c URL | curl -C - -O URL | aria2c -c URL |
| 把速度限制在 1 MiB/s | wget --limit-rate=1m URL | curl --limit-rate 1M -O URL | aria2c --max-download-limit=1M URL |
| 最多重试 10 次 | wget --tries=10 URL | curl --retry 10 -O URL | aria2c --max-tries=10 URL |
| 发送一个请求头 | wget --header="X-Key: 1" URL | curl -H "X-Key: 1" -O URL | aria2c --header="X-Key: 1" URL |
| 设置 User-Agent | wget -U "Agent/1" URL | curl -A "Agent/1" -O URL | aria2c -U "Agent/1" URL |
| HTTP 登录 | wget --user=U --password=P URL | curl -u U:P -O URL | aria2c --http-user=U --http-passwd=P URL |
| 下载 URL 列表 | wget -i urls.txt | xargs -n1 curl -O < urls.txt | aria2c -i urls.txt |
| 跳过证书检查 | wget --no-check-certificate URL | curl -k -O URL | aria2c --check-certificate=false URL |
| 跟随重定向 | wget URL | curl -L -O URL | aria2c URL |
| 用 16 个连接下载一个文件 | 不支持 | 不支持 | aria2c -x16 -s16 -k1M URL |
| 下载种子 | 不支持 | 不支持 | aria2c file.torrent |
| 复制一个网站 | wget -r -np URL | 不支持 | 不支持 |
aria2c -x16 -s16 -k1Maria2c -i urls.txt -j16aria2caria2c --enable-rpc 配合 WebUIwget -r -npcurlwget 或 curl -L,系统已预装