1

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


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

  • H是一个 20 字节输出的散列函数
  • infohash是种子的 info_hash(20 字节)
  • sub(hash, i)返回hash从 byte 开始的 2 个字节i(例如,sub(0x62616463666568676a696c6b6e6d706f72717473, 2) = 0x6463
  • announce_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 个字节)发生冲突,但是对于相对特定的关键字,它应该可以工作......

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


那么,这个可怕的黑客是否可行:D?我知道Retroshare 正在使用 BitTorrent 的 DHT

4

1 回答 1

1

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

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

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

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

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

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

于 2018-01-02T20:47:28.273 回答