来自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,那么节点可以在其路由表中保留的最大条目是160x20
。节点如何在其路由表中跟踪如此大量的节点。节点是否应该只保留其自己的k-bucket中存在桶大小为k=20
的那20个节点的条目?它是如何保留160个这样的列表,即使该节点本身不在这些列表上,除了它存在于一个包含20个节点的列表中?
我可以互换使用列表和存储桶,它们都是相同的。
答案 0 :(得分:1)
路由表大小由O(log₂(n/k))
渐近限制,其中n
是网络中实际的节点数,而不是2^160
的理论限制, k
是桶大小,因此较大的桶会略微减少路由表中的桶数。
在实践中,对于k = 8和~7M可达节点的bittorrent ipv4 dht,您可以获得大约19-22个桶的路由表深度。
即使理论上,160 * 20也不会像你想象的那样糟糕。这只是3200个IP地址+一个小的关联状态,可以保留在内存中,并且偶尔会发送一个数据包。将ping操作调整为每秒一次意味着您仍然可以在一小时内刷新整个路由表。