磁力链接

定义磁链接格式的方案
(重定向自Magnet URI scheme

磁力連結(Magnet URI scheme),是对等网络中进行信息检索和下载文档的电脑程序。和基于“位置”连接的统一资源定位符不同,磁力连结是基于元数据文件内容,属于统一资源名称。也就是说,磁力连结不基于文档的IP地址或定位符,而是在分布式数据库中,通过散列函数值来识别、搜索来下载文档。因为不依赖一个处于启动状态的主机来下载文档,所以特别适用没有中心服务器的对等网络。它符合开源标准

历史

这个标准的草稿出现于2002年,是为了对eDonkey2000的“ed2k:”和Freenet的“freenet:”两个URI格式进行“厂商与项目中立化”(vendor- and project-neutral generalization)而制定的。同时这个标准也尝试紧密地跟进IETF官方的URI标准。

内容散列函数的应用

磁力連結最常见的用途是基于文件内容的散列函数值来链接到特定文件,生成一个唯一的文件识别符,类似于ISBN。不像常规的识别符,内容散列可以被任意一位持有此文件的人生成,所以并不需要一个中心机构,这使其在文件共享领域经常被用作搜索条件,因任何人都可以分发一个磁力連結来确保该链接指向的资源就是他想要的,而和得到该资源的方式无关。(虽然技术上讲,两个不同的文件可能具有相同的散列值,但实际上这是极不可能发生的)

另一个磁力連結的优势是开放性和跨平台性:一个磁力連結可被运行在几乎所有平台上的应用程序们使用以下载一个文件。因为磁力連結十分简洁且为纯文本格式,所以用户可以很方便地将其复制到电子邮件或即时消息中,比如种子文件

技术描述

磁力連結由一组参数组成,参数间的顺序没有讲究,其格式与在HTTP链接末尾的查询字符串相同。最常见的参数是"xt",是"exact topic"的缩写,通常是一个特定文件的内容散列函数值形成的URN,例如:

  magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C

其值是Base32英语Base32编码的文件的SHA-1散列。

注意,虽然这个链接指向一个特定文件,但是客户端应用程序仍然必须进行搜索来确定哪里,如果有,能够获取那个文件。

在标准的草稿中其他参数的定义如下:

  • "dn" ("显示名称"):为了方便,为用户显示文件名称
  • "kt" ("关键字"):更笼统的搜索,指定搜索关键字而不是特定文件
  • "mt" ("文件列表"):一个URI指向一个列表,例如一个项目列表
  • 应用程序定义的实验参数,必须以"x."开头

标准还建议同类的多个参数可以在参数名称后面加上".1", ".2"等来使用,例如

  magnet:?xt.1=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C&xt.2=urn:sha1:TXGCZQTH26NL6OUQAJJPFALHG2LTGBC7

描述

磁力連結可以包括一个或多个参数,之间用'&'隔开。参数的顺序在文件在标准中没有记录。有一些参数的值对于客户端正确解析磁力連結很重要。

   magnet:? xl = [字节大小]& dn = [文件名(已编码URL)]& xt = urn: tree: tiger: [ TTH hashBase32)]

参数

  • dn(显示名称)- 文件名
  • xl(绝对长度)- 文件字节数
  • xt(eXact Topic)- 包含文件散列函数值的URN
  • as(可接受来源) - 在线文件的网络链接
  • xs(绝对资源)- P2P链接
  • kt(关键字)- 用于搜索的关键字
  • mt(文件列表)- 链接到一个包含磁力連結的元文件 (MAGMA - MAGnet MAnifest页面存档备份,存于互联网档案馆))
  • tr(Tracker地址)- BT下载的Tracker URL

xt参数

磁力連結的这部分最重要。用于寻找和验证包含着磁力連結中的文件。

TTH(Tiger Tree散列函数)

TigerTree散列函数被用在包括Direct Connect (protocol)英语Direct Connect (protocol)Gnutella2英语Gnutella2在内的几个网络中。

xt=urn:tree:tiger:[ TTH HashBase32英语Base32)]
SHA-1(安全散列演算法1)

GnutellaGnutella2英语Gnutella2使用的散列函数。

xt=urn:sha1:[ SHA-1 HashBase32英语Base32)]
BitPrint英语BitPrint

这种散列函数包含一个SHA-1散列函数和一个TTH散列函数,用"."隔开。

GnutellaGnutella2英语Gnutella2使用。

xt=urn:bitprint:[ SHA-1 HashBase32英语Base32)].[ TTH HashBase32英语Base32)]
eD2k Hash(eDonkey2000)散列函数

eDonkey2000使用的散列函数算法。

xt=urn:ed2k:[ ED2K HashHex)]
AICH(高级智能型损坏处理)

不是正式的磁力連結的一部分。eDonkey2000使用的散列函数算法,用于存储和控制下载完成、正在下载的文件的完整性。

xt=urn:aich:[ aich HashBase32英语Base32)]
Kazaa英语Kazaa散列函数

FastTrack英语FastTrack使用的散列函数算法。

xt=urn:kzhash:[ Kazaa英语Kazaa HashHex)]
BTIH(BitTorrent Info Hash)

BitTorrent使用的散列函数算法。出于向下兼容的考虑,客户端需要同时支持被Base32英语Base32编码过[1]BTIH散列结果。

xt=urn:btih:[ BitTorrent Info HashHex)]
MD5(信息-摘要算法5)

Gnutella2英语Gnutella2支持的散列函数算法。

xt=urn:md5:[ MD5 HashHex)]
CRC-32(循环冗余校验)

不是正式的磁力連結的一部分。没有任何已知的P2P网络使用。

xt=urn:crc32:[ CRC-32(Base10)]

網路連結至檔案

有两种可以插入到磁力連結的下载链接作为直接或者备用资源。

