磁力鏈接

磁力鏈接

徠磁力鏈接(Magnet URI scheme),是對等網路中進行信息檢索和下載文檔的電腦程序。和基於“位置”連接的統一資源定位符(URL)不同,磁力鏈接是基於元數據(metadata)文件內容,屬於統一資源名稱(URN)。也就是說,磁力鏈接不基於文檔的IP地址或定位符,而是在分散式資料庫中,通過散列函數值來識別、搜索來下載文檔。因為不依賴一個處於啟動狀態的主機來下載文檔,所以特別適用沒有中心伺服器的對等網路。舉例來說,一個常見的磁力鏈接形式為“magnet:?xt=urn:btih:”。

歷史概述


這個標準的草稿出現於2002年,是為了對eDonkey2000的“ed2k:”和Freenet的“freenet:”兩個URI格式進行“廠商與項目中立化”(vendor- and project-neutral generalization)而制定的。同時這個標準也嘗試緊密地跟進IETF官方的URI標準。

特點


眾所周知,BT下載速度不夠穩定,當中斷時則無法完整下載。
磁力鏈接很好地解決了這個問題。磁力鏈接的問世與大行其道,標誌著BT 1.0時代已經過去,BT 2.0 時代已經到來。
深刻理解磁力鏈接
簡單地說,磁力鏈接是一種特殊鏈接,但是它與傳統基於文件的位置或名稱的普通鏈接(如http://xxx)不一樣,它只是通過不同文件內容的Hash結果生成一個純文本的“數字指紋”,並用它來識別文件。
它類似於生活消費品包裝上常見的條碼,不同的是這個“數字指紋”可以被任何人從任何文件上生成,這也就註定了磁力鏈接不需要任何“中心機構”的支持,且識別準確度極高。
因此任何人都可以生成一個Magnet 鏈接並確保通過該鏈接下載的文件準確無誤。

散列函數應用


磁力鏈接最常見的用途是基於文件內容的散列函數值來鏈接到特定文件,生成一個唯一的文件識別符,類似於ISBN。不像常規的識別符,內容散列可以被任意一位持有此文件的人生成,所以並不需要一個中心機構,這使其在文件共享領域經常被用作搜索條件,因任何人都可以分發一個磁力鏈接來確保該鏈接指向的資源就是他想要的,而和得到該資源的方式無關。
另一個磁力鏈接的優勢是開放性和跨平台性:一個磁力鏈接可被運行在幾乎所有平台上的應用程序們使用以下載一個文件。因為磁力鏈接十分簡潔且為純文本格式,所以用戶可以很方便地將其複製到電子郵件或即時消息中,比如種子文件。

構成


磁力鏈接由一組參數組成,參數間的順序沒有講究,其格式與在HTTP鏈接末尾的查詢字元串相同。通常是一個特定文件的內容散列函數值形成的URN,例如:
magnet:?xt=urn:btih:4D9FA761D69964B00DF0B3B0C9C1F968EA6C47D0&xt=urn:ed2k:7655dbacff9395e579c4c9cb49cbec0e&dn=bbb_sunflower_2160p_30fps_stereo_abl.mp4&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.publicbt.com%3a80%2fannounce&ws=http%3a%2f%2fdistribution.bbb3d.renderfarming.net%2fvideo%2fmp4%2fbbb_sunflower_2160p_30fps_stereo_abl.mp4
雖然這個鏈接指向一個特定文件,但是客戶端應用程序仍然必須進行搜索來確定哪裡。
在標準的草稿中其他參數的定義如下:
magnet:協議名。
xt:exact topic的縮寫,包含文件哈希值的統一資源名稱。BTIH(BitTorrent Info Hash)表示哈希方法名,這裡還可以使用ED2K,AICH,SHA1MD5等。這個值是文件的標識符,是不可缺少的。
dn:display name的縮寫,表示向用戶顯示的文件名。這一項是選填的。
tr:tracker的縮寫,表示tracker伺服器的地址。這一項也是選填的。
ws:webseed的縮寫,表示網路種子。
urn:(Uniform Resource Name, URN 表示資源名
btih:BitTorrent info hash,種子散列函數
應用程序定義的實驗參數,必須以"x."開頭。
標準還建議同類的多個參數可以在參數名稱後面加上".1", ".2"等來使用,例如:
magnet:?xt.1=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C&xt.2=urn:sha1:TXGCZQTH26NL6OUQAJJPFALHG2LTGBC7

xt參數詳述


磁力鏈接的這部分最重要。用於尋找和驗證包含著磁力鏈接中的文件。
TTH(Tiger Tree散列函數)
TigerTree散列函數被用在包括Direct Connect和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"的意思是"acceptable source"。這種鏈接指向從網路伺服器的直接下載。只有在指定的超時后才會鏈接,防止伺服器過載。客戶端在考慮向伺服器發送下載請求前會先花一定時間在P2P網路中定位文件。
as=[文件的網路鏈接(已編碼URL)]

P2P鏈接


鏈接可以是鏈接到磁力鏈接的文件的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]/[文件大小]/

常用客戶端


客戶端起始支持版本
μTorrent1.8
BitComet1.17
BitSpirit3.6.0.126
迅雷5.9.17
Transmission1.80
qBittorrent1.5.0
NeoLoader0.10 Public Beta Release
此外,支持磁力鏈接的應用程序還包括Vuze、BearShare、DC++、Deluge、gtk-gnutella、Kazaa、LimeWire、FrostWire、MP3 Rocket、Morpheus、Shareaza、MLdonkey、aMule、KCeasy和TrustyFiles。

問題


前面我們說過,“磁力鏈接”是通過DHT網路來索引需要下載的文件的,因此在某些環境下可能出現“獲取磁力鏈接信息”時間較長,或者獲取失敗的問題。由於相關問題經驗的積累很少,因此除了重試還沒有明確的解決辦法。