昨天我们拆解了异或距离,这个和地理毫无关系、却偏偏表现得像正经距离的奇怪度量。如果还没看过,快速回顾一下:把两个 ID 做异或,把结果当成数字读出来,那就是距离。它满足零自距、对称性和三角不等式。
数学本身很漂亮,但光靠数学没法转发数据包。今天要看的,是真正把这套数学用起来、搭出一个能跑的去中心化网络的东西:Kademlia。
你可能用过它,只是没听过这个名字
Kademlia 是那个悄悄跑在 BitTorrent、IPFS、以太坊节点发现和以太坊 Swarm 存储层下面的分布式哈希表算法。一个算法,四个完全不同的产品。
想象你要搭一个没有中心服务器的网络。成千上万个节点随时加入、随时离开,而你必须快速回答一个问题:“谁有我要找的东西?”
那些看起来理所当然的做法全都撑不住。Kademlia 的思路说起来简单,做起来确实聪明:每个节点只需要记住一小撮、对数级别的邻居,却依然能在对数级别的跳数内找到网络里的任何东西。
没有中心权威。节点可以在查找过程中突然消失,系统几乎毫无感觉。
昨天的异或距离,在这里真正派上用场
每个节点维护一张路由表,表被拆成一个个“桶”。第 i 个桶里放的,是异或距离落在 [2^i, 2^(i+1)) 这个区间里的邻居。
用大白话说:0 号桶装的是只在最后一位跟你不同的节点,最高位的桶装的是跟你的 ID 几乎毫无共同点的节点。
桶的淘汰规则才是那个容易被忽略、却非常关键的地方。Kademlia 更信任那些待了很久、仍然能响应的老节点,而不是刚冒出来的新节点。原因很直接:已经存在一段时间的节点,从统计上看更可能继续存在下去。
这种“长寿邻居优先”的策略,让整个网络在节点频繁进出时依然保持稳定。一个节点掉线了,查找路径会绕开它;一个桶满了,系统会先确认最老的节点是否还活着,再决定要不要把新节点放进来。
最终效果是:你不需要知道全网长什么样,只需要维护好自己那一小片邻居关系,就能在去中心化环境里快速定位到任意一个 ID 对应的资源。
热门跟贴