networking - software - Conexiones directas de TCP/IP en aplicaciones P2P
que es modo p2p (3)
De la 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é cortafuegos o NAT estén en su lugar. Para que esto suceda, ambas partes realizan conexiones de salida a nuestro servidor, que retransmite el tráfico en su nombre. Bueno, en muchos casos, esto no es necesario. Así que 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 fiabilidad del 100%. Pero una vez que están todos conectados, silenciosamente, en el fondo, busca la manera de establecer una conexión directa. Si no puede, no es gran cosa: simplemente sigue transmitiendo a través de nuestro servidor. Si puede establecer una conexión directa punto a punto, 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?
Creo que la versión simple es que eliminan la conexión del servidor y la reemplazan por la conexión P2P.
Algo como:
- Machine1 se conecta a los servidores del copiloto.
- Machine1 se conecta a los servidores del copiloto.
- Machine1 se conecta a los servidores del copiloto.
- Machine2 se conecta posteriormente y comienzan a compartir la pantalla.
- Machine2 abre un puerto para Machine1 para conectarse.
- Machine1 intenta conectarse al puerto ahora abierto en Machine2.
Si se establece esta conexión:
- La conexión a los servidores del copiloto está cortada.
- En cambio, los datos se transfieren a través de la conexión directa (P2P) entre las dos máquinas.
Es bastante complicado e interesante. Estoy seguro de que tengo algunos detalles incorrectos, pero la descripción general es la siguiente:
Los programas ya pueden comunicarse entre ellos a través del servidor de Joel, para que puedan 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 usando la dirección IP externa de B. No funcionará, pero lo que hace es decir al enrutador A que necesita permitir paquetes entrantes desde 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 B envió (aquí hay 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 más allá de su enrutador.
Por lo tanto, en realidad es bastante sencillo, pero la implementación tiene detalles, especialmente con respecto a cómo se otorgan los puertos a las nuevas conexiones TCP, y cómo los enrutadores NAT normalmente tratan con las solicitudes TCP y cómo se asignan a los puertos externos. Estos detalles son interesantes y difíciles.
-Adán
Hay una técnica llamada " Perforación de orificios " que funciona bien con "Cono" NAT (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 la biblioteca para realizar perforación de agujeros: STUN ( wikipedia )