对于第一次使用磁铁链接 。 想了解它是如何工作的,我抬起头规格并没有找到任何答案。 维基说xt
的意思是“确切的主题”,后面跟着的格式( btih
在这种情况下)与SHA1哈希。 只见提到base32,知道它的每个字符5位和32个字符,我发现它持完全相同160bits,这也正是SHA1的大小。
有没有空间,IP地址或任何东西,它只是一个SHA1。 那么如何BitTorrent客户端找到实际的文件吗? 我打开URL窥探,看它是否访问一个页面(使用TCP)或进行查找或类似,但什么都没有发生。 我不知道客户端如何找到同行。 这是如何运作的?
此外,什么是哈希? 是不是所有的数组文件哈希在一起的哈希? 也许这是实际的torrent文件的要求(剥离某些信息),散列?
在一个虚拟机,我试着用uTorrent的磁铁链接(这是新安装的),并设法找到同伴。 同行之首从何而来? 这是新鲜的,有没有其他的种子。
Answer 1:
一个BT磁铁链路标识使用1被称为“信息散列”一个SHA-1或截短的SHA-256哈希值的洪流。 这是对等体(客户端)与跟踪器或其他对等端进行通信时使用,以确定种子相同的值。 传统的.torrent文件包含两个顶级密钥的数据结构: announce
,识别所述跟踪器(一个或多个),以用于下载,和info
,包含用于种子的文件名和散列。 在“信息散列”是编码的哈希info
数据。
有些磁铁链接包括跟踪器或网络种子,但他们往往没有。 你的客户可能一无所知,除了其信息散列的洪流。 它需要的第一件事就是找到谁正在下载的洪流其他同龄人。 为此,它使用单独的对等网络的网络2操作“分布式哈希表”(DHT)。 DHT的是一个大的分布式索引它映射奔流(由infohashes标识)到同龄人的名单谁参加了一个群为洪流(上传/下载数据或元数据)(通过IP地址和端口标识)。
第一次客户端加入网络DHT它生成由相同的空间infohashes随机160位的ID。 然后,自举其使用先前洪流群遇到客户端开发人员控制的客户端,或DHT-支持的客户无论是硬编码地址的DHT网络连接。 当它要参加一个群对于一个给定的洪流,它搜索DHT网络的其他几个客户端ID分别接近3尽可能地信息散列。 它会通知这些客户端,它愿意参与群,并问他们,因为他们已经知道谁是参与群体的任何同行的连接信息。
当同龄人上传/下载特定的洪流,他们试图告诉对方所有他们知道,在参与同一洪流群的其他同行。 这让同行知道对方的快,无需进行跟踪器或DHT不断的请求。 一旦你学会从DHT的几个同行,你的客户就可以问那些同行的还更多的同龄人在洪流群的连接信息,直到你有你需要的所有同行。
最后,我们可以问这些同龄人的洪流的info
元数据,包括文件名和散列表。 一旦我们已经下载了这些信息,并验证了它的正确使用已知infohash
,我们在几乎相同的位置,与常规的启动客户端.torrent
文件,并得到了来自包括跟踪同行的列表。
下载可能开始。
1信息散列通常十六进制编码的,但某些老的客户端使用基座32代替。 V1( urn:btih:
使用SHA-1直接消化,而V2( urn:bimh:
增加了一个multihash前缀来标识的散列算法和摘要长度。
2有两种主要的DHT的网络:简单的“主线” DHT,并且通过使用的Azureus更复杂的协议。
3的距离由XOR测量。
延伸阅读
- BEP-3:BitTorrent的协议规范
- BEP-52:BitTorrent的协议规范V2
- BEP-5:DHT协议
- BEP-9:扩展对等发送元数据文件
- BEP-10:扩展协议
- BEP-11:同行交流(PEX)
- Azureus的DHT说明
Answer 2:
同伴发现和资源发现(在你的情况的文件)是两个不同的东西。
我比较熟悉的JXTA但所有点对点的基本原理相同网络的工作。
需要发生的第一件事情就是等方发现。
同伴发现
大多数P2P网络是“播种”的网络:当第一次开始对将连接到一个众所周知的(硬编码)地址检索正在运行的节点列表。 它可以直接播种像连接到dht.transmissionbt.com
如在另一篇文章或通常JXTA完成,其中对等连接,只有提供其他同龄人的网络地址的文本文件列表中的地址间接播种提及。
一旦连接建立,其中第一(少数)等(S),连接等(通过发送请求出)执行其他同龄人的发现和维护他们的表。 由于其它对等体的数量可以是巨大的,连接对等体仅保持对等端的分布式哈希表(DHT)的一部分。 的算法来确定对等体的连接应保持取决于网络表中的哪一部分。 BitTorrent的使用Kademlia的具有160个标识符/密钥。
资源发现
一旦一些同行已经被连接同行发现,后者发送几个请求了资源的发现给他们。 磁铁链接标识这些资源和内置于这样一种方式,他们是一个“签名”的资源,并保证他们唯一识别所有同业中所请求的内容。 然后,连接方将派人磁铁链接/资源它周围的同龄人发现请求。 该DHT是建立在这样一种方式,它有助于确定哪些同龄人应该首先问的资源(上Kademlia的维基百科阅读更多)。 如果请求对未持有所请求的资源通常会“传递”查询到更多的同龄人从自己的DHT获取。
的数量“跳”,查询可以在通常限于通过; 图4是具有JXTA类型的网络的通常数量。
当一个节点持有的资源,它与它的全部细节应答。 然后,连接端可以连接到同级持有资源(直接或通过中继 - 我不赘述),并开始读取它。
资源/ P2P网络服务不直接连接到网络地址:它们分布,这是这些高度可扩展的网络之美。
Answer 3:
我被同样的问题自己好奇。 读取用于发送的代码,我发现在以下libtrnasmission/tr-dht.c
:
3248: bootstrap_from_name( "dht.transmissionbt.com", 6881,
bootstrap_af(session) );
它尝试的是6倍,等待尝试之间40(!)秒。 我想你可以通过删除配置文件(测试~/.config/transmission
在UNIX上),并阻止所有通信dht.transmissionbt.com
,看看会发生什么(等待240秒至少)。
所以会出现客户端内置了引导节点开始。 当然,一旦得到进入网络,它并不需要一个引导节点了。
Answer 4:
我终于找到了规范。 第一次谷歌没有帮助 。 (维基链接到bittorrent.com这是主要的网站。我点击了链接开发商,注意右边的bittorrent.org选项卡,然后它是从那里很容易。它很难找到链接,当你不知道它们标记和许多点击了)。
好像所有的种子都在同伴网络。 您可以找到跟踪同行和你让他们会话之间。 网络让你找到同行和其他东西。 我还没有看它如何与使用磁铁的联系 ,但现在看来似乎是未定义的新客户端如何找到同行。 也许有些是烤的,或者他们用自己的主服务器或内嵌到客户端称为跟踪获取网络中同行之首。
Answer 5:
当我开始回答你的问题,我不知道你问的磁铁方案是如何工作的。 只是以为你想知道如何生成有关BitTorrent协议的部分。
在磁体URI中列出的哈希值是base32编码的洪流的信息哈希值。 该信息散列洪流中的B编码信息块的SHA1哈希。
这Python代码演示了如何计算。
我写了一个(很幼稚)C#实现测试了这一点,因为我没有手头上有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")));
}
据我了解,这个哈希值不包括关于如何定位跟踪器的任何信息,客户端需要通过其他方式(提供的网址公布)找到了这一点。 这是从另一个在跟踪一个洪流正是区分。
有关BitTorrent协议的一切仍然是围绕跟踪。 它仍然是群之间的通信的主要手段。 该磁力链接不是专为通过BitTorrent的使用而设计的。 它的使用通过任何P2P协议作为通信的另一种形式。 BitTorrent客户端适用于接收磁铁链接的另一种方式,以确定这样你就不需要再下载的.torrent文件种子。 磁铁URI仍然需要指定tr
为了找到它,因此客户可以参与阿克尔。 它可以包含其他有关协议的详细信息,但无关的BitTorrent协议。 BitTorrent协议最终将没有纤夫工作。
Answer 6:
同行的名单很可能从升级客户端的洪流填充(例如有一个为uTorrent的洪流是升级的话)。 只要每个人使用相同的客户端,它应该是一件好事,因为你别无选择,只能分享升级。
文章来源: How do BitTorrent magnet links work?