Pregunta

he visto y leído muchas preguntas similares, y los correspondientes artículos de Wikipedia ( NAT transversal , STUN , TURN , TCP perforación de orificios ), pero la cantidad abrumadora de información en realidad no me ayude con mi problema muy simple:

Estoy escribiendo una aplicación P2P, y quiero dos usuarios de mi solicitud detrás de NAT para poder conectarse entre sí. La conexión debe ser fiable (comparable a la fiabilidad del TCP) así que no puedo acaba de cambiar a UDP. La solución debería funcionar en sistemas comunes de hoy en día, sin reconfiguración. Si ayuda, la solución puede implicar un tercio de partido conectable, con tal de que no tiene que proxy de todos los datos (por ejemplo, para obtener direcciones externas (WAN) IP los compañeros).

Por lo que yo sé, mi única opción es utilizar una biblioteca "UDP fiable" + UDP agujero punzonado. ¿Hay una biblioteca (C / C ++) para esto? He encontrado ENET en un relacionado con pregunta, pero sólo se ocupa de la primera mitad de la solución.

Algo más? Cosas que he mirado:

  1. Teredo túnel - requiere apoyo desde el sistema operativo y / o usuario de configuración
  2. UPnP reenvío de puertos - UPnP no está presente / habilitada en todas partes
  3. TCP perforación parece ser un trabajo experimental y sólo en determinadas circunstancias
  4. SCTP es aún menos con el apoyo de IPv6. SCTP sobre UDP es simplemente la fantasía de UDP fiable (véase más arriba)
  5. RUDP - casi sin soporte estándar
  6. Por lo que pude entender de STUN, truco, TURN y el ICE, ninguno de ellos me ayudaría aquí.
¿Fue útil?

Solución

ICE recoge una lista de candidatos IP / objetivos puerto al que se conecten. Cada par recoge estos, y luego cada uno ejecuta una comprobación de conectividad de cada uno de los candidatos en orden, hasta que pasa un cheque o una comprobación falla.

Cuando Alice intenta conectarse a Bob, que de alguna manera obtiene una lista de posibles maneras - determinado por Bob - que puede conectarse a Bob. ICE llama a estos candidatos. Bob podría decir, por ejemplo: "192.168.1.1:1024/udp de mi conector local, mi vinculante NAT externa (que se encuentra a través STUN) es 196.25.1.1:4454/udp, y se puede invocar una retransmisión de medios (un middlebox) a 1.2 .3.4: 6675 / udp". Bob pone en un paquete que SDP (una descripción de estos diversos candidatos), y envía a Alice que de alguna manera. (En SIP, el caso de uso original para el ICE, del SDP realizado en un SIP INVITE / 200 intercambio / ACK, el establecimiento de una sesión SIP).

ICE es enchufable, y se puede configurar la naturaleza / número exacto de candidatos. Usted podría tratar de un enlace directo, seguido por pedir a un href="http://tools.ietf.org/html/rfc5389" rel="nofollow noreferrer"> STUN servidor para una unión (esto golpes una agujero en el NAT, y le informa que la externa IP / puerto de ese agujero, lo que usted pone en su descripción de la sesión), y volver a caer en pedir un TURN servidor para transmitir sus datos.

Una desventaja de ICE es que sus compañeros intercambiar SDP descripciones, que puede o no como. Otra es que el soporte TCP está todavía en forma de borrador , lo que puede o puede no ser un problema para usted. [ACTUALIZACIÓN: ICE es ahora oficialmente RFC 6544 .]

Juegos a menudo utilizan UDP, ya que los datos de edad es inútil. (Esta es la razón por lo general se extiende RTP sobre UDP.) Algunas aplicaciones P2P suelen utilizar dispositivos intermedios o redes de dispositivos intermedios.

IRC utiliza una red de dispositivos intermedios: servidores IRC forman redes, y los clientes se conectan a un servidor próximo. Los mensajes de un cliente a otro pueden viajar a través de la red de servidores.

A falta de todo eso, usted podría echar un vistazo a la arquitectura de BitTorrent y ver cómo manejan el problema de NAT. Como CodeShadow señala en los comentarios abajo, BitTorrent se basa en pares accesibles en la red: en un sentido algunos pares forman una red de dispositivos intermedios. Si esos dispositivos intermedios podrían actuar como relés, que tendría un IRC-como la arquitectura, pero que se ha configurado de forma dinámica.

Otros consejos

libjingle ya que es utilizado por algunos de los principales videojuego empresas que en gran medida se basa en la comunicación de la red P2P. (¿Has oído hablar de vapor? Vavle también utiliza libjingle , ver la " redes sesión de peer-to-peer" en la página: https://partner.steamgames.com/documentation/api )

Sin embargo, la siempre trabajo solución sería utilizar un servidor de retransmisión. Dado que no hay manera "estándar" para ir a través de NAT, usted debe tener esta opción servidor de retransmisión como una estrategia de repliegue si una conexión tiene que ser siempre que se establece entre los pares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top