Ir para conteúdo
  • Programando um cliente de BitTorrent

       (0 análises)

    Guilherme Martins

    Introdução

    Você, muito provavelmente, já precisou baixar um arquivo torrent na internet. Mesmo que a primeira coisa que tenha pensado quando disse isso seja algo relacionado a pirataria e coisas do gênero. Apesar da má fama que os torrents têm, em alguns casos é conveniente seu uso, como quando se vai baixar alguma distribuição baseada em linux. Para isso, se faz necessário o uso de algum cliente bittorrent. Os mais populares são: uTorrent, qBittorrent e o Bittorrent (não confundir com o protocolo). Sendo o segundo que uso e recomendo. Interessado em como funcionavam, sobre o protocolo usado, pensei que seria uma boa ideia criar o meu próprio cliente de bittorrent. É justamente isso que venho tratar nesse artigo.

    Sobre o BitTorrent

    Antes de falar do cliente em si, precisamos ter uma noção geral do BitTorrent. Trata-se de um protocolo de compartilhamento de arquivos de forma distribuída e descentralizada. Por exemplo, imagine que um usuário quer compartilhar um arquivo music.mp3 na rede. Através do protocolo BitTorrent, este arquivo será fragmentado e cópias destes fragmentos serão compartilhadas com os nós da rede, também chamados de peers. Assim, quando um peer (podemos chamar nesse caso de leecher) solicitar o arquivo, ele requisitará cada fragmento (não necessariamente na mesma ordem) e remontará o arquivo original. Durante o processo de download, o leecher também pode assumir o papel de um seeder, funcionando como um distribuidor dos fragmentos já baixados.

    A seguinte imagem ilustra o esquema acima:

    377840904_Capturadetela2022-08-03164517.thumb.jpg.e907d3fd85606ec0f042cd2c807da590.jpg

    https://blog.passwork.pro/what-is-bittorrent/

     

    Há muitos outros detalhes sobre o protocolo BitTorrent que optei por deixar de lado, uma vez que este artigo é sobre o desenvolvimento de um software cliente e não sobre o protocolo em si. No entanto, os interessados podem buscar a documentação oficial do mesmo.

    Motivações

    Naturalmente a vontade de escrever um cliente de BitTorrent não veio do nada, ela foi sendo desenvolvida desde o começo do ano de 2021, quando comecei a me interessar mais pelo assunto de redes de computadores, graças a um  professor meu na época. Isso acabou me motivando a querer estudar mais sobre o assunto, e claro, acabei caindo no tópico de redes distribuídas, P2P (Peer-to-Peer) e eventualmente no protocolo BitTorrent.

    Primeiro projeto 

    Este primeiro projeto trata de uma rede de compartilhamento de arquivos. Nele, fui derivando as coisas com as noções que tinha até aquele momento e adicionava o que acreditava necessário. Esse ainda não era um cliente BitTorrent. Na época, não tive um contato mais aprofundado com protocolo. Após cerca de dois meses, consegui fazer com que funcionasse de forma mínima ainda que com alguns bugs, esse projeto da rede de compartilhamento de arquivos. Graças a isso tive uma melhor noção de como redes distribuídas funcionam na prática. Caso queira ver o código, basta acessar o repositório aqui.

    Desenvolvimento do cliente BitTorrent

    Quando considerei fazer o projeto estava tendo contato com uma nova linguagem de programação, C#, então decidi unir o útil ao agradável e fazer um cliente BitTorrent usando-a. Inicialmente pretendia implementar todo o protocolo. No entanto, percebi, após alguns dias tentando implementar que, seria uma uma tarefa árdua e que demandaria muito tempo. Acabei obtendo como resultado um parser de arquivos torrent que, embora simples, era funcional. No fim, acabei não dando segmento a implementação de todos os requisitos do protocolo, mas caso você tenha vontade de implementar  ou apenas interesse em ver mais detalhes sobre o protocolo, recomendo começar lendo as BitTorrent Enhancement Proposals (BEPs) e caso queira fazer usando C#, recomendo também este artigo no qual me baseei.

    Nesse momento, pensei que deveria haver alguma biblioteca que cuidasse disso para mim e comecei a pesquisar. Encontrei uma chamada MonoTorrent, que parecia boa e completa. O único problema era que o projeto estava abandonado e não tinha uma documentação atualizada. Resolvi então ler o código fonte da biblioteca, já que, havia alguns exemplos, mas que já eram suficientes. Dedici por trabalhar em uma casca (wrapper), uma interface para a biblioteca apenas. Durante o desenvolvimento desse projeto, aproveitei para tentar criar uma interface gráfica também, tirando proveito da linguagem que estava usando e de suas facilidades para tal. Acabei por me desvincular da ideia tendo em vista o resultado e seguir sugestões de apenas seguir com a versão CLI, que já se encontrava funcional.

    O projeto hoje

    Eu já o considero pronto, em um estado usável. Devo dizer também que não pretendo dar suporte nem manutenção, tendo em vista que o objetivo foi apenas educacional. O código-fonte está disponível no GitHub e a seguir mostrarei o uso do cliente. 

    Ao executar o programa na linha de comando sem nenhum argumento, o seguinte menu de ajuda é exibido:

    1510162275_Capturadetela2022-08-03165055.thumb.jpg.8cdf8c6e44b9599317849faeec2089c0.jpg

    Menu de ajuda do cliente de BitTorrent

     

    As opções são bem simples. A mais importante é a opção a -l/--load, usada para carregar um arquivo do tipo .torrent, que contém informações sobre que arquivos baixar. Ela também suporta um link (Magnet) ou um hash.

    Neste exemplo a seguir, vemos o cliente de BitTorrent baixando a partir de um arquivo .torrent. Antes de fazer o download, o cliente mostra as informações do arquivo final e pergunta ao usuário se quer ou não prosseguir com o download:


    665757888_Capturadetela2022-08-03165345.thumb.jpg.f5bdc48e286c3b210b43d605c8bc5ae6.jpg

    Fazendo o download do arquivo

     

    Comparativo com outros clientes de BitTorrent existentes

    Apesar de ser um projeto para fins didáticos e de estudos, ainda apresenta uma coisa que considero vantajosa: a simplicidade. Ao mesmo tempo, pode ser visto como uma desvantagem, tendo em vista que alguns recursos mais sofisticados não estão presentes. A velocidade também não é das melhores, uma vez que não implementei otimização alguma. No entanto, em situações onde o usuário não possua interface gráfica, esse cliente pode ser de grande ajuda. Além disso, ele pode lhe ser útil, como foi para mim, como um grande auxiliar de estudos de protocolos, já que o código é aberto. Bons estudos!

    Referências:

    https://pt.wikipedia.org/wiki/BitTorrent

    https://blog.passwork.pro/what-is-bittorrent/

    http://www.bittorrent.org/beps/bep_0000.html

    https://github.com/FallAngel1337/P2P-File-Sharing

    https://github.com/FallAngel1337/BitTorrentClient


    • Curtir 2

    Feedback do Usuário

    Participe da conversa

    Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.
    Nota: Sua postagem exigirá aprovação do moderador antes de ficar visível.

    Visitante

    • Isso não será mostrado para outros usuários.
    • Adicionar um análise...

      ×   Você colou conteúdo com formatação.   Remover formatação

        Apenas 75 emojis são permitidos.

      ×   Seu link foi automaticamente incorporado.   Mostrar como link

      ×   Seu conteúdo anterior foi restaurado.   Limpar o editor

      ×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.


  • Conteúdo Similar

×
×
  • Criar Novo...