问题描述
我正在实施 DHT protocol
,我收到了许多 find_node
响应,从中我获得了新节点。我将节点放入队列中,也向它们发送 find_node
请求。我在 Linux 上运行我的 java 程序。
所以我认为我的解码是正确的,我可以从 find_node
响应中解析 IP 和端口。
但奇怪的是,我从未收到过 get_peers
或 announce_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 或通过 PCP、UPnP-IGD 或 NAT-PMP 协议(如果路由器支持)实现。
- 如果您支持 CGNAT,那么您可能无法对其进行太多控制,但在某些部署中,您的本地路由器可能能够通过 PCP 将其端口映射转发到 CGNAT。您必须检查您的路由器是否有公共 IP 或您的 ISP 的文档/帮助论坛才能弄清楚这一点。
如果您公开可见的 IP:port 元组不稳定,bittorrent DHT 将不起作用。