Como funcionam os links magnéticos do BitTorrent?

157

Pela primeira vez, usei um link magnético . Curioso sobre como ele funciona, procurei as especificações e não encontrei nenhuma resposta. O wiki diz que xtsignifica "tópico exato" e é seguido pelo formato ( btihneste caso) com um hash SHA1. Eu vi a base32 mencionada, sabendo que são 5 bits por caractere e 32 caracteres, achei que ela contém exatamente 160 bits, que é exatamente o tamanho do SHA1.

Não há espaço para um endereço IP nem nada, é apenas um SHA1. Então, como o cliente BitTorrent encontra o arquivo real? Ativei o URL Snooper para ver se ele visita uma página (usando TCP) ou faz uma pesquisa ou algo parecido, mas nada aconteceu. Não faço ideia de como o cliente encontra colegas. Como é que isso funciona?

Além disso, qual é o hash? É um hash de uma matriz de todos os hashes de arquivo juntos? Talvez seja um hash do arquivo torrent real necessário (removendo certas informações)?


Em uma VM, tentei um link magnético com o uTorrent (que foi instalado recentemente) e ele conseguiu encontrar pares. De onde veio o primeiro par? Era fresco e não havia outros torrents.

Barmar
fonte
3
Isso é relevante para a programação?
Krypton

Respostas:

156

Um link magnético do BitTorrent identifica um torrent usando 1 um valor de hash SHA-1 ou SHA-256 truncado, conhecido como "infohash". Esse é o mesmo valor que os pares (clientes) usam para identificar torrents ao se comunicar com rastreadores ou outros pares. Um arquivo .torrent tradicional contém uma estrutura de dados com duas chaves de nível superior: announceidentificando os rastreadores a serem usados ​​para o download e infocontendo os nomes de arquivos e hashes do torrent. O "infohash" é o hash dos infodados codificados .

Alguns links magnéticos incluem rastreadores ou sementes da web, mas geralmente não. Seu cliente pode não saber nada sobre o torrent, exceto por seu infohash. A primeira coisa que ele precisa é encontrar outros colegas que estejam baixando o torrent. Isso é feito usando uma rede ponto a ponto separada 2 operando uma "tabela hash distribuída" (DHT). Um DHT é um grande índice distribuído que mapeia torrents (identificados por infohashes) para listas de pares (identificados por endereço IP e portas) que participam de um enxame para esse torrent (upload / download de dados ou metadados).

Na primeira vez em que um cliente ingressa na rede DHT, ele gera um ID aleatório de 160 bits do mesmo espaço que os infohashes. Em seguida, ele inicializa sua conexão com a rede DHT usando endereços codificados de clientes controlados pelo desenvolvedor do cliente ou clientes que suportam DHT encontrados anteriormente em um enxame de torrents. Quando se quer participar de um enxame para um determinado torrent, ele procura a rede DHT para vários outros clientes cujos IDs estão tão perto de 3 possível do infohash. Ele notifica esses clientes de que gostaria de participar do enxame e solicita a eles as informações de conexão de todos os colegas que eles já conhecem e que estão participando do enxame.

Quando os colegas estão fazendo o upload / download de um torrent específico, eles tentam contar um ao outro sobre todos os outros colegas que eles conhecem que estão participando do mesmo enxame de torrents. Isso permite que os colegas se conheçam rapidamente, sem submeter um rastreador ou DHT a solicitações constantes. Depois que você souber de alguns colegas do DHT, seu cliente poderá solicitar a eles informações sobre a conexão de mais pares no enxame de torrents, até que você tenha todos os pares necessários.

Finalmente, podemos pedir a esses pares os infometadados do torrent , contendo os nomes dos arquivos e a lista de hash. Depois que baixamos essas informações e verificamos que elas estão corretas usando o conhecido infohash, estamos praticamente na mesma posição que um cliente que começou com um .torrentarquivo comum e obteve uma lista de pares no rastreador incluído.

O download pode começar.

1 O infohash normalmente é codificado em hexadecimal, mas alguns clientes antigos usavam a base 32. v1 ( urn:btih:) usa o resumo SHA-1 diretamente, enquanto v2 ( urn:bimh:) adiciona um prefixo multihash para identificar o algoritmo de hash e o comprimento do resumo.
2 Existem duas redes DHT principais: a DHT "principal" mais simples e um protocolo mais complicado usado pelo Azureus.
3 A distância é medida por XOR.

Leitura adicional

