aria2c 加了 -x 16 还是单连接:四层原因与对应命令
环境与链接
- aria2 1.8.3,手册 ,仓库
- curl 8.23.0,特性对照表
- wget 1.25.0,
- wget2 2.1.0,
- axel,
- yt-dlp,
给 aria2c 传了 -x 16 却还是一个连接在跑,原因通常不在参数写错,而在参数之间、以及客户端与服务端之间的约束。按下面四层依次看。
第一层:-k 默认 20M,切分门槛是 2*SIZE
手册原文:aria2 does not split less than 2*SIZE byte range。默认 --min-split-size 是 20M,所以实际切分门槛是 40MiB:小于这个体积的文件只会用 1 个 source。
举例一个 20MiB 的文件:SIZE=10M 时可以切成 2 段;SIZE=15M 时 2*15M > 20MiB,不切。该参数取值范围 1M–1024M。
所以下一个 30MB 的 release 包,-x 16 -s 16 完全不起作用,必须显式降门槛:
aria2c -x 16 -s 16 -k 1M https://example.com/pkg-30mb.tar.gz
# 或
aria2c -x 16 -s 16 --min-split-size=1M https://example.com/pkg-30mb.tar.gz
第二层:-x 是每服务器每文件上限,-s 才是分片数
两个参数管的事不一样:
-x/--max-connection-per-server,默认 1,含义是「一个下载任务对同一台服务器的连接上限」。-s/--split,默认 5,含义是「用 N 个连接下载一个文件」。
给的 URI 少于 N 时,aria2 会复用 URI,但复用出来的连接同样受 -x 限制。于是单 URL 场景下:
- 只写
-x 16:5 个分片全挤在 1 个连接上,等效单连接。 - 只写
-s 16、不动-x:被卡在 1,也是单连接。
两个都要给:
aria2c -x 16 -s 16 -k 1M https://example.com/big.iso
aria2 还维护 server performance profile,通过 --server-stat-of / --server-stat-if 存取,默认 --uri-selector=feedback,即按历史表现挑选 URI。
第三层:服务端是否接受 Range
多连接分片的前提是服务端接受 Range 并返回 206。先探测再下载:
curl -sI -H "Range: bytes=0-1023" https://example.com/file.iso
看返回码:206 且带 Content-Range 才支持;返回 200 说明服务端忽略了 Range,aria2 只能退回单连接。静态大文件放在 nginx 或对象存储上一般没问题;动态脚本输出、签名 URL 后端忽略 Range 的,看到的就是 200。
只想探测不下载,可以用 --dry-run。
第四层:单 IP 限速与连接数限制
如果服务端是按账号或按 IP 做的令牌桶限速,加连接只会让每连接速度变低、总量不变,还可能触发 429/403。--lowest-speed-limit 可以在连接速度过低时主动断开并换源。
另外别混淆:-j / --max-concurrent-downloads 默认 5,管的是「同时下载几个任务」,与单个任务的连接数无关。
续传:三家语义不同
aria2:-c / --continue,手册明确仅对 HTTP(S)/FTP 生效,且需要服务端支持 Range。断点信息存在 .aria2 控制文件里,删了它就得重下。
curl:
curl -C - -O https://example.com/big.iso
curl -C - -o out.bin https://example.com/big.iso
-C - 表示自动探测偏移,同样依赖 Range。curl 默认不跟随重定向,下载短链要自己加 -L。curl 8 的 --parallel 并行的是多个 URL(不同文件),单文件不切分。
wget:
wget -c https://example.com/big.iso
-c 自动续传。注意 -c 与 -O 一起用时续传语义不稳:文件名变成用户指定的,续传判断按本地文件长度来。要么用 -O 但接受重下,要么保持原名配合 -P 指定目录。后台下载用 -b,日志默认写 wget-log。递归镜像用 --mirror(等价于 -r -N -l inf --no-remove-listing),-np 慎用。
wget2 2.x 提供 --max-threads,可做多线程 HTTP 下载,是 wget 的替代品,但两者行为不完全兼容:
wget2 --max-threads=8 https://example.com/big.iso
限速参数各不相同:wget 用 --limit-rate=200k,aria2 用 --max-download-limit=1M,axel 用 -s(每秒字节)。线程数建议 4–16,再高容易被打。
yt-dlp 里的外部下载器
--downloader aria2c 只对 http/ftp 有效。dash/m3u8 分片有自己的并发开关 -N / --concurrent-fragments(默认 1),这类源应保留 native 下载器,不要交给 aria2c:
yt-dlp --downloader aria2c --downloader-args "aria2c:-x 16 -k 1M" -N 4 URL
yt-dlp 合并音视频还需要 ffmpeg 二进制(不是同名的 Python 包)。
校验
下载完必须校验:
sha256sum -c SHA256SUMS
或直接交给 aria2:
aria2c --checksum=sha-256=DIGEST https://example.com/big.iso
aria2 还支持 Metalink 的分片校验,用 -V / --check-integrity 开启。
判断顺序
- 文件 ≥ 40MiB 吗?小于就先加
-k 1M。 -x和-s都给了吗?curl -sI带Range看是不是 206。- 前三条都满足还慢,就是服务端限速或链路问题,加连接无意义。
- 单文件下载用 aria2;批量下载用
aria2c -i urls.txt -j;脚本里求稳定用 curl;网站镜像用wget --mirror;站点视频用 yt-dlp。