BitTorrent磁力链接如何工作?

我第一次使用磁铁链接 。 好奇它是如何工作的,我查了一下规格,没有find答案。 wiki表示xt意思是“确切的主题”,后面跟着一个SHA1哈希的格式(在这个例子中是btih )。 我看到base32提到,知道它是每个字符5位和32个字符,我发现它正好持有160位,这正是SHA1的大小。

没有IP地址或任何空间,这只是一个SHA1。 那么,BitTorrent客户端如何find实际的文件呢? 我打开URL Snooper来查看它是否访问了一个页面(使用TCP),或者做了一个查找之类的事情,但是什么都没有发生。 我不知道客户如何find同行。 这个怎么用?

另外,什么是散列? 它是一个散列在一起的所有文件散列的散列吗? 也许这是所需的实际torrent文件的散列(剥离某些信息)?


在一个虚拟机中,我尝试了与uTorrent(刚刚安装)的磁盘链接,并find了同行。 第一个同行从哪里来? 这是新鲜的,没有其他种子。

BitTorrent磁力链接使用1个SHA-1或被称为“infohash”的截短的SHA-256哈希值来识别洪stream。 与同行(客户)在跟踪器或其他同事通信时用于识别山洪的价值是相同的。 传统的.torrent文件包含一个包含两个顶级密钥的数据结构: announce ,标识用于下载的跟踪器,以及包含文件名和哈希值的信息。 “infohash”是编码的info数据的散列。

一些磁铁链接包括跟踪器或networking种子,但他们通常不。 除了infohash,你的客户可能对洪stream一无所知。 首先需要find正在下载洪stream的其他同伴。 它使用单独的运行“分布式哈希表”(DHT)的对等networking2来执行此操作。 DHT是一个很大的分布式索引,它将Torrent(通过infohashes标识)映射到正在参与该torrent种群(上传/下载数据或元数据)的同伴列表(由IP地址和端口标识)。

客户端第一次joinDHTnetworking时,它会从infohashes的相同空间生成一个随机的160位ID。 然后使用客户端开发人员控制的客户端的硬编码地址或以前在Torrent群中遇到的支持DHT的客户端将其与DHTnetworking的连接引导。 当它想要参与一个给定的洪stream的群体时,它会在DHTnetworking中search其他几个ID尽可能接近infohash的客户端。 它通知这些客户想要参与群体,并要求他们提供他们已经知道参与群体的任何同伴的连接信息。

当同伴上传/下载一个特定的洪stream时,他们试图告诉对方他们所知道的所有参与同一洪stream群的其他同伴。 这可以让同行快速了解对方,而不需要跟踪器或DHT经常提出请求。 一旦你从DHT中了解了几个同伴,你的客户端就可以向这些同伴询问torrent群中更多同伴的连接信息,直到你拥有了所有需要的同伴。

最后,我们可以向这些同伴请求包含文件名和哈希列表的洪streaminfo元数据。 一旦我们下载了这些信息,并且使用已知的infohashvalidation了它是正确的,我们实际上和一个以一个普通的.torrent文件开始的客户端的位置相同,并从包含的跟踪器中获得了一个对等列表。

下载可能开始。

