簡體   English   中英

BitTorrent 磁力鏈接如何工作?

[英]How do BitTorrent magnet links work?

我第一次使用磁力鏈接 好奇它是如何工作的,我查閱了規格並沒有找到任何答案。 維基說xt意思是“確切的主題”,后面是帶有 SHA1 哈希的格式(在本例中為btih )。 我看到提到的 base32,知道它是每個字符 5 位和 32 個字符,我發現它正好包含 160 位,這正是 SHA1 的大小。

沒有 IP 地址或任何東西的空間,它只是一個 SHA1。 那么 BitTorrent 客戶端是如何找到實際文件的呢? 我打開 URL Snooper 以查看它是否訪問頁面(使用 TCP)或執行查找等操作,但什么也沒發生。 我不知道客戶如何找到同行。 這是如何運作的?

另外,hash 是什么? 它是所有文件散列的數組的散列嗎? 也許它是所需的實際torrent文件的散列(剝離某些信息)?


在虛擬機中,我嘗試使用 uTorrent(新安裝的)磁力鏈接,它設法找到了對等點。 第一個同行從哪里來? 它很新鮮,沒有其他種子。

BitTorrent 磁力鏈接使用1 SHA-1 或被稱為“infohash”的截斷 SHA-256 哈希值來識別種子。 這與對等方(客戶端)在與跟蹤器或其他對等方通信時用於識別種子的值相同。 傳統的 .torrent 文件包含一個帶有兩個頂級鍵的數據結構: announce ,標識用於下載的跟蹤器,以及info ,包含 torrent 的文件名和哈希。 “infohash”是編碼info數據的散列。

一些磁力鏈接包含跟蹤器或網絡種子,但它們通常不包含。 除了它的信息哈希外,您的客戶可能對 torrent 一無所知。 它需要做的第一件事是找到正在下載 torrent 的其他同行。 它使用運行“分布式哈希表”(DHT)的單獨的對等網絡2來做到這一點。 DHT 是一個大型分布式索引,它將種子文件(由信息哈希標識)映射到參與該種子文件群(上傳/下載數據或元數據)的對等點列表(由 IP 地址和端口標識)。

客戶端第一次加入 DHT 網絡時,它會從與 infohashes 相同的空間生成一個隨機的 160 位 ID。 然后,它使用由客戶端開發人員控制的客戶端的硬編碼地址或先前在 Torrent 群中遇到的支持 DHT 的客戶端,引導其與 DHT 網絡的連接。 當它要參加一個群對於一個給定的洪流,它搜索DHT網絡的其他幾個客戶端ID分別接近3盡可能地信息散列。 它通知這些客戶端它想加入群,並向他們詢問他們已經知道誰正在參與群的任何對等點的連接信息。

當對等點上傳/下載特定的 torrent 時,他們會嘗試告訴對方他們知道的所有其他對等點正在參與同一個 torrent 群。 這可以讓對等點快速相互了解,而無需讓跟蹤器或 DHT 受到不斷的請求。 一旦您從 DHT 了解了一些對等點,您的客戶端將能夠向這些對等點詢問 torrent 群中更多對等點的連接信息,直到您擁有所需的所有對等點。

最后,我們可以向這些節點詢問 torrent 的info元數據,其中包含文件名和哈希列表。 一旦我們下載了這些信息並使用已知的infohash驗證它是正確的,我們實際上處於與從常規.torrent文件開始並從包含的跟蹤器獲取對等點列表的客戶端相同的位置。

可以開始下載。

1 infohash 通常是十六進制編碼的,但一些舊客戶端使用 base 32 代替。 v1 ( urn:btih: ) 直接使用 SHA-1 摘要,而 v2 ( urn:bimh: ) 添加了多哈希前綴來標識哈希算法和摘要長度。
2有兩個主要的 DHT 網絡:更簡單的“主線”DHT,以及 Azureus 使用的更復雜的協議。
3距離是通過異或來測量的。

進一步閱讀

對等發現和資源發現(在您的情況下是文件)是兩件不同的事情。

我更熟悉 JXTA,但所有對等網絡都遵循相同的基本原則。

需要發生的第一件事是對等發現。

對等發現

大多數 p2p 網絡是“種子”網絡:當第一次啟動對等點時,將連接到一個眾所周知的(硬編碼)地址以檢索正在運行的對等點列表。 它可以是直接播種,如在另一篇文章中提到的連接到dht.transmissionbt.com或間接播種,如通常使用 JXTA 完成的那樣,其中對等方連接到僅提供其他對等方網絡地址的純文本列表的地址。

一旦與第一個(少數)對等體建立連接,連接對等體就會執行其他對等體的發現(通過向外發送請求)並維護它們的表。 由於其他對等點的數量可能很大,因此連接對等點僅維護對等點的分布式哈希表 (DHT) 的一部分。 確定連接對等方應維護表的哪一部分的算法因網絡而異。 BitTorrent 使用具有 160 位標識符/密鑰的 Kademlia。

