2010-06-04 22 views
6

Tengo algo así como un servidor proxy (escrito en java) corriendo entre mis clientes y el servidor de video real (hecho en C++). Todo lo que los clientes envían pasa por este proxy y luego se redirige al servidor.Redirigir una conexión TCP

Está funcionando bien, pero tengo algunos problemas y creo que sería mejor si pudiera hacer este servidor proxy solo para escuchar las solicitudes de los clientes y de alguna forma decirle al servidor que se ha realizado una solicitud desde el lado del cliente , y que se supone que crea una conexión con el cliente directamente.

Básicamente en el nivel de TCP lo que quiero que suceda es algo como esto:

1- cada vez que un cliente envía un SYN al proxy, el proxy simplemente envía un mensaje al servidor real diciendo la IP y el puerto del cliente

2- El servidor enviaría el SYN-ACK correspondiente al cliente especificado creando una conexión directa entre el cliente y el servidor.

El proxy estaría simplemente retransmitiendo las solicitudes iniciales (pero no la transferencia de datos posterior) al servidor real. Simplemente no sé si eso es posible.

Muchas gracias

Nelson R. Pérez

Respuesta

1

Usted no tiene el control del protocolo de enlace TCP en espacio de usuario de esa manera. Esto es lo que hacen los cortafuegos/enrutadores pero todo sucede en el kernel. Eche un vistazo al software de firewall para su plataforma, es posible que ni siquiera tenga que codificar nada.

2

Eso es en gran medida la forma en que algunos juegos (y Fog Creek CoPilot) lo hacen, pero requiere apoyo tanto en el servidor y el cliente. Básicamente, el proxy debe decirle al cliente y al servidor "intente comunicarse directamente con esta IP y este puerto" y, si no pueden hacerlo (porque uno o ambos están detrás de un NAT o firewall), vuelven a la normalidad. a través del proxy.

me encontré con esta buena descripción de "peer to peer de perforación tcp" en http://www.brynosaurus.com/pub/net/p2pnat/

+0

Ok, retiro eso, parece que CoPilot no hace eso, o si lo hicieron, se detuvieron. Ver https://www.copilot.com/tech/ –

2

¿El proxy y el servidor viven en la misma máquina? De ser así, puede pasar la conexión al servidor utilizando Socket Transfer o File Descriptor Passing. Puede encontrar ejemplos en C aquí,

http://www.wsinnovations.com/softeng/articles/uds.html

Si están en las diferentes máquinas, no hay manera de pasar la conexión con el servidor. Sin embargo, es posible enviar los paquetes de IP al servidor utilizando VIP (IP virtual). Esto está debajo del socket, por lo que debe usar la interfaz de capa de enlace, como DLPI.

Cuestiones relacionadas