¿Cómo funcionan los enlaces magnéticos de BitTorrent?

157

Por primera vez utilicé un enlace magnético . Curioso sobre cómo funciona, busqué las especificaciones y no encontré ninguna respuesta. El wiki dice que xtsignifica "tema exacto" y es seguido por el formato ( btihen este caso) con un hash SHA1. Vi a base32 mencionado, sabiendo que son 5 bits por carácter y 32 caracteres, descubrí que contiene exactamente 160 bits, que es exactamente el tamaño del SHA1.

No hay espacio para una dirección IP ni nada, es solo un SHA1. Entonces, ¿cómo encuentra el cliente BitTorrent el archivo real? Encendí URL Snooper para ver si visita una página (usando TCP) o hace una búsqueda o similar, pero no pasó nada. No tengo idea de cómo el cliente encuentra compañeros. ¿Como funciona esto?

Además, ¿de qué se trata el hash? ¿Es un hash de una matriz de todos los hashes de archivos juntos? ¿Quizás es un hash del archivo de torrent real requerido (eliminando cierta información)?


En una máquina virtual, probé un enlace magnético con uTorrent (que estaba recién instalado) y logró encontrar pares. ¿De dónde vino el primer compañero? Estaba fresco y no había otros torrentes.

Barmar
fuente
3
¿Es esto relevante para la programación?
Krypton

Respuestas:

156

Un enlace de imán BitTorrent identifica un torrent utilizando 1 un SHA-1 o un valor hash SHA-256 truncado conocido como "infohash". Este es el mismo valor que los pares (clientes) usan para identificar torrentes cuando se comunican con rastreadores u otros pares. Un archivo .torrent tradicional contiene una estructura de datos con dos claves de nivel superior: announceidentificar los rastreadores que se usarán para la descarga y infocontener los nombres de archivo y los hash para el torrent. El "infohash" es el hash de los infodatos codificados .

Algunos enlaces magnéticos incluyen rastreadores o semillas web, pero a menudo no lo hacen. Es posible que su cliente no sepa nada sobre el torrent, excepto su infohash. Lo primero que necesita es encontrar otros pares que estén descargando el torrent. Lo hace utilizando una red de igual a igual 2 que opera una "tabla hash distribuida" (DHT). Un DHT es un gran índice distribuido que asigna torrents (identificados por infohashes) a listas de pares (identificados por dirección IP y puertos) que participan en un enjambre para ese torrent (carga / descarga de datos o metadatos).

La primera vez que un cliente se une a la red DHT, genera una ID aleatoria de 160 bits desde el mismo espacio que las casillas de información. Luego, inicia su conexión a la red DHT utilizando direcciones codificadas de clientes controlados por el desarrollador del cliente o clientes compatibles con DHT encontrados previamente en un enjambre de torrentes. Cuando quiere participar en un enjambre de un torrente determinado, busca en la red DHT varios otros clientes cuyas identificaciones estén lo más cerca posible 3 del infohash. Notifica a estos clientes que le gustaría participar en el enjambre, y les solicita la información de conexión de sus compañeros que ya conocen de quién está participando en el enjambre.

Cuando los pares cargan / descargan un torrent en particular, intentan contarse entre sí sobre todos los otros pares que conocen que están participando en el mismo enjambre de torrent. Esto permite que los compañeros se conozcan entre sí rápidamente, sin someter a un rastreador o DHT a solicitudes constantes. Una vez que se haya enterado de algunos pares del DHT, su cliente podrá solicitar a esos pares la información de conexión de aún más pares en el enjambre de torrentes, hasta que tenga todos los pares que necesita.

Finalmente, podemos pedir a estos pares los infometadatos del torrent , que contienen los nombres de archivo y la lista hash. Una vez que hemos descargado esta información y verificado que es correcta usando lo conocido infohash, estamos prácticamente en la misma posición que un cliente que comenzó con un .torrentarchivo normal y obtuvo una lista de pares del rastreador incluido.

La descarga puede comenzar.

1 El infohash generalmente está codificado en hexadecimal, pero algunos clientes antiguos usaban la base 32 en su lugar. v1 ( urn:btih:) usa el resumen SHA-1 directamente, mientras que v2 ( urn:bimh:) agrega un prefijo multihash para identificar el algoritmo hash y la longitud del resumen.
2 Hay dos redes DHT principales: la DHT "mainline" más simple y un protocolo más complicado utilizado por Azureus.
3 La distancia se mide por XOR.

Otras lecturas

