2009-10-08 5 views
31

Estoy diseñando una aplicación p2p que funciona en el puerto 30000. Mi enrutador no es UPnP así que tuve que reenviar un puerto al enrutador. Pero Skype otra aplicación p2p funciona sin reenvío de puertos en mi pc. Cuando lo analicé con wireshark encontré que usa el puerto UDP 48980, 58544. Estoy usando C++.¿Cómo funciona Skype sin reenvío de puertos?

Hay una biblioteca en python here que lo hace para Nat PnP enrutadores. ¿Es posible reenviar el puerto mediante programación al enrutador independientemente del tipo de enrutador y el sistema operativo. ¿Cuál debería ser el enfoque para hacerlo en C++ o en cualquier otro idioma?

Respuesta

20

Skype funciona de una manera muy interesante. Por lo que he leído (y esto es hace un tiempo) funciona de la siguiente manera:

  • servidor de Skype mantiene una lista de todos los usuarios y direcciones IP.
  • El usuario de Skype A quiere hablar con el usuario B El usuario A de Skype envía un paquete de red a la dirección IP del usuario B y espera una respuesta. (el usuario B nunca recibe este paquete).
  • Skype usuario A notifica servidor de IP/puerto combinación en la que está esperando para una respuesta
  • servidor notifica al usuario B para enviar una respuesta a
  • el usuario A en la puerto especificado se realiza una conexión .

Esto es probablemente más simplificado pero la última vez que lo comprobé, así es como funciona. (Que alguien me corrija si me equivoco).

+0

pero la pregunta es que son IP de clientes PÚBLICOS? ver, por ejemplo, A necesita comunicarse con B y el servidor conoce la IP de B, pero ¿qué IP utiliza? Si este es el caso, puede hacer ping a cualquier usuario de ip. perdón si es estúpido –

+4

Esta respuesta meramente describe A y no se comunica con B y el servidor envía la combinación correcta de IP/Puerto al usuario B. Falta el punto principal, que se llama perforado y está muy bien descrito en el enlace provisto por @MartinBeckett. Solo agregaría que también es posible reenviar el puerto independientemente del tipo de enrutador y del sistema operativo, siempre que el enrutador sea compatible con UPnP. – Igor

+1

@rein ¿y qué hay de la NAT simétrica? – onmyway133

18

UDP hole punching es (una) de las formas de atravesar el NAT.

+0

no soy capaz de entender la diferencia entre el router y NAT? ¿Reenviamos el puerto al enrutador o NAT? El perforado no es equivalente a enviar datos desde ambos lados al mismo tiempo, lo que no funciona cuando trabajamos en un puerto diferente. Gracias – Xinus

+1

Un enrutador enruta la información de una red a otra. NAT es el proceso de tener un rango de direcciones privadas en la red interna y solo tener el enrutador con una dirección válida en la otra red. El enrutador es un dispositivo físico, NAT es algo que usted hace. – rein

3

Tienes que usar un servidor intermediario e iniciar la comunicación desde el lado del cliente. Como mencionó Yossarian, desde ese punto, una posibilidad es la perforación de agujeros UDP. Según el tipo de aplicación (y si es verdaderamente P2P o no), puede mantener el servidor intermediario en su lugar todo el tiempo.

0

Skype usa otros pares como punto intermedio cuando la conexión directa no es posible.

es decir, el par A desea conectarse al par B, pero el par B tiene todos los puertos cerrados, luego la comunicación se inicia a través del par C que tiene puertos abiertos.

0

tienen alguna experiencia en la implementación de las aplicaciones P2P y conseguir que trabajan detrás de routers NAT.

Skype usa perforación UDP para trabajar detrás de enrutadores NAT. Escribí un artículo e hice un video de demostración para ayudar a otros a implementar aplicaciones similares. También se proporcionan enlaces a bibliotecas útiles que hacen la mayor parte del trabajo de campo como libutp, aquí.

>>> UDP hole punching Demo video and useful Libs.

Cuestiones relacionadas