2011-05-26 18 views
6

Una de mis aplicaciones se conecta a un módulo de servidor que normalmente está instalado en una computadora diferente, a veces en Internet. En algunos escenarios de implementación, los usuarios no tienen acceso directo a Internet, solo servidores proxy HTTP (s). Así que tengo que enseñarle a mi programa a usar el proxy HTTP para emular la conexión TCP asíncrona al servidor. Hay mucha información en Internet sobre este tema, y ​​con el proxy HTTPS es muy fácil: simplemente envíe "HTTP CONNECT" al puerto 443 de la aplicación del servidor, envíe respuesta y podrá enviar y recibir datos binarios como lo desee.¿Cuál es la forma correcta de emular la conexión TCP a través del proxy HTTP (s)?

Pero algunos usuarios tienen HTTPS deshabilitado en los servidores proxy, por lo que solo tienen HTTP. Y hay una serie de problemas con HTTP debido a que el proxy comprueba activamente el tráfico, intenta almacenarlo en caché, lo acumula, etc. Las 2 conexiones con una solicitud HTTP infinita "GET" y una respuesta HTTP infinita funcionan, pero diferentes proxies ofrecen diferentes problemas: ejemplo, Microsoft IIS no envía pequeños fragmentos de datos al instante e intenta acumularlos :(.

Así que mi pregunta es: ¿es una técnica bien establecida para emular la conexión TCP full duplex a través del proxy HTTP sin soporte HTTPS? existen algunas implementaciones de fuente abierta o comerciales que puedo usar o comprar. ¡Se aceptan sugerencias! Realmente no quiero crear una solución que funcione solo en un número pequeño de proxies, por lo que necesito una implementación ya existente y probada o buen manual :).

Respuesta

3

Existen varias soluciones existentes para emular conexiones TCP de larga duración sobre HTTP.

Una de las técnicas más utilizadas en el caso de XMPP es el BOSH specification. Aunque BOSH fue desarrollado originalmente por la comunidad Jabber/XMPP, no está limitado a XMPP y puede transportar cargas útiles arbitrarias como XML o JSON.

Aquí hay otros recursos útiles:

4

Este es un engaño de varias otras preguntas sobre SO.

En general, no puede suponer que un proxy HTTP le permitirá realizar la transmisión TCP/IP a través de una conexión. Esto es algo que se ha discutido extensamente en el grupo de trabajo de WebSockets de HTML5.

En algunos casos, puede realizar una solicitud HTTP utilizando el verbo CONNECT pidiendo al proxy que genere un túnel bidireccional "ciego" a un servidor de destino/combo de puerto. Sin embargo, el proxy puede negarse a hacerlo para cualquier puerto objetivo que no sea el 443 (para evitar exactamente lo que intenta hacer), y el proxy PUEDE intentar escanear o alterar el tráfico que le envía.

Un proxy SOCKS, por el contrario, está diseñado para hacer casi exactamente lo que estás tratando de hacer. Pero los proxies SOCKS son relativamente poco comunes.

+0

Los links que esta WebSockets HTML5 discusión de grupo de trabajo? – grigoryvp

Cuestiones relacionadas