Programação de aplicativo P2P

Estou escrevendo um programa p2p personalizado que é executado na porta 4900. Em alguns casos, quando a pessoa está atrás de um roteador, essa porta não é acessível pela Internet.

Existe uma maneira automática de ativar o access à porta a partir da Internet. Eu não tenho certeza de como funcionam as outras aplicações p2p.

Alguém pode por favor lançar alguma luz sobre isso?

Conectividade P2P em poucas palavras. Suponha que estamos falando de UDP aqui. As etapas abaixo também podem ser aplicadas ao TCP com alguns ajustes.

  1. Enumerar todos os seus endereços IP locais (geralmente apenas 1). Crie um soquete UDP em um determinado número de porta ** para cada adaptador com um endereço IP.

  2. Para cada soquete criado na etapa 1, entre em contato com um servidor STUN ou TURN com o mesmo soquete para descobrir seu endereço IP externo e descobrir o que o número da porta interna mapeia para fora do NAT (nem sempre o mesmo valor de porta). Ou seja, seu endereço local 192.168.1.2:4900 pode ser 128.11.12.13:8888 para o mundo externo. E alguns NATs nem sempre usam o mesmo mapeamento de porta ao usar a mesma porta local para outros endereços IP. O TURN também fornecerá um “endereço de retransmissão”. Você também pode usar o UPNP para obter um endereço mapeado de porta diretamente de seu roteador, se ele suportar esse protocolo.

  3. Por meio de um serviço de encontro (SIP, XMPP, mensagem instantânea, web service, email, xícaras com strings), publique sua lista de candidatos a um serviço ou envie uma notificação para o outro cliente que diz: “Ei, quero me conectar com você “. Esta mensagem inclui todos os “candidatos de endereço” (pares de ip e porta) coletados nas etapas 1 e 2.

  4. O cliente remoto, ao receber o convite para se conectar, executa as etapas 1 e 2 acima também. Em seguida, envia de volta a sua lista de candidatos através do mesmo canal em que recebeu a lista de candidatos do candidato.

  5. Passo de perfuração. Ambos os clientes, começam a enviar mensagens de teste através do UDP para os candidatos do endereço do outro lado e a ouvir as mesmas mensagens no seu final. Sempre que uma mensagem é recebida, responda ao endereço de onde veio. Eventualmente, os clientes descobrirão que eles têm um par de endereços para os quais podem enviar datagramas com segurança. Normalmente, um endpoint toma a decisão final sobre qual par de endereços (sockets) se comunica e o protocolo facilita esse endpoint informando ao outro endpoint essa decisão.

** – geralmente é melhor não confiar em uma porta bem conhecida para clientes P2P. Porque dois clientes atrás do mesmo NAT ou firewall provavelmente não seriam capazes de usar seu software ao mesmo tempo.

Aqui está um breve resumo de algumas tecnologias para explorar.

STUN – É um servidor e protocolo simples para clientes por trás de uma rota NAT para descobrir o que são seus mapeamentos externos de IP e porta.

O TURN é uma expansão para STUN, mas suporta retransmissão para cenários de conectividade P2P em que firewalls e NATs impedem conexões diretas.

ICE é um conjunto de passos pelos quais STUN e TURN são usados ​​para configurar uma conexão P2P. O ICE é um protocolo formal para as etapas 1 a 5 acima. Dois excelentes conjuntos de slides no ICE estão aqui e aqui .

WebRTC é uma variante do padrão ICE, bem como uma biblioteca de referência para fazer sessões P2P com STUN e TURN.

UPNP + Internet Gateway Device Protocol – Alguns roteadores suportam isso para que os hosts obtenham automaticamente mapeamentos de porta.

A libnice é uma biblioteca C de software livre para Linux (e pode funcionar no Windows) que implementa o ICE.

A libjingle é outra implementação do ICE (em C ++) do Google. Para Windows e Linux.

PJNATH é uma biblioteca dentro do conjunto PJSIP de bibliotecas de codificação. É uma boa implementação de uma pilha ICE (código C) e foi portada para muitas plataformas. (Windows, Linux, Mac, iOS, Symbian e logo Android).

E finalmente, eu tenho um plug flagrante para você usar minha base de código de servidor STUN .

Existem soluções em alguns casos, consulte UPnP: https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

Meu roteador doméstico permite isso, basicamente, o NAT pode ser configurado automaticamente pelo pedido adequado do computador.

Eu não contaria com isso para fornecer uma grande melhoria na sua disponibilidade, porque não há muitos roteadores compatíveis e habilitados.

EDIT: @ DavidI sugeriu esta pergunta SO para uma biblioteca .net para UPnP: Existe uma biblioteca UPnP para .net (c # ou vb.net)?

Eu usaria a tecnologia WebRTC como uma estrutura de código aberto para tal aplicativo.

Website oficial

Na verdade, é um projeto de código aberto que suporta todos os resources necessários para tecnologias peer-to-peer fora da checkbox:

  • ICE e STUN (passagem NAT)
  • DTLS e SRTP (segurança)
  • AVPF para qualidade de streaming.

Isso pode ser um pouco mais complicado do que o que você está procurando, mas o TCP Hole Punching é uma técnica que deve funcionar. http://en.wikipedia.org/wiki/TCP_hole_punching

Alternativamente, o UPnP funciona muito bem para roteadores / firewalls que o suportam.

Você tem outra opção que é NAT Port Mapping Protocol (NAT-PMP) O NAT-PMP é amplamente utilizado por aplicativos VoIP como o Skype ou clientes P2P BitTorrent.