磁力链接Magnet URI,主要用于识别能够通过点对点技术下载的文件。这种链接是基于文件内容来识别文件,而不是基于文件的位置或者名称的。更确切地说,它是通过文件的散列函数值来识别的。磁力下载基于BT下载面临严重危机的情况下,诞生的一种新型的下载方式。


由于磁力链接是基于文件内容或者元数据而不是位置的,磁力链接可以被认为是一种统一资源名称Uniform Resource Name,URN,而不是更常见的统一资源定位符Uniform Resource Locator,URL。尽管磁力链接可以被其他应用程序使用,但是它的主要用途还是在点对点技术方面,因为其可以定位不在稳定主机上的资源。


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


以往从网上下载电影、大型软件,许多人会选用BT下载方式,但随着审查制度日趋严格,BT下载不仅难以保证高速,而且更无法保证稳定性,经常出现下载中途没有种子的现象。而且BT下载需要一个存放种子的服务器BT Tracker服务器,而这种Tracker服务器正是目前版权组织打击的重点对象,世界著名的Tracker提供者海盗湾等正被追杀,在这种情况下,传统的BT下载面临了严重的生存危机。


磁力下载不同于传统的BT下载需要Tracker服务器,它的工作原理类似于电驴这样的P2P下载。磁力下载会根据下载的文件的HASH值HASH是根据文件的内容的数据通过逻辑运算得到的数值,不同的文件,即使是相同的文件名,得到的HASH值是不同的,所以HASH值就成了一个文件的***,生成一个独特的文本格式的指纹,再通过此指纹识别文件并下载。由于任何人都能生成这样的文件指纹,因此,磁力下载无须任何中心机构服务器就可以进行正常的下载,确保了下载的稳定性。支持磁力下载的链接通常都会显示为一块磁铁的图标。


此外,磁力连接也非常易于传播,标准的磁力下载地址类似于“magnet:?xt=urn:btih:57C4862BB8058ADED8CA1AB8667A2C59BB5EE0B3&dn=Avatar+2009+1080p+BluRay+X264-AMIABLE&xl=7062222453”,它只是一个字符串,而不必像BT那样非得有.torrent的种子文件,在论坛发帖或聊天工具里粘贴磁力连接地址,别人复制下来即可下载,更容易传播和使用。


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


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


Magnet URI全称为Magnet Uniform Resource Identifier即“磁力统一资源定位名”,其主要支持参数(即组成部分)如下:dn (显示名称)-文件名、xl (绝对长度)-文件字节数、xt(eXact Topic)-包含文件散列函数的URN、as(Acceptable Source)-Web link to the file online、xs (绝对资源)-P2P链接、kt(关键字)-用于搜索的关键字、mt(文件列表)-链接到一个包含magnet链接的元文件(MAGMA - MAGnet Manifest)、tr(Tracker 地址)-BT下载的Tracker URL。


MagNet协议,也就是哈希分布。现在的BT下载服务是需要一个tracker服务器来储存BT种子文件,但是MagNet URI协议是不需要tracker服务器的,原理类似于电驴,但不完全是电驴的翻版。MagNet每次连接的源头都是不固定的,也就没法查封源头。在BT被封锁以后MagNet将是主流下载方式。


Magnet: URI 计划主要是用来鉴别p2p网络中的可用资源,是基于内容或元数据而非名字或位置,尽管它可以被其它应用程序使用,但主要的用途还是在p2p这一部分,已支持的软件包括 Azureus, BearShare, DC++, gtk-gnutella, Kazaa, LimeWire, FrostWire, Morpheus, Shareaza, TrustyFiles 和 uTorrent。它会根据文件内容的hash生成一个独特的指纹,有点类似于ISBN。这样,任何拥有此文件的人可以生成基于文件内容的指纹。它的另一个优势就是跨平台性,因为它是以普通文本存在,你可以简单的复制粘贴即可完成分享。


Magnet URI这样做有什么好处?


显而易见的好处是,整个下载网络的可靠性提高了,每一个节点都是可以被替代的。另一个好处是,审查变得更困难了,因为每次下载的路径都是不一样的,而且每个节点都是动态变化的,导致实际上无法追踪谁在下载。此外,magnet URI只是一个字符串,非常容易传播,根本无法禁止。


