Como me conecto diretamente com um contato num chat p2p?

Um chat do tipo par a par (peer to peer, P2P) é aquele que conecta diretamente as pessoas sem um servidor intermediando a comunicação. Essa forma de conexão visa, entre outras coisas, aumentar o anonimato e burlar a censura.

Apenas lembrando, quando a gente se comunica  pela internet, existem trocentos pontos intermediários que registram e podem armazenar o que estamos fazendo (nossa localização,  tipo de comunicação, dia e hora, tamanho das informações transferidas, versão do aplicativo, modelo do dispositivo, etc.). Assim, quando conseguimos tirar um intermediário, diminuímos nossos rastros e a possibilidade de sermos identificados por terceiros (se esse é o intuito, claro. Se você usa um meio de comunicação que exige sua identificação prévia, como telefonia celular, tipo o zap, telegram ou signal (por causa do registro do chip), aí não tem jeito de trafegar sem ser reconhecido). Porém, há uma pegadinha aqui: como vou me conectar diretamente com minha amiga, essa pessoa precisa saber quem eu sou para estabelecer a conexão e poder responder (diferente da televisão ou rádio, que a estação emissora não precisa saber que recebe, pois não há resposta). Uma ligação direta só acontece se há certeza que ambas as partes se reconhecem. Ou seja, o tipo de anonimato que estou falando aqui se refere a passar incógnito por intermediários e sem usar um servidor central que gerencie as conversas. Porém, você não é anônima para a pessoa com quem está falando.

Mas, então, como que as pessoas se conectam? Para responder com um exemplo, vou usar o protocolo Tox. Outros protocolos certamente farão diferente, mas descreverei esse só para termos uma ideia.

Primeiro de tudo, quando uma pessoa comum se conecta na internet ela recebe um endereço de IP novo. Isso acontece toda vez. Se os endereços fossem fixos, como é o da nossa casa, aí não teria grilo: tu mesmo, sabendo onde a pessoa está, irias até lá e deixarias a carta, o smile, a foto, sem precisar da empresa do correio e de carteiro (intermediário). Mas na internet não é assim. Toda vez que a gente se conecta, ganhamos do sistema um endereço novo, um IP diferente para cada conexão.

Agora, se o Tox é um chat que me liga diretamente com meus contatos, sem um servidor intermediário (como zap,  email, telegram, facebook, signal, wire, etc. que têm um servidor mediando tudo que fazemos), como ele sabe onde estamos (qual nosso IP) para nos botar em contato direto? Como o meu aplicativo (que sabe onde estou) encontra o endereço de IP de um contato, sendo que ele muda de IP toda vez que conecta?

Aqui tem um pepino técnico importante. Alguém tem que conhecer os dois endereços para então colocá-los em contato. Quem está intermediando inicialmente nossa conversa, afinal?

Comecei a entender um pouquinho como o protocolo Tox funciona olhando o que o cliente (qTox) me dizia quando rodava-o pelo terminal do linux. Selecionei a parte que nos interessa aqui:

[09:23:19.947 UTC] core/core.cpp:357 : Debug: "Connecting to 144.217.86.39:33445 (velusip)"
[09:23:19.949 UTC] core/core.cpp:357 : Debug: "Connecting to 2001:1470:fbfe::109:33445 (fluke571)"
[09:23:19.949 UTC] core/core.cpp:366 : Debug: "Error bootstrapping from fluke571"
[09:23:19.950 UTC] core/core.cpp:370 : Debug: "Error adding TCP relay from fluke571"
[09:23:24.448 UTC] core/core.cpp:357 : Debug: "Connecting to d4rk4.ru:1813 (D4rk4)"
[09:23:25.616 UTC] core/core.cpp:357 : Debug: "Connecting to tmux.ru:33445 (nrn)"
[09:23:28.499 UTC] core/core.cpp:326 : Debug: Connected to the DHT
...

Fiquei intrigado ao ver que o programa estava se conectando a pessoas (IPs) que eu não tinha a menor ideia de quem eram: velusip, fluke571, D4rk4, nrn. Esses não eram meus contatos.

Toda vez que eu rodava o Tox, ele tentava se conectar a IPs que eu não conhecia. Ao observar as tentativas de conexão toda vez que abria o programa, percebi que esses IPs se repetiam. Até que resolvi ir atrás da informação que está na última linha que colei acima: “connected to the DHT“.

Agora, alguns termos difíceis. Segundo a Wikipedia, DHT significa Distributed Hash Table, ou Tabela de Hash Distribuída, que é um sistema distribuído e descentralizado para armazenar e buscar informação (chave, valor) de forma resumida. Os nós (IPs) que se conectem nesse sistema podem recuperar rapidamente o valor associado a cada chave.

Também encontrei a explicação de como o protocolo Tox usa DHTs para encontrar os meus contatos:

A DHT é um agrupamento auto-organizado de todos os usuários da rede Tox. Ela serve para encontrar o IP e a porta de cada pessoa e estabelecer uma rota direta via UDP.

Cada pessoa na DHT possui uma chave pública temporária que lhe serve de endereço. Esse endereço é efêmero e renovado a cada vez que o tox é fechado e reaberto.

Tá, o que tudo isso significa? Cada vez que abro um cliente Tox (como o qTox ou antox), me conecto em alguns endereços de IP fixos e com alta disponibilidade, chamados Bootstrap Nodes. Quando contei, eram 24 nós-IPs nessa lista (e são de vários países diferentes). Provavelmente, esses são IPs de pessoas de confiança da rede Tox. Não encontrei informações sobre quem são essas pessoas e como elas são escolhidas para serem um bootstrap node.

Então, primeiro me conecto a entre 3 a 6 nós de bootstrap (segundo a distância). Com cada um desses nós, eu troco chaves temporárias. Quando meu contato estiver online, ele fará a mesma coisa. Quando nós dois estivermos conectados ao mesmo nós, então, finalmente, estabelecemos uma conexão direta, deixando de passar pelos nós fixos de bootstrap. Só a partir desse momento é que começamos a trocar mensagens e a conexão pode ser chamada de par a par (peer to peer).

Se não me confundi em algum momento, resumidamente é assim que o protocolo Tox faz com que eu consiga uma conexão direta com um contato.

Se você sabe como outros protocolos par a par conseguem encontrar as pessoas certas (por exemplo, o Briar ou Bittorrent), escreva um artiguinho assim pra gente publicar aqui 🙂

Um comentário em “Como me conecto diretamente com um contato num chat p2p?”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *