How the get_peers DHT Query Locates Torrent Swarms

In decentralized peer-to-peer file sharing, the BitTorrent protocol uses a Distributed Hash Table (DHT) to eliminate the need for centralized trackers. At the core of this trackerless discovery mechanism is the get_peers query. This query allows a BitTorrent client to locate active peers participating in a specific torrent swarm by searching the DHT network using the torrent’s unique infohash. By iteratively querying nodes that are mathematically closest to the target infohash, the client either receives contact information for peers currently sharing the file or discovers closer DHT nodes to query next, seamlessly bootstrapping the client into the swarm.

The Role of the Infohash and XOR Metric

The BitTorrent Mainline DHT operates on a variation of the Kademlia algorithm. Every participating node on the network is assigned a unique 160-bit Node ID, and every torrent is identified by a 160-bit info_hash generated from its metadata.

Distance in the DHT is measured using an exclusive OR (XOR) metric: \[\text{Distance} = \text{Node ID} \oplus \text{info\_hash}\]

The closer the result is to zero, the “closer” a node is considered to the target torrent. Nodes are responsible for maintaining peer lists for any infohashes that fall within their designated neighborhood of the ID space.

The Structure of a get_peers Query

A get_peers message is sent using the KRPC protocol (a Bencode-encoded RPC mechanism over UDP). When a client initiates the lookup, the query packet contains two key parameters:

  1. id: The 160-bit Node ID of the client making the request.
  2. info_hash: The 20-byte (160-bit) target hash corresponding to the desired torrent.

Iterative Lookup Process

When a client wants to join a swarm, it does not broadcast its search to the entire network. Instead, it follows an iterative lookup procedure:

  1. Initial Search: The querying client searches its own routing table for the nodes with IDs closest to the target info_hash.
  2. Dispatching Queries: The client sends parallel get_peers queries to these neighboring nodes.
  3. Evaluating Responses: Each receiving node checks whether it is currently storing peer data for that specific info_hash.

How Nodes Respond

A node responding to a get_peers query will return one of two responses:

In both response types, the answering node includes a short-lived string called a token.

Joining the Swarm

Once the querying client receives a response containing values, it extracts the IP addresses and ports to initiate direct BitTorrent connections with those peers, effectively joining the swarm and beginning the download or upload process.

Simultaneously, once the client locates the nodes closest to the info_hash, it sends an announce_peer query using the received token. This registers the client’s own IP and port with those nearest DHT nodes, ensuring that future get_peers queries from other users will include this client in their swarm results.