【问题标题】:Mainline DHT bootstrap process主线 DHT 引导过程
【发布时间】:2011-09-28 21:18:04
【问题描述】:
有人可以澄清一下主线 DHT 规范中的声明吗?
在将第一个节点插入其路由表并在其后启动时,该节点应尝试在 DHT 中找到离自身最近的节点。它通过向越来越近的节点发出 find_node 消息来做到这一点,直到找不到更近的节点为止。
“直到找不到更近的地方”是什么意思?
当我的程序开始发送 find_node 消息时,它有一组空节点。每个对 find_node 消息的响应都会返回大约 8 个 dht 节点。我的程序将它们收集在列表中。
我的程序何时必须停止发送查找节点消息?
我认为它必须在接收到所有元素都在已收集节点列表中的 dht 节点集时停止发送?
我说的对吗?
提前谢谢你。
【问题讨论】:
标签:
implementation
bootstrapping
bittorrent
dht
【解决方案1】:
Mainline DHT 是一个 kademlia 实现,详情见the paper。
从您收到的 8 个节点中,按照节点 ID 与您自己 ID 的接近程度对它们进行排序,然后将 find_node 发送到前 3 个节点(离您最近的 3 个节点)。然后,您将收到 8 x 3 个以上的节点,将它们插入您的节点列表中,仍然按照节点与您的距离排序。继续向 3 个顶级节点发送 find_node 消息(忽略您已经向其发送消息的节点),直到您返回的节点已经在您的列表中。即终止条件是您已向距离您最近的所有 8 个节点(在列表顶部)发送了一条消息。
正如论文所解释的,距离度量是 XOR。要计算您的节点 ID 与另一个节点的距离,您可以对节点 ID 进行异或运算。结果越低,节点之间的距离越近。
在现实生活中,您可能希望做的更复杂一点,在任何给定时间保留 3 个未完成的请求,并在超时中途临时打开更多未完成的请求。