it-swarm-pt.tech

Programação de aplicação 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 está acessível na Internet.

Existe uma maneira automática de habilitar o acesso à porta pela Internet. Não tenho muita certeza de como outros aplicativos p2p funcionam.

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

38
Jayesh

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

  1. Enumere 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 o seu endereço IP externo e descobrir o que o número da porta interna mapeia para fora do NAT (não é 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 outras Endereço 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 do seu roteador, se ele suportar esse protocolo.

  3. Por meio de um serviço de encontro (SIP, XMPP, mensagem instantânea, serviço web, email, copos com seqüências de caracteres), publique sua lista de candidatos a endereços em um serviço ou envie uma notificação ao outro cliente que diz: "ei, eu quero me conectar com você " Esta mensagem inclui todos os "candidatos a endereço" (pares de ip e porta) coletados nas etapas 1 e 2.

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

  5. Etapa de perfuração. Ambos os clientes começam a enviar mensagens de teste pelo UDP para os candidatos a endereço do outro lado e ouvem as mesmas mensagens. Sempre que uma mensagem é recebida, responda de volta ao endereço de onde veio. Eventualmente, os clientes descobrirão que possuem um par de endereços para os quais também podem enviar datagramas de maneira confiável. Normalmente, um ponto final toma a decisão final sobre qual par de endereços (soquetes) se comunicar e o protocolo facilita esse ponto final, informando o outro ponto final sobre essa decisão.

** - geralmente é melhor não confiar em uma porta 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 rápido resumo de algumas tecnologias a serem exploradas.

STUN - É um servidor e protocolo simples para clientes atrás de uma NAT/rota descobrirem quais são seus mapeamentos de IP e porta externos.

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 etapas pelas quais STUN e TURN são usados ​​para configurar uma conexão P2P. O ICE é um protocolo formal para as etapas de 1 a 5 acima. Dois excelentes conjuntos de slides no ICE são aqui e aqui .

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

PNP + Protocolo de dispositivo de gateway da Internet - Alguns roteadores suportam isso para que os hosts obtenham automaticamente mapeamentos de portas.

libnice é uma biblioteca C de código aberto para Linux (e pode funcionar no Windows) que implementa o ICE.

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

PJNATH é uma biblioteca dentro do conjunto de bibliotecas de codificação PJSIP das 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 em breve Android).

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

111
selbie

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 pela solicitação apropriada do computador).

Eu não contaria com isso para fornecer uma grande melhoria em sua disponibilidade, porque poucos roteadores suportam isso e estão habilitados.

EDIT: @David sugeriu esta SO pergunta para uma biblioteca .NET para UPnP: Existe uma biblioteca UPnP para .NET (C # ou VB.NET)?

4
jv42

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

Site Oficial

Na verdade, é um projeto de código aberto que suporta todos os recursos necessários para as tecnologias ponto a ponto, prontas para uso:

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

Você tem outra opção que é NAT-PMP NAT-PMP é amplamente utilizado por aplicativos VoIP, como clientes Skype ou BitTorrent P2P.

1
loretoparisi

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

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

1
Matthew