一旦启动,BitTorrent 客户端会生成一个名为 的 20 字节标识符peer_id
,它由ClientIdentifierClientVersion-RandomNumbers
. 授予,ClientIdentifier
并且ClientVersion
不提供任何身份证明,但RandomNumbers
可以用于识别客户,并且需要了解一些事项:
peer_id
可以是客户想要发送的任何东西。该协议没有定义它应该如何生成,也没有定义它应该如何构建。
客户将其提供peer_id
给任何要求它的人(这是握手的一部分)。
设置no_peer_id
标志允许通信发生而无需透露peer_id
.
peer_id
每次重新启动客户端时都会生成。uTorrent 3.3 甚至会在运行时生成一个新peer_id
的。
然而,BitTorrent使用了一个名为Kademlia的DHT,这对于安全研究(AKA stalkers)来说是一个好消息。不久前,我分析了 uTorrent 和传输,它们都使用 DHT/PEX 加密(如果启用并强制)。
当客户端进入 DHT“网络”时,它通过连接到一些引导服务器来引导。这通常发生在您第一次运行新客户端时。但这并不是引导 Kademlia 时发生的唯一事情。
当客户端加入网络时,它会获得一个随机生成的标识符,称为node ID
. 此节点 ID 是从与 BitTorrent 的“信息哈希”相同的 160 位空间中随机选择的。您可以随时清除您的 DHT 信息并重新加入网络,这将为您提供一个新的标识符。由于这样做的用户并不多,因此您可以相对地将其视为标识符。
要获得客户的信息,node ID
向他们发送 DHTping
消息就足够了,它会用它的 ID 进行响应
{"t":"T_ID", "y":"q", "q":"ping", "a":{"id":"THE_SENDER_ID
"}}
t
是事务 ID,它标识消息并与响应一起发回
y
是消息的类型,值"q"
表示它是一个查询。
q
是查询的类型,这里是 ping 查询。
a
表示查询的参数。这里它只包含发送者的节点 ID。
客户会回应
Response = {"t":"T_ID", "y":"r", "r": {"id":"MY_ID"}}
"r"
的值y
意味着这是一个响应。
这些主要是协议本身提供的两种识别客户端的方法。