前阵子我把一台退役的迷你主机改成了家里的下载机,顺便把下载方式从“浏览器单线程硬拉”换成了 Aria2 这类支持全协议的开源下载引擎。折腾完以后,从本地千兆局域网的文件服务器拉一个 4GB 的测试文件,速度稳定在 110MB/s 左右;从公网镜像站拉系统镜像,速度也能跑到几十甚至上百兆字节每秒。标题里的数字听着夸张,但只要链路达标、参数合理,它确实可以被复现,不是玄学。
更让我满意的是,这套方案同时覆盖了我日常会遇到的几种下载场景:HTTP/HTTPS 直链、BT 种子、磁力链接,全部用一个引擎统一管理,跨平台还能后台跑。这篇文章会把我的思路、配置步骤、踩过的坑全部拆开讲一遍。如果你也经常要在不同下载器之间来回切换,或者想在 NAS、Linux 服务器上搭一个自己说了算的下载环境,这篇应该能帮你省不少事。
1. 项目思路:从“下载器来回切换”到“一个引擎通吃”
1.1 为什么需要 HTTP、BT、磁力同时支持
很多人会把下载工具分成两类:一类用来下 HTTP 直链,比如浏览器或者迅雷;另一类用来下 BT 种子和磁力链接,比如各种小众客户端。这么做临时用还行,时间长了就有明显问题:一个资源可能同时提供 HTTP 镜像和 BT 种子,你为了稳定会先开 HTTP 下载器,结果发现某个分包挂了又得转 BT,或者反过来下到一半想换通道,文件校验逻辑还不一样。
真正省心的方案是底层引擎同时支持 HTTP、HTTPS、FTP、SFTP、BitTorrent、磁力链接。你不需要关心资源是哪种协议,把链接丢进去就行。HTTP 直链能满速下载,BT 种子和磁力链接也能走同一个调度系统,配合统一的下载目录、断点续传、磁盘缓存,效率高很多。
选择全协议还有一个好处,就是能针对不同资源做组合操作。比如一些开源软件的发布页同时给了 BT 种子和直链下载地址,如果 BT 做种人数不多,直链反而是更稳定的来源。只要有一个统一的下载引擎,你可以分别下,然后对比校验值;也可以先借助 HTTP 把文件主体拿下来。当然,这类操作的前提是资源本身允许这样用,后面我会再细说。
1.2 多款工具横评:为什么我选了 Aria2 而不是现成 GUI
我的需求比较明确:既能装在 Linux 服务器上当一个无头下载服务,也能临时在 Windows、macOS 上跑;资源占用不能太高;协议覆盖要全;最好还能通过 Web 页面管理下载任务。当时对比了几套方案:
| 工具 | 协议覆盖 | 图形界面 | 后台服务能力 | 适合谁 |
|---|---|---|---|---|
| Aria2 + WebUI | HTTP/HTTPS/BT/磁力 | 依赖前端 | 很强,RPC 管理 | 愿意折腾、需要长期挂机的人 |
| Motrix | 同上 | 有,界面现代 | 一般 | 想要开箱即用的人 |
| qBittorrent | BT/磁力为主 | 有,WebUI | 很强 | 重度玩 PT/BT,对 HTTP 要求不高的人 |
| Transmission | BT/磁力为主 | 有 | 很强 | 追求极简与稳定的人 |
最后胜出的是 Aria2。它的优势在于非常轻量,一个二进制文件就能跑;协议覆盖面广,HTTP、HTTPS、FTP、SFTP、BT、磁力都能处理;启动后通过 RPC 接口管理,可以随时被其他程序调用;就算不想用命令行,也能套一层 AriaNg 之类的纯静态前端页面。
可能有人会说,Motrix 和 qBittorrent 不也有现成界面吗?为什么绕一圈用 Aria2?我的理由是,图形客户端往往替你封装了很多配置,看起来省心,但遇到速度问题时你能调的东西很少。Aria2 把连接数、分段大小、缓存、DHT 开关等参数全暴露出来,一旦某次下载速度不对,我可以逐个排查,而不是只能对着界面干瞪眼。对于追求“跑满带宽”的人来说,这种可调性太重要了。
2. 先把 110MB/s 背后的物理和协议逻辑算清楚
2.1 单位换算:110MB/s 对链路意味着什么
先说一个很多人容易忽略的点:文件下载速度里的 B 是大写,指的是 Byte(字节);运营商宣传的百兆、千兆带宽,单位是 bit(比特),通常用小写 b。1 Byte = 8 bit,所以 110MB/s 换算到带宽是 110 × 8 = 880Mbps。
普通千兆以太网的理论极限是 1000Mbps,也就是 125MB/s,去掉协议头和实际损耗后,能跑到 110MB/s 已经非常接近网卡上限。如果你的网卡、路由器、网线、光猫端口实际协商速率只有 100Mbps,那理论极速只有 12.5MB/s,连 20MB/s 都别想,更不用说 110MB/s 了。
所以想复现标题里的速度,第一件事不是调软件,而是确认物理链路。我的测试环境里,下载机和服务器的网卡都协商在 1000Mbps,中间交换机也支持千兆,测试文件放在本地 HTTP 服务上,没有跨公网,这才跑出了 110MB/s。如果你用公网资源测速,能达到多少还取决于对方服务器的出口带宽、链路拥堵程度、你和服务器之间的往返延迟,软件只能把它能利用的那部分带宽榨干,不能凭空变出带宽。
注意:110MB/s 是接近千兆链路的极限值。如果你的宽带是几百兆或者百兆,不要用这个数字作为验收标准,先把链路这一层检查清楚。
2.2 HTTP 多线程下载为什么快,以及为什么不能无脑堆线程
很多人不理解“多线程下载”为什么能比单线程快。我们可以打个比方:一条传输管道,单线程相当于只有一个搬运工来回跑。搬运工的效率受到两个因素制约,一是每次能搬多少东西,二是往返一趟要多久。网络里的“往返要多久”就是 RTT(Round-Trip Time)。当链路带宽足够高,但单次搬运窗口不够大时,单线程很难把整个管道占满。
HTTP 协议本身支持 Range 请求,客户端可以告诉服务器:“我要这个文件的第 0 到第 10MB 段。”于是 Aria2 会把一个大文件拆成多个分段,同时开多个连接,分别请求文件的不同部分,下载完以后再拼成一个完整文件。这就是多线程分段下载的原理。只要服务器允许 Range 请求,多个连接可以各拉各的,互不干扰,最终把整个链路的带宽用起来。
但是,多线程并不是越多越好。连接数太高会带来额外的 TCP 开销和内存消耗,也容易触发服务器端的并发限制。很多镜像站会对单个 IP 的最大连接数做出限制,你开了 64 个连接,实际服务端只允许 4 个,剩下 60 个都在排队,效果反而更差。更合理的做法是先按 8 到 16 个连接来设置,再根据实际速度微调。Aria2 里有两个参数经常一起出现:split和max-connection-per-server。前者决定一个文件最大分成多少段,后者决定每个服务器最多建立多少连接。两者配合起来,才是真正有效的多线程下载。
3. 实操记录:从安装到把下载参数压榨到极限
3.1 跨平台安装步骤:Windows / Linux / macOS / NAS
Aria2 在不同平台上都能跑,安装方式不算复杂。因为它是命令行工具,最核心的安装其实是把可执行文件放到系统里,并配置好 PATH 环境变量。
Linux 系的 Debian/Ubuntu 安装很直接:
sudo apt update sudo apt install -y aria2macOS 上如果装了 Homebrew,也可以用:
brew install aria2Windows 用户可以去 Aria2 的官方发布页下载对应版本,解压出来可以直接运行aria2c.exe。为了方便,我会把 exe 所在目录加到系统 PATH 里,然后在任意终端执行aria2c --version都能看到版本号。如果你不习惯命令行,也可以用 Motrix 作为前端,底层同样是 Aria2。
NAS 设备会更偏爱 Aria2,因为很多 NAS 系统都支持 Docker。启动一个 Aria2 容器,把下载目录挂载出来,再映射 RPC 端口和 BT 监听端口,就能在 NAS 上获得一个常驻下载服务。命令大致是:
docker run -d --name aria2 \ -p 6800:6800 \ -p 6881:6881 \ -p 6881:6881/udp \ -v /path/to/download:/downloads \ -v /path/to/config:/config \ your-aria2-image不同架构的 NAS 需要选择不同镜像,具体情况根据自己的设备来。装好之后,我一般会在浏览器里打开一个 AriaNg 前端页面,它是一个纯静态页面,通过 Aria2 的 RPC 接口来管理任务。界面上可以新建 HTTP 下载,也可以粘贴磁力链接,和平时用的图形下载器体验差别不大。
3.2 HTTP 下载核心配置:跑满镜像站的关键语句
Aria2 的所有行为都可以通过参数控制。为了长期使用,我建议把常用参数写进aria2.conf,避免每次启动敲一长串命令。下面这份配置是我跑 HTTP 下载时的常用底稿:
# 基础设置 continue=true max-concurrent-downloads=5 split=16 max-connection-per-server=16 min-split-size=1M # 不限速 max-overall-download-limit=0 max-download-limit=0 # 磁盘与缓存 file-allocation=falloc disk-cache=64M # RPC 支持 enable-rpc=true rpc-listen-all=false rpc-listen-port=6800 rpc-secret=change-me # BT / 磁力 enable-dht=true dht-listen-port=6881-6999 listen-port=6881-6999 bt-max-peers=500逐项说明一下:
continue=true表示支持断点续传,下载中途断网或重启,再次启动后会从断点继续。split=16和max-connection-per-server=16是 HTTP 下载跑满速的关键,意思是最多把文件分成 16 段,并且对同一个服务器最多建立 16 个连接。min-split-size=1M表示小于 1MB 的文件不会强行拆分,避免无谓的碎片化。file-allocation=falloc会在 Linux 支持的环境下一开始就为文件分配好空间,减少下载过程中磁盘碎片的产生。如果文件系统不支持该参数,可以改成none或trunc。disk-cache=64M是给下载数据开一块内存缓存,降低频繁写入磁盘带来的 IO 压力。内存大的机器可以调到 256M,不要盲目设太高。enable-rpc=true和后面的 RPC 端口、密钥,是为了让 AriaNg 等前端能连接上来,通过网页管理任务。
临时下载单个文件时,我习惯直接命令行覆盖关键参数:
aria2c -c \ -x 16 \ -s 16 \ -k 1M \ -d /data/downloads \ "http://192.168.1.10/linux-distro.iso"其中-x对应max-connection-per-server,-s对应split,-k对应min-split-size。当文件托管在支持 Range 请求的服务器上时,配置正确后速度可以很快达到链路上限。如果测试对象不支持 Range,Aria2 会退回单连接,这时候怎么调线程数都没用。
3.3 BT 与磁力优化:让 P2P 任务不再“百KB级”
BT 和磁力走的是 P2P 网络,不像 HTTP 那样有一个明确的服务器“给你拉文件”。你的下载速度取决于全局有多少 peer 在线、做种者多不多、你们之间能不能建立连接、连接质量如何。所以 BT 调优的思路和 HTTP 很不一样。
首先要确保 Aria2 的监听端口能被外部连接进来。很多 BT 没速度的问题,不是没找到资源,而是别人找到了你,但连接不上。配置里我给listen-port和dht-listen-port都设置了 6881-6999 段。你需要在系统防火墙里放行这些端口,并且在路由器上把端口转发到下载机。如果你的路由器支持 UPnP,Aria2 也能尝试自动映射,不过手动设置更可控。
其次是 DHT。磁力链接不是完整的种子文件,它只包含一个文件的哈希值。下载磁力链接时,Aria2 首先要通过 DHT 网络和 tracker 服务器找到那些持有完整种子元数据的 peer,把元数据拿下来,然后才能知道文件列表并开始正式下载。没有 DHT,单纯靠 tracker,冷门资源的可连接性会差很多,所以enable-dht=true必须开着。
然后要调整合理的 peer 数。bt-max-peers=500意味着一个种子任务最多同时连接 500 个 peer。peer 数越多,越有可能从不同的人拼出完整数据块。但连接数太多也会消耗内存和 CPU,对于轻量下载机来说 300 到 500 是一个合理区间。如果某个种子的做种者本身就只有两三个人,那 peer 数设再多也改变不了上限,只能靠长期挂机慢慢磨。
还可以考虑手动维护一份 tracker 列表。有些资源主要靠 tracker 通知节点,DHT 只是兜底方案。public tracker 列表可以从社区维护的地址列表中获取,放进配置文件的bt-tracker字段,多个 tracker 用英文逗号分隔。需要注意的是,冷门资源即使有 tracker,帮助也有限,所以别指望加了列表之后所有资源都能跑满速。
4. 我踩过的坑:下载异常排查与速度问题速查
4.1 速度上不去时,按这个顺序从头查一遍
我见过太多人一遇到下载速度低,就条件反射地调大连接数,结果越调越慢。按照我的习惯,速度不对的时候应该从前到后按顺序排查。
第一层是硬件链路。先看网卡有没有成功协商到千兆,再看网线是不是老化或者质量太差。可以跑一个内网 HTTP 测试,用一个自己架设的文件服务器传输大文件,如果内网都跑不到 90MB/s 以上,就不要指望公网能跑满。之前我遇到过一次速度只有 40MB/s,排查了很久,最后发现是网线某一段铜芯氧化,换了根六类线立刻恢复。
第二层是源站能力。用curl -I看服务器响应头里有没有Accept-Ranges: bytes,没有的话基本上说明服务器不支持 Range,分段下载无从谈起,只能单线程慢慢拉。另外,当你把连接数调到 16 甚至更高仍没变化时,可能是服务器限制了单 IP 并发数。此时可以试试把-x降到 4 或 8,如果速度反而更稳,说明限制确实存在。
第三层是本地配置。检查max-concurrent-downloads是不是设置得太高。并行任务太多会争抢磁盘 IO 和带宽,尤其是机械硬盘,多个大文件同时写入时,磁头来回摆动,速度会很难看。此时应该降低并发数,或者把磁盘缓存调大,让写入缓冲得更平滑。
最后一层再考虑资源本身。HTTP 下载的公共镜像站通常带宽充足,但某些小站点或网盘文件会针对非会员限速。这种时候调 Aria2 参数没有意义,因为瓶颈在对方策略,不在你的链路。
4.2 BT / 磁力任务没速度、卡在 99% 怎么办
BT/磁力类问题比 HTTP 更复杂,我整理成一张速查表,实践时可以直接对照:
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| 磁力链接一直 0%,没有文件信息 | 元数据还没拿回来 | 等待一段时间,确认 DHT 已启用,或补充可用的 tracker |
| BT 任务连接数为 0 | 端口未被放行或对方连不上你 | 检查防火墙、路由器端口转发、UPnP 状态 |
| 下载速度极慢 | 做种者太少或连接质量差 | 调整 peer 上限,挂机等待,不要频繁暂停 |
| 速度一开始很快,慢慢掉到 0 | 磁盘写入拖后腿或缓存不足 | 调大disk-cache,检查磁盘剩余空间 |
| 下载到 99% 卡住 | 最后一块数据很难从其他 peer 拼齐 | 暂停后重新开始任务,或临时加做种者多的 tracker |
很多初次折腾 BT 的人会忽略一个点:磁力链接的任务在刚添加时,下载速度是 0,并不代表出问题了。因为 Aria2 先得去网络上找持有种子元数据的节点,这个阶段可能持续几十秒甚至几分钟。如果任务列表里能看到文件名,说明元数据已经就位,后续才会显示实际下载进度。
卡在 99% 是一种很熬人的情况。P2P 下载的后期,你手里可能已经拥有了 99% 的数据块,但最后一块数据只有少数几个 peer 持有,而它们又因为各种原因没和你建立稳定连接。此时重启任务会让 Aria2 重新发起 peer 连接,往往能突破僵局。如果始终不行,也可以暂时不管,等网络里做种者增加后再继续。
提示:BT 下载完成后,如果任务没有显式做种,最好保留一段时间,而不是立刻删掉。P2P 网络的基本逻辑就是“人人为我,我为人人”,只下载不分享会降低整个网络的健康度。不过要注意,分享内容必须是你有权分享的合法资源。
5. 这套全协议下载方案适合做什么,以及一些个人建议
5.1 我日常的主要用法
配置好之后,我很少再打开浏览器去等下载完成。主要用在几类场景:下载开源操作系统的 ISO 安装镜像