2. Fundamentos

Conceitos

Para um bom entendimento do protocolo BitTorrent, é necessário saber quais são os atores e compreender alguns termos que fazem parte deste universo.

Cliente (client): um aplicativo que implementa o protocolo BitTorrent, e através do qual um usuário realiza trocas de arquivos seguindo esse protocolo. O termo pode se referir ao programa em si ou a um usuário conectado por este programa.

Par (peer): qualquer cliente que está participando na troca de um determinado arquivo, seja através de envio e/ou recebimento de partes do arquivo. Cada par é um nó na rede de compartilhamento.

Semente (seeder): par que já contem uma cópia completa do arquivo, ou seja, apenas realiza upload.

Sanguessuga (leecher): par que ainda não possui uma cópia completa do arquivo, ou seja, ainda está realizando download. Este termo é usado por alguns com uma conotação negativa, para designar aqueles que apenas recebem pedaços de outros, ou seja, não enviam as partes que já possuem. Para outros, todos aqueles que ainda estão baixando o arquivo – realizando upload ou não – podem ser chamados de sanguessugas.

Enxame (swarm): o conjunto de pares que está compartilhando um determinado arquivo, ou seja, a rede de compartilhamento.

Rastreador (tracker): servidor responsável por manter uma lista de quais pares estão participando de um enxame. Para tanto, os pares devem se reportar periodicamente ao servidor. Este, por sua vez, envia aos usuários uma lista de pares com os quais eles podem se conectar, permitindo assim que as conexões sejam estabelecidas. Sua função secundária e opcional é armazenar estatísticas sobre o torrent, tais como o número de downloads.

 Importante: Um servidor de rastreamento não possui uma cópia do arquivo.

Arquivo de metadados (metafile): arquivo, normalmente de extensão .torrent, que contém informações sobre o arquivo ou arquivos que serão, de fato, baixados. Tais informações são necessárias para que o compartilhamento possa ser iniciado, e incluem o tamanho de cada arquivo, o hash de cada pedaço para verificação após o recebimento e um ou mais endereços de servidores de rastreamento para os arquivos.

Pedaço (piece): cada arquivo presente em um .torrent é dividido em pedaços, a fim de otimizar a distribuição do mesmo e permitir que a verificação após o download, para garantir que não houve erros de transmissão, possa ser feita com freqüência maior. Além disso, caso o pedaço esteja de fato corrompido, apenas ele precisará ser reenviado, e não o arquivo inteiro.

Bloco (block): cada pedaço é subdividido em blocos, que são a unidade mínima de envio. Cada requisição de envio a um par deve ser de um bloco. Esta divisão permite que um pedaço seja baixado mais rápido, pedindo blocos deste a pares diferentes.

Funcionamento básico

Para dar início a um download através da rede BitTorrent, o primeiro passo é obter o arquivo de metadados relativo aos arquivos desejados. Estes normalmente se encontram em sites de busca e catalogação especializados (chamados de sites de indexação) e são baixados dos servidores pelo tradicional protocolo HTTP.

Este arquivo indica quais arquivos podem ser baixados deste enxame; quando aberto no cliente BitTorrent escolhido pelo usuário, este poderá selecionar um ou mais arquivos para serem recebidos dos pares.  A descoberta inicial dos pares se dá através dos servidores de rastreamento (que podem ou não ser também servidores de indexação). A lista de rastreadores nos quais o arquivo .torrent foi cadastrado também está presente no arquivo de metadados.

Quando o cliente contatar o rastreador para informar que deseja fazer parte da rede de compartilhamento do arquivo em questão, processo conhecido como anúncio,  o servidor irá enviar uma lista de pares ativos, para que o cliente possa se conectar a estes e começar a baixar os arquivos. O cliente deve contatar o rastreador periodicamente, para que este saiba que o usuário ainda está on-line.

Figura 3: Evolucao do envio de um arquivo atraves de BitTorrent.
Figura 3: Evolução do envio de um arquivo através de BitTorrent.

Após a conexão inicial, outros pares podem ser descobertos através daqueles com o qual o cliente já está conectado, seguindo o protocolo adicional Peer Exchange (troca de pares), que não consta da especificação original do protocolo BitTorrent.

Depois de conectar-se aos pares e ver quais pedaços estão disponíveis em cada um, o cliente irá começar a pedir que os pares enviem seus pedaços. Após ter alguns pedaços completos, o cliente também passará a receber requisições de envio. A escolha, em ambos os casos, de quais pedaços ou blocos e com quais pares trocá-los é feita seguindo algoritmos detalhados nas seções seguintes. Estes algoritmos foram pensados com fins de otimizar a distribuição do arquivo e diminuir o tempo total de envio.

Para cada pedaço completamente recebido, o cliente calcula o hash SHA1 do pedaço, e confere se este está de acordo com o valor presente no arquivo de metadados. Caso este esteja diferente, o pedaço é considerado como corrompido e é descartado, e deve ser baixado novamente.

Quando o cliente conclui o recebimento de todos os pedaços do arquivo, ele deixa de realizar download e torna-se uma semente, contribuindo apenas no envio, até que o programa seja encerrado pelo usuário.

O criador de um arquivo deve seguir um processo diferente: de posse dos arquivos, ele deve gerar um arquivo de metadados utilizando um cliente que tenha essa capacidade, fornecendo como entrada os arquivos a serem compartilhados e um ou mais servidores de rastreamento por ele escolhidos. O arquivo .torrent resultante pode ser distribuído, normalmente através de um servidor de indexação. Caso o objetivo seja compartilhar os arquivos com um grupo pré-definido, o arquivo de metadados pode ser enviado diretamente para as pessoas interessadas – por exemplo, via e-mail.

Arquivo de metadados

O arquivo .torrent está codificado no formato bencoding, que suporta quatro tipos de dados: strings (cadeias de caracteres), números inteiros, listas e dicionários (listas nas quais cada valor está associado a um valor de chave único, do tipo string). As listas e dicionário podem conter qualquer um dos quatro tipos.

  • Strings: [número de caracteres em base dez, codificado em ASCII]:[texto]
    Ex.: 10:bittorrent → “bittorrent”

  • Inteiros: i[número em base dez, codificado em ASCII]e
    Ex.: i6e → 6

  • Listas: l[valor em bencoding][valor em bencoding][...]e
    Ex: l3:bit7:torrenti2008ee → <“bit”, “torrent”, 2008>

  • Dicionários: d[chave em bencoding][valor em bencoding][chave][valor][...]e
    Ex.: d1:a6:inicio1:bi5e1:c3:fime → <(“a”, “inicio”), (“b”, 5), (“c”, “fim”)>
    Obs: As chaves devem estar ordenadas de forma crescente.

O conteúdo de um arquivo de metadados é um dicionário, cujas chaves e valores são os abaixo:

  • announce: uma string contendo a URL do servidor de rastreamento.

  • announce-list: uma lista opcional de URLs dos rastreadores secundários.

  • creation date: data de criação do torrent, em segundos desde 01/01/1970.

  • comment: string contendo um texto de comentário livre.

  • created by: string com o nome e a versão do programa usado para criar o arquivo de metadados.

  • info: dicionário cujo conteúdo, especificado abaixo, descreve os arquivos compartilhados por esse torrent.

O dicionário info contém algumas informações gerais do torrent (tamanho do pedaço, hashes de todos os pedaços, restrição do uso de rastreadores diferentes do principal) e algumas informações para cada arquivo compartilhado (tamanho em bytes e nome do arquivo).