Pregunta

A partir de una Publicación de Joel en Copilot:

¡Conexión directa!Siempre hemos hecho todo lo posible para asegurarnos de que Fog Creek Copilot pueda conectarse en cualquier situación de red, sin importar qué firewalls o Nats estén en su lugar.Para que esto suceda, ambas partes hacen conexiones salientes con nuestro servidor, que transmite el tráfico en su nombre.Bueno, en muchos casos, esto no es necesario.Entonces la versión 2.0 hace algo bastante inteligente:Establece la conexión inicial a través de nuestros servidores, por lo que se conecta de inmediato con una confiabilidad del 100%.Pero luego, una vez que esté conectado, en silencio, en segundo plano, busca una forma de hacer una conexión directa.Si no puede, no es gran cosa:Sigues transmitiendo a través de nuestro servidor.Si puede hacer una conexión de igual a igual directa, cambia silenciosamente sus datos a la conexión directa.No notará nada excepto, probablemente, una comunicación mucho más rápida.

¿Cómo cambian la conexión del servidor a una conexión P2P?

¿Fue útil?

Solución

Es bastante complicado e interesante.Estoy seguro de que tengo algunos detalles incorrectos, pero la descripción general es esta:

Los programas ya pueden comunicarse entre sí a través del servidor de Joel, por lo que pueden intercambiar información entre ellos y con el servidor de Joel.Además, Joel tiene sus direcciones IP externas y le brindan información sobre sus direcciones IP internas.

Deciden probar esta técnica de perforación.La computadora A inicia una conexión TCP con la computadora B utilizando la dirección IP externa de B.No funcionará, pero lo que hace es decirle al enrutador de A que necesita permitir paquetes entrantes de B en un puerto determinado.

La computadora B hace lo mismo, pero su mensaje llega a A ya que el enrutador de A abrió una combinación de puerto/ip que coincide con lo que envió B (aquí ocurre algo de magia de puerto; esto no es trivial, pero es factible).

El enrutador de B recuerda que B inició una conexión con A en un puerto e IP determinados, por lo que los paquetes de A ahora también fluyen hacia B a través de su enrutador correctamente.

Así que en realidad es bastante sencillo, pero la implementación tiene detalles, especialmente en relación con cómo se asignan los puertos a las nuevas conexiones TCP y cómo los enrutadores NAT típicamente lidiar con las solicitudes TCP y cómo se asignan a puertos externos.Estos detalles son lo interesante y lo difícil.

-Adán

Otros consejos

Existe una técnica llamada "Perforación de agujeros"que funciona bien con NAT "Cone" (Cone es una familia técnica de enrutadores).Esa no es una técnica 100% segura; hoy en día funciona bien con UDP en aproximadamente el 80% del enrutador.

Hay algunas implementaciones de biblioteca para realizar perforaciones: ATURDIR (Wikipedia)

Creo que la versión simple es que eliminan la conexión del servidor y la reemplazan con la conexión P2P.

Algo parecido a:

  1. Machine1 se conecta a los servidores del copiloto.
  2. Machine1 se conecta a los servidores del copiloto.
  3. Machine1 se conecta a los servidores del copiloto.
  4. Posteriormente, Machine2 se conecta y comienzan a compartir la pantalla.
  5. Machine2 abre un puerto destinado a que se conecte Machine1.
  6. Machine1 intenta conectarse al puerto ahora abierto en Machine2.

Si se establece esta conexión:

  1. La conexión con los servidores del copiloto está cortada.
  2. En cambio, los datos se transfieren a través de la conexión directa (P2P) entre las dos máquinas.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top