网盘直链下载这件事,说穿了就是把“网页点一下、浏览器慢慢拖”的体验,换成“多连接并行、断了能续、队列能排”的工程化下载。而 NDM(Neat Download Manager)之所以被一堆人叫作网盘直链下载神器,核心不在于它界面多花哨,而在于它足够轻、免费、对 HTTP 直链的接管足够干脆,几十兆的安装包丢上去,配置十分钟就能跑出接近线路上限的速度。我这些年帮人排查过不少“直链下到一半断掉”“速度卡在 300KB/s 不动”“下完打不开”的案例,八成不是软件的问题,而是直链的时效、请求头、并发策略这三件事没对齐。这篇就把 NDM 处理网盘直链的完整链路拆开讲:它到底强在哪、多线程分片的账怎么算、浏览器怎么接管、报错怎么定位,以及哪些场景你压根不该开高并发。适合刚接触直链下载的新手照着抄配置,也适合已经用过一段时间、但速度始终上不去的人回头补课。
1. 先搞清楚 NDM 在网盘直链场景里到底补了哪个洞
1.1 浏览器自带下载为什么在直链场景里天然吃亏
浏览器下载器的设计目标从来不是“把带宽榨干”,而是“别给用户添麻烦”。它默认单连接、串行写盘、失败后从头再来,这套逻辑对付几十兆的安装包毫无问题,但放到几个 G 的网盘直链上就露怯了。最典型的两个症状:一是速度被单条 TCP 连接的拥塞窗口卡死,尤其跨国或跨运营商线路,单连接很难跑满你办的千兆;二是浏览器一旦关闭标签页、切走页面或者进程被回收,任务就断了,续传能力约等于没有。
再往深一层看,浏览器下载还受同源策略和扩展权限的限制。有些直链需要特定的 Referer 或者 Cookie 才能放行,浏览器直接点会 403,但你手动把链接丢进下载器、补齐请求头就通了。这不是玄学,是服务端在校验“你是不是从正确的地方来的”。NDM 这类工具的价值,就在于它把这些请求头变成了可配置项,而不是让浏览器替你决定。
还有一个容易被忽略的点:浏览器下载失败时的错误信息极度贫瘠。它只会告诉你“网络错误”,不会告诉你服务端返回的是 403、416 还是一段 HTML 错误页。而直链下载的排查,恰恰高度依赖这些细节。所以从工程角度看,换一个能看见响应头、能记录分片状态的下载器,本身就是把黑盒变成白盒。
1.2 NDM 的定位:轻量接管,而不是全能管家
NDM 的定位非常清晰:一个免费的、跨平台的、支持多线程分片和浏览器接管的下载管理器。它支持的协议主要是 HTTP/HTTPS 和 FTP,能嗅探页面里的媒体资源,能接管浏览器的下载事件,能排队、能限速、能断点续传。Windows 和 macOS 都有版本,安装包体积很小,装完几乎不占资源,这点比很多动辄几百兆的“全家桶”式下载工具要舒服得多。
但它的边界也很明确。它不是网盘客户端,不负责登录、不负责解析分享页、不负责绕过任何访问控制。你给它一个能直接拿到文件字节的地址,它就能干活;你给它一个网页地址,它只能尝试嗅探,嗅探不到就只能干瞪眼。很多人第一次用觉得“不好使”,本质是把“网页链接”和“直链”混为一谈了。这两个东西的区别,后面第二章会专门拆。
我个人对它的评价是:在“免费 + 轻量 + 浏览器接管顺畅”这个三角里,NDM 的位置很稳;但如果你需要的是复杂规则、脚本化批量任务、精细的站点适配,那它就不是最优解,得往上找更重的方案。选工具之前先想清楚自己要解决的是“下得快”还是“下得全”,这两个诉求经常打架。
1.3 三种常见方案横向对比,别一上来就堆工具
新手最容易犯的错是同时装三四个下载器,结果浏览器扩展互相抢接管权,点一个链接弹三个窗口。先把方案理清楚,再决定装哪个。
| 方案 | 优势 | 明显短板 | 适合谁 |
|---|---|---|---|
| 浏览器自带下载 | 零配置、无需安装 | 单连接、几乎无续传、错误信息少 | 小文件、一次性下载 |
| 网盘官方客户端 | 账号体系完整、支持同步 | 体积大、常驻后台、非会员限速明显 | 长期备份、需要同步盘 |
| NDM 这类下载管理器 | 多线程分片、断点续传、请求头可调、体积小 | 需要自己拿直链、不解析分享页 | 有直链、追求速度与稳定 |
这张表里最值得说的是第二行。官方客户端的限速是产品策略,不是技术瓶颈,你换什么下载器都改变不了“服务端按账号限速”这个事实。所以如果你的目标是“把官方客户端限掉的速度抢回来”,那方向本身就错了。NDM 真正能发挥作用的场景,是服务端按单连接限速、但允许多连接并行的情况,或者直链本身没有做账号级限速、只是浏览器单线程跑不满的情况。
我在实际排查里见过太多人把这两件事搞混:明明是账号级限速,非要加到 32 线程,结果速度没涨,反而因为并发过高被服务端直接返回 429。判断方法很简单,后面 4.1 节会给具体的测试步骤,两分钟就能试出来。
1.4 一个前置判断:这条链值不值得用多线程
不是所有直链都适合开多线程。判断依据主要看服务端返回的响应头里有没有Accept-Ranges: bytes,以及Content-Length是否明确。前者决定服务端是否支持按字节范围请求,后者决定下载器能不能提前规划分片。两个都有,多线程才有意义;缺了Accept-Ranges,你开 32 线程也只是 32 个连接各自从头下,纯属添乱。
还有一个隐含条件:文件得足够大。一个 5MB 的文件切成 32 片,每片 160KB,光是建立连接和协商的往返开销就吃掉了大部分收益。我的经验阈值是 50MB 起步再考虑多线程,200MB 以上收益才明显。这个数字不是拍脑袋,后面 2.1 节会用 TCP 慢启动的机制解释清楚为什么小文件开并发是负收益。
2. 核心机制拆解:多线程、分片和直链协商
2.1 多线程分片到底快在哪,并发数该怎么定
多线程下载快的根本原因,不是“线程多所以快”,而是“多条 TCP 连接各自有独立的拥塞窗口”。单条 TCP 连接在慢启动阶段,窗口从很小开始指数增长,遇到丢包还会回退,所以在高延迟线路上,单连接往往要跑很久才能逼近带宽上限。开多条连接,相当于让多个窗口同时增长,总吞吐自然上去了。这是机制层面的解释,理解了它你就明白为什么“加线程”在低延迟局域网里几乎没收益,而在高延迟线路上效果显著。
分片的第二个作用是绕开单连接限速。有些服务端会在应用层对单条连接做速率限制,比如每条连接给 200KB/s。这时候 8 条连接就是 1.6MB/s,16 条就是 3.2MB/s,理论上线性增长。但这里有个天花板:服务端很可能同时对同一 IP 或同一账号做总量限制。所以并发数不是越大越好,而是存在一个拐点。
给出一个可操作的估算方法。假设你的线路实测单连接稳定速度是V1,服务端没有 IP 级限速,那么理论总速度约等于V1 × N(N 为并发数),但要扣除三块损耗:连接建立开销、分片调度的元数据开销、以及服务端可能存在的突刺限流。实际经验是,N 从 1 加到 8 时提升最明显,8 到 16 提升变缓,16 以上经常出现“总速度不涨但 CPU 和连接数上去了”的情况。
| 并发数 | 典型适用场景 | 观察到的现象 |
|---|---|---|
| 1 | 小文件、服务端明确限制并发 | 稳定但慢,适合验证直链是否可用 |
| 4 | 普通家庭宽带、多数直链 | 速度提升明显,失败重试成本低 |
| 8 | 大文件、单连接限速明显的服务端 | 接近线路上限,推荐作为默认值 |
| 16 | 高延迟线路、明确支持多连接 | 提升趋缓,需观察是否触发 429 |
| 32 | 极少数场景 | 多数情况下是负收益,容易触发风控 |
我自己的默认配置是 8,遇到明显单连接限速再往 16 试,32 基本不用。理由很实际:并发越高,单个分片失败后重试的调度越复杂,一旦服务端开始丢连接,整体耗时会比低并发还长。而且高并发对服务端的压力是实打实的,用的人多了,服务端收紧策略,最后大家都没得用。
2.2 直链长什么样,为什么它总是“过一会儿就失效”
所谓直链,是指直接指向文件字节流的 URL,请求它返回的是文件内容本身,而不是一个 HTML 页面。它和分享页链接的区别,类似于“快递单号”和“快递柜取件码”:分享页是让你去某个页面走流程,直链是直接给你货。
但直链通常不是裸的https://example.com/file.zip,而是带了一大串查询参数,常见的有几类:时效参数(类似Expires、valid_time,本质是一个过期时间戳)、签名参数(类似Signature、sign,由服务端用密钥对“路径 + 过期时间 + 其他字段”做摘要生成)、身份参数(类似token、uid,绑定到某个会话)。这三类参数共同构成了“这条链接在什么时间、由谁、对哪个文件有效”的完整约束。
理解了这一点,你就能解释 90% 的直链失效问题。链接复制出来放了两小时才想起来用,签名过期了,服务端返回 403;链接是在 A 浏览器登录状态下拿的,粘到下载器里但没带对应的 Cookie,服务端认不出你,还是 403;链接里带了绑定 UA 的签名,下载器默认 UA 和浏览器不一致,继续 403。
所以正确姿势是:拿到直链后尽快开始下载,并且在下载器里把 Referer、User-Agent、Cookie 这三项按获取时的上下文补齐。NDM 的任务属性里可以单独设置请求头,这一步别偷懒,很多人就是卡在这里。
注意:直链本身携带的是访问凭证,等同于临时钥匙。不要把它贴到公开场合,也不要随手分享给不相关的人。用完即弃的链接,过期了重新获取就行,不要试图去“破解”签名,那既不可靠也不合规。
2.3 浏览器接管是怎么发生的,扩展和主程序怎么通信
NDM 装完之后会注册一个本地服务,浏览器扩展通过本地回环地址上的固定端口和主程序通信。你在扩展里点“接管下载”,扩展拦截浏览器的下载事件,把 URL、Cookie、Referer、UA 这些上下文打包发给本地服务,主程序收到后建任务。这个链路的好处是请求头能原样传递,不需要你手动复制粘贴。
这条链路出问题的典型表现是:扩展装了但点了没反应,或者弹窗一闪而过。排查顺序建议是固定的:先看扩展是否启用、再看主程序是否在运行、然后看端口是否被占用、最后看是不是被系统防火墙拦了本地回环。多数情况下是主程序没启动或者被安全软件静默拦了,跟扩展本身没关系。
还有一个细节值得说:接管开关不要和浏览器自带的“下载前询问保存位置”同时开,两者会互相干扰,表现为点了下载没反应或者重复弹窗。我的习惯是浏览器自带的询问关掉,统一交给 NDM 管理,队列和保存路径都在下载器里配,这样批量任务的时候不会被打断。
2.4 断点续传靠什么成立,什么情况下会失效
断点续传的技术基础是 HTTP 的范围请求。下载器在请求头里带上Range: bytes=start-end,服务端如果支持,就只返回这一段的内容,响应码是 206。配合ETag或Last-Modified,下载器还能判断“服务端的文件有没有变过”,变了就拒绝续传、要求重下,避免拼出一个半新半旧的坏文件。
失效的场景主要有三种。第一种是服务端不支持范围请求,响应头里没有Accept-Ranges: bytes,那就只能整段重下。第二种是直链过期,续传时服务端返回 403,这时候任务会一直卡在重试,看起来像“卡住了”,其实是链接死了。第三种是文件在服务端被替换了,ETag变了,严格的下载器会直接报错让你重下,宽松的会把新旧分片拼在一起,结果就是文件损坏。
第三种最坑,因为它不报错。我的应对办法是:大文件下载完成后必须做一次哈希校验,服务端给了 MD5 或 SHA256 就比对,没给就至少验证文件头(比如 zip 看PK\x03\x04,视频看容器魔数)和文件大小。这一步花不了两分钟,能省掉几小时的返工。
3. 从零到跑满:完整实操流程
3.1 安装与首次配置,这几项先改掉
安装没什么好说的,官网下对应平台的包,一路下一步。真正影响体验的是装完之后的第一次配置。我建议按下面的顺序过一遍,五分钟搞定。
| 配置项 | 建议值 | 为什么这么设 |
|---|---|---|
| 默认并发连接数 | 8 | 兼顾速度与稳定性,后续按需调整 |
| 单任务最大连接数 | 16 | 给特殊任务留余量,避免全局过高 |
| 同时下载任务数 | 2 到 3 | 多任务并行会互相抢带宽,串行反而更快 |
| 临时文件目录 | 与目标盘同盘 | 跨盘移动大文件很慢,同盘是秒级重命名 |
| 磁盘写入策略 | 预分配空间 | 避免下载中途磁盘满导致任务失败 |
| 失败重试次数 | 3 到 5 次 | 太少容易因瞬时抖动失败,太多会死循环 |
重点说两个。临时文件目录和目标目录放同一个盘,是因为多数下载器完成时做的是“重命名”而不是“复制”,同盘重命名是元数据操作,几个 G 的文件也是瞬间完成;跨盘就得真复制一遍,白白多等几分钟。预分配空间则是为了防止“下到 90% 提示磁盘空间不足”这种让人想砸键盘的情况,尤其是你同时开两三个大文件任务的时候。
还有一项容易被忽略:下载完成后的动作。默认可能是打开文件或者弹出提示,批量任务的时候这些行为很烦。我一般把它关掉,改成任务完成后只做哈希校验和归档,安静跑完最好。
3.2 浏览器扩展安装与接管验证
扩展装好之后,先做一次最简单的验证:随便找一个能直接返回文件的地址(比如某个软件官网的安装包直链),点一下,看是否被 NDM 接管。接管成功的标志是浏览器不出现自带下载条,NDM 主界面多出一个任务。
如果没接管成功,按这个顺序查:
- 扩展图标是否是激活状态,有没有被浏览器禁用。
- NDM 主程序是否在运行,托盘区有没有图标。
- 扩展设置里本地服务的端口和主程序设置里的端口是否一致。
- 系统防火墙或安全软件是否拦了本地回环通信。
- 浏览器是否开了“无痕模式”,部分扩展在无痕下默认不生效。
这五步能解决绝大多数接管失败。还有一种情况是接管了但任务立刻失败,那多半是请求头没带全,跳到 3.3 节。
3.3 拿到可用直链并正确导入
这一步是整条链路里最容易出错的地方。原则只有一条:在什么上下文里拿到的链接,就在什么上下文里用。
具体操作上,我推荐两种路径。第一种是浏览器扩展接管,最省事,请求头自动带过去,适合单文件。第二种是手动复制链接新建任务,适合批量或者需要改请求头的场景,但要记得手动补齐三项:
- Referer:填获取直链的那个页面地址,很多服务端会校验来源。
- User-Agent:填你获取直链时用的浏览器的 UA,不要用下载器的默认值。
- Cookie:如果直链依赖登录态,把对应站点的 Cookie 粘进去。
手动导入之前,强烈建议先用一条命令验证链接是否还活着,别等下载器里排了半天队才发现链接早死了。用 curl 看响应头是最快的办法:
curl -I -L \ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \ -H "Referer: https://example.com/share/page" \ "https://example.com/path/to/file?token=xxx&expires=1700000000"重点看四样东西:状态码是不是 200 或 206;Content-Length有没有具体数值;Accept-Ranges是不是bytes;Content-Type是不是文件类型而不是text/html。如果Content-Type是text/html,说明你拿到的是错误页,链接已经失效或者请求头不对,别浪费时间往下载器里丢了。
提示:验证链接时不要反复高频请求,两三次足够。频繁探测容易被服务端判定为异常行为,反而把链接提前封掉。
3.4 队列、限速与批量任务的编排
批量下载最容易犯的错是“全选、全速、全开”。二十个任务各开 8 线程,就是 160 条连接同时打过去,结果通常是全体变慢、部分任务失败、重试风暴。正确的做法是做两层编排。
第一层是任务级:同时活动的任务数控制在 2 到 3 个,其余排队。理由很朴素,你的带宽是固定的,10 个任务平分和 2 个任务跑完再跑下 2 个,总耗时基本一样,但前者的失败率和重试成本高得多。
第二层是连接级:给全局设一个总连接数上限,比如 24,单个任务最多用 8 条。这样即使跑 3 个任务,总连接数也可控。有些服务端对单 IP 的连接数有硬限制,超过就直接拒绝新连接,这时候总连接数上限就是你的保命绳。
限速功能也别浪费。如果你一边下载一边还要开会、看视频,给下载任务设一个总带宽的 70% 到 80%,剩下的留给其他应用。这个设置比事后抱怨“下载把网占满了”有用得多。反过来,如果下载不急,设个定时任务放到凌晨跑,既不影响自己也不影响别人,这是最体面的做法。
3.5 下载完成后的校验与归档
我在前面反复提到哈希校验,这里给一个可直接用的脚本。假设服务端给了 SHA256,下完跑一下:
import hashlib import sys def sha256_of(path, chunk_size=1024 * 1024): h = hashlib.sha256() with open(path, "rb") as f: while True: chunk = f.read(chunk_size) if not chunk: break h.update(chunk) return h.hexdigest() if __name__ == "__main__": file_path = sys.argv[1] expected = sys.argv[2].lower() if len(sys.argv) > 2 else None actual = sha256_of(file_path) print(f"actual : {actual}") if expected: print(f"expected: {expected}") print("MATCH" if actual == expected else "MISMATCH - 文件可能损坏,建议重下")分块读取是为了避免几个 G 的文件一次性读进内存。这个脚本跑 4GB 文件大概几十秒,比重新下一遍划算太多。如果服务端没给哈希,至少做两件事:比对文件大小是否和Content-Length一致;检查文件头魔数是否匹配扩展名。这两步能拦住绝大多数“下成了 HTML 错误页”的情况。
归档方面,我的习惯是按“日期 + 来源 + 文件类型”建目录,下载完成后自动归类,临时文件目录定期清理。别小看这个习惯,下载器用久了临时目录里会堆积大量半成品分片,占空间不说,有些还会干扰后续任务的断点识别。
4. 常见问题与排查实录
4.1 速度不升反降,先分清是哪种限速
这是问得最多的问题。速度上不去,先做一次对照实验:同一个直链,先用单连接下 30 秒记录速度,再用 8 连接下 30 秒记录速度。
- 如果两者速度接近,说明服务端做的是账号级或 IP 级总量限速,加并发没有意义,老老实实单线程慢慢下,或者错峰下载。
- 如果单连接明显慢于多连接,且多连接下速度随并发数上升,说明是单连接限速,继续加并发到拐点为止。
- 如果多连接一开始快、几十秒后掉下来,说明触发了动态限流或连接数风控,把并发降到 4 试试,同时降低请求频率。
这个实验两分钟能做完,比在网上翻十篇帖子有用。我见过太多人跳过这一步,直接照抄别人的 32 线程配置,结果自己这边服务端策略不同,越配越慢。
还有一种“假慢”要排除:磁盘写入瓶颈。机械硬盘随机写入大文件分片时,速度可能卡在几十兆,看起来像网络问题。判断方法是看任务管理器里的磁盘活动时间,如果长期 100% 而网络占用不高,那就是盘的问题,把临时目录换到固态盘就能解决。
4.2 403、404、416 分别意味着什么
状态码是排查直链问题最可靠的信息源,别忽略它。
| 状态码 | 常见原因 | 处理动作 |
|---|---|---|
| 403 | 签名过期、UA 不匹配、Referer 缺失、Cookie 失效 | 重新获取直链,补齐三项请求头 |
| 404 | 文件已被移除,或路径拼错 | 回原页面确认文件是否还存在 |
| 416 | Range 越界,通常是分片记录与实际文件大小不一致 | 删除任务及临时文件,重新建任务 |
| 429 | 请求过于频繁,触发风控 | 降低并发、加大重试间隔、暂停一段时间 |
| 200 但内容是 HTML | 拿到的是错误页或登录页 | 检查 Cookie 与 Referer,重新取链 |
416 值得单独说一句。它的成因是下载器记录的“已下载字节数”超过了服务端认为的文件总长度,常见于两种情况:一是文件在服务端被替换成了更小的版本,二是上一次任务被强制中断,临时文件的分片索引写坏了。处理方法很干脆,删任务、删临时文件、重下,不要试图修复,修起来比重下慢。
4.3 文件下完了却打不开,八成是这三种情况
第一种,下成了 HTML。表现是文件大小只有几 KB 到几百 KB,扩展名是 zip 或 mp4 但用任何软件都打不开。用文本编辑器打开看一眼,如果开头是<!DOCTYPE或者<html,就是错误页,回到 4.2 节处理。
第二种,分片拼接损坏。表现是文件大小对得上,但解压报 CRC 错误或者视频播到中途卡死。成因通常是下载过程中直链过期,部分分片重试后拿到了错误内容,或者文件在服务端被替换。处理办法是校验哈希,没哈希就重新完整下载一次,别指望修复。
第三种,扩展名错了。有些直链返回的Content-Type是application/octet-stream,下载器不知道真实类型,就按 URL 里的后缀命名,但 URL 后缀可能是假的。判断方法是看文件头魔数:PK开头是 zip 系,\x89PNG是图片,ftyp出现在前 12 字节内是 mp4 系。改对扩展名就能打开。
4.4 一份可以贴在显示器旁边的速查表
| 现象 | 最可能的原因 | 第一步动作 |
|---|---|---|
| 点下载没反应 | 扩展未接管或主程序未启动 | 检查托盘图标与扩展状态 |
| 任务一直 0% | 链接失效或请求头不全 | 用 curl 验证链接 |
| 速度卡在固定值 | 单连接限速 | 提高并发到 8 再测 |
| 速度波动剧烈 | 服务端动态限流 | 降到 4 并发,加大重试间隔 |
| 下载中途全部失败 | 直链过期 | 重新获取链接,续传前先验证 |
| 完成但文件损坏 | 分片拼接问题或错误页 | 校验哈希,必要时重下 |
| 磁盘占用 100% 但网速低 | 写入瓶颈 | 临时目录换固态盘 |
| 同时多任务整体变慢 | 带宽争抢与连接数过高 | 活动任务降到 2 个 |
这张表覆盖了我实际遇到过的大部分情况。真正难缠的往往不是单一问题,而是几个问题叠加,比如“链接快过期 + 并发过高 + 临时目录在机械盘”,三个因素一起作用,表现就是速度忽高忽低还偶尔失败。这时候别想着一次调一个参数试,直接把并发降到 4、重新取一条新链接、临时目录换盘,三件事一起做,成功率最高。
5. 使用边界与长期维护的几个习惯
5.1 直链是凭证,不是可以随便传的东西
很多人对直链的敏感度不够,觉得“不就是个下载地址”。实际上带签名的直链等同于一把临时钥匙,谁拿到谁就能在有效期内访问对应文件。把它发到群聊、贴到论坛,等于把钥匙挂在门上。更麻烦的是,有些直链还绑定了你的会话信息,泄露出去可能连带暴露其他信息。
我的习惯是:直链只在本地流转,复制粘贴用完就清剪贴板;需要给别人传文件,走正常的分享流程,别图省事甩直链。另外,公共电脑上用完下载器记得清理任务列表和历史记录,那些里面存着完整的 URL 和请求头。
5.2 什么情况下不该开多线程
有几类场景,我建议直接把并发设成 1 到 2。第一类是服务端明确在响应头或文档里写了并发限制,逆着来只会被限流甚至临时封禁。第二类是小文件,前面算过,分片开销大于收益。第三类是本身就在弱网环境,比如移动网络或者信号不稳的无线,多连接会让丢包重传的代价成倍放大。第四类是你并不着急,那就慢慢下,把带宽让给更需要的人和事。
这个判断标准其实很朴素:多线程是为了解决“单连接跑不满”的问题,如果单连接已经跑满了,或者瓶颈根本不在连接数上,加并发就是纯粹的资源浪费。我见过有人为了下一个 20MB 的驱动包开 32 线程,然后抱怨“这软件不好用”,问题真不在软件。
5.3 版本更新与配置备份
NDM 这类工具更新不算频繁,但每次大版本更新后,建议重新验证一遍浏览器接管是否正常,因为扩展和主程序的通信协议偶尔会变。更新前把配置文件备份一下,位置一般在用户目录下的应用数据文件夹里,具体路径各平台不同,找一下带软件名的目录即可。
配置备份的另一个好处是换机器时能快速恢复。我的习惯是把并发数、临时目录、请求头模板这几项单独记一份,新机器装完直接照着填,省得重新摸索。请求头模板尤其值得存,常用的 Referer 和 UA 就那么几个,存成模板后新建任务时一键套用,比每次手打靠谱。
最后再提一个我踩过的坑:不要在下载任务运行期间修改全局并发数或临时目录,部分版本会把正在跑的任务的分片索引搞乱,表现为任务卡在 99% 不动。要改就等任务全部暂停或者完成再改,这个习惯能省掉不少莫名其妙的故障排查。