磁力链接

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

## 历史

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

## 内容散列函数的应用

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

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

### 技术描述

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

<image>

`magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C`

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

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

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

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

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

<image>

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

## 描述

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

```
  `magnet:? xl = [zh-hans:字节; zh-hant:位元組大小]& dn = [zh-hans:文件; zh-hant:檔案;名（已编码[[URL]]）]& xt = urn: tree: tiger: [ [[散列树#Tiger tree hash|TTH]] [[散列函數|hash]]（[[Base32]]）]`
```

### 参数

- dn（显示名称）- 文件名
- xl（绝对长度）- 文件字节数
- xt（eXact Topic）- 包含文件散列函数值的URN
- as（可接受来源） - 在线文件的网络链接
- xs（绝对资源）- P2P链接
- kt（关键字）- 用于搜索的关键字
- mt（文件列表）- 链接到一个包含磁力连结的元文件 (MAGMA - MAGnet MAnifest）
- tr（Tracker地址）- BT下载的Tracker URL

#### xt参数

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

TTH（Tiger Tree散列函数）

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

```
xt=urn:tree:tiger:[ [[哈希树|TTH]] [[散列函數|Hash]]]
```

SHA-1（安全散列算法1）

Gnutella和使用的散列函数。

```
xt=urn:sha1:[ [[SHA-1]] [[散列函數|Hash]]]
```

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

Gnutella和使用。

```
xt=urn:bitprint:[ [[SHA-1]] [[散列函數|Hash]]].[ [[哈希树|TTH]] [[散列函數|Hash]]]
```

eD2k Hash（eDonkey2000）散列函数

eDonkey2000使用的散列函数算法。

```
xt=urn:ed2k:[ [[EDonkey network#Hash identification|ED2K]] [[散列函數|Hash]]（[[十六进制|Hex]]）]
```

AICH（高级智能型损坏处理）

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

```
xt=urn:aich:[ [[aich]] [[散列函數|Hash]]]
```

散列函数

使用的散列函数算法。

```
xt=urn:kzhash:[  [[散列函數|Hash]]（[[十六进制|Hex]]）]
```

BTIH（BitTorrent Info Hash）

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

```
xt=urn:btih:[ [[BitTorrent (协议)|BitTorrent]] Info [[散列函數|Hash]]（[[十六进制|Hex]]）]
```

MD5（信息-摘要算法5）

支持的散列函数算法。

```
xt=urn:md5:[ [[MD5]] [[散列函數|Hash]]（[[十六进制|Hex]]）]
```

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?[包含一个文件[[散列函數|hash]]的[[URN]] ]
```

例：

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

链接到 hub并为文件查找源

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

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

为上的文件引用基于网络的源缓存

这种情况下，链接包含的点不是客户端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

BitComet｜1.17

BitSpirit｜3.6.0.126

迅雷｜5.9.17

Transmission｜1.80

qBittorrent｜1.5.0

NeoLoader｜0.10 Public Beta Release

此外，支持磁力连结的应用程序还包括Vuze、BearShare、DC++、Deluge、gtk-gnutella、Kazaa、LimeWire、FrostWire、MP3 Rocket、Morpheus、Shareaza、MLdonkey、aMule、KCeasy和TrustyFiles。

也有部分网络硬盘能支持磁力连结，比如百度网盘和PikPak。

## 外部链接

- MAGNET-URI项目网站
- Magnet.so，Magnet.so搜索引擎
- ENBT.org，Magnet搜索引擎
- Freebase，使用磁力连结索引免费软件的网站
- RHash，开源命令行工具，可以计算磁力连结
- torrent2magnet，Magnet转换工具，可以把torrent文件转换成磁力链接