Come funzionano i collegamenti magnetici BitTorrent?


157

Per la prima volta ho usato un collegamento magnetico . Curioso di come funziona, ho cercato le specifiche e non ho trovato alcuna risposta. Il wiki dice xt"argomento esatto" ed è seguito dal formato ( btihin questo caso) con un hash SHA1. Ho visto la base32 menzionata, sapendo che sono 5 bit per carattere e 32 caratteri, ho scoperto che contiene esattamente 160 bit, che è esattamente la dimensione di SHA1.

Non c'è spazio per un indirizzo IP o altro, è solo un SHA1. Quindi, come fa il client BitTorrent a trovare il file effettivo? Ho attivato 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 colleghi. Come funziona?

Inoltre, qual è l'hash di? È un hash di un array di tutti gli hash di file insieme? Forse è un hash del file torrent effettivo richiesto (rimozione di determinate informazioni)?


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


3
È rilevante anche per la programmazione?
Krypton,

Risposte:


156

Un collegamento magnete BitTorrent identifica un torrent usando 1 a SHA-1 o troncato valore hash SHA-256 noto come "infohash". Questo è lo stesso valore utilizzato dai peer (client) per identificare i torrent quando comunicano con tracker o altri peer. Un file .torrent tradizionale contiene una struttura di dati con due chiavi di livello superiore: announceidentificare i tracker da utilizzare per il download e infocontenere i nomi dei file e gli hash per il torrent. "Infohash" è l'hash dei infodati codificati .

Alcuni collegamenti magnetici includono tracker o semi web, ma spesso non lo fanno. Il tuo client potrebbe non sapere nulla del torrent tranne che per il suo infohash. La prima cosa che deve fare è trovare altri peer che stanno scaricando il torrent. Lo fa usando una rete peer-to-peer 2 separata che gestisce una "tabella hash distribuita" (DHT). Un DHT è un grande indice distribuito che mappa i torrent (identificati da infohash) agli elenchi di peer (identificati da indirizzo IP e porte) che partecipano a uno sciame per quel torrent (caricamento / download di dati o metadati).

La prima volta che un client si unisce alla rete DHT, genera un ID casuale a 160 bit dallo stesso spazio delle infohash. Quindi avvia la sua connessione alla rete DHT usando indirizzi hardcoded di client controllati dallo sviluppatore del client o client che supportano DHT precedentemente incontrati in uno sciame torrent. Quando si vuole partecipare a uno sciame per un dato torrente, cerca la rete DHT per diversi altri clienti i cui ID sono il più vicino 3 possibile al infohash. Comunica a questi clienti che vorrebbe partecipare allo sciame e chiede loro le informazioni di connessione di tutti i peer che già conoscono e che partecipano allo sciame.

Quando i peer caricano / scaricano un particolare torrent, provano a parlarsi di tutti gli altri peer di cui sono a conoscenza e che partecipano allo stesso sciame di torrent. Ciò consente ai peer di conoscersi rapidamente, senza sottoporre un tracker o DHT a richieste costanti. Dopo aver appreso alcuni peer dal DHT, il tuo client sarà in grado di chiedere a quei peer le informazioni di connessione di altri peer nello sciame torrent, fino a quando non avrai tutti i peer di cui hai bisogno.

Infine, possiamo chiedere a questi peer i infometadati del torrent , contenenti i nomi dei file e l'elenco di hash. Una volta scaricate queste informazioni e verificato che sia corretto utilizzando il noto infohash, siamo praticamente nella stessa posizione di un client che ha iniziato con un .torrentfile normale e ha ottenuto un elenco di peer dal tracker incluso.

Il download potrebbe iniziare.

1 Infohash è in genere codificato in esadecimale, ma alcuni vecchi client hanno utilizzato invece la base 32. v1 ( urn:btih:) utilizza 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 primarie: la DHT "mainline" più semplice e un protocollo più complicato usato da Azureus.
3 La distanza è misurata da XOR.

Ulteriori letture


1
Il nodo bootstrap, ad esempio dht.transmission.com, è semplicemente un tracker? Il modo in cui lo capisco è che deve tenere traccia dell'elenco dei peer per hash di informazioni, che è esattamente ciò che fa un tracker.
Kar,

