在 Kademlia DHT 中,一个节点可以在其路由 table 中保留多少个 k-buckets?

How many k-buckets can a Node keep in its routing table in Kademlia DHT?

来自Wikipedia
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,那么节点在其路由 table 中可以保留的最大条目是 160x20。节点如何在其路由中跟踪如此大量的节点table。一个节点不应该只保留它自己的 k-bucket 中桶大小为 k=20 的那 20 个节点的条目吗?它如何保留 160 个这样的列表,即使该节点本身不在这些列表中,只是它出现在一个包含 20 个节点的列表中?

我交替使用列表和存储桶,它们是相同的。

路由 table 大小受 O(log₂(n/k)) 渐近限制,其中 n 是网络中的 实际 节点数,而不是2^160k 的理论限制是桶大小,因此较大的桶会稍微减少路由 table.

中的桶数

在实践中,对于 k=8 和 ~7M 可达节点的 bittorrent ipv4 dht,你得到的路由 table 深度约为 19-22 个桶。

而且即使在理论上,160*20 也不会像您想象的那么糟糕。这只是 3200 个 IP 地址 + 一个小的关联状态,用于保存在内存中并时不时地发送一个数据包。将 ping 设置为每秒一次意味着您仍然可以在一小时内刷新整个路由 table。