2012-01-22 67 views
2

我应该模拟一个p2p协议(使用Java),其中每个节点最初与一个邻居建立连接。然后,使用发现算法,每个节点找到新的潜在邻居,并且可以连接其中的一些邻居。如何避免两个节点之间的双重连接?

假设覆盖网络的两个节点(如A和B)不是彼此相邻的:如果他们同时发现它们会发生什么? A发送连接请求给B,而B发送连接请求,以A,这样两个TCP连接建立,但两者之一将是无用的...

  1. 有没有办法来避免这个问题?
  2. 另外,如果最坏的情况发生这个问题,我怎么能发现它不必要放弃连接?

假设每个节点具有唯一的ID,这将是足以与两个邻居的ID每个连接相关联,以使该节点可以定位和消除一些重复的连接。这可能是一个解决方案,但是...有更好的解决方案来打破任何重复的连接?

回答

1

一个基本的解决方案是确保打开出站连接和入站连接是不能同时执行的操作。您可以为此使用并发基元。

如果这些操作成为顺序,那么很容易避免双重链接:跟踪所有当前打开的连接(入站和出站)。然后,当请求入站连接时,检查是否已有出站连接。如果是这样,拒绝新的。

1

您可以使用散列表来存储每个节点上的连接,并使用唯一ID作为散列键。

建立新连接(传出或传入)时,可以检查散列表中是否存在对等节点,并使用新连接替换旧连接,以确保没有重复连接。

相关问题