编程 aria2c -x 16 还是单连接:-k 默认 20M,40MiB 以下根本不切分

2026-10-28 00:03:50

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 开启。

判断顺序

  1. 文件 ≥ 40MiB 吗?小于就先加 -k 1M。
  2. -x 和 -s 都给了吗?
  3. curl -sI 带 Range 看是不是 206。
  4. 前三条都满足还慢,就是服务端限速或链路问题,加连接无意义。
  5. 单文件下载用 aria2;批量下载用 aria2c -i urls.txt -j;脚本里求稳定用 curl;网站镜像用 wget --mirror;站点视频用 yt-dlp。
复制全文 生成海报 下载工具 aria2 curl wget yt-dlp

推荐文章

程序员茄子在线接单