![](/img/trans.png)
[英]How to add a magnet URL to bittorrent programmatically from vb.net?
[英]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 協議最終將無法工作。
對等點的列表可能是從升級客戶端的 torrent 中填充的(例如,有一個升級它的 utorrent 的 torrent)。 只要大家都用同一個客戶端就好了,因為你別無選擇,只能共享升級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.