我正在编写一个 p2p 实现,我想让它去中心化,但是我在理解诸如 bittorrent 之类的协议中的 DHT 如何工作时遇到了一些麻烦。如果没有跟踪器,客户端如何知道对等点在哪里?对等点是否存储在实际的 torrent 文件中?
4 回答
对于 trackerless/DHT 种子,对等 IP 地址使用 BitTorrent 信息哈希作为密钥存储在 DHT 中。由于跟踪器所做的基本上都是响应 put/get 请求,因此此功能与 DHT(分布式哈希表)提供的接口完全对应:它允许您通过 infohash 在 DHT 中查找和存储 IP 地址。
因此,“获取”请求将查找 BT 信息哈希并返回一组 IP 地址。“put”存储给定 infohash 的 IP 地址。这对应于您向跟踪器发出的“通知”请求,以接收对等 IP 地址的字典。
在 DHT 中,对等点被随机分配以存储属于密钥空间的一小部分的值;散列确保密钥在参与的对等方之间随机分布。DHT 协议(BitTorrent 的Kademlia)确保 put/get 请求被有效地路由到负责维护给定密钥的 IP 地址列表的对等方。
一般理论可以在维基百科关于Kademlia的文章中找到。bittorrent 中使用的具体协议规范在这里:http ://wiki.theory.org/BitTorrentDraftDHTProtocol
bittorrent 和 DHT 发生的情况是,在开始时,bittorrent 使用嵌入在 torrent 文件中的信息从 DHT 转到跟踪器或一组节点中的一个。然后,一旦找到一个节点,它就可以继续寻找其他节点并使用 DHT 进行持久化,而无需集中式跟踪器来维护它。
原始信息引导了 DHT 的后续使用。
DHT 节点具有唯一标识符,称为节点 ID。节点 ID 是从与 BitTorrent 信息散列相同的 160 位空间中随机选择的。接近度是通过比较Node ID的路由表来衡量的,越接近的Node越详细,从而得到最优的
那么是什么让它们比使用简单无符号整数的前身“Kademlia”更优化:距离(A,B)=|A xor B| 较小的值更接近。异或。除了不安全之外,它的逻辑也是有缺陷的。
如果您的客户端支持 DHT,则保留 8 字节,其中包含 0x09,后跟 2 字节有效负载,带有 UDP 端口和 DHT 节点。如果握手成功,上述将继续。