BitTorrent磁铁链接如何工作?

时间:2010-10-02 05:27:49

标签: bittorrent magnet-uri

我第一次使用magnet link。好奇它是如何工作的,我查看了规格并没有找到任何答案。维基说xt表示“确切的主题”,后面是格式(在这种情况下为btih),带有SHA1哈希。我看到base32提到,知道它是每个字符5位和32个字符,我发现它只有160位,这正是SHA1的大小。

没有IP地址或任何东西的空间,它只是一个SHA1。那么BitTorrent客户端如何找到实际文件呢?我打开了URL Snooper以查看它是否访问了一个页面(使用TCP)或进行了查找等,但没有任何反应。我不知道客户端如何找到同行。这是如何工作的?

另外,哈希是什么?它是所有文件哈希数组的哈希值吗?也许它是所需的实际torrent文件的哈希值(剥离某些信息)?


在虚拟机中,我尝试了与uTorrent(新安装)的磁力链接,并设法找到了同行。第一个同伴来自哪里?它很新鲜,没有其他种类。

6 个答案:

答案 0 :(得分:142)

BitTorrent磁力链接使用 1 SHA-1或截断的SHA-256哈希值(称为" infohash")来识别torrent。这与对等方(客户端)在与跟踪器或其他对等方通信时用于识别种子的值相同。传统的.torrent文件包含一个带有两个顶级键的数据结构:announce,用于标识要用于下载的跟踪器,以及info,包含torrent的文件名和哈希值。 " infohash"是编码的info数据的哈希值。

某些磁铁链接包括跟踪器或网络种子,但它们通常不会。除了infohash之外,您的客户可能对torrent没有任何了解。它需要的第一件事是找到正在下载洪流的其他同行。它使用单独的对等网络 2 来操作分布式哈希表" (DHT)。 DHT是一个很大的分布式索引,它将种子(由infohashes标识)映射到参与该群组的对等列表(由IP地址和端口标识)(上传/下载数据或元数据)。

客户端第一次加入DHT网络时,它会从与infohashes相同的空间生成一个随机的160位ID。然后,它使用由客户端开发人员控制的客户端的硬编码地址或先前在torrent群中遇到的支持DHT的客户端来引导其与DHT网络的连接。当它想要参与特定洪流的群体时,它会在DHT网络中搜索其ID与infohash尽可能接近 3 的其他几个客户端。它通知这些客户它想参与群体,并询问他们已经知道谁参与群体的任何同伴的连接信息。

当同伴上传/下载特定的torrent时,他们会尝试告诉对方他们所知道的参与同一种子群的所有其他同伴。这使得同伴能够快速了解​​彼此,而不会使跟踪器或DHT受到持续请求。一旦您从DHT中了解到一些同行,您的客户就可以向这些对等方询问有关洪流群中更多同行的连接信息,直到您拥有所需的所有对等方为止。

最后,我们可以向这些对等方询问torrent的info元数据,其中包含文件名和哈希列表。我们下载了这些信息,并使用已知的infohash验证了该信息的正确性,我们与以常规.torrent开头的客户端的位置几乎相同文件并从包含的跟踪器中获取对等列表。

下载可能会开始。

1 infohash通常是十六进制编码的,但是一些旧客户端使用的是base 32。 v1(urn:btih:)直接使用SHA-1摘要,而v2(urn:bimh:)添加multihash前缀以标识哈希算法和摘要长度。
2 有两个主要的DHT网络:更简单的"主线" DHT,以及Azureus使用的更复杂的协议 3 距离通过XOR测量。

进一步阅读

答案 1 :(得分:40)

同行发现和资源发现(您的案例中的文件)是两回事。

我对JXTA更熟悉,但所有对等网络都遵循相同的基本原则。

首先需要发现的是同伴发现。

同行发现

大多数p2p网络都是#34;种子"网络:首次启动对等体时,将连接到一个众所周知的(硬编码)地址,以检索正在运行的对等体列表。它可以直接播种,如连接到另一篇文章中提到的dht.transmissionbt.com或间接播种,就像通常使用JXTA一样,其中对等体连接到仅提供其他对等网络地址的纯文本列表的地址。