Jeremy Banks
fuente
1
¿Es el nodo bootstrap, por ejemplo dht.transmission.com, simplemente un rastreador? Según tengo entendido, necesita hacer un seguimiento de la lista de pares por hash de información, que es exactamente lo que hace un rastreador.
Kar
3
@ Kate No exactamente. Un nodo DHT típico almacena listas de pares para algunos torrents que están "cerca" de él en el "espacio" de la red DHT. En cambio, un rastreador intenta almacenar listas de pares para cada torrent que conoce. Además, los nodos DHT de bootstrap específicamente no almacenan listas de pares para ningún torrente. En cambio, solo distribuyen listas de otros nodos DHT, para ayudarlo a conectarse a la red general. Luego puede encontrar un nodo DHT típico con la lista de pares que le interesa.
Jeremy Banks
"Algunos enlaces magnéticos incluyen rastreadores o semillas web". Estoy un poco confundido. El imán se está utilizando para descargar el archivo torrent como usted describe. De la especificación del URI del imán veo "fuente aceptable" y "rastreador" como información que puede codificarse en el URI. Ahora el rastreador es obviamente específico de Bittorrent y probablemente se usará además de los rastreadores enumerados en el archivo torrent. ¿La "fuente aceptable" debe usarse para descargar el archivo torrent o (uno de) los archivos reales que se descargarán a través del archivo Torrent?
Frederick Nord
@FrederickNord Al admitir clientes torrent, el ws=parámetro apunta a una URL de inicio web BEP-19 de los datos reales, y el xs=parámetro apunta a una URL con el .torrentarchivo mismo. Creo que esto es un poco inconsistente con otros usos del magnet:esquema, pero así es como es. Olvidé si algún cliente usa as=para algo ... tal vez solo como una alternativa para el xs=IIRC, pero no es ampliamente compatible.
Jeremy Banks
46

El descubrimiento entre pares y el descubrimiento de recursos (archivos en su caso) son dos cosas diferentes.

Estoy más familiarizado con JXTA, pero todas las redes punto a punto funcionan con los mismos principios básicos.

Lo primero que debe suceder es el descubrimiento entre pares.

Descubrimiento entre pares

La mayoría de las redes p2p son redes "sembradas": cuando se inicia por primera vez, un par se conectará a una dirección conocida (codificada) para recuperar una lista de pares en ejecución. Puede ser una siembra directa como conectarse a dht.transmissionbt.comcomo se menciona en otra publicación o una siembra indirecta como se hace generalmente con JXTA donde el par se conecta a una dirección que solo entrega una lista de texto sin formato de otras direcciones de red de pares.

Una vez que se establece la conexión con los primeros (pocos) pares, el par de conexión realiza un descubrimiento de otros pares (enviando solicitudes) y mantiene una tabla de ellos. Dado que el número de otros pares puede ser enorme, el par de conexión solo mantiene parte de una tabla de hash distribuido (DHT) de los pares. El algoritmo para determinar qué parte de la tabla debe mantener el par de conexión varía según la red. BitTorrent usa Kademlia con identificadores / claves de 160 bits.

Descubrimiento de recursos

Una vez que el par de conexión ha descubierto algunos pares, este último envía algunas solicitudes para que descubran recursos. Los enlaces magnéticos identifican esos recursos y están construidos de tal manera que son una "firma" para un recurso y garantizan que identifiquen de manera única el contenido solicitado entre todos los pares. El par de conexión enviará una solicitud de descubrimiento para el enlace / recurso magnético a los pares a su alrededor. El DHT está construido de tal manera que ayuda a determinar a qué pares se les debe pedir primero el recurso (lea en Kademlia en Wikipedia para obtener más información). Si el par solicitado no retiene el recurso solicitado, generalmente "transmitirá" la consulta a pares adicionales extraídos de su propio DHT.

El número de "saltos" a los que se puede pasar la consulta suele ser limitado; 4 es un número habitual con redes de tipo JXTA.

Cuando un compañero retiene el recurso, responde con todos sus detalles. El par de conexión puede conectarse al par que contiene el recurso (directamente o mediante un relé; no entraré en detalles aquí) y comenzar a buscarlo.

Los recursos / servicios en las redes P2P no están directamente conectados a las direcciones de red: se distribuyen y esa es la belleza de estas redes altamente escalables.

Bruno Grieder
fuente
Esta creo que es la respuesta más sucinta sin mucha jerga técnica. Gracias.
desaivv
26

Tenía curiosidad por la misma pregunta yo mismo. Leyendo el código para la transmisión, encontré lo siguiente en libtrnasmission/tr-dht.c:

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

Lo intenta 6 veces, esperando 40 (!) Segundos entre intentos. Supongo que puede probarlo eliminando los archivos de configuración ( ~/.config/transmissionen Unix) y bloqueando toda comunicación dht.transmissionbt.com, y vea qué sucede (espere al menos 240 segundos).

Entonces parece que el cliente tiene un nodo de arranque incorporado para comenzar. Por supuesto, una vez que ha entrado en la red, ya no necesita ese nodo de arranque.

Yhager
fuente
9

