如何在公告请求中将可选的 IP 参数传递给 bittorrent 跟踪器?

How to pass optional IP parâmeter to bittorrent tracker in announce request?

提前感谢您花时间阅读本文。

我在 python 中实现了一个 bittorrent 跟踪器客户端,它成功地与 udp 跟踪器通信并从中检索对等列表。

从跟踪器检索到的对等列表示例。在这种情况下,对等点是我自己的计算机,因为只有我在跟踪器中宣布:

[('34.2.289.11', 53016)]

这是将传递给 annouce 查询的参数转换为字节对象的代码:

msg = struct.pack('!QII20s20sQQQIIIIH', self.client.connid, action, tid,
                  infohash, self.client.peerid, downloaded, left,
                  uploaded, event, ip, key, num_want, port)

“ip”参数是一个整数,通常传递的值为 0。这是默认值,这意味着跟踪器本身将确定我的 IP 并在将我的端点信息传递给加入群的其他对等点时使用它.

但是 bittorrent 规范告诉我们可以选择传递自定义 IP 或 DNS 名称供跟踪器使用。

问题是我在使用 struct.pack() 之前将 ip 参数的值更改为大于 0 的任何数字,但它不起作用,因为跟踪器的响应仍然是我的 public IP,即:

[('34.2.289.11', 53016), ('34.2.289.11', 59509)]

(忽略列表中的第一个元组,当我发送“ip”参数等于0的announce请求时它是我自己的计算机)

我知道跟踪器本身可能会忽略 ip 参数。但我测试了 50 种不同的追踪器,每一种都 returns 我的 IP 地址,而不是我试图通过的自定义追踪器。因此我认为问题出在我的实现上。

I know it might be possible that the trackers themselves may be ignoring the ip parâmeter. But I tested 50 different trackers and every one of them returns my IP address, not the custom one im trying to pass. Therefore I think the problem is in my implementation.

由于安全问题,几乎所有 public/open 跟踪器都不会接受 IP 参数。原则上他们可以进行主动验证(一些跟踪器软件支持)但是对于开放跟踪器来说太昂贵了。在实践中,只有 user-bases 较小的跟踪器会允许它,通过客户端身份验证或主动验证进行门控。

I have implemented a bittorrent tracker client in python that successfully communicates with udp trackers and retrieves a peer list from them.

我希望 UDP 跟踪器更不可能支持此参数,因为 UDP 跟踪器协议适用于 high-load 更不可能提供任何类型验证的场景。

出于测试目的,您应该寻找一些明确支持 IP 参数的跟踪器软件(可能是用于私有 Torrent 站点的 HTTP 跟踪器,或者至少是未针对高负载场景进行修剪的实现)和 运行 它本地。确保服务器端支持它后,您可以正确测试客户端。