3
@Kate Non esattamente. Un tipico nodo DHT memorizza elenchi peer per alcuni torrent che sono "vicini" nello "spazio" della rete DHT. Un tracker tenta invece di memorizzare elenchi peer per ogni torrent di cui è a conoscenza. Inoltre, i nodi DHT bootstrap non memorizzano specificamente elenchi peer per nessun torrent. Invece, distribuiscono solo elenchi di altri nodi DHT, per aiutarti a connetterti alla rete complessiva. È quindi possibile trovare un tipico nodo DHT con l'elenco dei peer a cui si è interessati.
Jeremy Banks,

"Alcuni collegamenti magnetici includono tracker o semi web" - Sono un po 'confuso. Il magnete viene utilizzato per scaricare il file torrent come descritto. Dalle specifiche dell'URI Magnete vedo "sorgente accettabile" e "tracker" come informazioni che possono essere codificate nell'URI. Ora il tracker è ovviamente specifico di Bittorrent e molto probabilmente verrà utilizzato in aggiunta ai tracker elencati nel file torrent. La "fonte accettabile" è pensata per essere utilizzata per scaricare il file torrent o (uno dei) file effettivi da scaricare attraverso il file Torrent?
Federico Nord,

@FrederickNord Nel supportare i client torrent, il ws=parametro punta a un URL seed web BEP-19 dei dati effettivi e il xs=parametro punta a un URL con il .torrentfile stesso. Penso che questo sia un po 'incompatibile con altri usi dello magnet:schema, ma è così. Dimentico se qualche client usa as=qualcosa ... forse solo come fallback xs=, ma non ampiamente supportato, IIRC.
Jeremy Banks,

46

La scoperta dei pari e la scoperta delle risorse (file nel tuo caso) sono due cose diverse.

Conosco meglio JXTA ma tutte le reti peer to peer funzionano con gli stessi principi di base.

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

Peer Discovery

La maggior parte delle reti p2p sono reti "seeded": quando si avvia per la prima volta un peer si connetterà a un indirizzo noto (hardcoded) per recuperare un elenco di peer in esecuzione. Può essere il seeding diretto come il collegamento a dht.transmissionbt.com come menzionato in un altro post o seeding indiretto come di solito fatto con JXTA in cui il peer si collega a un indirizzo che fornisce solo un elenco di testo semplice di altri indirizzi di rete peer.

Una volta stabilita la connessione con i primi (pochi) peer, il peer di connessione esegue una rilevazione di altri peer (inviando richieste) e ne mantiene una tabella. 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 in base alla rete. BitTorrent utilizza Kademlia con chiavi / identificatori a 160 bit.

Scoperta delle risorse

Una volta che alcuni peer sono stati scoperti dal peer di connessione, quest'ultimo invia alcune richieste per il rilevamento delle risorse. I collegamenti magnetici identificano tali risorse e sono costruiti in modo tale da essere una "firma" per una risorsa e garantire che identificano in modo univoco il contenuto richiesto tra tutti i peer. Il peer di connessione invierà quindi una richiesta di rilevamento per il collegamento / risorsa magnete ai peer circostanti. Il DHT è costruito in modo tale da aiutare a determinare quali peer dovrebbero prima essere richiesti per la risorsa (leggi di più su Kademlia in Wikipedia). Se il peer richiesto non contiene la risorsa richiesta, in genere "passa" la query a peer aggiuntivi recuperati dal proprio DHT.

Il numero di "hop" su cui è possibile passare la query è generalmente limitato; 4 è un numero normale con reti di tipo JXTA.

Quando un peer detiene la risorsa, risponde con tutti i dettagli. Il peer di connessione può quindi connettersi al peer che detiene la risorsa (direttamente o tramite un relay - non entrerò nei dettagli qui) e iniziare a recuperarlo.

Le risorse / i servizi nelle reti P2P non sono direttamente collegati agli indirizzi di rete: sono distribuiti e questa è la bellezza di queste reti altamente scalabili.


Penso che questa sia la risposta più concisa senza molto gergo tecnico. Grazie.
desaivv,

26

Ero curioso della stessa domanda me 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) );

Ci prova 6 volte, aspettando 40 (!) Secondi tra i tentativi. Immagino che tu possa testarlo cancellando i file di configurazione ( ~/.config/transmissionsu unix), bloccando tutte le comunicazioni dht.transmissionbt.come vedendo cosa succede (attendi almeno 240 secondi).

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


