![简单来说,BitTorrent 客户端最初如何使用 DHT 发现对等点?](https://linux22.com/image/1362423/%E7%AE%80%E5%8D%95%E6%9D%A5%E8%AF%B4%EF%BC%8CBitTorrent%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%80%E5%88%9D%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20DHT%20%E5%8F%91%E7%8E%B0%E5%AF%B9%E7%AD%89%E7%82%B9%EF%BC%9F.png)
答案1
概括
在没有跟踪器或至少一个群组成员的知识的情况下,新客户端如何加入群组以进行对等交换?
你不能。这是不可能的。*
*(除非你的局域网恰好已经是 DHT 中的一个节点。在这种情况下,您可以使用广播机制(例如 Avahi)来“发现”此对等节点,并从中引导。但是如何他们自己引导?最终,您会遇到需要连接到公共互联网的情况。而公共互联网是单播的,不是多播的,所以您只能使用预先确定的对等点列表。)
参考
Bittorrent DHT通过称为卡德姆利亚,这是理论概念的一个特例分布式哈希表。
展览
使用 Kademlia 协议,当你加入网络时,你将经历引导程序,这绝对要求你知道,提前,即已参与 DHT 网络的至少一个节点的 IP 地址和端口。例如,您连接的跟踪器本身可能就是一个 DHT 节点。连接到一个 DHT 节点后,您就可以继续从 DHT 下载信息,DHT 会为您提供更多节点的连接信息,然后您可以浏览该“图”结构以获取与更多节点的连接,这些节点既可以提供与其他节点的连接,也可以提供有效载荷数据(下载块)。
我认为你实际的问题用粗体表示——如何在不知情的情况下加入 Kademlia DHT 网络任何其他成员——是基于一个错误的假设。
对于你用粗体标出的问题,简单的答案是,你没有。如果您对可能包含 DHT 元数据的主机一无所知,那么您将陷入困境——甚至无法开始。我的意思是,当然,您可以暴力尝试在公共互联网上发现一个具有开放端口的 IP,该 IP 恰好广播 DHT 信息。但更可能的是,您的 BT 客户端被硬编码到某个特定的静态 IP 或 DNS,该 IP 或 DNS 解析为稳定的 DHT 节点,该节点仅提供 DHT 元数据。
基本上,DHT 的去中心化程度仅与加入机制一样,而且由于加入机制相当脆弱(无法在整个互联网上“广播”!所以你必须单播到单独的预先分配的主机获取 DHT 数据),Kademlia DHT 不是真的去中心化。严格意义上来说不是。
想象一下这样的场景:有人想让 P2P 停止,准备攻击全部常用的稳定 DHT 节点用于引导。一旦他们发起攻击,他们就会将其全部节点一次完成。威猛;所有引导 DHT 节点都一下子瘫痪了。现在怎么办?你只能连接到集中追踪器下载传统的同伴列表。如果他们也攻击追踪器,那么你真的真的陷入困境。换句话说,Kademlia 和整个 BT 网络受到互联网本身的限制,即您必须成功攻击或使之下线的计算机数量有限(且数量相对较少),才能阻止 90% 以上的用户连接到网络。
一旦“伪集中式”引导节点全部消失,DHT 的内部节点(由于DHT 外部的任何人都不知道内部节点,是无用的;它们无法将新节点带入 DHT。因此,随着每个内部节点随着时间的推移与 DHT 断开连接(无论是由于人们关闭计算机、重新启动进行更新等),网络将崩溃。
当然,为了解决这个问题,有人可以部署一个修补过的 BitTorrent 客户端,其中包含一个新的预先确定的稳定 DHT 节点或 DNS 地址列表,并大声向 P2P 社区宣传使用这个新列表。但这会变成一种“打地鼠”的局面,攻击者(节点吞噬者)会逐步下载这些列表,并瞄准勇敢的新引导节点,然后将它们也脱机。
答案2
简短回答:它从 .torrent 文件中获取。
当 BitTorrent 客户端生成一个无跟踪器的 .torrent 文件(即,当有人准备通过 BitTorrent 分享新内容时),它会将一个“节点”键(键作为“键/值对”中的键;类似于节标题,而不是加密密钥)添加到包含该客户端已知的 K 个最近 DHT 节点的 .torrent 文件。
http://www.bittorrent.org/beps/bep%5F0005.html#torrent-file-extensions
无跟踪器的种子字典没有“announce”键。相反,无跟踪器的种子具有“nodes”键。此键应设置为种子生成客户端路由表中的 K 个最近节点。或者,可以将该键设置为已知的良好节点,例如由生成种子的人操作的节点。请不要自动将“router.bittorrent.com”添加到种子文件或自动将此节点添加到客户端路由表。
因此,当您向 BitTorrent 客户端提供要下载的无跟踪器种子的 .torrent 文件时,它会使用 .torrent 文件中“nodes”键的值来查找其前几个 DHT 节点。
答案3
不行!你必须知道其中一个群组的至少一个 IP,这是 p2p 网络的弱点。你可以盲目广播来查找第一个 IP,但在大型网络中,如果每个人都这样做,就会出现拥塞问题。你可以使用缓存,但只有大型群组才有可能(更大的对等地址缓存)。你总是必须连接跟踪器才能询问第一个 IP。
分散式DHT 意味着客户端不必保存包含共享文件名称的 md5 和的所有列表,以及相应的对等点。哈希列表被分成相等的部分,并在整个群集中以冗余方式分布。如果对等点断开连接,则在某处有另一个具有相同哈希列表部分的对等点。对等点将彼此的地址共享给哈希列表部分的良好持有者。
答案4
大多数 p2p 网络客户端都是从它们最初连接的种子对等点列表引导的...一旦它们连接到一个引导对等点,它就会以分布式方式下载其余的对等点。它连接到引导对等点并下载其 DHT 对等点列表,然后转到每个对等点并执行相同操作,等等。
例如:
以下是引导节点的列表:
https://github.com/dontcontactme/p2pspider/blob/master/lib/dhtspider.js#L10
这里是客户端连接它们来补充对等列表的地方:
https://github.com/dontcontactme/p2pspider/blob/master/lib/dhtspider.js#L60
这与跟踪器的工作方式类似,不同之处在于几乎任何人都可以成为引导节点,因此几乎不可能关闭它们。
比特币核心钱包的工作原理相同。如果由于某种原因默认的启动种子对等体被关闭,它允许您更改启动种子对等体。