networking - qbittorrent - ¿Conectar P2P a NAT?
qbitorrent (4)
Otra pregunta interesante que surge es de BitTorrent porque pueden funcionar en cualquier dispositivo e incluso detrás de un NAT. No puedo obtener ninguna explicación sobre cómo funciona BitTorrent.
Esta afirmación parece suponer que bittorrent necesita una conectividad completa para funcionar.
Eso es incorrecto.
Detrás de un dispositivo NAT, aún podrá establecer conexiones TCP salientes . Que generalmente es suficiente para bittorrent siempre que haya otros clientes no NATed (o NATed pero correctamente port-forwarded ) en la red que puedan aceptar conexiones entrantes .
NAT no tiene ningún impacto en la dirección del flujo de los datos porque las conexiones son bidireccionales una vez que se establecen. Solo es problemático para la configuración de conexión inicial.
Esto funciona perfectamente bien para bittorrent porque a bittorent no le importa de qué nodo específico obtienes tus datos. Aunque una mejor conectividad generalmente mejora el rendimiento.
Si la identidad del nodo es importante o las transferencias uno a uno son un caso de uso importante, entonces otros protocolos p2p generalmente intentan primero el cruce de NAT y si eso falla, dependen de nodos de terceros que transmitan el tráfico entre esos nodos que no pueden conectarse entre sí directamente. .
Además, la compatibilidad con IPv6 será esencial en el futuro para mantener la conectividad de extremo a extremo debido a que cada vez más ISP están comenzando a implementar NAT de nivel de operador para IPv4, mientras que IPv6 seguirá siendo no NATED.
Empecé a explorar la opción de conectarme con otros utilizando una conexión p2p, así que codifiqué un programa de socket simple en JAVA para dispositivos Android en el que los usuarios pueden compartir mensajes simples p2p (entonces no tenía ninguna idea sobre NAT). Conocí NAT, así que ahora necesito establecer una conexión TCP con otro usuario que utiliza un servidor para el descubrimiento, pero la carga útil se transfiere p2p. También he analizado XMPP (una explicación muy buena y detallada de cómo funciona el protocolo here ) y UPnP, pero no sé cómo implementarlos.
Otra pregunta interesante que surge es de BitTorrent porque pueden funcionar en cualquier dispositivo e incluso detrás de un NAT. No puedo obtener ninguna explicación sobre cómo funciona BitTorrent.
He investigado mucho, pero estoy atascado.
Mis preguntas son:
- Una explicación detallada de BitTorrent (como here , no cómo funcionan los torrents) y cómo funciona con NAT.
- ¿Hay alguna manera de hacer una entrada NAT programáticamente?
- ¿La programación del socket es suficiente para p2p?
- ¿Qué tan difícil es crear su propio protocolo y cómo puedo construir uno?
- Si dos dispositivos D1 y D2 quieren comunicar p2p y conocen la IP de los demás. D1 envía una solicitud a D2 y no puede atravesar la NAT de la D2, pero debe haber una entrada creada en la NAT de D1. Entonces, cuando D2 intenta enviar algo, la NAT de D1 debe descubrir una entrada con la IP de D2. Entonces, ¿por qué el paquete no está permitido?
Las versiones recientes de BitTorrent usan µTP , que se superpone en capas sobre UDP, no sobre TCP. μTorrent usa una extensión privada (
ut_holepunch
) que realiza perforaciones UDP, la mayoría de las otras implementaciones no molestan (con la notable excepción de Tixati).Algunos enrutadores NAT aceptan solicitudes de reenvío de puertos utilizando uPNP o el protocolo PMP . Si esto es compatible depende de la marca particular del enrutador y su configuración.
Sí, la programación del socket es suficiente para P2P.
Difícil de responder. Le sugiero que lea la especificación de BitTorrent wikified y anotada para empezar.
Sí, este es el principio detrás de la perforación de agujeros UDP .
Hay un documento sobre " Comunicación punto a punto a través de los traductores de direcciones de red " que describe el método de perforación de orificios UDP y lo extiende para usarlo también sobre TCP.
Por supuesto, siempre necesitará un servidor de retransmisión para los casos en que la perforación no sea compatible.
Una cosa que debe quedar clara es que 100% P2P entre todo tipo de NAT es imposible en este momento. No hay una forma práctica de establecer la conectividad P2P entre ** simétrico y simétrico / PRC NAT. En este escenario, la conexión se establece a través de un servidor de retransmisión llamado TURN.
Estoy respondiendo de su segunda pregunta porque no sé mucho sobre la primera.
2) Sí. Puede enviar un paquete a través de su NAT y habrá un mapeo entre su IP interna: Puerto a la IP externa de su NAT: Puerto. Puede conocer estos IP externos: Puerto enviando una solicitud de aturdimiento. Tenga en cuenta que esta técnica no funciona para NAT simétrica.
3) Sí, programación de socket suficiente para p2p.
4) ¿Por qué necesita un protocolo cuando ya existe varios? El protocolo ICE es el mejor hoy para NAT transversal y no creo que sea fácil de crear. UPnP y NAT-PMP es realmente vulnerable en términos de seguridad.
5) Creo que lo que sucede es que normalmente NAT bloquea paquetes desconocidos que llegan a él. Entonces cuando D1 envía un paquete a D2, su NAT bloquea todos los paquetes entrantes desde D1s IP: Puerto. Es por eso que falla el establecimiento de la conexión. Tienes que emplear la técnica de perforación para D1 y D2 para establecer con éxito la conectividad P2P.
** Por NAT simétrica quiero decir NAT simétrica con asignación de puerto aleatorio.