Sirius
Sirius
Home avatar

Fan的博客

KRPC请求格式

所有的 KRPC 消息都是通过 UDP 传输的、经过 Bencode 编码的字典。 本文主要介绍find_nodeget_peersannounce_peer 这三个 RPC 调用的请求和响应消息结构。

通用结构元素:

  • t: 事务 ID (Transaction ID),二进制字符串,由请求方设置,响应方必须在响应中原样返回。
  • y: 消息类型 (Message Type),单个字符,‘q’ 代表查询 (Query),‘r’ 代表响应 (Response),’e’ 代表错误 (Error)。
  • v (可选): 客户端版本信息 (Version),通常是字符串。
  • ip (可选,通常在响应中出现): 响应者看到的请求者的公网 IP 地址和端口 (紧凑的 6 字节二进制字符串)。

目的: 向一个节点请求,获取它所知道的、其 Node ID 在 XOR 距离上最接近指定 target Node ID 的 k 个节点的联系信息。这主要用于路由表的填充和更新,以及在其他查找(如 get_peers)中进行迭代查询。 find_node 请求用于询问某个节点:“请告诉我你认识的、离 target 这个 Node ID 最近的那些节点是谁?”。响应则直接返回一个包含这些节点(最多 k 个)联系信息的紧凑字符串。这个 RPC 是 DHT 网络进行节点发现和路由的基础。

KRPC

好的,我们来详细介绍一下 KRPC 协议。这是 BitTorrent Mainline DHT 网络中节点之间进行通信所使用的协议。 KRPC 是 BitTorrent DHT 的基石通信协议。它利用 UDP 的高效性和 Bencode 的简洁性,定义了一套清晰的查询/响应机制(ping, find_node, get_peers, announce_peer)以及错误处理方式

Kademlia 算法(二)

1. 节点 ID (Node ID)

  • 结构:通常是一个 160 位或 256 位的随机数。这个长度决定了网络的理论最大规模以及发生 ID 碰撞(两个节点生成相同 ID)的概率(极低)。
  • 生成:节点第一次启动时,通常会随机生成自己的 Node ID。这个 ID 在节点的生命周期内保持不变。
  • 意义:ID 不仅仅是标识符,它定义了节点在 Kademlia “地址空间”中的位置。

2. XOR 距离度量 (XOR Metric)

Kademlia 算法(一)

Kademlia 是一种通过分布式哈希表(DHT)实现的协议算法,专为非集中式对等网络(P2P)而设计。它由 Petar Maymounkov 和 David Mazières 于 2002 年提出。Kademlia 协议包含了对应网络的结构,规定了节点之间通过查询进行信息交换的方式。很多著名的点对点(P2P)系统,比如 BitTorrent 的 DHT 网络、以太坊(Ethereum)等,都使用了 Kademlia 或其变种算法。

BitTorrent 的 DHT协议

本文介绍 BitTorrent 使用的 DHT(分布式哈希表)网络,它通常被称为 “Mainline DHT”。

最初,BitTorrent 依赖于 Tracker 服务器 来协调 Peer(下载或上传同一个文件的用户)之间的连接。用户客户端连接到 Tracker,报告自己的信息和想要的 Torrent 文件,Tracker 则返回其他正在下载/上传该文件的 Peer 的列表。这种方式的问题在于 Tracker 是一个中心点

BT握手与TCP的连接与释放

定位了DHT爬虫的一个问题,在这梳理一下BT握手流程

BitTorrent 客户端(假设为 A)与另一个 Peer(假设为 B)从建立 TCP 连接开始,经过标准握手、扩展握手,最终到通过 ut_metadata 扩展获取种子元数据的完整流程