用 Rust + Flutter 造了个免费开源的 IDM 替代品:FluxDown,聊聊它的下载引擎是怎么设计的

TL;DR:FluxDown 是一款免费、开源(AGPL-3.0)、零广告零追踪的多协议下载管理器。下载引擎用 Rust + Tokio 从零写起,UI 用 Flutter,支持 HTTP/HTTPS、FTP、BitTorrent、eD2K、HLS/DASH。Windows / macOS / Linux 全平台,还配了 Chrome / Edge / Firefox 扩展自动接管浏览器下载。

官网:https://fluxdown.zerx.dev | 开源:https://github.com/zerx-lab/FluxDown

起因:IDM 很好用,但……

用过 IDM 的都知道它有多能打——多线程分段、断点续传、浏览器接管,下载速度经常能把浏览器自带的下载器按在地上摩擦。但它有几个绕不过去的槽点:

  • 收费:$24.95,还要续费;
  • 只有 Windows:macOS / Linux 用户无缘;
  • 闭源:你不知道它在后台干了什么;
  • 不支持 BitTorrent / 磁力 / eD2K,流媒体(HLS/DASH)也只是部分支持。

市面上"免费"的下载器又大多塞满广告、捆绑全家桶、偷偷上传数据。于是我干脆自己写了一个:下载引擎用 Rust 保证性能和内存安全,界面用 Flutter 做到跨平台且好看,永久免费、零广告、零追踪、不需要注册账号。

这就是 FluxDown

它能做什么

先摆一张和 IDM 的对比表:

FluxDown IDM
价格 永久免费 $24.95 + 续费
开源 是(AGPL-3.0)
平台 Windows / macOS / Linux 仅 Windows
BitTorrent 与磁力链 支持 不支持
eD2K / eMule 链接 支持 不支持
HLS / DASH 流媒体 支持 部分支持
动态分段 支持 支持
浏览器扩展 Chrome / Edge / Firefox 支持
广告与追踪

核心亮点:

  • 最高 10 倍提速:Rust + Tokio 引擎,IDM 式运行时动态分段;
  • 多协议:HTTP/HTTPS、FTP、BitTorrent(DHT/UPnP/磁力)、eD2K(服务器 + Kad DHT 找源、MD4 校验)、HLS(AES 解密)、DASH,每种协议都有专属引擎;
  • 浏览器集成:三层下载拦截,自动嗅探页面里的视频/音频/流媒体资源;
  • 随处续传:每个字节都记录在 SQLite(WAL 模式),崩溃、断电都不丢进度;
  • 干净纯粹:零广告、零追踪、无账号,本地优先,数据不出你的机器。

聊点硬核的:架构怎么设计的

一句话概括:Flutter 负责渲染界面,一个零 FFI 依赖的纯 Rust 引擎负责下载,两端通过 Rinf 信号通信,浏览器扩展经 Native Messaging 接入。

[浏览器扩展 (WXT)] --Native Messaging--> [fluxdown_nmh]
                                              │ Named Pipe / Unix socket
[Flutter UI (shadcn_ui)] <--Rinf 信号--> [hub —— FFI 适配层]
                                              │
                                     [fluxdown_engine]
                            ┌─────────┬────────┼────────┬─────────┐
                          HTTP       FTP       BT      eD2K    HLS/DASH
                                              │
                                          [SQLite]

这里最关键的一个设计决定是:把下载引擎 fluxdown_engine 做成零 rinf / 零 Dart 依赖的独立 crate。它通过两个 trait 和宿主解耦:

  • EventSink:引擎向宿主上报进度、分段拆分、队列变化等事件;
  • HostSelection:引擎需要宿主介入决策时(比如让用户选 HLS 画质、选种子里下载哪些文件)回调。

hub 这个 crate 只是 Rinf FFI 适配层,负责信号收发和类型转换,不含任何下载协议逻辑。

为什么这么拆? 因为这样一来,同一个引擎可以喂给完全不同的宿主:桌面 App(Flutter)、headless Web 服务器(axum)、命令行客户端(aria2c 风格 CLI)、甚至未来的手机端,都只需要各自实现一遍 EventSink / HostSelection,下载核心逻辑一行不改。目前仓库里已经有了 headless server 和 CLI 两个复用同一引擎的宿主。

