BitTorrent磁铁链接如何工作?

153 bittorrent magnet-uri

我第一次使用磁铁链接.好奇它是如何工作的,我查看了规格并没有找到任何答案.维基说的xt意思是"确切的主题",然后是格式(btih在本例中),带有SHA1哈希.我看到base32提到,知道每个字符5位和32个字符,我发现它只有160位,这正是SHA1的大小.

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

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


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

小智 149

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

一些磁铁链接包括跟踪器或网络种子,但它们通常不包括.除了infohash之外,您的客户可能对torrent没有任何了解.它需要的第一件事是找到正在下载洪流的其他同行.它使用操作"分布式散列表"(DHT)的单独的对等网络2来完成此操作.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测量.

进一步阅读

  • @Kate不完全是.典型的DHT节点存储在DHT网络"空间"中"接近"它的*某些*种子的对等列表.跟踪器会尝试为其知道的每个torrent存储对等列表.此外,引导DHT节点特别不存储*any*种子的对等列表.相反,它们仅分发其他DHT节点的列表,以帮助您连接到整个网络.然后,您可以找到一个典型的DHT节点,其中包含您感兴趣的对等列表. (3认同)
  • 引导节点,例如`dht.transmission.com`,仅仅是一个跟踪器吗?我理解它的方式是它需要跟踪每个信息哈希的对等列表 - 这正是跟踪器所做的。 (2认同)

Bru*_*der 41

对等发现和资源发现(您的案例中的文件)是两回事.

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

需要发生的第一件事是同行发现.

同行发现

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

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

资源发现

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

查询可以传递的"跳数"通常是有限的; 4是JXTA型网络的常用号码.

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

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


yha*_*ger 25

我自己也对同样的问题感到好奇.阅读传输代码,我发现以下内容libtrnasmission/tr-dht.c:

3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );
Run Code Online (Sandbox Code Playgroud)

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

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


小智 9

我终于找到了规范.谷歌第一次没有帮助.(维基链接到bittorrent.com这是主要的网站.我点击了链接开发商,注意右边的bittorrent.org选项卡,然后它是从那里很容易.它很难找到链接,当你不知道它们标记和许多点击了).

似乎所有种子都有同伴网络.您可以从跟踪器中找到同伴,并在会话之间保留它们.网络允许您查找同伴和其他事物.我还没有看到它如何与磁铁链接一起使用,但似乎未定义新客户如何找到同行.也许有些是烤的,或者他们用自己的主服务器或内嵌到客户端称为跟踪获取网络中同行之首.


Jef*_*ado 8

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


磁体uri中列出的哈希是base32中编码的torrent的信息哈希.info散列是torrent的bencoded信息块的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")));
}
Run Code Online (Sandbox Code Playgroud)

据我了解,此哈希不包含有关如何定位跟踪器的任何信息,客户端需要通过其他方式(提供的通知URL)找到它.这就是跟踪器上的一个洪流与另一个洪流的区别.

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

  • 这没有帮助.但是你是说它散列整个torrent文件跳过infokey块吗?我的问题是如何找到同伴. (2认同)
  • @Jeff M:但是什么'发送'回来的同伴列表.链接只是没有跟踪器关联的链接.我试图找出什么回送同行. (2认同)