磁力連結

定义磁链接格式的方案

磁力連結(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). 

外部連結

編輯