这是典型的 依赖倒置 + 端口适配器:核心领域(下载)不依赖任何具体的 UI / FFI 框架,框架反过来依赖核心定义的 trait。写 Rust 的同学应该会喜欢这个边界。

智能分段:不是简单地开 N 个线程

很多下载器的"多线程"就是把文件均分成 N 段并行下。问题是:网络是不均匀的——某一段可能撞上慢速 CDN 节点,其他段都下完了它还在龟速爬,整体速度被这一段拖死。

FluxDown 的分段做了两件事:

1. 动态确定分段数(segment_advisor

不是无脑开满线程,而是按文件大小分档,再受 CPU 核心数上限约束:

  • < 1MB → 1 段(小文件多线程纯属浪费握手开销)
  • 1–10MB → 4 段
  • 10–100MB → 8 段
  • 100MB–1GB → 16 段
  • 1GB → 32 段起步

2. 运行时动态拆分与抢救(segment_coordinator

  • 主动拆分:检测到某个分段明显偏慢 → 把它剩余的部分再拆成两段并行加速;
  • 抢救拆分:某分段卡死 → 拆分让空闲线程接管。

拆分是原子的:子分段插入 + 父分段缩小在单个事务里提交,避免中间态导致的重复下载或漏下。这个拆分过程会通过 EventSink 上报,前端能实时播放 IDM 那种分段可视化的动画。

这就是"空闲线程接管慢速分段"的含义——像 IDM,但更聪明

全局限速:Token Bucket

后台挂着下载、前台还想正常刷网页,就需要限速。FluxDown 用经典的 Token Bucket 做全局限速器:

  • 参数:rate(字节/秒)+ burst(突发缓冲,默认等于 rate);
  • 每次写盘前 consume(bytes) 异步等待令牌,令牌不够就 await,天然不阻塞 Tokio 运行时。

这样既能精确控制总带宽,又允许短时突发,不会把速度限制得一顿一顿的。

断点续传:SQLite 全量持久化

任务、分段、配置、队列全都落在 SQLite 里(WAL 模式 + 外键)。每个分段的 downloaded_bytes 都按 5 秒批量刷盘,断电 / 崩溃 / 强制关机后重启,从上次的字节数继续,不重下已完成的部分

顺带一提,持久化层用的是 sqlx 的 Any 池,$N 占位符统一 SQL,同一份代码能同时跑 SQLite 和 PostgreSQL 双后端——这是为 headless server 部署预留的。

浏览器集成:三层拦截

装上扩展后,FluxDown 会自动接管浏览器下载。拦截做了三层防线:

  1. webRequest.onHeadersReceived:缓存响应头,检测 Content-Disposition / Content-Type
  2. downloads.onDeterminingFilename:主拦截(Chrome MV3 专属),suggest({cancel:true}) 干净地取消浏览器自身下载并转交 FluxDown;
  3. downloads.onCreated + onChanged:兜底拦截,也是 Firefox 的唯一路径。

外加:自动嗅探页面里的视频/音频/HLS 流、Alt+Click 临时放行浏览器直接下载、右键"发送到 FluxDown"。全平台走 Native Messaging Host 与 App 通信(Windows 用 Named Pipe,Linux/macOS 用 Unix socket)。

下载与安装

从 GitHub Releases 或官网获取最新版(当前 v0.1.52):

  • Windows(x64 / ARM64):setup.exe 安装程序 · 便携版 .zip
  • macOS(Intel / Apple Silicon):.dmg · 便携版 .tar.gz
  • Linux(x64):.AppImage · .deb · Arch .pkg.tar.zst · 便携版 .tar.gz

浏览器扩展:Chrome · Edge · Firefox

⚠️ 安全提醒:官方唯一域名是 fluxdown.zerx.dev,开源仓库是 github.com/zerx-lab/FluxDown。近期发现有假冒站点 fluxdown.com.cn 传播木马(SilverFox),请勿从任何非官方渠道下载

最后

FluxDown 完全开源(AGPL-3.0),用 Rust 写引擎的初衷就是想证明:免费的东西也可以很硬核。技术栈是 Rust + Tokio + Flutter + Rinf,代码在 GitHub 上,欢迎围观、提 Issue、发 PR。

如果它帮你省下了时间,欢迎给个 Star —— 这能让更多人发现它。有任何问题、建议、想支持的协议,评论区或 Issue 见。

posted @ 2026-07-04 20:53  Penetration  阅读(3)  评论(0)    收藏  举报