磁力链接是什么意思?没有服务器文件从哪来,我拆了一个链接,里面装的是文件的指纹

上个月表弟来我家,看见我往qBittorrent里粘了一串字符,下载就自己跑起来了。他凑过来问:这是哪个网盘的网址,怎么连登录都不要?我说这不是网址。他更懵了:不是网址,那文件从哪下来的?
这问题我还真答不囫囵。磁力链接用了好几年,一直当它是个黑盒,粘上就能下,坏了就换一个。那天晚上我拿python把这串字符拆开,又翻了几篇协议文档,才把里面的门道捋顺。这篇就把这事讲透。
先把这串字符拆开:它不是地址,是身份证号
我拆的是Ubuntu官网发的那个磁力链接,装系统用的官方渠道。拿python的urlparse一解析,结构当场就出来了:
magnet:?xt=urn:btih:9e9f5f...中间略...3e4f&dn=ubuntu-24.04.3-desktop-amd64.iso&tr=https://torrent.ubuntu.com/announce
拆开就三样东西,各管一摊:
- xt是正主。urn:btih后面跟着40个十六进制字符,40个hex就是20个字节,正好是一个SHA-1哈希的长度。这个数有个名字叫info hash,是把整个种子的元信息揉在一起算出来的指纹
- dn是显示名,纯粹给人看的,删掉它照样能下
- tr是tracker服务器地址,一个链接里能塞好几个,全失效了也未必下不动,后面说为什么
我之前写过一篇拆网址的(地址栏那串字符拆开就五段),http开头的网址本质是「地址」——告诉你文件放在哪台服务器哪个目录。磁力链接正好反过来,它压根不说文件在哪,只说「我要找指纹长这样的东西」。一个是收件地址,一个是身份证号。这个区别决定了后面所有的事:地址会失效,服务器一关就404;指纹不会,只要地球上还留着一份这个文件,你就找得到持有它的人。
| 对比项 | http网址下载 | 磁力链接下载 |
| 链接里装的是 | 文件的位置 | 文件的指纹 |
| 文件从哪来 | 那一台服务器 | 所有持有人互传 |
| 源头挂了会怎样 | 直接404 | 只要还有人做种就能下 |
| 人越多速度 | 越挤越慢 | 越热越快 |
.torrent文件是什么:一张分块清单
磁力链接流行之前,大家传的是.torrent后缀的小文件,几KB到几百KB。很多人以为「种子」就是压缩过的电影本身,其实你拿工具打开会看见里面一个字节的电影内容都没有,装的只是三样东西。
一是文件清单:这个种子里有哪些文件、每个多大。二是分块清单:把大文件切成一块一块(术语叫piece),常见的块大小是256KB或者1MB,每一块单独算一个SHA-1指纹,逐条记在清单里。我拿Ubuntu那个5.7GB的镜像算过账:按1MB一块切,是5836块,清单里就躺着5836条哈希值。三是tracker地址:该去哪报到。
磁力链接跟种子文件的关系,一句话能说清:磁力链接就是把种子文件里最要紧的元信息先算了个总指纹直接塞给你,种子文件本身则从持有人那里现拉。所以粘上磁力链接之后头几秒会卡一下,状态栏显示「正在获取元数据」——它就是在跟同伴讨要那张分块清单呢。清单到手,才算正式开工。
下载的真正来源:一群同好互传
清单有了,剩下的问题是去哪下。
普通下载是星形的:一台服务器,千军万马都从它那拉,服务器出口就那么宽,人一多就挤成粥(CDN那篇我写过是怎么往各家分店分流的,见测速940兆看4K还转圈)。BT下载是网状的:所有留着这份文件的人互相传。你从十几个人那各拿几块,凑齐就算完事;你下载的同时,自己已有的块也在传给别人。
这就是为什么热门资源动辄跑满宽带,冷门资源反而不如网盘——没人做种,指纹再对也白搭。我家NAS上常年挂着两百多个种子做种(qBittorrent我从装到保种踩了一圈),某种意义上,我就是别人下载时连的那台「服务器」。
那问题又回来了:客户端怎么知道世界上谁持有这份文件?两条路,一条老的一条新的。
tracker和DHT:登记处和通讯录
第一条路是tracker,一台专门的服务器。你连上它报个到:「我持有指纹xxx,还有谁在?」它把在线名单发给你,你拿着名单去跟那些人直连。缺点也明显:tracker是个单点,它宕机、或者被网络策略拦掉,这条路就整个断掉。
第二条路是DHT,分布式哈希表,这是磁力链接能脱离tracker活下来的关键。它相当于一张没有管理员的通讯录:全世界参与的设备各自只记一小片,你要找指纹xxx,先问身边的节点,对方说「我不知道,但这事归某某管」,一层层指过去,通常跳几次就能摸到持有者。我写过挂BT那晚路由器NAT会话表爆掉的事(网页全打不开的那晚),里面提到DHT自己要维护一张几百上千节点的路由表——那笔账就是这么来的,DHT节点之间的通信全走UDP小包,跟TCP是两个脾气(视频通话走UDP网页走TCP)。
| 对比项 | tracker | DHT |
| 本质 | 一台中心服务器 | 所有节点拼成的通讯录 |
| 挂了会怎样 | 这条路断 | 没有单点,掐不死 |
| 找到人的方式 | 问它要名单 | 节点间一层层问过去 |
| 走的协议 | http或UDP都有 | 全是UDP |
顺带解释一个常见疑惑:为什么在公司网络里BT经常一个peer都连不上?tracker和DHT的主力通道都是UDP,公司防火墙一看你跟几百个陌生IP的UDP端口聊得火热,多半直接掐断。这不是文件的问题,是通道的问题。还有一对都在家里的NAT后面的peer想直连,得先打个洞才能互相够着,这事我在NAT类型那篇写过(PS5联机NAT1/2/3),道理同一套。
为什么断电后会「重新校验」:每块都要对指纹
分块清单的另一半用处是校验。客户端每收到一块,就拿SHA-1现算一遍,跟清单里那条对,对上了才入库,对不上就丢掉重下。所以BT下载天然防调包——中间哪个环节想往文件里掺点私货,那块的指纹立刻对不上,整块作废。
我吃过这个校验的亏。有次NAS异常断电,重启后qBittorrent把两百多个种子挨个重新校验了一遍,硬盘灯闪了大半天。后来才弄明白它在干什么:把磁盘上已有的每一块重新算指纹,跟清单逐条对账,确认断电瞬间没有半块写糊的数据混进去。这功能其实是保命的,别嫌它慢,跑NAS的隔三差五重启的话记得把这个时间算进去(NAS要不要定时重启)。
按块下载还有个连带的好处:下载本身就是断点续传的。下了六成断了网,明天接着下剩下的四成,已经下好的六成纹丝不动——每块都是独立的,凑数就行,不存在「从头再来」这一说。
合法的用法和别碰的边界
先把话说周正。BT和磁力链接只是个传输技术,本身不分好坏,正经用途一大把:Ubuntu、Debian这些Linux系统官方就提供种子下载,比浏览器直连快得多,还给官方省带宽;Blender基金会的开源电影、互联网档案馆的大文件,都在用torrent分发。我自己下系统镜像基本都走这条路。
但拿它去下版权电影、破解软件,一来违法,二来安全上没有任何保障——清单只校验块的完整性,保证不了内容本身干净,伪装成资源的恶意软件一样能把指纹做对。这个技术值得搞懂,用在正地方。
收尾给一条排查顺序:粘了磁力链接一直卡在「获取元数据」,多半是没人做种或者tracker全挂,挂了就挂了别死等;能连上peer但速度为零,看一眼DHT节点数是不是0,是0说明UDP通道被掐了;挂机做种记得把全局连接数往下调一档,你家路由器的会话表会谢谢你的。

发表评论