En el sistema de distribución de archivos BitTorrent , un archivo torrent o archivo de metainformación es un archivo de computadora que contiene metadatos sobre los archivos y carpetas que se distribuirán y, por lo general, también una lista de las ubicaciones de red de los rastreadores , que son computadoras que ayudan a los participantes en el sistema a encontrarse entre sí y formar grupos de distribución eficientes llamados enjambres . [1] Los archivos torrent normalmente se nombran con la extensión .torrent
.
Un archivo torrent actúa como una tabla de contenidos (índice) que permite a las computadoras encontrar información mediante el uso de un cliente torrent. Con la ayuda de un archivo torrent, se pueden descargar pequeñas partes del archivo original de las computadoras que ya lo han descargado. Estos "pares" permiten la descarga del archivo además de, o en lugar de, el servidor principal . Un archivo torrent no contiene el contenido que se va a distribuir; solo contiene información sobre esos archivos, como sus nombres, estructura de carpetas , tamaños y valores hash criptográficos para verificar la integridad del archivo.
El sistema torrent se ha creado para aliviar la carga de los servidores centrales, ya que en lugar de que los clientes individuales obtengan archivos del servidor, el torrent puede obtener el ancho de banda necesario para la transferencia de archivos y reducir el tiempo necesario para descargar archivos grandes. Muchos programas y sistemas operativos gratuitos, como las diversas distribuciones de Linux, ofrecen una opción de descarga torrent para los usuarios que buscan los beneficios antes mencionados. Otras descargas grandes, como archivos multimedia, también suelen descargarse mediante torrent.
Por lo general, el acceso a Internet es asimétrico, lo que permite velocidades de descarga mayores que las de carga, lo que limita el ancho de banda de cada descarga y, en ocasiones, impone límites de ancho de banda y períodos en los que los sistemas no son accesibles. Esto genera ineficiencia cuando muchas personas quieren obtener el mismo conjunto de archivos de una única fuente; la fuente debe estar siempre en línea y debe tener un ancho de banda de salida masivo. El protocolo torrent aborda este problema descentralizando la distribución, aprovechando la capacidad de las personas para conectarse en red " de igual a igual " entre sí.
Cada archivo que se va a distribuir se divide en pequeños fragmentos de información llamados fragmentos . Los pares que descargan logran altas velocidades de descarga al solicitar múltiples fragmentos de diferentes computadoras simultáneamente en el enjambre. Una vez obtenidos, estos fragmentos generalmente se ponen inmediatamente a disposición para que otros en el enjambre los descarguen. De esta manera, la carga en la red se distribuye entre los descargadores, en lugar de concentrarse en un centro o clúster de distribución central. Mientras todos los fragmentos estén disponibles, los pares (descargadores y cargadores) pueden ir y venir; ningún par necesita tener todos los fragmentos o incluso permanecer conectado al enjambre para que la distribución continúe entre los otros pares.
Se crea un pequeño archivo torrent para representar un archivo o carpeta que se va a compartir. El archivo torrent actúa como la clave para iniciar la descarga del contenido real. Alguien interesado en recibir el archivo o carpeta compartida primero obtiene el archivo torrent correspondiente, ya sea descargándolo directamente o usando un enlace magnet . Luego, el usuario abre ese archivo en un cliente torrent, que automatiza el resto del proceso. Para conocer las ubicaciones en Internet de los pares que pueden estar compartiendo fragmentos, el cliente se conecta a los rastreadores nombrados en el archivo torrent y/o logra un resultado similar mediante el uso de tablas hash distribuidas . Luego, el cliente se conecta directamente a los pares para solicitar fragmentos y participar de otro modo en un enjambre. El cliente también puede informar el progreso a los rastreadores, para ayudar al rastreador con sus recomendaciones de pares.
Cuando el cliente tiene todas las piezas, el cliente de torrent las reúne en un formato utilizable. También puede seguir compartiéndolas, lo que eleva su estatus al de seeder en lugar de ser un par común.
Un archivo torrent contiene una lista de archivos y metadatos de integridad sobre todas las partes y, opcionalmente, contiene una gran lista de rastreadores.
Un archivo torrent es un diccionario bencoded con las siguientes claves (las claves en cualquier diccionario bencoded están ordenadas lexicográficamente ):
Todas las cadenas deben estar codificadas en UTF-8 , excepto los fragmentos , que contienen datos binarios.
Un torrent se identifica de forma única mediante un infohash , un hash SHA-1 calculado sobre el contenido del diccionario de información en formato bencode . Los cambios en otras partes del torrent no afectan al hash. Este hash se utiliza para identificar el torrent ante otros pares a través de DHT y ante el rastreador. También se utiliza en enlaces magnet .
El protocolo BitTorrent v2 (BEP-0052) introduce una nueva definición del archivo torrent. [2] La estructura básica es:
El nuevo formato utiliza SHA-256 tanto en el fragmento de hash como en el hash de información , reemplazando el hash SHA-1 roto . El enlace magnético "btmh" contendría el hash completo de 32 bytes, mientras que la comunicación con los rastreadores y en el DHT utiliza la versión truncada de 20 bytes para adaptarse a la antigua estructura del mensaje. [2] Es posible construir un archivo torrent con solo los nuevos campos actualizados para un torrent "v2", o con los campos antiguos y nuevos para un formato "híbrido". Sin embargo, como un torrent tendría diferentes hashes de información en las redes v1 y v2, se formarían dos enjambres, lo que requeriría un manejo especial por parte del cliente para fusionar los dos. [3]
Una característica fundamental del nuevo formato es la aplicación de árboles de Merkle , que permiten verificar y volver a descargar individualmente bloques de 16 KiB de una pieza. Ahora, cada archivo ocupa siempre tamaños de pieza enteros y tiene un hash raíz de Merkle independiente, de modo que es posible encontrar archivos duplicados en archivos torrent no relacionados de cualquier longitud de pieza. El tamaño del archivo no se reduce (suponiendo que el tamaño de la pieza se mantenga igual; la estructura de árbol de la v2 permite piezas más grandes con menos efectos nocivos), pero sí el diccionario de información necesario para los enlaces magnéticos (solo en los torrents exclusivos de la v2). [3]
Un archivo torrent también puede contener metadatos adicionales definidos en extensiones de la especificación BitTorrent. [4] Estas se conocen como "Propuestas de mejora de BitTorrent". Algunos ejemplos de dichas propuestas incluyen metadatos para indicar quién creó el torrent y cuándo.
Estas extensiones se han implementado en una o más implementaciones y han demostrado ser útiles gracias a su uso sistemático y generalizado. Si bien pueden requerir revisiones menores, en gran medida se las considera completas y solo esperan la aprobación de Bram Cohen para ser elevadas al estado de proceso final/activo.
BEP-0005 [5] extiende BitTorrent para soportar tablas hash distribuidas , específicamente Mainline DHT .
Un diccionario de torrent sin rastreadores no tiene una clave de anuncio . En cambio, un torrent sin rastreadores tiene una clave de nodos :
{ # ... 'nodos' : [[ "<host>" , <puerto> ], [ "<host>" , <puerto> ], ... ], # ... }
Por ejemplo,
'nodos' : [[ "127.0.0.1" , 6881 ], [ "su.nodo.de.enrutador" , 4804 ]] ,
La especificación recomienda que los nodos "se establezcan en los K nodos más cercanos en la tabla de enrutamiento del cliente que genera el torrent. Alternativamente, la clave podría establecerse en un nodo que se sepa que funciona bien, como uno operado por la persona que genera el torrent".
BEP-0012 [6] extiende BitTorrent para soportar múltiples rastreadores.
Se coloca una nueva clave, Announce-list , en el diccionario superior (es decir, con Announce e Info ).
{ # ... 'lista-de-anuncios' : [[ '<tracker1-url>' ][ '<tracker2-url>' ]], # ... }
BEP-0019 [7] es una de las dos extensiones que permiten utilizar semillas HTTP en BitTorrent.
En BEP-0019, url-list
se coloca una nueva clave , en la lista superior. El cliente usa los enlaces para ensamblar URL HTTP comunes; no se requiere soporte del lado del servidor. Esta característica es muy utilizada por proyectos de código abierto que ofrecen descargas de software. Las semillas web permiten la selección inteligente y el uso simultáneo de sitios espejo , P2P o HTTP(S), por parte del cliente. Al hacerlo, se reduce la carga en los servidores del proyecto y se maximiza la velocidad de descarga. MirrorBrain genera automáticamente torrents con semillas web.
BEP-0027 [8] extiende BitTorrent para soportar torrents privados.
Se coloca una nueva clave, privada , en el diccionario de información . El valor de esta clave es 1 si el torrent es privado:
{ # ... 'información' : { # ... 'privado' : 1 , # ... }, # ... }
Los torrents privados se deben utilizar con un rastreador privado . Este rastreador restringe el acceso a los torrents que rastrea comprobando la IP del par y negándose a proporcionar una lista de pares si la IP es desconocida. El par en sí suele estar registrado en el rastreador a través de una comunidad en línea cerrada; el rastreador privado normalmente también mantiene estadísticas de transferencia de datos para su uso en la comunidad.
Los métodos descentralizados como DHT, PeX y LSD están deshabilitados para mantener el control centralizado. Un torrent privado se puede editar manualmente para eliminar la bandera privada, pero al hacerlo se cambiará el hash de información (de manera determinista), formando un "enjambre" separado de pares. Por otro lado, cambiar la lista de rastreadores no cambiará el hash. La bandera no ofrece privacidad real, sino que funciona como un acuerdo entre caballeros .
Se está estudiando la posibilidad de estandarizar estas extensiones, y la mayoría ya se han adoptado ampliamente como normas de facto .
BEP-0017 [9] extiende BitTorrent para soportar semillas HTTP, más comúnmente llamadas posteriormente "semillas web" para incluir HTTPS .
En BEP-0017, se coloca una nueva clave, httpsseeds , en la lista superior (es decir, con Announce e Info ). El valor de esta clave es una lista de direcciones web donde se pueden recuperar datos de torrent. Se requiere soporte de servidor especial. Permanece en estado de Borrador.
{ # ... 'httpsseeds' : [ 'http://www.site1.com/source1.php' , 'http://www.site2.com/source2.php' ], # ... }
BEP-0030 [10] amplía BitTorrent para que admita árboles Merkle (implementados originalmente en Tribler ). El objetivo es reducir el tamaño de los archivos torrent, lo que reduce la carga para quienes los sirven.
Un archivo torrent que utiliza árboles Merkle no tiene una clave pieces en la lista de información . En cambio, dicho archivo torrent tiene una clave root_hash en la lista de información . El valor de esta clave es el hash raíz del hash Merkle:
{ # ... 'info' : { # ... ' hash raíz ' : <hash SHA1 binario> , # ... }, # ... }
BitTorrent v2 utiliza un tipo diferente de árbol Merkle. [3]
Un archivo torrent descodificado (con una longitud de fragmento de 256 KiB = 262.144 bytes) para un archivo debian-503-amd64-CD-1.iso (cuyo tamaño es 678.301.696 bytes) podría verse así:
{ 'announce' : 'http://bttracker.debian.org:6969/announce' , 'info' : { 'length' : 678301696 , 'name' : 'debian-503-amd64-CD-1.iso' , 'piece length' : 262144 , 'pieces' : <hashes binarios SHA1> } }
Nota: las piezas aquí tendrían un valor de 51 KiB ( ).
Un archivo torrent descodificado (con una 'longitud de fragmento' de 256 KiB = 262144 B) para dos archivos, 111.txt y 222.txt , podría verse así:
{ 'announce' : 'http://tracker.example.com/announce' , 'info' : { 'files' : [ { 'length' : 111 , 'path' : [ '111.txt' ]}, { 'length' : 222 , 'path' : [ '222.txt' ]} ], 'name' : 'directoryName' , 'piece length' : 262144 , 'pieces' : <hashes binarios SHA1> } }