我已经阅读了SuperUser的答案和Wikipedia的文章,但是这两者对于我来说都太技术性了,真让人难以理解。
我了解跟踪器的概念:客户端连接到中央服务器,该服务器维护着一群对等方。
我还理解了对等交换的思想:已经成群的客户端将彼此的完整列表相互发送。如果发现新的对等方,则将它们添加到列表中。
我的问题是,DHT如何工作?也就是说,没有跟踪者或不知道该群集中至少一个成员以与之交换对等方的情况下,新客户端如何加入该群集?
(注意:最好的解释是最好的。)
我已经阅读了SuperUser的答案和Wikipedia的文章,但是这两者对于我来说都太技术性了,真让人难以理解。
我了解跟踪器的概念:客户端连接到中央服务器,该服务器维护着一群对等方。
我还理解了对等交换的思想:已经成群的客户端将彼此的完整列表相互发送。如果发现新的对等方,则将它们添加到列表中。
我的问题是,DHT如何工作?也就是说,没有跟踪者或不知道该群集中至少一个成员以与之交换对等方的情况下,新客户端如何加入该群集?
(注意:最好的解释是最好的。)
Answers:
在没有跟踪者或不知道群集中至少一个成员与之交换对等对象的情况下,新客户端如何加入群集?
你不能 是不可能的。*
*(除非局域网中的某个节点恰好已经是DHT中的一个节点。在这种情况下,您可以使用广播机制(例如Avahi)来“发现”该对等节点,并从中进行引导。但是如何做到的他们会自行引导?最终,您将遇到需要连接到公共Internet的情况。公共Internet仅是单播的,而不是多播的,因此您必须使用预定的对等方列表。)
Bittorrent DHT通过称为Kademlia的协议实现,这是Distributed hash table的理论概念的特例。
使用Kademlia协议,当您加入网络时,您需要执行自举程序,这绝对需要您事先知道至少一个已经参与DHT网络的节点的IP地址和端口。例如,您连接到的跟踪器本身可能是DHT节点。连接到一个DHT节点后,您便可以继续从DHT下载信息,该信息为您提供了更多节点的连接信息,然后您可以浏览“图”结构以获得与越来越多节点的连接,这些节点可以提供与其他节点的连接性以及有效负载数据(下载块)。
我觉得你的实际问题,以粗体-即如何加入的Kademlia DHT网络不知道任何其他成员-是基于一个错误的假设。
以粗体显示您的问题的简单答案是,您不需要。如果您甚至根本不了解可能包含DHT元数据的一台主机的任何信息,那么您就会陷入困境-您甚至无法上手。我的意思是,可以肯定,您可以蛮力尝试在公共互联网上使用恰好广播DHT信息的开放端口来发现IP。但是更可能的是,您的BT客户端被硬编码为某些特定的静态IP或DNS,该IP或DNS解析为一个稳定的DHT节点,该节点仅提供DHT元数据。
基本上,DHT仅与连接机制一样分散,并且由于连接机制非常脆弱(无法在整个Internet上“广播”!因此您必须单播到单个预先分配的主机上才能获得DHT数据),但Kademlia DHT并未真正分散。严格意义上讲不是这样。
想象一下这种情况:某个希望P2P停止的人出去了,并准备对所有用于引导的稳定DHT节点进行攻击。一旦上演了攻击,他们就会立即在所有节点上发动攻击。ham ; 每一个自举DHT节点都一口气掉下来。怎么办?您必须连接到集中式跟踪器,才能从中下载传统的对等方列表。好吧,如果他们也攻击追踪器,那么您真的,真的上一条小河。换句话说,Kademlia和整个BT网络都受到Internet自身的局限性的限制,因为只有有限(且数量相对较少)的计算机才能成功攻击或脱机,以防止> 90%的用户连接到网络。
一旦“伪集中”自举节点全部消失,DHT的内部节点(因为DHT 外部的任何人都不了解内部节点)就无法自举,这些内部节点是无用的。他们无法将新节点引入DHT。因此,随着时间的推移,由于每个内部节点都与DHT断开连接,或者由于人们关闭计算机,重新启动以进行更新等原因,网络将崩溃。
当然,要解决此问题,某人可以部署具有新的预定稳定DHT节点或DNS地址列表的修补BitTorrent客户端,然后大声地向P2P社区做广告,以使用此新列表。但是,这将变成一种“恶作剧”的情况,其中攻击者(食节点者)将自己逐步下载这些列表,并以勇敢的新引导节点为目标,然后将它们也脱机。
简短的答案:它是从.torrent文件中获取的。
当BitTorrent客户端生成无追踪程序的.torrent文件时(也就是说,当某人准备通过BitTorrent共享新内容时),它会添加一个“节点”键(如“键/值对”中的键;就像节头一样), (不是加密密钥)到包含该客户端已知的K个最近的DHT节点的.torrent文件。
http://www.bittorrent.org/beps/bep%5F0005.html#torrent-file-extensions
无追踪程序的torrent词典没有“宣布”键。取而代之的是,无追踪程序的torrent具有“节点”键。该密钥应设置为在洪流生成客户的路由表中的K个最近的节点。或者,可以将密钥设置为已知的良好节点,例如由洪流生成者操作的节点。请不要将“ router.bittorrent.com”自动添加到torrent文件中,也不要将此节点自动添加到客户端路由表中。
因此,当您向BitTorrent客户端提供要下载的无跟踪torrent的.torrent文件时,它将使用.torrent文件中“节点”键的值来查找其前几个DHT节点。
你不能!您必须知道其中一个群集的至少一个IP,这是p2p网络的弱点。您可以盲目广播以找到第一个IP,但是在大型网络中,如果每个人都这样做,则会遇到拥塞问题。您可以使用缓存,但仅可能用于大型群集(较大的对等地址缓存)。您始终必须连接一个跟踪器才能仅询问第一个IP。
以DHT 分发意味着客户端不必拥有包含共享文件名的md5和的所有列表以及相应的对等项。哈希表的形状是相等的部分,并在整个群集中冗余分布。如果一个对等点断开连接,则在另一个地方具有与哈希表相同的部分。伙伴彼此共享哈希表部分的良好所有者的地址。
在没有跟踪者或不知道群集中至少一个成员与之交换对等对象的情况下,新客户端如何加入群集?
它要求它。
支持DHT的 Bittorrent客户端运行两个单独的对等应用程序。
第一个广告文件共享:一个群中的bittorrent行话是一组对等共享的bittorrent对象(例如文件或目录结构)。每个痛苦的对象都有一些保存在.torrent文件中的元数据。(它包括对象大小,文件夹名称,可能的跟踪器信息或节点等。)下载此bittorrent对象所需的元数据的哈希称为infohash。
DHT基本上是第二个P2P应用程序,旨在替换跟踪器:它存储(infohash,swarm)对,并在收到通知消息时更新swarm。新客户端必须了解某些“节点”(DHT的对等方的bittorrent术语)才能引导其DHT的信息。@allquixotic给出的参数在这里适用。由于MDHT当前由超过700万对等端组成,因此持续拒绝服务攻击似乎不太可能。
然后,它可以查询有关信息哈希的DHT,而不必以前使用跟踪器或不知道是群集成员的对等体。如果他联系的同伴之一支持共享元数据, 则仅需要信息哈希可以从群中检索.torrent文件。
大多数p2p网络客户端从其最初连接到的种子对等方列表进行引导...一旦连接到一个引导对等方,它就会以分布式方式下载其余的对等体。它连接到引导对等方并下载其DHT对等方列表,然后转到每个对等方并进行相同操作,依此类推。
例如:
这是引导节点列表:
https://github.com/dontcontactme/p2pspider/blob/master/lib/dhtspider.js#L10
客户端连接到此处以合并对等列表的位置:
https://github.com/dontcontactme/p2pspider/blob/master/lib/dhtspider.js#L60
这类似于跟踪器的工作方式,除了几乎任何人都可以成为引导节点,因此几乎不可能将其关闭。
比特币核心钱包的工作方式相同。如果由于某种原因默认启动被关闭,它可以让您更改启动种子对等项。