Pergunta

A partir de um Postagem de Joel no Copilot:

Conexão direta!Sempre fizemos tudo o que podemos para garantir que o Fog Creek Copilot possa se conectar em qualquer situação de rede, independentemente do que firewalls ou NATs estão no lugar.Para que isso aconteça, ambas as partes fazem conexões de saída com nosso servidor, que retransmite o tráfego em seu nome.Bem, em muitos casos, isso não é necessário.Então, a versão 2.0 faz algo bastante inteligente:Ele configura a conexão inicial por meio de nossos servidores, para que você se conecte imediatamente com 100% de confiabilidade.Mas depois que você está conectado, em silêncio, em segundo plano, procura uma maneira de fazer uma conexão direta.Se não puder, não é grande coisa:Você apenas continua transmitindo nosso servidor.Se você puder fazer uma conexão direta ponto a ponto, ele muda silenciosamente seus dados para a conexão direta.Você não notará nada, exceto, provavelmente, uma comunicação muito mais rápida.

Como eles mudam a conexão do servidor para uma conexão P2P?

Foi útil?

Solução

É muito complicado e interessante.Tenho certeza de que tenho alguns detalhes errados, mas a visão geral é esta:

Os programas já podem se comunicar através do servidor do Joel, para que possam trocar informações entre si e com o servidor do Joel.Além disso, Joel tem seus endereços IP externos e fornece informações a Joel sobre seus endereços IP internos.

Eles decidem tentar esta técnica de perfuração.O Computador A inicia uma conexão TCP com o Computador B usando o endereço IP externo de B.Ele não passará, mas o que ele faz é informar ao roteador de A que ele precisa permitir a entrada de pacotes de B em uma determinada porta.

O computador B faz a mesma coisa, mas sua mensagem chega a A, já que o roteador de A abriu uma combinação de porta/ip que corresponde ao que B enviou (há alguma mágica de porta que acontece aqui - isso não é trivial, mas é factível).

O roteador de B lembra que B iniciou uma conexão com A em uma determinada porta e IP e, portanto, os pacotes de A agora fluem para B, passando pelo roteador corretamente também.

Na verdade, é bastante simples, mas a implementação tem detalhes, especialmente em relação a como as portas são fornecidas para novas conexões TCP e como os roteadores NAT tipicamente lidar com solicitações TCP e como elas são mapeadas para portas externas.Esses detalhes são a parte interessante e difícil.

-Adão

Outras dicas

Existe uma técnica chamada "Perfuração" que funciona bem com NAT "Cone" (Cone é uma família técnica de roteadores).Essa não é uma técnica 100% segura, hoje funciona bem com UDP em cerca de 80% do roteador.

Existem algumas implementações de biblioteca para realizar perfuração: ATORDOAR (Wikipédia)

Acredito que a versão simples é que eles abandonam a conexão do servidor e a substituem pela conexão P2P.

Algo como:

  1. Machine1 se conecta aos servidores do copiloto.
  2. Machine1 se conecta aos servidores do copiloto.
  3. Machine1 se conecta aos servidores do copiloto.
  4. Posteriormente, Machine2 se conecta e eles iniciam o compartilhamento de tela.
  5. Machine2 abre uma porta destinada à conexão da Machine1.
  6. Máquina1 tenta se conectar à porta agora aberta na Máquina2.

Se esta conexão for estabelecida:

  1. A conexão com os servidores do copiloto foi cortada.
  2. Em vez disso, os dados são transferidos pela conexão direta (P2P) entre as duas máquinas.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top