Jeremy Banks
fonte
1
O nó de inicialização, por exemplo dht.transmission.com, é simplesmente um rastreador? Pelo que entendi, ele precisa acompanhar a lista de pares por hash de informações - que é exatamente o que um rastreador faz.
Kar
3
@ Kate Não exatamente. Um nó DHT típico armazena listas de pares para alguns torrents que estão "próximos" dele no "espaço" da rede DHT. Em vez disso, um rastreador tenta armazenar listas de pares para todos os torrents que conhece. Além disso, os nós de inicialização DHT especificamente não armazenam listas de pares para nenhum torrent. Em vez disso, eles distribuem apenas listas de outros nós DHT, para ajudá-lo a se conectar à rede geral. Você pode, então, encontrar um nó DHT típico com a lista de pares você está interessado.
Jeremy Banks
"Alguns links magnéticos incluem rastreadores ou sementes da web" - estou um pouco confuso. O Magnet está sendo usado para baixar o arquivo torrent como você descreve. Na especificação URI do Magnet, vejo "fonte aceitável" e "rastreador" como informações que podem ser codificadas no URI. Agora, o rastreador é obviamente específico do Bittorrent e provavelmente será usado além dos rastreadores listados no arquivo torrent. A "fonte aceitável" deve ser usada para baixar o arquivo torrent ou (um dos) arquivos reais a serem baixados pelo arquivo Torrent?
Frederick Nord
@FrederickNord No suporte a clientes de torrent, o ws=parâmetro aponta para um URL de semente da web BEP-19 dos dados reais e o xs=parâmetro aponta para um URL com o .torrentpróprio arquivo. Eu acho que isso é um pouco inconsistente com outros usos do magnet:esquema, mas é assim que é. Eu esqueço se algum cliente usa as=para alguma coisa ... talvez apenas como um substituto para o IIRC xs=, mas não amplamente suportado.
Jeremy Banks
46

A descoberta por pares e a descoberta de recursos (arquivos no seu caso) são duas coisas diferentes.

Eu estou mais familiarizado com o JXTA, mas todas as redes ponto a ponto funcionam com os mesmos princípios básicos.

A primeira coisa que precisa acontecer é a descoberta por pares.

Descoberta de pares

A maioria das redes p2p são redes "semeadas": na primeira inicialização, um ponto se conecta a um endereço conhecido (codificado) para recuperar uma lista de pontos em execução. Pode ser propagação direta, como a conexão dht.transmissionbt.commencionada em outro post ou propagação indireta, como geralmente feito com o JXTA, em que o ponto se conecta a um endereço que fornece apenas uma lista de texto sem formatação de outros endereços de rede.

Depois que a conexão é estabelecida com o (s) primeiro (s) ponto (s), o ponto de conexão realiza uma descoberta de outros pontos (enviando solicitações) e mantém uma tabela deles. Como o número de outros pares pode ser enorme, o ponto de conexão mantém apenas parte de uma DHT (Distributed Hash Table) dos pares. O algoritmo para determinar qual parte da tabela o ponto de conexão deve manter varia de acordo com a rede. O BitTorrent usa o Kademlia com identificadores / chaves de 160 bits.

Descoberta de Recursos

Depois que alguns pares são descobertos pelo parceiro de conexão, o último envia alguns pedidos para a descoberta de recursos. Os links magnéticos identificam esses recursos e são construídos de forma que sejam uma "assinatura" para um recurso e garantem que eles identifiquem exclusivamente o conteúdo solicitado entre todos os pares. O ponto de conexão enviará uma solicitação de descoberta para o link / recurso magnético aos pontos ao seu redor. O DHT é construído de tal maneira que ajuda a determinar quais pares devem ser solicitados primeiro pelo recurso (leia Kademlia na Wikipedia para obter mais informações). Se o par solicitado não reter o recurso solicitado, ele geralmente "transmitirá" a consulta para pares adicionais buscados em seu próprio DHT.

O número de "saltos" nos quais a consulta pode ser transmitida geralmente é limitado; 4 é um número usual em redes do tipo JXTA.

Quando um par mantém o recurso, ele responde com todos os detalhes. O ponto de conexão pode então se conectar ao ponto que contém o recurso (diretamente ou através de um relé - não vou entrar em detalhes aqui) e começar a buscá-lo.

Recursos / serviços em redes P2P não estão diretamente conectados aos endereços de rede: eles são distribuídos e essa é a beleza dessas redes altamente escalonáveis.

Bruno Grieder
fonte
Esta é a resposta mais sucinta, sem muito jargão técnico. Obrigado.
Desaivv 31/05
26

Fiquei curioso com a mesma pergunta. Lendo o código para transmissão, encontrei o seguinte em libtrnasmission/tr-dht.c:

3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );

Ele tenta 6 vezes, aguardando 40 (!) Segundos entre as tentativas. Eu acho que você pode testá-lo excluindo os arquivos de configuração ( ~/.config/transmissionno unix), bloqueando toda a comunicação dht.transmissionbt.come ver o que acontece (aguarde pelo menos 240 segundos).

Portanto, parece que o cliente possui um nó de autoinicialização incorporado para começar. Obviamente, depois de entrar na rede, não precisa mais desse nó de inicialização.

yhager
fonte
9

Eu finalmente encontrei especificação. Pela primeira vez, o google não ajudou . (wiki com link para bittorrent.com, que é o site principal. Cliquei no link dos desenvolvedores, observe a guia bittorrent.org à direita e ficou fácil a partir daí. É difícil encontrar links quando você não tem idéia do que eles estão rotulados e muitos cliques de distância).

