磁力連結

**磁力連結**（Magnet URI scheme），是對等網路中進行資訊檢索和下載文件的電腦程式。和基於「位置」連接的統一資源定位符不同，磁力連結是基於元資料（metadata）檔案內容，屬於統一資源名稱。也就是說，磁力連結不基於文件的 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 編碼的檔案的 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 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 雜湊函式被用在包括 Direct Connect (protocol) 和 Gnutella2 在內的幾個網路中。

```
xt=urn:tree:tiger:[ TTH Hash（Base32）]
```

**SHA-1（安全雜湊演算法 1）**

Gnutella 和 Gnutella2 使用的雜湊函式。

```
xt=urn:sha1:[ SHA-1 Hash（Base32）]
```

**BitPrint**

這種雜湊函式包含一個 SHA-1 雜湊函式和一個 TTH 雜湊函式，用 "." 隔開。

Gnutella 和 Gnutella2 使用。

```
xt=urn:bitprint:[ SHA-1 Hash（Base32）].[ TTH Hash（Base32）]
```

**eD2k Hash（eDonkey2000）雜湊函式**

eDonkey2000 使用的雜湊函式演算法。

```
xt=urn:ed2k:[ ED2K Hash（Hex）]
```

**AICH（進階智慧型損壞處理）**

不是正式的磁力連結的一部分。eDonkey2000 使用的雜湊函式演算法，用於儲存和控制下載完成、正在下載的檔案的完整性。

```
xt=urn:aich:[ aich Hash（Base32）]
```

**Kazaa 雜湊函式**

FastTrack 使用的雜湊函式演算法。

```
xt=urn:kzhash:[ Kazaa Hash（Hex）]
```

**BTIH（BitTorrent Info Hash）**

BitTorrent 使用的雜湊函式演算法。出於向下相容的考慮，客戶端需要同時支援被 Base32 編碼過的 BTIH 雜湊結果。

```
xt=urn:btih:[ BitTorrent Info Hash（Hex）]
```

**MD5（資訊 - 摘要演算法 5）**

Gnutella2 支援的雜湊函式演算法。

```
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
```

**連結到 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. 用於在不需要分散式雜湊表支援下下載 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
```

## 客戶端

此外，支援磁力連結的應用程式還包括 Vuze、BearShare、DC++、Deluge、gtk-gnutella、Kazaa、LimeWire、FrostWire、MP3 Rocket、Morpheus、Shareaza、MLdonkey、aMule、KCeasy 和 TrustyFiles。

## 參見

* Metalink
* DHT

## 參考文獻

## 外部連結

* MAGNET-URI 專案網站 （頁面存檔備份，存於網際網路檔案館）
* Magnet.so （頁面存檔備份，存於網際網路檔案館），Magnet.so 搜尋引擎
* ENBT.org （頁面存檔備份，存於網際網路檔案館），Magnet 搜尋引擎
* Freebase （頁面存檔備份，存於網際網路檔案館），使用磁力連結索引免費軟體的網站
* RHash （頁面存檔備份，存於網際網路檔案館），開源命令列工具，可以計算磁力連結
* torrent2magnet （頁面存檔備份，存於網際網路檔案館），Magnet 轉換工具，可以把 torrent 檔案轉換成磁力連結