磁力链接(magnet)的一个好处是"不用下载种子文件,复制一串链接就能开始下"。但也正因为这串链接里只带了一个哈希值,很多新手会以为"复制粘贴就能下"是理所当然的——直到他们遇到一个怎么也下不动、进度永远停在 0% 的磁力。
现象
- 磁力链接加进客户端后,长时间没有任何对端连接,速度始终是 0;
- 换网络、重启客户端都没用;
- 手动把链接里的哈希换成种子文件(.torrent)重新添加,反而能下了;
- 打开链接一看,它的内容里除了哈希和信息哈希,什么都没有。
根因
关键是理解磁力链接到底带了什么。
一条典型的磁力链接大概是这样:
magnet:?xt=urn:btih:<40位哈希>&dn=<显示名>
xt 是唯一的必需字段,里面只有内容的信息哈希。tracker 地址通常是可选的——很多索引站在发布磁力时压根不写 tr= 参数,只留一个哈希。这类磁力想找到对端,就完全依赖 DHT(分布式哈希表)去网络里"问":谁有这个哈希的数据?
DHT 的原理是去中心化的:你的客户端连上一批已知节点,通过它们一层层查询,慢慢找到持有该数据的对端。它能工作,但有两个现实问题:
- 慢。 从零开始查询、逐步扩散,第一次可能要好几分钟才有第一个对端冒出来。
- 在国内不一定通。 DHT 主要靠 UDP 通信,而很多公共 DHT 节点、以及可用的 UDP tracker 在国内网络环境下经常被阻断,导致查询范围大打折扣。
两边一叠加,就出现了"磁力挂在那儿半天没动静"的现象。而换成种子文件就不一样了——种子文件里通常内嵌了完整的 tracker 列表和文件清单,客户端可以直接照着列表去问,路径短得多。
解决
按投入从低到高,可以试这几步:
1. 补公共 tracker。 把一份维护中的公共 tracker 列表加到客户端里(和上面那条一样,注意设置时机——要在添加任务之前设好):
udp://<公共tracker-1>:6969/announce
udp://<公共tracker-2>:1337/announce
https://<公共tracker-3>/announce
...
2. 提高连接相关上限。 把最大连接数、每个任务的连接数上限调高,同时确认 DHT、PEX、本地对端发现这些能帮你"发现更多对端"的功能全部打开。PEX 尤其重要:它能从已连上的对端那里问到更多对端地址,相当于在你连上第一个人之后,圈子会自己扩大。
3. 换成正确的下载方式。 如果这是一个"立等可取"的需求(比如想马上看完),那就别在磁力上死磕了,直接去找 HTTP 直链的版本,用多线程下载工具拉。P2P 的优势是热门资源快速且抗单点,冷门资源或强网络限制下反而不如直链。
4. 接受挂机。 冷门种子是这样的:可能在你挂了两小时之后,某个做种者恰好上线,速度才起来。想好你能接受的时间成本,别一边挂机一边反复重启客户端——重启会丢掉已经连上的对端,代价比等待大。
延伸与预防
这条坑的通用教训是:P2P 的瓶颈常常是"找不到对端",而不是"带宽不够"。
这个思路可以迁移到很多"卡在 0 就不动"的场景:
- 不是所有链接都自带完整信息。 磁力只有哈希、DHT 是兜底;有些 API 只返回一个 ID,细节要再请求一次;有些短链展开才知道真实地址。看到"信息不完整"就该想到"还缺一步补全"。
- 去中心化的方案,代价是速度和不确定性。 DHT、发现协议这类机制设计上是"最终能找到",但"最终"可能是几分钟也可能是几小时,且强依赖网络环境允许它工作。
- 排查顺序:先问"它现在能连上谁",再谈带宽和速度。 连接数长期是 0 或个位数,那就不是带宽问题;连接数很高但速度低,才是带宽或磁盘的问题。先用连接数把这层分歧切开,比乱调参数快。