BitTorrent 跟踪器宣布问题

Posted

技术标签:

【中文标题】BitTorrent 跟踪器宣布问题【英文标题】:BitTorrent tracker announce problem 【发布时间】:2009-07-09 00:35:24 【问题描述】:

我花了一点空闲时间来编写一个 BitTorrent 客户端,主要是出于好奇,但部分是出于提高我的 c# 技能的愿望。

我一直使用the theory wiki 作为我的向导。我已经建立了一个处理 BEncoding 的类库,对此我很有信心;基本上是因为完整性检查是在解析后立即从我的内部表示中重新生成原始 .torrent 文件,然后进行哈希和比较。

下一阶段是让跟踪器宣布工作。在这里我遇到了一个绊脚石,因为跟踪器拒绝了我的请求而没有非常有用的错误消息。

以latest stack overflow database dump 为例。我的代码生成以下通告 URI:

http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact= 0&no_peer_id=0&事件=开始

跟踪器对我的代码的响应:

d14:failure reason32:invalid info hash and/or peer ide

跟踪器对该字符串的响应放入 Chrome 的地址栏中:

d8:completei2e11:external ip13:168.7.249.11110:incompletei0e8:intervali600e5:peerslee

peer_id 是(有效的)垃圾,但将其更改为合理的(模拟广泛使用的客户端)并不会改变任何内容。

就像我说的那样,我很确定我正确地提取了信息字典并像我应该的那样进行散列 (SHA1),并且对等 id 格式正确。

我的猜测是我在做一些愚蠢的小事,如果能帮助我找出它到底是什么,我将不胜感激。

很难猜测什么代码是相关的(而且要发布的内容很多)。不过,我会尝试发布任何要求的内容。

编辑 我没有对 info_hash 进行十六进制编码,这有帮助。

这是获取生成 URI 并尝试获取响应的代码:

//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();

【问题讨论】:

【参考方案1】:

MonoTorrent 是 Mono 附带的 BitTorrent 实现。 在HTTPTracker class 中有一个CreateAnnounceString 方法。 也许您可以将您的实现与该方法的执行方式进行比较? (您可能需要寻找AnnounceParameters 实例的创建位置。)

【讨论】:

【参考方案2】:

这不是您问题的答案,但它可能有助于测试。

那里有基于 php 的开源种子跟踪器。它们的效率非常低(我知道,我以前为其中一个写过缓存机制),但是您可以设置自己的本地跟踪器并修改 PHP 代码,以帮助调试与跟踪器通信的客户端。拥有本地客户端-服务器设置将使故障排除变得容易得多。

【讨论】:

【参考方案3】:

你到底在散列什么?您应该只对 info 部分进行哈希处理,而不是对整个种子文件进行哈希处理...所以基本上,解码文件,重新编码 info 部分,然后对其进行哈希处理。

即。对于发布的种子,您应该散列的是:

d6:lengthi241671490e4:name20:so-export-2009-07.7z12:piece lengthi262144e6:pieces18440:<lots of binary data>e

【讨论】:

【参考方案4】:

info_hash 的 URL %-encoding 有错误。 info_hash 的最后两个字节中的前导零已被删除。

It is:     info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C
Should be: info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%0F%0C  

当宣布字符串被放入 Chrome 的地址栏中时,它可能会被浏览器自动更正。

【讨论】:

以上是关于BitTorrent 跟踪器宣布问题的主要内容,如果未能解决你的问题,请参考以下文章

有关无跟踪器的 bittorrent 的一般信息,例如 BitTorrent 的 Mainline DHT

如何连接到从 bittorrent 获得的对等点

python http/udp bittorrent 跟踪器抓取库

Bittorrent DHT 中的“分布式跟踪器”概念如何运作?

BitTorrent 协议有问题

通过 UDP 向 Bittorrent Tracker 发送信息哈希