现在BT下载的多款软件已经更新均采用了最新的BT磁力链接(magnet)方式,类似电馿的ED2K链接,放弃了需要BT种子才能下载的传统方式,现在您不需要下载种子文件,只要有磁力链接就可以下载BT了。


磁力下载是BT的进化。最早期的BT就是一个种子seed,它是由一个待发布文件外加一些tracker经过计算得到的一个文件,通过BT的网络吸收营养,最后长成一棵大树。这个种子需要水壶tracker服务器不断的浇灌才能成长。Tracker服务器是早期下载中必须的角色。它工作的过程是这样的:


Client向tracker发一个HTTP的GET请求,并把它自己的信息放在GET的参数中;这个请求的大致意思是:我是xxx一个唯一的ID,我想下载yyy文件,我的IP是aaa,我用的端口是bbb。


tracker对所有Client的信息进行维护,当它收到一个请求后,首先把Client的信息记录下来如果已经记录在案,那么就检查是否需要更新,然后将一部分参与下载同一个文件一个Tracker服务器可能同时维护多个文件的下载的另一个Client的信息返回给对方。


Client在收到Tracker的响应后,就能获取其它Client的信息,那么它就可以根据这些信息,与其它Client建立连接,从它们那里下载文件片断。


2005年,BT软件开始引入这种技术,在BT中被称为DHT协议。DHT是一种分布式存储方法。DHT的作用是找到那些与本机正在下载上传相同文件的对端主机Peer,当然,实现这一过程并不依赖Tracker服务器。在DHT网络中的每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。这种信息获取方式保证了整个网络没有单个的中心,即使一个节点下线,依然可以通过其他节点来获取文件,因此也就不需要Tracker服务器来告诉你,其他节点在什么地方。


虽然DHT解决了去中心化的问题,但要在没有“中心协调员”Tracker的情况下实现高效寻址,就要借助PEX。PEX所提供的功能有点类似于以前的Tracker服务器,但工作方式却非常不同。举个例子,我叫D,我有A需要的东西,但是A不认识我,A只认识B,B只认识C,我只认识C,这样A就可以通过B--C,从而找到我。现在Tracker服务器的功能已经可以被DHT+PEX所取代。


很多人使用BTBitTorrent来共享和下载文件,它是最大的P2P(Peer-to-Peer,端对端)网络之一。但由于BitTorrent协议没有包含资源搜索相关的机制,人们必须依靠BTChina和Mininova这样的BT资源索引网站来搜索需要的文件。而在这些BT资源索引网站上,跟踪服务器Tracker负责管理和分配用户的IP地址。


通过跟踪服务器Tracker交换数据


用户先要安装客户端软件,比如Vuze和uTorrent,然后从BT资源索引网站上下载一个torrent后缀的种子文件。当你使用客户端软件打开这个种子文件时,跟踪服务器Tracker就会搜索你要下载的文件源IP地址。开始下载之后,你也会作为其中一个源地址被记录在跟踪服务器Tracker上,以供其他用户下载该资源。由此可见,跟踪服务器Tracker是BT网络的中心节点,海盗湾网站也正是因为提供了跟踪服务器Tracker而侵犯了版权。


随着磁力下载技术的到来,跟踪服务器Tracker将不再是一个必备的服务器。磁力链接提供了一个符合统一资源标识符URI的标准,类似经典URL的超链接地址。 然而,磁力链接又不同于URL地址,它不会显示出下载文件的源地址:磁力链接只会确认与其精确对应的文件,完全独立于下载源的地址。它会根据文件内容的数据通过逻辑运算得到的一个哈希值,这个值是个字符串,虽然不包含文件源相关信息,却能更精确地识别文件。至于文件到底在哪里,只有文件的拥有者知道。


不同于BT种子文件还需要中心跟踪服务器Tracker,有了磁力链接,文件共享网站仅仅提供一个文件名和一串对应的哈希值即可。当然,这种下载机制是否仍旧会被法院界定为侵权行为还是个未知数,不过这种P2P下载技术确实是一种对服务器依赖更少的技术。


磁力下载技术原理