一旦与第一个(少数)对等体建立连接,连接对等体就会执行其他对等体的发现(通过发送请求)并维护它们的表。由于其他对等体的数量可能很大,因此连接对等体仅维护对等体的分布式哈希表(DHT)的一部分。用于确定连接对等体应该维护的表的哪个部分的算法根据网络而变化。 BitTorrent使用Kademlia和160位标识符/密钥。

资源发现

一旦连接对等体发现了一些对等体,后者就会向它们发送一些请求以发现资源。磁铁链接识别这些资源,并以这样的方式构建,即它们是一个"签名"对于资源并保证它们在所有对等体中唯一地标识所请求的内容。 然后,连接对等体将向其周围的对等体发送磁链接/资源的发现请求。 DHT的构建方式有助于确定首先应该询问哪些对等资源(请阅读维基百科的Kademlia了解更多信息)。 如果请求的对等方没有持有所请求的资源,它通常会#34;传递"对从其自己的DHT获取的其他对等方的查询。

"啤酒花的数量"查询可以传递通常是有限的; 4是JXTA型网络的常用号码。

当对等方拥有该资源时,它会回复其完整的详细信息。然后,连接对等体可以连接到持有资源的对等体(直接或通过中继 - 我不会在这里详细说明)并开始获取它。

P2P网络中的资源/服务直接连接到网络地址:它们是分布式的,这是这些高度可扩展网络的优点。

答案 2 :(得分:25)

我自己对同样的问题很好奇。阅读代码进行传输,我在libtrnasmission/tr-dht.c

中找到了以下内容
3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );

尝试6次,等待尝试之间的40(!)秒。我想你可以通过删除配置文件(unix上的~/.config/transmission)来测试它,并阻止所有与dht.transmissionbt.com的通信,看看会发生什么(至少等待240秒)。

所以看起来客户端有一个内置的引导节点开始。当然,一旦它进入网络,它就不再需要那个引导节点了。

答案 3 :(得分:9)

I finally found specification. For the first time google didnt help。 (wiki链接到bittorrent.com这是主站点。我点击了开发人员链接,注意右边的bittorrent.org选项卡然后从那里很容易。当你不知道它们被标记了什么时很难找到链接点击了。)

似乎所有种子都有同伴网络。您可以从跟踪器中找到同伴,并在会话之间保留它们。网络允许您查找同伴和其他事物。我还没有读过它如何与magnet links一起使用,但似乎未定义新客户端如何找到同行。也许有些人已经被淘汰,或者他们使用他们的家庭服务器或嵌入到客户端的已知跟踪器来获得网络中的第一个对等体。

答案 4 :(得分:8)

当我开始回答你的问题时,我没有意识到你在询问磁铁方案的工作原理。只是想你想知道如何生成与bittorrent协议相关的部分。


磁体uri中列出的哈希是base32中编码的torrent的信息哈希。 info散列是torrent的bencoded信息块的sha1散列。

python code演示了如何计算它。

我编写了一个(非常天真的)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)找到它。这就是跟踪器上一条洪流与另一条洪流的区别。

与bittorrent协议相关的所有仍然围绕着跟踪器。它仍然是群体之间的主要通信手段。磁铁uri方案并非专门为bittorrent设计。它被任何P2P协议用作通信的替代形式。 Bittorrent客户适应接受磁铁链接作为识别种子的另一种方式,您不再需要下载.torrent文件。磁体uri仍然需要指定tr acker才能找到它,以便客户可以参与。它可以包含有关其他协议的信息,但与bittorrent协议无关。如果没有跟踪器,bittorrent协议最终将无法工作。

答案 5 :(得分:3)

对等体列表可能来自升级客户端的torrent(例如,有一个用于升级它的utorrent的torrent)。只要每个人都使用同一个客户端,它应该是好的,因为你别无选择,只能分享升级。