miércoles, 21 de agosto de 2013

Anexo 13: Bittorrent

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.
bittorrent

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:
  1. 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.
  2. 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.
  3. 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