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

Posted

技术标签:

【中文标题】使用 BitTorrent 的 DHT 执行实时关键字搜索【英文标题】:Using BitTorrent's DHT to perform real-time keyword searches 【发布时间】:2018-01-02 17:18:20 【问题描述】:

我有一个想法,利用现有的BitTorrent DHT实现一个基于关键字的实时种子搜索机制,我想知道它是否可行和现实。


我们有一个种子,我们希望能够仅使用 DHT 从keyword 找到它。

H 是一个 20 字节输出的散列函数 infohash 是种子的 info_hash(20 字节) sub(hash, i) 返回 2 个字节的 hash,从字节 i 开始(例如,sub(0x62616463666568676a696c6b6e6d706f72717473, 2) = 0x6463announce_peer(hash, port) 发布与虚假 info_hash hash 关联的虚假对等点。 fake peer 的 IP 无关紧要,我们使用port 数字来存储数据(2 个字节)。 get_peers(hash) 检索与虚假 info_hash hash 关联的虚假对等点。让我们考虑这个函数只返回一个端口号列表。 a ++ b 表示连接 ab(例如,0x01 ++ 0x0203 = 0x010203

出版

id <- sub(infohash, 0)
announce_peer( H( 0x0000 ++ 0x00 ++ keyword ), id               )
announce_peer( H( id     ++ 0x01 ++ keyword ), sub(infohash, 2 ))
announce_peer( H( id     ++ 0x02 ++ keyword ), sub(infohash, 4 ))
announce_peer( H( id     ++ 0x03 ++ keyword ), sub(infohash, 6 ))
announce_peer( H( id     ++ 0x04 ++ keyword ), sub(infohash, 8 ))
announce_peer( H( id     ++ 0x05 ++ keyword ), sub(infohash, 10))
announce_peer( H( id     ++ 0x06 ++ keyword ), sub(infohash, 12))
announce_peer( H( id     ++ 0x07 ++ keyword ), sub(infohash, 14))
announce_peer( H( id     ++ 0x08 ++ keyword ), sub(infohash, 16))
announce_peer( H( id     ++ 0x09 ++ keyword ), sub(infohash, 18))

搜索

ids <- get_peers(H( 0x0000 ++ 0x00 ++ keyword ))
foreach (id : ids)

    part1 <- get_peers(H( id ++ 0x01 ++ keyword ))[0]
    part2 <- get_peers(H( id ++ 0x02 ++ keyword ))[0]
    part3 <- get_peers(H( id ++ 0x03 ++ keyword ))[0]
    part4 <- get_peers(H( id ++ 0x04 ++ keyword ))[0]
    part5 <- get_peers(H( id ++ 0x05 ++ keyword ))[0]
    part6 <- get_peers(H( id ++ 0x06 ++ keyword ))[0]
    part7 <- get_peers(H( id ++ 0x07 ++ keyword ))[0]
    part8 <- get_peers(H( id ++ 0x08 ++ keyword ))[0]
    part9 <- get_peers(H( id ++ 0x09 ++ keyword ))[0]

    result_infohash <- id ++ part1 ++ part2 ++ ... ++ part9
    print("search result:" ++ result_infohash)


我知道会与 id 发生冲突(仅 2 个字节),但使用相对特定的关键字应该可以工作...

我们还可以通过按字母数字顺序连接多个单词来构建更具体的关键字。例如,如果我们有单词ABC与种子相关联,我们可以发布关键字ABCA ++ BA ++ CB ++ CA ++ B ++ C


那么,这个可怕的 hack 可行吗 :D ?我知道Retroshare is using BitTorrent's DHT。

【问题讨论】:

【参考方案1】:

这不太可能实用,因为它甚至没有尝试提高效率(查找次数)或可靠(失败率乘以查找次数)。这是针对单个关键字的,而不是布尔查询,它会进一步增加查找的复杂性。

更不用说它甚至没有解决分布式搜索的难题,例如避免垃圾邮件和审查。

其他问题是每个节点只能在一个关键字下发布一个种子,并且需要多个节点在遇到冲突问题之前以某种方式协调他们在哪个关键字下发布的内容。

当然,您可能能够使其在少数情况下工作,但这无关紧要,因为 p2p 协议的使用应该设计为在 所有节点 节点以类似的方式使用该功能。显然 (m * n * 10) 倍 [m = 每个关键字的种子,n = 搜索词的数量] 网络流量爆炸是不可接受的。

如果您对分布式关键字搜索非常感兴趣,我建议您访问 google Academic 和 arxiv 并查找现有研究,这是一个不平凡的话题。

对于 bittorrent,您还应该超越 BEP 5。BEP 44 提供任意数据存储,BEP 46、49 和 51 描述了额外的构建块和抽象。但我认为它们都不足以用于实时分布式多关键字搜索,因为人们期望它来自本地数据库或索引网站。

【讨论】:

以上是关于使用 BitTorrent 的 DHT 执行实时关键字搜索的主要内容,如果未能解决你的问题,请参考以下文章

BitTorrent DHT 协议中文翻译

BitTorrent DHT 协议

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

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

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

javascript BitTorrent DHT爬虫