从 DHT 引导程序获取 Bittorrent 的混乱回复

Posted

技术标签:

【中文标题】从 DHT 引导程序获取 Bittorrent 的混乱回复【英文标题】:Getting scrambled replies from DHT bootstraps for Bittorrent 【发布时间】:2015-03-31 21:40:26 【问题描述】:

我正在尝试在 Bittorrent 主线中实现一个 DHT 节点。到目前为止,我在引导节点上建立了一个进出连接,根据一些经过编码的示例,查询似乎很好,但我得到的部分结果都是乱码(包含实际数据的部分):

d2:ip6:µ§ û©Å1:rd2:id20:ëÿ6isQÿJì)ͺ«òûãF|Âge1:t2:aa1:y1:re

这是我目前的代码:

private static String serverName = "router.utorrent.com";
private static int port = 6881;
private static String packet = "d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe";
public static void main(String[] args)  

    int port = Main.port;
    InetAddress address = InetAddress.getByName(Main.serverName);
    DatagramSocket socket = new DatagramSocket();

    byte[] buf = Main.packet.getBytes();
    DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
    socket.send(packet);
    byte[] recBuf = new byte[2048];
    DatagramPacket recPacket = new DatagramPacket(recBuf, recBuf.length);

    socket.receive(recPacket);

    System.out.println(new String(extract(recPacket)));


  private static byte[] extract(DatagramPacket packet) 
        byte[] data = packet.getData();
        int offset = packet.getOffset();
        int length = packet.getLength();

        byte[] copy = new byte[length];
        System.arraycopy(data, offset, copy, 0, copy.length);

        return copy;
      

我不确定我是否有图表集问题,或者我在任何地方都找不到指定的编码。

【问题讨论】:

既然你是用java写的,我自己的实现可能你会感兴趣:github.com/the8472/mldht 是的,而且它似乎比我更领先。谢谢! 它对我正在运行的 redis 实例非常有效。其次,我还在考虑通过 DHT 积极搜索托管特定信息哈希的节点。我想它应该比你所做的更容易。也许有任何参考资料? 我还没有 CLI 或其他类型的 UI,但基本上你只需要发出一个 PeerLookupTask 然后提供各种方法来获取抓取或对等列表结果。如果你愿意,我想你可以通过 github issues 提问。 【参考方案1】:

您的回答在我看来是正确的。听起来您希望 DHT 协议仅使用 ascii 字符,但事实并非如此。 160位节点ID以20字节传输,IP和端口以6字节传输。

请参阅protocol specification。

【讨论】:

以上是关于从 DHT 引导程序获取 Bittorrent 的混乱回复的主要内容,如果未能解决你的问题,请参考以下文章

使用 libtorrent 获取 Bittorrent DHT 消息的所有字段

使用 BitTorrent 的 DHT 执行实时关键字搜索

一个功能齐全的 BitTorrent 库,支持 DHT磁力链接加密等功能

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

BitTorrent DHT 协议中文翻译

BitTorrent 协议中的 PEX 和 DHT 有啥区别?