磁力連結

磁力連結（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`

其值是編碼的文件的SHA-1散列。

注意，雖然這個連結指向一個特定文件，但是客戶端應用程式仍然必須進行搜索來確定哪裡，如果有，能夠獲取那個文件。

在標準的草稿中其他參數的定義如下:

- "dn" ("顯示名稱"）:為了方便，為使用者顯示文件名稱
- "kt" ("關鍵字"):更籠統的搜索，指定搜索關鍵字而不是特定文件
- "mt" ("文件列表"):一個URI指向一個列表，例如一個項目列表
- 應用程式定義的實驗參數，必須以"x."開頭

標準還建議同類的多個參數可以在參數名稱後面加上".1", ".2"等來使用，例如

`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文件轉換成磁力連結