微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实现 DHT 得到了 find_node 响应,但从未得到过 get_peers 或announce_peers 请求

如何解决实现 DHT 得到了 find_node 响应,但从未得到过 get_peers 或announce_peers 请求

我正在实施 DHT protocol,我收到了许多 find_node 响应,从中我获得了新节点。我将节点放入队列中,也向它们发送 find_node 请求。我在 Linux 上运行我的 java 程序。

所以我认为我的解码是正确的,我可以从 find_node 响应中解析 IP 和端口。

但奇怪的是,我从未收到过 get_peersannounce_peers 请求。是什么错误导致了我的情况?

我无法解释的一件事是,在 find_node 响应中,我得到了一个密钥 IP,它是解析后我自己的 IP 和端口。但是每次的端口都不一样。为什么端口不同?

解决方法

但奇怪的是,我从未收到过 get_peers 或announce_peers 请求。是什么错误导致了我的情况?

DHT 节点 A 只会发送请求,前提是您已被添加到另一个节点 B 沿其目的地路径的某个路由表中。只有当您的节点表现良好,即具有良好的正常运行时间,具有稳定的 IP、端口、ID 并正确响应各种查询类型(例如 ping)时,您才会被添加到路由表中。

我无法解释的一件事是,在 find_node 响应中,我得到了一个关键 IP,它是解析后我自己的 IP 和端口。但是每次的端口都不一样。为什么端口不同?

  • 对于所有 DHT 通信,您应该使用单个 UDP 套接字 bound 到本地计算机上的特定端口 IP 地址。这对于 IPv6 实施来说尤为重要,因为主机通常有多个 IPv6 地址。
  • 如果您在本地 NAT 后面,您需要确保从您的公共地址到本地机器有稳定的端口映射。这可以通过路由器中的 manual port forwarding 或通过 PCPUPnP-IGDNAT-PMP 协议(如果路由器支持)实现。
  • 如果您支持 CGNAT,那么您可能无法对其进行太多控制,但在某些部署中,您的本地路由器可能能够通过 PCP 将其端口映射转发到 CGNAT。您必须检查您的路由器是否有公共 IP 或您的 ISP 的文档/帮助论坛才能弄清楚这一点。

如果您公开可见的 IP:port 元组不稳定,bittorrent DHT 将不起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。