Archivos .torrent y su codificación interna
Los archivos .torrent
contienen información acerca del archivo que queremos bajar. Esta
información está codificada mediante Bencoding. La siguiente tabla
muestra los distintos tipos de datos que podemos usar para
representar la metainformación contenida en el arhivo .torrent.
Strings Cadenas de
Caracteres <longitud de la cadena>:<cadena> 3:red
Representa la cadena “red”
Integers Enteros
i<entero>e i3e Representa 3.
Lists Lista de tipos
[strings, integers, lists, dictionaries] l<bencoded type>e
l3:red4:wifie representa la lista de 2 cadenas: ["red",
"wifi"]
Dictionaries Son
asociaciones de clave -> valor d<bencoded string><bencoded
element>e d3:ana4:blas5:mujer6:hombree representa el diccionario {
"ana" -> "mujer", "blas" ->
"hombre" } d4:spaml1:a1:bee representa el diccionario {
"spam" -> [ "a", "b" ] }
Si abrimos con un editor
de texto un archivo .torrent nos encontramos con un diccionario que
contiene las siguientes claves:
- info: Un diccionario que describe los archivos del torrent. Puede tener una u otra estructura dependiendo de si el torrent es para bajar un archivo o varios archivos con una jerarquía de directorios.
- announce: cadena que representa la URL del tracker
- announce-list: (lista de cadenas opcional). Se usa para representar listas de trackers alternativos. Es una extensión a la especificación original.
- creation date: (entero opcional) La fecha de creación del torrent en formato de época UNIX.
- comment: (cadena opcional) Campo libre para el creador del torrent.
- created by: (cadena opcional) Nombre y versión del programa usado para crear el archivo torrent.
- El diccionario info que acabamos de citar contiene a su vez las siguientes claves:
- name: (cadena) El nombre del archivo o directorio donde se almacenarán los archivos.
- piece length: Como dijimos en la introducción, el archivo que queremos compartir es dividido en piezas. Este parámetro es un entero que representa el número de bytes de cada pieza. Piezas demasiado grandes causan ineficiencia y piezas demasiado pequeñas forman un archivo .torrent más pesado. Actualmente se aconseja fijar el tamaño de cada pieza en 512 KB o menos para archivos de varios GBs.
- pieces: Cadena que representa la concatenación de la lista de claves hash de cada parte del fichero compartido. Las claves hash son generadas utilizando SHA-1 con un resumen de 160 bits y un tamaño máximo por parte de 2^64 bits. Este conjunto de claves se utiliza como mecanismo para asegurar la integridad y consistencia de una parte, una vez ha sido completada la descarga de dicha parte.
- private: (opcional). Es un entero que puede tener valores 0 ó 1 y que indica si se pueden buscar peers fuera de los trackers explícitamente descritos en la metainformación o no.
- length: (entero) Longitud del archivo en bytes.
- md5sum: (cadena opcional). Es una cadena hexadecimal de 32 caracteres correspondiente a la suma MD5 del archivo.
- files: Sólo aparecerá en el caso de que sea un torrent multi archivo. Es una lista de diccionarios (uno para cada archivo, pero con una estructura diferente a info). Cada uno de estos diccionarios contendrá a su vez información sobre la longitud del archivo, la suma MD5 y una ruta (path) en donde debe ubicarse el archivo en la jerarquía de directorios.
Algoritmos
A continuación
describimos los términos más importantes:
- Piezas y bloques. Los archivos transmitidos usando Bittorrent se dividen en piezas y éstas a su vez se dividen en bloques. Los bloques son la unidad de transmisión en la red, pero las piezas parcialmente recibidas no pueden ser servidas por un peer hasta que estén completas, es decir que se tengan todos sus bloques.
- Interested. Se dice que un peer A está interesado en el peer B (A está en el estado Interested) cuando el peer B tiene piezas que el peer A no tiene. Por el contrario, el peer A no está interesado en el peer B cuando el peer B solo tiene un subconjunto de las piezas del peer A.
- Choked. Se dice que el peer A bloquea al peer B (B está en el estado Choked) cuando el peer A decide no enviar piezas al peer B. Por el contrario, se dice que el peer A desbloquea al peer B cuando el peer A decide enviar piezas al peer B.
- Conjunto de peers. Cada peer mantiene una lista de los peers que conoce.
- Peers locales y remotos. Se llama peer local al par que está ejecutando el cliente bittorrent y peers remotos a los pares que están en el conjunto de peers del peer local.
- Conjunto de peers activos. El peer A sólo puede enviar datos a un subconjunto de su conjunto de peers. A este conjunto se le llama conjunto de peers activos. El algoritmo de bloqueo , que veremos más adelante, determina los peers que formarán parte del conjunto de peers activos. Solamente los peers que están desbloqueados por el peer local e interesados en él son parte del conjunto de peers activos.
- Piezas más raras y conjunto de las piezas más raras. Las piezas más raras son las que tienen menos número de copias en el conjunto de peers. En el caso de que la pieza menos replicada en el conjunto de peers tenga m copias, entonces todas las piezas con m copias forman el conjunto de las piezas más raras.
Algoritmo de “las piezas más raras primero” (rarest first algorithm)
Este algoritmo define la
estrategia usada por el protocolo Bittorrent para seleccionar la
siguiente pieza a descargar. Cada par mantiene una lista del número
de copias de cada pieza en su conjunto de pares y usa esta
información para definir su conjunto de las piezas más raras. Sea m
el número de copias de la pieza más rara, entonces la posición de
cada pieza con m copias en el conjunto de peers es añadida al
conjunto de las piezas más raras. Cada peer selecciona
aleatoriamente la siguiente pieza para bajar de su conjunto de las
piezas más raras.
El comportamiento de
este algoritmo puede ser modificado por 3 causas:
- Si un peer ha bajado menos de 4 piezas, éste elige aleatoriamente la próxima pieza para bajar. Una vez que se han descargado estas 4 piezas, el algoritmo funciona de la manera descrita anteriormente. La razón de este comportamiento inicial es permitir que un peer baje sus primeras piezas muy rápidamente, ya que es importante tener algunas piezas para empezar a intercambiar en el Algoritmo de Bloqueo. De hecho, una pieza elegida aleatoriamente tiene muchas más copias que las piezas más raras, así que probablemente el tiempo de bajada será menor seleccionándola aleatoriamente.
- La segunda causa es que cuando uno de los bloques de una pieza se ha pedido, los otros bloques de la misma pieza se piden con la prioridad más alta. La razón de este comportamiento es completar la descarga de una pieza completa lo antes posible, dado que sólo las piezas completas pueden ser enviadas.
- La última causa es el modo de fin de juego (End Game Mode). Este modo empieza muy al final de la descarga, cuando el peer pide todos los bloques que todavía no han sido recibidos a todos los peers de su conjunto de peers que tienen esos bloques. Cada vez que se recibe un bloque, el peer cancela la petición para el bloque recibido a todos los peers en su conjunto de peers que tienen la petición activa.
Algoritmo de bloqueo (choke algorithm)
Este algoritmo define la
estrategia usada por el protocolo BitTorrent para seleccionar el
siguiente peer con el que va a interactuar. Se usa para garantizar
una buena relación subida/bajada entre los peers. Por ejemplo los
“free riders”, pares que nunca suben, deben penalizarse. El
algoritmo se describe desde el punto de vista del peer local, así
que “interesado” significa interesado en el peer local y
“bloqueado” significa bloqueado por el peer local. El algoritmo
funciona así:
Como máximo 4 peers
remotos pueden estar desbloqueados e interesados a la vez.
Cada 10 segundos, los
peers remotos interesados se ordenan de acuerdo a su velocidad de
bajada hacia el peer local y los 3 más rápidos son desbloqueados.
Cada 30 segundos, un peer
interesado adicional se desbloquea aleatoriamente. Esto se llama
“Desbloqueo Optimista” (Optimistic Unchoke), que tiene dos
objetivos: permite evaluar la capacidad de bajada de nuevos peers en
el conjunto de peers y también posibilita que los peers que no
tienen ninguna pieza que compartir puedan obtener su primera pieza.
Limitaciones y ataques
Se considera que lo justo
es subir la misma cantidad de datos que se ha bajado, es decir que la
tasa de descarga/subida sea de 1, pero este comportamiento no es
común ni está garantizado en BitTorrent. Normalmente los usuarios
se desconectan rápidamente una vez que han obtenido la copia
completa de su archivo. Esto se denomina leeching.
Esta forma de actuar
provoca que aunque todo el contenido nuevo se comparta al principio
muy rápidamente, con el paso de los días el torrent caduque porque
no quedan semillas, ya que BitTorrent sólo ofrece incentivos a los
leechers pero no a los seeds que no obtienen ninguna ventaja por
permanecer subiendo a la red.
Para evitar esto han
aparecido los denominados trackers privados. Normalmente para usar un
tracker privado hay que identificarse previamente. Para cada usuario
registrado guardan las estadísticas de tráfico y utilizan un
sistema de porcentajes que permite saber si el usuario comparte o no
los datos que haya descargado o esté descargando. Muchos de estos
trackers suelen expulsar a los usuarios que tienen un porcentaje
bajo, ya que al no compartir no colaboran con la red.
Otro punto flaco es que
el tracker es un cuello de botella ya que consume el 1 por mil del
tráfico total de la red. Teniendo en cuenta la cantidad de datos que
circulan en una red de este tipo, es un porcentaje a tener en cuenta.
Además, la caída del tracker implica que nuevos peers no se puedan
conectar y que aquellos que ya están conectados no puedan descubrir
otros. Conceptualmente se forman pequeñas islas desorganizadas,
donde en realidad todos los nodos están conectados entre sí a
través de vecinos pero no hay comunicación entre esas islas (la
comunicación entre ellas la gestionaba el tracker) y por tanto
influye muy negativamente en la descarga.
Una debilidad más de
BitTorrent es que es poco eficiente en transferencias de archivos
pequeños (unos cuantos kb) ya que el ancho de banda usado en
mensajes del protocolo es comparativamente alto.
Al contrario que otros
famosos programas P2P como Kazaa o Emule, los clientes Bittorrent
carecen de alguna utilidad de búsqueda de contenidos. Los archivos
.torrent se suelen bajar de páginas web donde se suelen indexar las
novedades o bien existen buscadores de torrents como mininova.org o
The Pirate Bay, este método garantiza que se esté descargando el
fichero correcto.
Por otra parte,
BitTorrent tiene un protocolo considerado de los de modelo económico.
Es inocente, no está preparado para clientes maliciosos, y por tanto
el protocolo no presenta soluciones para posibles ataques a través
de este tipo de clientes. A continuación vamos a ver algunos
ejemplos de estos ataques:
- Denegación de servicio a través de un ataque Sybil:Cada peer genera un único identificador al comienzo mediante un hash de su dirección IP y la hora. Si un peer generara múltiples identificadores podría ocurrir que el conjunto de peers activos de los otros peers de la red sólo estuviera formado por multitud de identificadores falsos del mismo peer atacante, y de esta manera sólo se servirían datos a él.
- Ataque de “Sólo a semillas”:Un peer tiene que subir a los otros peers si quiere formar parte de su conjunto de peers activos. Si un peer sólo se conecta a seeds, podría bajarse el archivo entero sin necesidad de haber compartido ni una sola pieza.
- Ataque de “Subida corrupta”Bittorrent verifica la integridad de la pieza una vez descargada comparando su código hash con el que aparecía en la metainformación del torrent. Cuando un peer pide un bloque a un peer malicioso, éste puede decir que lo tiene aunque en realidad no sea así. Lo que le envía es basura, aunque el otro peer no se da cuenta hasta que le ha llegado la pieza entera y vuelve a pedir el bloque. Aunque se le están enviando datos corruptos, las tasas de subida sí son actualizadas y el peer malicioso puede mantenerse en la lista de peers preferidos.
Los clientes BitTorrent
actuales cuando reciben varios bloques corruptos de un mismo cliente
añaden su dirección IP a una lista de usuarios bloqueados y de esta
forma solucionan este problema.
Mejoras del protocolo
El protocolo Bittorrent
es susceptible de ser mejorado, por lo que algunos clientes han
incorporado diversas modificaciones como DHT, Web Seeding y Super
Seeding.
DHT
Si el tracker cae,
dependemos de los pares a los que estemos conectados para poder
finalizar una descarga. No siempre se consigue puesto que es
necesario que no se desconecten y que entre todos tengan el archivo
completo.
El DHT (Distritbuted Hash
Table) es una extensión oficial al protocolo de Bittorrent. Consiste
en que cada nodo de la red conserva información de los nodos
vecinos. De esta forma se evita el cuello de botella del tracker del
que hemos hablado antes, ya que si el tracker cae la totalidad de la
información de los peers está todavía disponible en los propios
peers.
Se puede considerar como
una descentralización del protocolo, aunque todavía no es completa
porque todavía se depende del tracker para bajarse el .torrent y
empezar a conocer los primeros nodos. El uso del DHT y la
comunicación entre nodos sin el paso por el tracker comporta una
independencia del nodo que a veces puede no interesar, como en el
caso de los trackers privados, donde se suelen aplicar ciertas
restricciones al usuario según sus estadísticas y donde es
requisito común el estar registrado (como mínimo) para poder entrar
en la red.
Debido a esto, y para
evitar que los administradores de los trackers privados expulsarán a
los usuarios de clientes con DHT activado, se ha añadido la
posibilidad de establecer un nuevo parámetro en el archivo .torrent
llamado “Private Flag”. Cuando el cliente lee esta opción
automáticamente desactiva el DHT para esa descarga. Este tipo de
parámetro es compatible con todos los clientes. Así si uno no
implementa DHT lo omitirá sin más.
Web Seeding
En muchas ocasiones en
una misma página web aparecen enlaces HTTP o FTP además del archivo
.torrent como posibles alternativas para bajar un archivo. La idea de
Web seeding es combinar la potencia de la descarga directa del
servidor con la del P2P. De esta manera siempre habría como mínimo
una semilla completa de la que descargar inicialmente.
Super Seeding
La supercompartición, en
inglés superseeding (Vuze) o initial seeding (µtorrent), sirve para
que el primer seed que sube un nuevo archivo pueda reducir el número
de piezas que tiene que subir para crear las primeras semillas y para
que los peers que lo están bajando lo puedan hacer más rápidamente.
Cuando un seed “A”
entra a un enjambre en modo super seeding, no aparece en el enjambre
como una semilla normal con el 100% del archivo sino que se oculta
como un leecher normal que no tiene ningún dato. A medida que otros
peers entran en el enjambre, el superseeder (el peer disfrazado) les
manda un mensaje de que tiene una nueva pieza; una pieza que en
realidad nunca ha sido enviada. Esto hará que el peer “B” del
enjambre pida solamente ese trozo. Cuando el peer “B” termina de
descargar aquella pieza, el seed "A" no le comunicará que
tiene otras piezas para enviar hasta que vea que la primera pieza que
le envió a "B" haya sido compartida con al menos otro peer
“C”. Mientras eso no pase, el peer “B” no tendrá acceso a
ninguna de las demás piezas de la semilla “A”, y así “A” no
desperdiciará su ancho de banda de subida teniendo que volver a
enviar piezas que ya ha enviado.








0 comentarios:
Publicar un comentario