Finalmente encontré especificación. Por primera vez, Google no ayudó . (wiki vinculado a bittorrent.com, que es el sitio principal. Hice clic en el enlace de desarrolladores, observe la pestaña bittorrent.org a la derecha, entonces fue fácil a partir de ahí. Es difícil encontrar enlaces cuando no tiene idea de lo que están etiquetados y muchos clics de distancia).

Parece que todos los torrents tienen una red de pares. Encuentra compañeros de los rastreadores y los mantiene entre sesiones. La red le permite encontrar compañeros y otras cosas. No he leído cómo se usa con enlaces magnéticos, pero parece que no está definido cómo un cliente nuevo encuentra pares. Quizás algunos están integrados, o usan su servidor doméstico o rastreadores conocidos incrustados en el cliente para obtener el primer par en la red.


fuente
Ah, supongo que tenía razón acerca de ir a DHT a buscar clientes. "Si no se especifica un rastreador, el cliente DEBE usar el DHT (BEP 0005 [3]) para adquirir pares".
Jeff Mercado
8

Cuando comencé a responder tu pregunta, no me di cuenta de que estabas preguntando cómo funciona el esquema magnético. Solo pensé que querías saber cómo se generaron las partes relevantes para el protocolo bittorrent.


El hash que figura en el uri del imán es el hash de información del torrent codificado en base32. El hash de información es el hash sha1 del bloque de información codificado del torrent.

Este código de Python demuestra cómo se puede calcular.

Escribí una implementación de C # (muy ingenua) para probar esto ya que no tenía un bencoder a mano y coincide con lo que se espera del cliente.

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")));
}

Según tengo entendido, este hash no incluye ninguna información sobre cómo ubicar el rastreador, el cliente debe averiguarlo a través de otros medios (se proporciona la URL de anuncio). Esto es justo lo que distingue un torrente de otro en el rastreador.

Todo lo relacionado con el protocolo bittorrent todavía gira en torno al rastreador. Sigue siendo el principal medio de comunicación entre el enjambre. El esquema uri del imán no fue diseñado específicamente para su uso por bittorrent. Es utilizado por cualquier protocolo P2P como una forma alternativa de comunicación. Los clientes de Bittorrent se adaptaron para aceptar enlaces magnéticos como otra forma de identificar torrents de esa manera, ya no es necesario descargar archivos .torrent. El uri del imán aún necesita especificar el tracker para localizarlo y que el cliente pueda participar. Puede contener información sobre otros protocolos, pero es irrelevante para el protocolo bittorrent. El protocolo bittorrent finalmente no funcionará sin los rastreadores.

Jeff Mercado
fuente
2
Esto no ayuda. Pero, ¿estás diciendo que hash todo el archivo torrent omitiendo el bloque de tecla de información? Mi pregunta fue sobre cómo encuentra a los compañeros.
1
@ acidzombie24 Probablemente esté pensando en rastreadores distribuidos que usan DHT para localizar pares. Esto no tiene nada que ver con los enlaces magnéticos. ( en.wikipedia.org/wiki/… )
Alexander Sagen
2
@Jeff M: Pero, ¿qué 'envía' una lista de pares? Un enlace es solo un enlace que no tiene un rastreador asociado. Estaba tratando de averiguar QUÉ envía a los compañeros.
1
+1. Además, el enlace magnético en cuestión no especifica tr (acker). Solo lo que me dejó confundido. Especialmente cuando estoy usando una instalación nueva sin torrents en ejecución (y no está conectado a ningún par) y tengo el enlace magnético para encontrar pares. Es mágico, no tengo idea de cómo funciona. Debe haber algún servidor doméstico que pueda solicitar pares. Pero, ¿eso significa que envío consultas a pares que buscan un hash y el cliente pasa el mensaje a muchos pares hasta que uno responde mi llamada?
1
No estoy seguro de cómo responder eso. Todos los uris magnéticos que he visto siempre especifican el rastreador. Puede ser que su cliente intente una lista de rastreadores públicos que conoce y resulta que la tiene. ¿Qué rastreadores enumera el torrent asociado como utilizado? ¿Cómo se muestra? ¿Existe alguna relación entre el rastreador al que se conecta y la fuente del enlace magnético? ¿Quizás es un torrente que usa DHT? ¿Funciona lo mismo para un torrent privado? De nuevo, no sé cómo funciona DHT exactamente. Veré si puedo encontrar más información.
Jeff Mercado
3

la lista de pares probablemente esté poblada del torrent que actualiza el cliente (por ejemplo, hay un torrent para utorrent que lo actualiza). siempre y cuando todos usen el mismo cliente, debería ser bueno porque no tiene más remedio que compartir la actualización.

Moe
fuente
Ese es un lugar muy lógico para buscar el hash y otros compañeros. +1