通过磁力链接交换数据



磁力下载:新一代的文件共享网络


点击磁力下载链接,系统就会打开客户端软件下载该文件,这个过程与打开BT种子文件类似。由于程序并不知道文件源IP地址,它使用DHT协议Distributed Hash Table,分布式哈希表查找那些与本机正在下载或上传相同文件的主机Peer:在DHT网络中的每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。所以说磁力下载是去中心化的,并不存在一个集中的负责数据交换的中心,这在一定程度上说是安全的,更不容易遭到版权所有者的起诉。 换个角度说,一个文件究竟是通过BT种子下载的,还是通过磁力链接下载的,对用户而言其实是无关紧要的。


在磁力链接网络中,非法下载含版权的文件依然是有一定风险的,因为你的IP地址是可识别的。在一点上,它和跟踪服务器Tracker并无区别。甚至磁力链接还有一大劣势:用它搜索可用IP地址的耗时比通过种子文件搜索要长。一些Web服务,在其提供的磁力链接中添加了部分类似于追踪服务器的信息参数,从而减少降低了搜索文件耗时:做种者的IP地址编码信息会在磁力链接参数中保留一个星期,同时每个下载者的信息都会保留在该网站的数据库中一周,以便提高搜索下载源的速度。


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

 Magnet-icon.gif magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C


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


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


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

 "dn" ("显示名称"): 为了方便,为用户显示文件名称

 "kt" ("关键字"): 更笼统的搜索,指定搜索关键字而不是特定文件

 "mt" ("文件列表"): 一个 URI 指向一个列表,例如一个项目列表

 应用程序定义的实验参数,必须以 "x." 开头


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

 Magnet-icon.gif magnet:?xt.1=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C&xt.2=urn:sha1:TXGCZQTH26NL6OUQAJJPFALHG2LTGBC7


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

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


参数

 dn显示名称- 文件名

 xl绝对长度- 文件字节数

 xteXact Topic- 包含文件散列函数值的 URN

 as可接受来源 - 在线文件的网络链接

 xs绝对资源- P2P链接

 kt关键字- 用于搜索的关键字

 mt文件列表- 链接到一个包含磁力链接的元文件 (MAGMA - MAGnet MAnifest)

 trTracker 地址- BT下载的Tracker URL


xt 参数

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


TTH (Tiger Tree 散列函数)

TigerTree 散列函数被用在包括 Direct Connect 和 Gnutella2 在内的几个网络中。

  xt=urn:tree:tiger:[ TTH HashBase32]


SHA-1 (安全散列算法 1)

Gnutella 和 Gnutella2 使用的散列函数。

  xt=urn:sha1:[ SHA-1 HashBase32]


BitPrint

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


Gnutella 和 Gnutella2使用。

  xt=urn:bitprint:[ SHA-1 HashBase32].[ TTH HashBase32]


eD2k Hash (eDonkey2000) 散列函数

eDonkey2000 使用的散列函数算法。

  xt=urn:ed2k:[ ED2K HashHex]


AICH (高级智能型损坏处理)

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

  xt=urn:aich:[ aich HashBase32]


Kazaa 散列函数

FastTrack 使用的散列函数算法。

  xt=urn:kzhash:[ Kazaa HashHex]


BTIHBitTorrent Info Hash

BitTorrent 使用的散列函数算法。

  xt=urn:btih:[ BitTorrent Info HashHex]


MD5信息-摘要算法 5

Gnutella2 支持的散列函数算法。

  xt=urn:md5:[ MD5 HashHex]


CRC-32 (循环冗余校验)

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

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


网络链接至文件

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


普通链接as

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

  as=[文件的网络链接已编码URL ]


P2P链接xs

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


内容寻址网络CANURL

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

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


例:  xs=http://192.0.2.0.27:6346/uri-res/N2R?urn:sha1:FINYVGHENTHSMNDSQQYDNLPONVBZTICF


链接到DirectConnect hub并为文件查找源

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

 xs=dchub://[hub地址]:[hub端口]


为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. 用于在不需要 DHT 支持下下载 BitTorrent 资源。

 tr=http://example.com/announce


补充格式x.

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

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


参数组

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

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