使用 BitTorrent 的 DHT 进行实时关键字搜索
Using BitTorrent's DHT to perform real-time keyword searches
我有一个想法,利用现有的 BitTorrent DHT 实现一个基于关键字的实时 torrent 搜索机制,我想知道它是否可行和现实。
我们有一个 torrent,我们希望能够仅使用 DHT 从 keyword
中找到它。
H
是一个散列函数,输出为20字节
infohash
是 torrent 的 info_hash(20 字节)
sub(hash, i)
returns 2 个字节的 hash
从字节 i
开始(例如,sub(0x62616463666568676a696c6b6e6d706f72717473, 2) = 0x6463
)
announce_peer(hash, port)
发布了一个与虚假 info_hash hash
关联的虚假对等点。假节点的 IP 是无关紧要的,我们使用 port
数字来存储数据(2 个字节)。
get_peers(hash)
检索与假 info_hash hash
关联的假对等点。让我们考虑这个函数 returns 只有端口号的列表。
a ++ b
表示连接a
和b
(例如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 个字节),但是对于相对特定的关键字,它应该可以工作...
我们还可以通过按字母数字顺序连接几个词来构建更具体的关键字。例如,如果我们有单词 A
、B
和 C
与 torrent 相关联,我们可以发布关键字 A
、B
、C
, A ++ B
, A ++ C
, B ++ C
和 A ++ B ++ C
.
那么,这个糟糕的破解是否可行 :D ?我知道 Retroshare is using BitTorrent's DHT.
它不太可能实用,因为它甚至没有尝试提高效率(查找次数)或可靠性(失败率乘以查找次数)。这是针对单个关键字的,而不是布尔查询,后者会进一步增加查找的复杂性。
更不用说它甚至没有解决分布式搜索的难题,例如避免垃圾邮件和审查。
其他问题是每个节点只能在一个关键字下发布一个 torrent,并且需要多个节点以某种方式协调它们在哪个关键字下发布的内容,然后才能 运行 进入冲突问题。
当然你可以让它在少数情况下工作,但这无关紧要,因为 p2p 协议的使用应该以一种方式设计,使得它们在这种情况下仍然可以工作 所有节点 个节点以类似的方式使用该功能。显然,(m * n * 10) 倍 [m = 每个关键字的种子,n = 搜索词的数量] 网络流量的爆炸是不可接受的。
如果你对分布式关键词搜索非常感兴趣,我建议你点击 google scholar 和 arxiv 并寻找现有的研究,这是一个不平凡的话题。
对于 bittorrent,您还应该超越 BEP 5。BEP 44 提供任意数据存储,BEP 46、49 和 51 描述了额外的构建块和抽象。但我认为其中 none 足以进行实时分布式多关键字搜索,正如人们期望从本地数据库或索引网站获得的那样。
我有一个想法,利用现有的 BitTorrent DHT 实现一个基于关键字的实时 torrent 搜索机制,我想知道它是否可行和现实。
我们有一个 torrent,我们希望能够仅使用 DHT 从 keyword
中找到它。
H
是一个散列函数,输出为20字节infohash
是 torrent 的 info_hash(20 字节)sub(hash, i)
returns 2 个字节的hash
从字节i
开始(例如,sub(0x62616463666568676a696c6b6e6d706f72717473, 2) = 0x6463
)announce_peer(hash, port)
发布了一个与虚假 info_hashhash
关联的虚假对等点。假节点的 IP 是无关紧要的,我们使用port
数字来存储数据(2 个字节)。get_peers(hash)
检索与假 info_hashhash
关联的假对等点。让我们考虑这个函数 returns 只有端口号的列表。a ++ b
表示连接a
和b
(例如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 个字节),但是对于相对特定的关键字,它应该可以工作...
我们还可以通过按字母数字顺序连接几个词来构建更具体的关键字。例如,如果我们有单词 A
、B
和 C
与 torrent 相关联,我们可以发布关键字 A
、B
、C
, A ++ B
, A ++ C
, B ++ C
和 A ++ B ++ C
.
那么,这个糟糕的破解是否可行 :D ?我知道 Retroshare is using BitTorrent's DHT.
它不太可能实用,因为它甚至没有尝试提高效率(查找次数)或可靠性(失败率乘以查找次数)。这是针对单个关键字的,而不是布尔查询,后者会进一步增加查找的复杂性。
更不用说它甚至没有解决分布式搜索的难题,例如避免垃圾邮件和审查。
其他问题是每个节点只能在一个关键字下发布一个 torrent,并且需要多个节点以某种方式协调它们在哪个关键字下发布的内容,然后才能 运行 进入冲突问题。
当然你可以让它在少数情况下工作,但这无关紧要,因为 p2p 协议的使用应该以一种方式设计,使得它们在这种情况下仍然可以工作 所有节点 个节点以类似的方式使用该功能。显然,(m * n * 10) 倍 [m = 每个关键字的种子,n = 搜索词的数量] 网络流量的爆炸是不可接受的。
如果你对分布式关键词搜索非常感兴趣,我建议你点击 google scholar 和 arxiv 并寻找现有的研究,这是一个不平凡的话题。
对于 bittorrent,您还应该超越 BEP 5。BEP 44 提供任意数据存储,BEP 46、49 和 51 描述了额外的构建块和抽象。但我认为其中 none 足以进行实时分布式多关键字搜索,正如人们期望从本地数据库或索引网站获得的那样。