普通連結(as)

"as"的意思是"acceptable source"。这种链接指向从网络服务器的直接下载。只有在指定的超时后才会連結,防止服务器过载。客户端在考虑向服务器发送下载请求前会先花一定时间在P2P网络中定位文件。

as=[文件的网络链接(已编码URL)]
P2P链接(xs)

链接可以是链接到磁力連結的文件的HTTP(SHTTP、FTP、SFTP等)下载源、文件的P2P源地址或是hub(使用DC++时)地址。对於这一链接,客户端尝试直接連結,并请求文件或其来源,有时会同时请求二者。这一字段常被P2P客户端用来存储源。引用中可能包含文件hash。

内容寻址网络(CAN)URL

这类链接被Gnutella还有G2应用程序使用,基於RFC 2168。

xs=http://[客户端地址]:[客户端端口]/uri-res/N2R?[包含一个文件hashURN ]

例:

xs=http://192.0.2.0.27:6346/uri-res/N2R?urn:sha1:FINYVGHENTHSMNDSQQYDNLPONVBZTICF
链接到DirectConnect英语DirectConnect hub并为文件查找源

这一链接立即将DirectConnect客户端连接到刚才讨论的hub。

xs=dchub://[hub 地址]:[hub端口]
Gnutella2英语Gnutella2上的文件引用基於网络的源缓存

这种情况下,链接包含的点不是客户端IP或直接来源,而是来源缓存。这样的缓存并不包含文件本身,而是存储了其他客户端的IP,这些客户端连接到缓存来下载相同的文件。一旦客户端连接到缓存并获得其他替代来源的IP,其自身IP就会存入到缓存中,然後继续连接到下一个缓存,继续请求替代来源。这种系统类似於BitTorrent tracker的操作。

xs=http://cache.freebase.be/[ SHA-1 hash ]
引用ED2K源
xs=ed2k://[客户端地址]:[客户端端口]/[ed2k hash]/[文件大小]/

文件列表(mt)

这是一个导向一系列连链接列表(也许是个网页)的链接……

mt=http://weblog.foo/all-my-favorites.rss

或者是一个URN

mt=urn:sha1:3I42H3S6NNFQ2MSVX7XZKYAYSCX5QBYJ

关键字(kt)

该部分代表了一串用于P2P网络搜索用的关键字

kt=martin+luther+king+mp3

Tracker地址(tr)

Tracker URL.用于在不需要分散式雜湊表支持下下载BitTorrent资源。

tr=http://example.com/announce

补充格式(x.)

对於实验性且自补的非正式选项,可以使用前缀x後加已选择的第二个字母

x.[新参数名]=[新参数数据(已编码URL)]

参数组

通过在每个参数后编号并用"."来分隔允许一个Magnet链接中包含多个文件及它们URN,文件名和散列函数值。

magnet:?xt.1=[第一个文件的URN]&xt.2=[第二个文件的URN]

示例

链接到一个0字节长度的文件。

magnet:?xt=urn:ed2k:31D6CFE0D16AE931B73C59D7E0C089C0&xl=0&dn=zero_len.fil&xt=urn:bitprint:3I42H3S6NNFQ2MSVX7XZKYAYSCX5QBYJ.LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ&xt=urn:md5:D41D8CD98F00B204E9800998ECF8427E

mediawiki-1.15.1.tar.gz

magnet:?xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&xl=10826029&dn=mediawiki-1.15.1.tar.gz&xt=urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY&xt=urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q&tr=http%3A%2F%2Ftracker.example.org%2Fannounce.php%3Fuk%3D1111111111%26&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&xs=http%3A%2F%2Fcache.example.org%2FXRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5&xs=dchub://example.org页面存档备份,存于互联网档案馆

url magnet

https://web.archive.org/web/20110716164755/http://sure-raza.com/magnet:/?xl=10826029&dn=mediawiki-1.15.1.tar.gz&xt=urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY

客户端

客户端 起始支持版本
μTorrent 1.8[2]
BitComet 1.17[3]
BitSpirit 3.6.0.126[4]
迅雷 5.9.17[5]
Transmission 1.80
qBittorrent 1.5.0
NeoLoader 0.10 Public Beta Release[6][7][8]

此外,支持磁力連結的应用程序还包括VuzeBearShareDC++Delugegtk-gnutellaKazaaLimeWireFrostWireMP3 RocketMorpheusShareazaMLdonkeyaMuleKCeasyTrustyFiles

参见

参考文献

  1. ^ (英文)BEP-9: Extension for Peers to Send Metadata Files. [2016-04-28]. (原始内容存档于2016-05-10). 
  2. ^ (英文)µTorrent 1.8 released - Announcements - µTorrent Community Forums. Firon. [2014-12-13]. (原始内容存档于2014-12-15). 
  3. ^ (英文)The lastest 1.17 version is released[20091228] - Comet Forums. sophia0316. [2014-12-13]. (原始内容存档于2014-12-13). 
  4. ^ 更新历史 比特精灵. sophia0316. [2014-12-13]. (原始内容存档于2014-12-13). 
  5. ^ 关于磁力链接(Magnet URI)的简单介绍 – 迅雷阳台-晒出新鲜事. 强伊文. [2014-12-13]. (原始内容存档于2014-12-13). 
  6. ^ NeoLoader v0.10公开测试版发布 eMule Fans 电骡爱好者. author. [2014-12-13]. (原始内容存档于2014-12-15). 
  7. ^ (英文)NeoLaoder 0.10 Public Beta Release. DavidXanatos. [2014-12-13]. (原始内容存档于2014-12-13). 
  8. ^ (英文)NeoLoader ChangeLog. DavidXanatos. [2014-12-13]. (原始内容存档于2014-12-13). 

外部链接