aria2 是命令行下载器,一个 exe 支持 HTTP、HTTPS、FTP、SFTP、BitTorrent、Metalink。它的卖点是分片:把一个文件切成若干段同时下,还支持断点续传和限速,很多人拿它当浏览器下载的后端。

分片开多少合适,答案和网络环境关系很大。同一个 10 MiB 文件,本地回环里开 4 个分片能跑到 21.6 MB/s,公网上开 16 个分片反而比 1 个慢 24%。

解压即用,一条命令

aria2c --version
aria2 version 1.37.0

aria2c -x 8 -s 8 -d D:\dl -o test.bin https://example.com/test.bin

-x 是连同一台服务器的最大连接数,-s 是把这个文件切成几段。-d 指定保存目录,-o 指定文件名。Release 页给的是 zip,解出来只有一个 aria2c.exe,不带 DLL。

本地回环:4 个分片就到顶

用 Python 起一个本地 HTTP 服务,提供 10 MiB 的随机数据文件,从 127.0.0.1 下载,每档跑一次:

分片参数耗时(秒)速度(MB/s)文件完整
-x 1 -s 10.6714.9是
-x 4 -s 40.4621.6是
-x 8 -s 80.4621.6是
-x 16 -s 160.4920.3是

1 个连接 14.9 MB/s,4 个连接 21.6 MB/s,提升 45%。再往上没有收益,16 个连接还掉了 1.3 MB/s,因为本地回环的带宽早就被吃满了,多开连接只是在争同一块磁盘。

公网:分片越多越慢

换成从公网服务器拉同一个 10 MiB 文件,中间隔着家用宽带:

分片参数耗时(秒)速度(MB/s)
-x 1 -s 114.630.7
-x 8 -s 815.270.7
-x 16 -s 1618.080.6

16 个分片比 1 个多花 3.45 秒,慢 24%。这种情况在带宽受限的链路上很常见:服务端按连接限速,客户端再多开也没用,额外的 TCP 握手和重传反而拖后腿。

判断方法很简单,先用 -x 1 跑一次记速度,再换 -x 4 跑一次。第二次没快到 20% 以上,说明链路已经跑满了,分片数就该停在那里。

断点续传是真的能接上

往目标目录放一个只下了 5 MiB 的半截文件,再用 --continue=true 跑:

> aria2c -x 8 -s 8 --continue=true -d D:\dl -o out.bin http://127.0.0.1:8899/speedtest10m.bin
最终大小 10485760 字节,与源文件一致
耗时 0.32 秒(只补了剩下的 5 MiB)

它按已有文件的大小发 Range 请求,只补后面的部分;分片下载时旁边还会多一个 .aria2 文件记录每段的完成情况。那个控制文件删了就只能从头下。

分片开太大直接报错

> aria2c -x 32 -s 32 ...
Exception: [AbstractOptionHandler.cc:69] errorCode=28
  -> [OptionHandlerImpl.cc:184] errorCode=1
     max-connection-per-server must be between 1 and 16.

-x 的合法范围是 1 到 16,如果写成 32,程序会在参数解析阶段就报错退出,退出码 28,一个字节都不会下。想更快只能靠多个服务器,单台服务器最多 16 个连接。

URL 打不开同样会报错,而且不同原因给不同退出码,脚本里可以直接判断:

情况退出码提示
URL 返回 4043errorCode=3 Download aborted
端口不通29errorCode=29 Download aborted
-x 超过 1628max-connection-per-server must be between 1 and 16

404 和连接被拒是两种退出码,脚本里能分开处理:3 说明文件没了,29 说明网络或服务端没起来。

什么时候别用它

只下一次小文件。为 2 MB 的文件装一个 5 MB 的 exe,不如浏览器直接点。aria2 的价值在批量、断点续传和分片,单次小文件用不上。

链路上游限速。公网实测 16 个分片比 1 个慢 24%,服务端按连接限速时,多开连接只会增加握手和重传。

需要图形界面。aria2 本身没有界面,要么开 --enable-rpc 配上 AriaNg 这类网页前端,要么直接命令行。想要托盘图标就别选它。

还没测的两项:BitTorrent 做种下的速度表现 / RPC 模式配 AriaNg 的完整流程。前者需要公网可连的种子,后者要额外部署一个前端。