问题标签 [kademlia]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何重复使用 twisted 调用函数而不会遇到无限递归问题?
我正在使用twisted 开发P2P 应用程序。我试图在我的 DHT 中重复搜索特定键,并在值更改时将其添加到字典中。代码或多或少在做我想要完成的事情,除了一旦我得到一个新值,我仍然有多个正在运行的请求。这有时会给我一个运行时错误,说我已经超过了最大递归深度。我怎样才能改变这一点,以便一次只运行一个获取请求,但它仍然不断搜索?我以前从未使用过twisted,所以我仍在努力掌握它。
dht - 更改 Kademlia 指标 - 单向属性重要性
Kademlia 使用 XOR 度量。除其他外,这具有所谓的“单向”属性(= 对于任何给定的点 x 和距离 e>0,恰好有一个点 y 使得 d(x,y)=e)。
第一个问题是一个普遍的问题:度量的这个属性是否对 Kademlia 的功能至关重要,或者它只是有助于揭示来自某些节点的压力(正如原始论文所暗示的那样)。换句话说,如果我们想改变指标,那么同时拥有一个“单向”的指标有多重要?
第二个问题是关于指标的具体变化:假设我们有节点标识符(地址)作为 X 位数字,以下任何指标是否适用于 Kademlia?
d(x,y) = abs(x-y)
d(x,y) = abs(x-y) + 1/(x xor y)
第一个指标只是提供数字之间的差异,因此对于节点 ID 100,ID 为 90 和 110 的节点距离相等,因此这不是单向指标。在第二种情况下,我们修复了添加 1/(x xor y),我们知道 (x xor y) 是单向的,因此具有 1/(x xor y) 应该保留此属性。
因此,对于节点 ID 100,节点 ID 90 为d(100,90) = 10 + 1/62
,而与节点 ID 110 的距离为d(100,110) = 10 + 1/10
。
bittorrent - Bittorrent KRPC - 为什么节点 ID 的大小是 info_hash 的一半并使用每个字符 az?
这让我非常困惑。
最初的 Kademlia 提供像 sha1 这样的 160 位十六进制应该用于明显的原因:当搜索与 infohash 相关的对等点时,您只需搜索 nodeID,因为它们应该等同于与 sha1 infohash 相同的系统。
但读这个: http: //www.bittorrent.org/beps/bep_0005.html
idabcdefghi0123456789
是:1) 大小的一半 2) 使用比标准十六进制编码更多的字符。
那么我错过了什么?
为什么节点ID是这样的?
dht - 一个节点可以在 Kademlia DHT 的路由表中保留多少个 k-bucket?
来自维基百科
Kademlia routing tables consist of a list for each bit of the node ID. If a node ID consists of 128 bits, a node will keep 128 such lists.
鉴于密钥空间来自0-2^160
它意味着最大节点可以存在于该密钥空间中2^160
,并且每个节点 ID 为 160 位。如果 k=20,则节点可以在其路由表中保留的最大条目为160x20
。节点如何在其路由表中跟踪如此大量的节点。一个节点不应该只保留它自己的 k-bucket 中存在的 20 个节点的条目k=20
吗?即使该节点本身不在这些列表中,除了它存在于具有 20 个节点的一个列表中之外,它如何保留 160 个这样的列表?
我交替使用列表和存储桶,它们都是相同的。
java - 将 DHT 和 Torrent 客户端拼接在一起
我有两个 java 库。一个连接到 DHT 并可以成功下载 torrent 文件。另一个下载与种子相关的实际数据。
torrent 客户端库需要 torrent 中的announce 或announce-list 部分,并且不理解“nodes”条目。
问题是如何更改 torrent 客户端代码以了解 torrent 文件的“节点”部分。或者我如何从一组 ip:port DHT 对等地址计算跟踪器 URL?
我可以通过猜测端口号并在其上附加 /announce 来猜测 url.. 但这肯定不对吗?
有谁知道这是如何工作的?
bittorrent - bittorrent DHT 详细规范
在我的新周末项目中,我决定从头开始编写一个 bittorrent 客户端,根本没有准备好使用的库。在寻找文件两天后,我已经要放弃了:微笑:。我知道有BEP,但它们远远不足以理解所有规范。在阅读了更多之后,我认为跟踪器和对等协议似乎很旧并且易于理解/实现(是的,我知道,要编写一个平衡、对等选择、优化的好代码,这并不像我刚才所说的那样容易,但我只想做基础知识来学习,而不是与那里的数十个好客户竞争。)
所以,我决定从 DHT 开始,这似乎是更复杂的部分,而且记录也更少。当您停止寻找 bittorrent DHT 或主线 DHT 并开始寻找 kademlia DHT 时,您会获得更多信息,但如何将它们组合在一起并不那么明显。
以下是我目前所了解的(我希望填补一些空白):
- 我从空的 DHT 树开始
find_nodes
在我的引导节点上使用- 将接收到的节点添加到我自己的树中,这样我就可以选择更接近我自己 ID 的节点
- 开始向
find_nodes
选定的人发出并将他们的响应添加到我的树 - 返回 3 直到我停止接收未知/新节点
- 如果我收到一个
announce_peer
,那么info_hash
我应该将其信息保存在本地数据库中(发送者的 info_hash 和 ip/port) - 如果一个节点
get_peers
与info_hash
我的数据库中的一个节点一起使用,那么我发送信息,否则我应该发送我在自己的树中拥有的更接近节点的列表(最接近那个 info_hash) - 当我
get_peers
在其他节点上使用时,我将收到对等节点或节点,在后一种情况下,我认为节点更接近info_hash
而不是我自己的nodeId
,所以,我应该将这些节点添加到我的树中还是基于它们开始一个新树? - 当我想宣布我对我
info_hash
应该announce_peer
在任何地方使用还是只对nodeId
更接近目标的节点感兴趣时info_hash
?离多少才够近?
在这一点上,我有很多节点的 ID 更接近我自己的 ID,而关于 info_hash'es 的信息我并不真正感兴趣。
恐怕我有一个巨大的愚蠢问题:我为什么这样做?
我的意思是:我做所有这些工作的自私理由是找到我感兴趣的 info_hash 的对等点。我知道一个 info_hash 的信息很可能保存在 ID 更接近该 info_hash 的节点上。因此,如果我创建一个更接近 info_hash 而不是更接近我自己的 ID 的节点树,我找到它的信息的机会就更大(此时,如果你知道这个主题,你已经注意到我是多么迷茫)。
我应该创建多个树吗?一个给我(在那里将 info_hashes 的信息保存到更靠近我的 nodeID 人们发送给我的位置),以及另一个更靠近我的每个目标 info_hashes 的树,以便我可以检索他们的信息?
我是否应该在我的节点 ID 附近创建一棵树,并在查询这棵树以获取所需的 info_hashes 时希望获得最好的结果?
既然我完全误解了 DHT 背后的想法,我应该放弃吗?
好吧,任何真实的文档,流程图,任何东西都将受到欢迎!
bittorrent - kademlia 最近的好节点在两个请求之间不会有足够的交集
在进行 bep44 实现时,我使用定义的 kademlia 算法来找到给定哈希 id 的最近的好节点。
使用我的程序,我go run main.go -put "Hello World!" -kname mykey -salt foobar2 -b public
得到了存储超过一百个节点的值(好)。
现在,当我连续多次运行它时,put 请求写入的 ip 集相交很差。
这是一个问题,因为当我尝试执行 get 请求时,查询的 ips 集与 put 集不相交,因此找不到该值。
在我的测试中,我使用公共 dht 引导节点
当我查询节点时,我选择了 8 个最近的节点 ( nodes := s.ClosestGoodNodes(8, msg.InfoHash())
),在递归遍历后,它们通常最终出现在一个 ~1K 查询列表中。
据我了解,考虑到表的状态,在 dht 表中存储信息哈希的地址是确定性的。当我进行连续查询时,我希望表格确实会改变,但不会改变那么多。
存储节点集不相交是如何发生的?
java - Java 中的 Kademlia 实现
我想建立一个 Kademlia 网络来连接对等点并建立一个 p2p 网络。我将分配网络内节点的处理能力。对于网络,我发现这个 Kademlia Java 从 git 实现了 Setup。 https://github.com/JoshuaKissoon/Kademlia
我想知道如何设置它并用于实现网络。我找到
用于创建对等点的 2 个实例,并使用以下代码将它们相互连接。
但那是将它们连接到它运行的同一个程序中。
我想为不同的计算机相应地连接它们。被困在这里好几个小时了。我不知道如何使用这个。
bittorrent - 搜索给定的目标,如何扩大搜索范围?
给定目标 id x...19x,让我们考虑程序运行递归查询,构建一个表,一旦没有更多节点可供查询,它会发现最近的结果节点小于 8 个的情况。
我怎样才能扩大搜索范围,以便表为任何给定的 id 返回至少 8 个节点?
我可以简单地获取目标 ID(信息哈希)并搜索 info_hash+1 / info_hash-1 吗?
如果是这样,在编程方面,如何增加/减少以“afe0 ...”形式给出的id?
如果没有,可以做些什么来达到冗余节点的数量?