把磁力链接拆开看,它其实只回答了三个问题:资源是谁、在哪里、怎么拿。理解了这三个问题的答案,整个机制就清楚了。
第一问:资源是谁 —— 哈希即身份
种子文件在创建时会对文件分块,每块计算哈希,再把这些哈希组成一棵树,根节点的哈希就是 BTIH。磁力链接里的 xt=urn:btih:… 保存的就是它。
这意味着:只要文件内容有哪怕一个字节的差别,哈希就完全不同。哈希在这里起到了「指纹」的作用,既标识资源,也用于校验。
第二问:资源在哪里 —— 三条查找路径
1. DHT 网络
每个客户端都是网络中的一个节点,保存着一部分「哈希 → 持有者」的路由信息。查询时通过 Kademlia 协议逐跳逼近,最终找到目标节点。这是最关键的一条路径,因为它不依赖任何中心服务器。
2. Tracker 服务器
链接里的 tr= 字段列出 Tracker 地址,向它查询可得到当前在线的节点列表。Tracker 现在更多是加速器而非必需品。
3. PeX 节点交换
一旦与某个节点建立连接,双方会交换各自知道的其他节点,像滚雪球一样扩大可连接范围。
第三问:怎么拿 —— 分块与校验
找到节点后,先通过元数据扩展获取文件结构(文件名、大小、分块表),然后开始交换分块:
- 双方通报各自拥有的分块(bitfield);
- 按「稀有优先」策略请求最缺的分块,避免最后卡在无人持有的块上;
- 每收到一块就校验哈希,通过则写入本地;
- 全部完成后文件可用,继续上传即「做种」。
为什么这样设计很聪明
- 可扩展:节点越多,总带宽越大,不会因用户增长而崩溃;
- 自愈:节点随时上下线,网络自动重组;
- 可验证:哈希树让完整性校验可以精确到块,损坏可定位修复。
一个容易误解的点
磁力链接不「包含」文件,也不「指向」某台服务器。它指向的是一个数学上的身份,由网络中的节点共同兑现。
小结
哈希定身份、DHT 定位置、分块交换定传输——三个环节环环相扣,构成了磁力链接的全部工作机制。