BitTorrent peer (Deluge) 在说什么?

What is BitTorrent peer (Deluge) saying?

我正在编写一个小应用程序来测试 torrent p2p 的工作原理,我创建了一个示例 torrent 并从我的 Deluge 客户端播种。我正在尝试从我的应用程序连接到 Deluge 并下载文件。

有问题的种子文件是单文件种子文件(文件名为 A - 没有任何扩展名),其数据是ASCII 字符串 Test.

参考 this 我能够提交初始握手并得到有效回复。

紧接着 Deluge 发送了更多数据。从第 5 个字节开始,它似乎是一条 bitfield 消息,但我不确定该怎么做。我读到 Torrent 客户端可能会发送混合的 BitfieldHave 消息以显示他们拥有 Torrent 的哪些部分。 (我的客户没有发送任何位域,因为它假设没有任何有问题的文件部分)。

如果我的理解是正确的,它表示消息大小为 2:一个用于标识符 + 负载。如果是这样,为什么它会发送这么多数据,那应该是什么?

在我的应用程序发送 interested 命令后,同样的事情发生了。 Deluge 以 unchoke 的 1 字节消息响应(但随后再次附加更多数据)。

最后,当它实际提交 部分 时,我不确定如何处理这些数据。第一个带下划线的字节是 84,它对应于字母 T,正如预期的那样,但我无法理解其余数据。

请注意,所讨论的 link 并未真正指定客户端在初始握手完成后应如何按顺序提供消息。我只是假设根据对我来说似乎有意义的内容发送 interestedrequest,但我可能会完全偏离。

我认为 Deluge 不会发送您看到的额外字节。

如果您查看它们,您会注意到所有额外的字节都是握手消息中已经存在的字节,这应该是您迄今为止收到的最长的消息。

我认为您正在将新消息读入同一个缓冲区,而没有将其清零或进行任何操作,因此您再次看到来自较早消息的字节,跟在您读取的最新消息的字节之后。

考虑检查您正在使用的网络 API 是否有办法检查实际收到的字节数,并且只查看缓冲区的那一部分,而不是整个缓冲区。