Come funzionano i collegamenti magnetici BitTorrent?

Per la prima volta ho usato un link magnetico . Curioso di come funziona, ho cercato le specifiche e non ho trovato nessuna risposta. Il wiki dice che xt significa “argomento esatto” ed è seguito dal formato ( btih in questo caso) con un hash SHA1. Ho visto base32 accennato, sapendo che sono 5 bit per carattere e 32 caratteri, ho trovato che contiene esattamente 160 bit, che è esattamente la dimensione dello SHA1.

Non c’è spazio per un indirizzo IP o altro, è solo uno SHA1. Quindi, come fa il client BitTorrent a trovare il file vero? Ho acceso URL Snooper per vedere se visita una pagina (usando TCP) o fa una ricerca o simili, ma non è successo nulla. Non ho idea di come il cliente trovi i compagni. Come funziona?

Inoltre, qual è l’hash di? È un hash di una matrice di tutti gli hash del file insieme? Forse è un hash del vero file torrent richiesto (eliminazione di determinate informazioni)?


In una VM, ho provato un collegamento magnetico con uTorrent (che è stato appena installato) ed è riuscito a trovare colleghi. Da dove viene il primo peer? Era fresco e non c’erano altri torrenti.

Un collegamento magnete BitTorrent identifica un torrent utilizzando 1 un SHA-1 o un valore hash SHA-256 troncato noto come “infohash”. Questo è lo stesso valore che peers (client) usano per identificare i torrenti quando comunicano con tracker o altri peer. Un file .torrent tradizionale contiene una struttura dati con due chiavi di livello superiore: announce , identifica i tracker da utilizzare per il download e info , contenenti i nomi file e gli hash per il torrent. “Infohash” è l’hash dei dati di info codificati.

Alcuni link magnetici includono tracker o web seeds, ma spesso non lo fanno. Il tuo cliente potrebbe non sapere nulla sul torrent ad eccezione del suo infohash. La prima cosa di cui ha bisogno è trovare altri peer che stanno scaricando il torrent. Lo fa utilizzando una rete peer-to-peer separata 2 che gestisce una “tabella hash distribuita” (DHT). Un DHT è un grande indice distribuito che mappa i torrenti (identificati da infohashes) in elenchi di peer (identificati da indirizzo IP e porte) che partecipano a uno sciame per quel torrente (caricamento / scaricamento di dati o metadati).

La prima volta che un client si collega alla rete DHT genera un ID casuale a 160 bit dallo stesso spazio di infohashes. Quindi esegue il bootstrap della sua connessione alla rete DHT utilizzando gli indirizzi hard-coded dei client controllati dallo sviluppatore del client o i client di supporto DHT precedentemente incontrati in uno sciame di torrent. Quando vuole partecipare a uno swarm per un dato torrent, cerca nella rete DHT altri client i cui ID sono il più vicino ansible a infohash. Notifica a questi clienti che vorrebbe partecipare allo sciame e chiede loro le informazioni di connessione di tutti i peer che già conoscono di chi partecipa allo sciame.

Quando i peer caricano / scaricano un particolare torrent, cercano di dirsi l’un l’altro su tutti gli altri peer che conoscono che stanno partecipando allo stesso sciame di torrent. Ciò consente ai peer di conoscersi rapidamente, senza sottoporre un tracker o DHT a richieste costanti. Una volta che hai imparato alcuni peer del DHT, il tuo cliente sarà in grado di chiedere a quei colleghi le informazioni sulla connessione di altri peer nello sciame torrent, finché non avrai tutti i peer di cui hai bisogno.

Infine, possiamo chiedere a questi peer i metadati delle info del torrente, contenenti i nomi dei file e l’elenco degli hash. Una volta che abbiamo scaricato queste informazioni e verificato che è corretto utilizzando il noto infohash , siamo praticamente nella stessa posizione di un client che ha iniziato con un normale file .torrent e ha ottenuto un elenco di peer dal tracker incluso.

Il download potrebbe iniziare.