Parece que todos os torrents têm uma rede de pares. Você encontra colegas de rastreadores e os mantém entre as sessões. A rede permite que você encontre colegas e outras coisas. Ainda não li como é usado com links magnéticos, mas parece que não está definido como um novo cliente encontra pares. Talvez alguns estejam envolvidos, ou eles usam seu servidor doméstico ou rastreadores conhecidos incorporados ao cliente para obter o primeiro ponto da rede.


fonte
Ah, acho que eu estava certo sobre ir ao DHT para encontrar clientes. "Se nenhum rastreador for especificado, o cliente DEVE usar o DHT (BEP 0005 [3]) para adquirir pares."
Jeff Mercado
8

Quando comecei a responder sua pergunta, não sabia que você estava perguntando como o esquema de ímãs funciona. Apenas pensei que você queria saber como as partes relevantes para o protocolo bittorrent foram geradas.


O hash listado no uri do ímã é o hash de informações do torrent codificado em base32. O hash de informação é o hash sha1 do bloco de informações codificadas do torrent.

Este código python demonstra como pode ser calculado.

Eu escrevi uma implementação C # (muito ingênua) para testar isso, já que eu não tinha um codificador em mãos e ele corresponde ao que é esperado do cliente.

static string CalculateInfoHash(string path)
{
    // assumes info block is last entry in dictionary
    var infokey = "e4:info";
    var offset = File.ReadAllText(path).IndexOf(infokey) + infokey.Length;
    byte[] fileHash = File.ReadAllBytes(path).Skip(offset).ToArray();
    byte[] bytes;
    using (SHA1 sha1 = SHA1.Create())
        bytes = sha1.ComputeHash(fileHash, 0, fileHash.Length - 1); // need to remove last 'e' to compensate for bencoding
    return String.Join("", bytes.Select(b => b.ToString("X2")));
}

Pelo que entendi, esse hash não inclui nenhuma informação sobre como localizar o rastreador, o cliente precisa descobrir isso por outros meios (o URL de anúncio fornecido). É exatamente isso que distingue um torrent do outro no rastreador.

Tudo relacionado ao protocolo bittorrent ainda gira em torno do rastreador. Ainda é o principal meio de comunicação entre o enxame. O esquema do ímã uri não foi projetado especificamente para uso pelo bittorrent. É usado por qualquer protocolo P2P como uma forma alternativa de comunicação. Clientes Bittorrent adaptados para aceitar links magnéticos como outra maneira de identificar torrents dessa maneira, você não precisa mais baixar arquivos .torrent. O uri do ímã ainda precisa especificar o tracker para localizá-lo para que o cliente possa participar. Ele pode conter informações sobre outros protocolos, mas é irrelevante para o protocolo bittorrent. O protocolo bittorrent não funcionará sem os rastreadores.

Jeff Mercado
fonte
2
Isso não ajuda. Mas você está dizendo que ele hashes o arquivo torrent inteiro pulando o bloco infokey? Minha pergunta era sobre como encontrar os pares.
1
@ acidzombie24 Você provavelmente está pensando em rastreadores distribuídos que usam DHT para localizar pares. Isso não tem nada a ver com links magnéticos. ( en.wikipedia.org/wiki/… )
Alexander Sagen
2
@ Jeff M: Mas o que 'envia' uma lista de colegas de volta. Um link é apenas um link que não possui rastreador associado. Eu estava tentando descobrir o que envia de volta colegas.
1
+1. O link do ímã em questão também não especifica tr (acker). Apenas o sha1 que me deixou confuso. Especialmente quando estou usando uma nova instalação sem torrents em execução (e não conectados a nenhum ponto) e com o link magnético para encontrar pares. É mágico, não tenho ideia de como funciona. Deve haver algum servidor doméstico que ele possa solicitar pares. Mas isso significa que eu envio consultas a colegas que procuram um hash e o cliente passa a mensagem para muitos colegas até que alguém atenda minha ligação?
1
Não sei bem como responder a isso. Todos os uris magnéticos que eu vi sempre especificam o rastreador. Pode ser o seu cliente tentando uma lista de rastreadores públicos que conhece e por acaso a possui. Quais rastreadores a lista de torrents associada está sendo usada? Como é exibido? Existe alguma relação entre o rastreador ao qual ele se conecta e a fonte do link do ímã? Talvez seja um torrent que usa DHT? O mesmo funciona para um torrent privado? Mais uma vez, não sei exatamente como o DHT funciona. Vou ver se consigo encontrar mais informações.
Jeff Mercado
3

a lista de pares provavelmente é preenchida a partir do torrent que atualiza o cliente (por exemplo, há um torrent para utorrent que o atualiza). contanto que todo mundo esteja usando o mesmo cliente, deve ser bom porque você não tem escolha a não ser compartilhar a atualização.

Moe
fonte
Esse é um lugar muito lógico para procurar o hash e outros pares. 1