我目前正在处理 Chord 协议。
对于每个节点,有两个函数,findSuccessor
它们closestPrecedingNode
以伪代码的形式给出。
findSuccessor
是:
n.findSuccessor(id)
if(id is.in (n, successor])
return successor;
else
n' = closestPrecedingNode(id);
return n'.findSuccessor(id);
closestPrecedingNode
是:
n.closestPrecedingNode(id)
for i = m downto 1
if(finger[i] is.in (n, id))
return finger[i];
return n;
创建节点时,其后继者最初设置为节点本身,其手指表为空。
现在我的问题是当只有一个节点时会发生什么,并且要求它提供除自己的 id 之外的任何id。然后findSuccessor
运行else
块并调用closestPrecedingNode
. 由于手指表为空,节点本身返回到findSuccessor
. 因此n'
等于n
。
之后,findSuccessor
调用 on n'
,这是对自身的递归调用。
然后我们有一个无限循环......或者我错过了什么?
注意:伪代码取自Chord: A Scalable Peer-to-peer Lookup Protocol for Internet Applications,第 5 页。