1 L’infohash è tipicamente esadecimale, ma alcuni vecchi client usavano invece la base 32. v1 ( urn:btih: usa direttamente il digest SHA-1, mentre v2 ( urn:bimh: aggiunge un prefisso multihash per identificare l’algoritmo hash e la lunghezza del digest.
2 Esistono due reti DHT principali: il DHT “mainline” più semplice e un protocollo più complicato utilizzato da Azureus.
3 La distanza viene misurata da XOR.

Ulteriori letture

  • BEP-3: la specifica del protocollo BitTorrent
  • BEP-52: La specifica del protocollo BitTorrent v2
  • BEP-5: protocollo DHT
  • BEP-9: estensione per i peer per inviare file di metadati
  • BEP-10: protocollo di estensione
  • BEP-11: Scambio tra pari (PEX)
  • Descrizione del DHT di Azureus

Scoperta e scoperta di risorse peer (file nel tuo caso) sono due cose diverse.

Ho più familiarità con JXTA ma tutte le reti peer to peer funzionano sugli stessi principi di base.

La prima cosa che deve succedere è la scoperta tra pari.

Peer Discovery

La maggior parte delle reti p2p sono reti “seminate”: quando si avvia per la prima volta un peer si connetterà a un noto indirizzo (codificato) per recuperare un elenco di peer in esecuzione. Può essere la semina diretta come la connessione a dht.transmissionbt.com come menzionato in un altro post o semina indiretta come solitamente fatto con JXTA dove il peer si connette a un indirizzo che fornisce solo un elenco di solo testo di altri indirizzi di rete peer.

Una volta stabilita la connessione con il primo (pochi) peer, il peer di connessione esegue una scoperta di altri peer (inviando richieste) e mantiene una tabella di essi. Poiché il numero di altri peer può essere enorme, il peer di connessione mantiene solo una parte di una tabella hash distribuita (DHT) dei peer. L’algoritmo per determinare quale parte della tabella deve mantenere il peer di connessione varia a seconda della rete. BitTorrent utilizza Kademlia con identificatori / chiavi da 160 bit.

Scoperta delle risorse

Una volta che alcuni peer sono stati scoperti dal peer di collegamento, quest’ultimo invia alcune richieste per la scoperta di risorse a loro. I collegamenti magnetici identificano quelle risorse e sono costruiti in modo tale che siano una “firma” per una risorsa e garantiscono che identificano in modo univoco il contenuto richiesto tra tutti i peer. Il peer di collegamento invierà quindi una richiesta di scoperta per il link magnetico / risorsa ai peer attorno ad esso. Il DHT è costruito in modo tale da aiutare a determinare quali peer dovrebbero essere chiesti prima per la risorsa (leggi su Kademlia in Wikipedia per maggiori informazioni). Se il peer richiesto non conserva la risorsa richiesta, di solito “passa” la query a peer aggiuntivi recuperati dal proprio DHT.

Il numero di “hop” che la query può essere trasmessa è solitamente limitato; 4 è un numero normale con reti di tipo JXTA.

Quando un peer detiene la risorsa, risponde con i suoi dettagli completi. Il peer di collegamento può quindi connettersi al peer che tiene la risorsa (direttamente o tramite un relay – non entrerò nei dettagli qui) e iniziare a scaricarlo.

Risorse / Servizi nelle reti P2P non sono direttamente collegati agli indirizzi di rete: sono distribuiti e questa è la bellezza di queste reti altamente scalabili.

Ero curioso della stessa domanda io stesso. Leggendo il codice per la trasmissione, ho trovato quanto segue in libtrnasmission/tr-dht.c :

 3248: bootstrap_from_name( "dht.transmissionbt.com", 6881, bootstrap_af(session) ); 

Prova 6 volte, aspettando 40 (!) Secondi tra i tentativi. Immagino che puoi testarlo eliminando i file di configurazione ( ~/.config/transmission su unix) e bloccando tutte le comunicazioni a dht.transmissionbt.com , e vedi cosa succede (aspetta almeno 240 secondi).

Quindi sembra che il client abbia un nodo bootstrap integrato per iniziare. Naturalmente, una volta entrato nella rete, non ha più bisogno di quel nodo di bootstrap.

Finalmente ho trovato le specifiche. Per la prima volta, Google non ha aiutato . (wiki collegato a bittorrent.com che è il sito principale. Ho fatto clic sul collegamento degli sviluppatori, noto la scheda bittorrent.org sulla destra, quindi è stato facile da lì. I suoi link di ricerca difficili quando non hai idea di cosa sono etichettati e molti clic di distanza).

Sembra che tutti i torrent abbiano una rete di colleghi. Puoi trovare i peer dei tracker e tenerli tra una sessione e l’altra. La rete ti permette di trovare coetanei e altre cose. Non ho letto come sia usato con i link magnetici, ma sembra che non sia definito come un nuovo cliente possa trovare pari. Forse alcuni sono cotti, o usano il loro server di casa o tracker noti incorporati nel client per ottenere il primo peer nella rete.

Quando ho iniziato a rispondere alla tua domanda, non mi ero reso conto che stavi chiedendo come funziona lo schema dei magneti. Ho solo pensato che volevi sapere come sono state generate le parti rilevanti per il protocollo bittorrent.


L’hash elencato nel magnete uri è l’hash delle informazioni del torrent codificato in base32. L’hash delle informazioni è l’hash sha1 del blocco di informazioni bencoded del torrent.

Questo codice python dimostra come può essere calcolato.

Ho scritto un’implementazione C # (molto ingenua) per testare questo dato poiché non avevo un bencoder a disposizione e corrisponde a quanto ci si aspetta dal client.

 static string CalculateInfoHash(string path) { // assumes info block is last entry in dictionary var infokey = "e4:info"; var offset = File.ReadAllText(path).IndexOf(infokey) + infokey.Length; byte[] fileHash = File.ReadAllBytes(path).Skip(offset).ToArray(); byte[] bytes; using (SHA1 sha1 = SHA1.Create()) bytes = sha1.ComputeHash(fileHash, 0, fileHash.Length - 1); // need to remove last 'e' to compensate for bencoding return String.Join("", bytes.Select(b => b.ToString("X2"))); } 

A quanto ho capito, questo hash non include alcuna informazione su come localizzare il tracker, il client ha bisogno di scoprirlo attraverso altri mezzi (l’url di annuncio fornito). Questo è esattamente ciò che distingue un torrent da un altro sul tracker.

Tutto ciò che riguarda il protocollo bittorrent ruota ancora attorno al tracker. È ancora il principale mezzo di comunicazione tra lo sciame. Lo schema uri del magnete non è stato progettato specificamente per l’uso di bittorrent. Viene utilizzato da qualsiasi protocollo P2P come forma alternativa di comunicazione. I client Bittorrent si sono adattati ad accettare i link magnetici come un altro modo per identificare i torrenti in questo modo non è più necessario scaricare i file .torrent. Il magnete uri deve ancora specificare il tr acker per localizzarlo in modo che il cliente possa partecipare. Può contenere informazioni su altri protocolli ma è irrilevante per il protocollo bittorrent. Il protocollo bittorrent alla fine non funzionerà senza i tracker.

la lista dei peer è probabilmente popolata dal torrent che aggiorna il client (es. c’è un torrent per utorrent che lo aggiorna). finché tutti usano lo stesso client, dovrebbe essere buono perché non hai altra scelta che condividere l’aggiornamento.