如何管理主机列表,定期刷新其状态以确保可以访问列表中的所有主机

时间:2015-04-13 05:46:30

标签: python multithreading dht

我最近用Python实现了DHT协议Kademila。 http://www.bittorrent.org/beps/bep_0005.html

但我不知道如何实现这是一种高效的方式:

  • 一个好节点是节点在过去15分钟内响应了我们的一个查询。如果一个节点响应了我们的一个查询并且在过去15分钟内向我们发送了查询,那么节点也很好。在15分钟不活动后,节点变得有问题。当节点无法连续响应多个查询时,节点会变得很糟糕。我们知道的节点优先于状态未知的节点。
  • 当存储桶充满好节点时,简单地丢弃新节点。如果已知存储桶中的任何节点已变坏,则会将其替换为新节点。如果在最近15分钟内没有看到存储桶中存在任何可疑节点,则会对最近最少见的节点进行ping操作。如果被ping通节点响应,那么下一个最近看到的可疑节点被ping,直到一个无法响应或者已知桶中的所有节点都是好的。如果存储桶中的节点无法响应ping,建议在丢弃节点并将其替换为新的良好节点之前再次尝试。通过这种方式,表填充了稳定的长运行节点。

此规则显示了如何刷新存储桶中的节点:如果节点在15分钟内未收到节点,则会对其进行ping操作,以确定它是否仍然是一个好的节点。

我如何实施上述规则? 我应该为每个节点设置一个计时器吗?如果我在15分钟内收到消息,将重置此节点的计时器。如果时间结束,则节点将被添加到等待判断的ping队列中。

但是我没有一个好主意在Python中实现这一点,任何人都可以提供一些指导吗? 谢谢你的考虑。

1 个答案:

答案 0 :(得分:0)

BEP5相当简洁,省略了很多细节,建议也阅读original Kademlia paper

至于状态保持:对于每个路由表条目,您可以保留上次响应查询的时间(由于NAT引起的非对称可达性,上次看到的消息不足)。

你可以简单地运行一个枚举你的路由表的计时器,让我们每隔10秒钟一次,查找有问题的条目,如果可以替换,可以删除ping / bad条目。 您还可以在插入尝试时触发ping到存储桶的替换列表。

如何执行维护(事件驱动,基于计时器,主动ping和主要是被动操作搭载远程请求的维护)对Kademlia算法来说并不是那么重要。 目标是不为您的路由表中的无法访问的条目提供服务,并使您的home-bucket区域保持最新状态以补偿流失。

由于您将其标记为多线程:路由表的树和主存储桶列表应该相当稳定。因此,您可以使用写时复制数据结构(无锁读快照,锁定时修改)。替换列表会更频繁地修改,因此并发队列可能更有用。

但是正常的DHT节点无论如何都不会经历很多流量。每秒100个数据包已经是一个不寻常的高峰。这可以在一个线程上处理。 对于具有低延迟和高可靠性的多宿主服务器级节点,您实际上只需要多个线程,这可能 - 随着时间的推移 - 最终会出现在许多其他节点的路由表中。

您还可以查看现有的实施:

  • C - jch的libdht,由传输
  • 使用
  • Java - 我自己的实施
  • C++ - libtorrent-rasterbar,一个也包含dht实现并具有python绑定的bittorrent库