1 infohash通常是hex编码,但一些旧客户端使用基数32。 v1( urn:btih:直接使用SHA-1摘要,而v2( urn:bimh:添加多哈希前缀来标识哈希algorithm和摘要长度。
2有两个主要的DHTnetworking:更简单的“主线”DHT,以及Azureus使用的更复杂的协议。
3距离是通过异或来测量的。

进一步阅读

  • BEP-3:BitTorrent协议规范
  • BEP-52:BitTorrent协议规范v2
  • BEP-5:DHT协议
  • BEP-9:对等的扩展发送元数据文件
  • BEP-10:扩展协议
  • BEP-11:同行交换(PEX)
  • Azureus DHT描述

对等发现和资源发现(在你的案例中的文件)是两个不同的东西。

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

需要发生的第一件事是对等发现。

对等发现

大多数p2pnetworking是“种子”networking:当第一次启动对等体时,将连接到一个众所周知的(硬编码的)地址来检索正在运行的对等体列表。 它可以直接播种,如连接到dht.transmissionbt.com如另一篇文章中提到的那样),也可以像通常使用JXTA进行的间接播种,其中对等体连接到仅传递其他对等体networking地址的纯文本列表的地址。

一旦与第一个(less数)对等体build立了连接,连接对等体就执行其他对等体的发现(通过发送请求)并维护其中的一个表。 由于其他对等体的数量可能很大,所以连接对等体只保持对等体的分布式散列表(DHT)的一部分。 确定连接对等体应维护的表的哪个部分的algorithm取决于networking。 BitTorrent使用160位标识符/密钥的Kademlia。

资源发现

一旦连接对端发现了一些对等点,后者就会发送一些请求给他们发现资源。 磁盘链接标识这些资源,并以这样一种方式构build,即它们是资源的“签名”,并保证它们唯一地标识所有同位体中请求的内容。 连接的对等体然后将发送磁铁链路/资源的发现请求给周围的同伴。 DHT是build立在这样一种方式,它有助于确定哪些同行应首先要求资源(阅读Kademlia在维基百科更多)。 如果请求的对等体没有保存所请求的资源,它通常会将查询“传递”给从其自己的DHT获取的其他对等体。

查询可以传递的“跳数”通常是有限的; 4是JXTAtypesnetworking的常用数字。

当一个同伴持有这个资源时,它会回复它的全部细节。 然后连接点可以连接到持有资源的对等点(直接或通过中继 – 我不会在这里详细介绍)并开始获取资源。

P2Pnetworking中的资源/服务并不直接连接到networking地址:它们是分布式的,这就是这些高度可扩展的networking的美妙之处。

我自己也对这个问题很好奇。 阅读代码进行传输,我在libtrnasmission/tr-dht.c发现了以下libtrnasmission/tr-dht.c

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

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

所以看起来客户端内置了一个引导节点来启动。 当然,一旦进入networking,就不再需要引导节点了。

我终于find规范。 谷歌第一次没有帮助 。 (wiki链接到主站点bittorrent.com,点击开发者链接,注意右边的bittorrent.org标签,然后很容易find链接,当你不知道标签是什么,点击)。

似乎所有的种子都有一个同伴networking。 你从追踪者那里find同伴,并让他们在会话之间保持联系。 networking可以让你find同伴和其他的东西。 我还没有看到如何使用磁铁链接,但它似乎是不明确的,如何一个新的客户端find同行。 也许有些人已经习惯了,或者他们使用他们的家庭服务器或embedded到客户端的已知跟踪器来获得networking中的第一个对等体。

当我开始回答你的问题时,我没有意识到你在问磁体scheme是如何工作的。 只是以为你想知道如何生成有关BitTorrent协议的部分。


在magnet uri中列出的散列是在base32编码的洪stream的信息散列。 info哈希是洪stream的bencoded信息块的sha1哈希。

这个python代码演示了如何计算。

我写了一个(非常天真的)C#实现来testing这一点,因为我手头没有bencoder,它与客户端期望的匹配。

 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)find这个信息。 这就是追踪器上的一个种子与另一个种子的区别。

与BitTorrent协议相关的一切仍然围绕着跟踪器。 它仍然是群体之间沟通的主要手段。 磁uri计划并不是专门为bittorrent使用而devise的。 它被任何P2P协议用作通信的替代forms。 BitTorrent的客户端适应接受磁链接作为另一种方式来识别山洪,这种方式,你不需要下载.torrent文件了。 磁铁仍然需要指定trider以便find它,以便客户可以参与。 它可以包含有关其他协议的信息,但与bittorrent协议无关。 如果没有跟踪器,BitTorrent协议最终将无法正常工作。

同行的列表可能会从升级客户端的洪stream(例如有升级它的utorrent的洪stream)填充。 只要每个人都使用同一个客户端,应该是好的,因为你别无select,只能分享升级。