9

Ho finalmente trovato le specifiche. Per la prima volta Google non ha aiutato . (wiki collegato a bittorrent.com che è il sito principale. Ho cliccato sul link degli sviluppatori, ho notato la scheda bittorrent.org sulla destra, quindi è stato facile da lì. È difficile trovare collegamenti quando non si ha idea di cosa siano etichettati e molti clic di distanza).

Sembra che tutti i torrent abbiano una rete di peer. Trovi colleghi dai tracker e li tieni tra le sessioni. La rete ti consente di trovare colleghi e altre cose. Non ho letto come viene utilizzato con i collegamenti magnetici, ma sembra che sia indefinito il modo in cui un nuovo cliente trova colleghi. Forse alcuni sono integrati o usano il loro server di casa o tracker noti incorporati nel client per ottenere il primo peer nella rete.


Ah, immagino di aver ragione, che sarebbe andato a DHT per trovare clienti. "Se non viene specificato alcun tracker, il client DOVREBBE utilizzare DHT (BEP 0005 [3]) per acquisire peer."
Jeff Mercado,

8

Quando ho iniziato a rispondere alla tua domanda, non mi rendevo conto che stavi chiedendo come funziona lo schema del magnete. Pensavo volessi 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 di informazioni è l'hash sha1 del blocco di informazioni codificato del torrent.

Questo codice Python dimostra come può essere calcolato.

Ho scritto un'implementazione C # (molto ingenua) per testarlo poiché non avevo un bencoder a portata di mano e corrisponde a ciò che 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 individuare il tracker, il client deve scoprirlo con altri mezzi (l'URL di annuncio fornito). Questo è proprio 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 gli sciami. Lo schema uri del magnete non è stato progettato specificamente per l'uso da parte di bittorrent. È utilizzato da qualsiasi protocollo P2P come forma alternativa di comunicazione. I client Bittorrent si sono adattati per accettare i collegamenti magnetici come un altro modo per identificare i torrent in questo modo non è più necessario scaricare i file .torrent. Il magnete uri deve ancora specificare l' trammortizzatore per individuarlo 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.


2
Questo non aiuta. Ma stai dicendo che esegue l'hashing dell'intero file torrent saltando il blocco infokey? La mia domanda era su come trova i coetanei.

1
@ acidzombie24 Probabilmente stai pensando a tracker distribuiti che usano DHT per localizzare i peer. Questo non ha nulla a che fare con i collegamenti magnetici. ( en.wikipedia.org/wiki/… )
Alexander Sagen,

2
@Jeff M: Ma ciò che 'manda' indietro un elenco di colleghi. Un collegamento è solo un collegamento a cui non è associato alcun tracker. Stavo cercando di capire COSA manda indietro i colleghi.

1
+1. Inoltre, il collegamento magnetico in questione non specifica tr (acker). Solo il sha1 che mi ha lasciato confuso. Soprattutto quando sto usando una nuova installazione senza torrent in esecuzione (e non connesso a nessun peer) e ho il collegamento magnetico a trovare peer. È magico, non ho idea di come funzioni. Ci deve essere un server di casa che può chiedere peer. Ciò significa che invio query a colleghi alla ricerca di un hash e il client trasmette il messaggio a molti colleghi fino a quando uno risponde alla mia chiamata?

1
Non sono sicuro di come rispondere. Tutta l'uride del magnete che ho visto specifica sempre il tracker. Potrebbe essere il tuo cliente a provare un elenco di tracker pubblici di cui è a conoscenza e uno sembra averlo. Quali tracker viene utilizzato dall'elenco dei torrent associato? Come viene visualizzato? C'è qualche relazione tra il tracker a cui si collega e la fonte del collegamento magnetico? Forse è un torrent che utilizza DHT? Lo stesso funziona per un torrent privato? Ancora una volta, non so come DHT funzioni esattamente. Vedrò se riesco a trovare ulteriori informazioni.
Jeff Mercado,

3

l'elenco dei peer è probabilmente popolato dal torrent che aggiorna il client (es. c'è un torrent per utorrent che lo aggiorna). fintanto che tutti usano lo stesso client, dovrebbe essere buono perché non hai altra scelta che condividere l'aggiornamento.


Questo è un posto molto logico per cercare l'hash e altri peer. +1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.