資源發現

一旦連接對等點發現了一些對等點,后者就會向它們發送一些發現資源的請求。 磁力鏈接識別這些資源,並以這樣一種方式構建,即它們是資源的“簽名”,並保證它們在所有對等點之間唯一地標識所請求的內容。 然后,連接對等方將向其周圍的對等方發送對磁力鏈接/資源的發現請求。 DHT 的構建方式有助於確定應首先向哪些對等節點請求資源(更多信息請閱讀 Wikipedia 中的 Kademlia)。 如果請求的對等方不持有所請求的資源,它通常會將查詢“傳遞”給從其自己的 DHT 獲取的其他對等方。

查詢可以傳遞的“跳”數通常是有限的; 4 是 JXTA 類型網絡的常用數字。

當對等方持有資源時,它會回復其完整的詳細信息。 然后,連接對等方可以連接到持有資源的對等方(直接或通過中繼 - 我不會在這里詳細介紹)並開始獲取它。

P2P 網絡中的資源/服務直接附加到網絡地址:它們是分布式的,這就是這些高度可擴展網絡的美妙之處。

我自己也對同樣的問題很好奇。 閱讀傳輸代碼,我在libtrnasmission/tr-dht.c發現了以下libtrnasmission/tr-dht.c

3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );

它嘗試了 6 次,兩次嘗試之間等待 40(!) 秒。 我想您可以通過刪除配置文件(unix 上的~/.config/transmission )並阻止與dht.transmissionbt.com所有通信來dht.transmissionbt.com ,然后看看會發生什么(至少等待 240 秒)。

所以看起來客戶端有一個內置的引導節點開始。 當然,一旦它進入網絡,它就不再需要那個引導節點了。

當我開始回答你的問題時,我沒有意識到你在問磁鐵方案是如何工作的。 只是想知道與 bittorrent 協議相關的部分是如何生成的。


磁體 uri 中列出的哈希值是以 base32 編碼的 Torrent 信息哈希值。 信息哈希是種子的編碼信息塊的 sha1 哈希。

python 代碼演示了如何計算它。

我編寫了一個(非常幼稚的)C# 實現來測試這一點,因為我手頭沒有本編碼器,並且它與客戶端的期望相匹配。

static string CalculateInfoHash(string path)
{
    // assumes info block is last entry in dictionary
    var infokey = "e4:info";
    var offset = File.ReadAllText(path).IndexOf(infokey) + infokey.Length;
    byte[] fileHash = File.ReadAllBytes(path).Skip(offset).ToArray();
    byte[] bytes;
    using (SHA1 sha1 = SHA1.Create())
        bytes = sha1.ComputeHash(fileHash, 0, fileHash.Length - 1); // need to remove last 'e' to compensate for bencoding
    return String.Join("", bytes.Select(b => b.ToString("X2")));
}

據我了解,此哈希不包含有關如何定位跟蹤器的任何信息,客戶端需要通過其他方式(提供的公告 url)找到它。 這正是在跟蹤器上區分一種 torrent 的原因。

與 bittorrent 協議相關的一切仍然圍繞着跟蹤器。 它仍然是群體之間的主要交流方式。 磁體 uri 方案不是專門為 bittorrent 使用而設計的。 它被任何 P2P 協議用作通信的替代形式。 Bittorrent 客戶端適應接受磁力鏈接作為另一種識別種子的方式,這樣您就不再需要下載 .torrent 文件了。 磁鐵URI仍然需要指定tr為了找到它,因此客戶可以參與阿克爾。 它可以包含有關其他協議的信息,但與 bittorrent 協議無關。 如果沒有跟蹤器,bittorrent 協議最終將無法工作。

我終於找到了規范。 谷歌第一次沒有幫助 (wiki 鏈接到主要站點 bittorrent.com。我點擊了開發人員鏈接,注意右側的 bittorrent.org 選項卡,然后從那里開始很容易。當你不知道它們被標記什么時很難找到鏈接,而且很多點擊離開)。

似乎所有種子都有一個對等網絡。 您可以從跟蹤器中找到同行,並在會話之間保留它們。 網絡允許您找到對等點和其他東西。 我還沒有讀過它如何與磁力鏈接一起使用,但似乎未定義新客戶如何找到同行。 也許有些已經被烤熟,或者他們使用他們的家庭服務器或嵌入客戶端的已知跟蹤器來獲取網絡中的第一個對等點。

對等點的列表可能是從升級客戶端的 torrent 中填充的(例如,有一個升級它的 utorrent 的 torrent)。 只要大家都用同一個客戶端就好了,因為你別無選擇,只能共享升級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM