2012-03-07 20 views
11

Estoy tratando de entender las conexiones tcp entre un navegador y un servidor web. Tengo un servidor web ejecutándose en mi máquina local, y puedo navegar perfectamente, como era de esperar, usando localhost: 3000 o 127.0.0.1:3000. (Estoy ejecutando "rails s" y WEBrick.)¿Por qué es necesario "fork" por socat cuando se conecta a un servidor web?

Quería poner un intermediario de software entre el navegador y el servidor web, y así comencé a experimentar con socat. Lo siguiente funciona bien:

socat TCP-LISTEN:8080,fork TCP:localhost:3000 

Puedo navegar a localhost: 8080 y todo funciona como se esperaba. Sin embargo, si omite el argumento "tenedor" como tal,

socat TCP-LISTEN:8080 TCP:localhost:3000 

el sitio web local rieles está bastante roto mirando en el navegador.

¿Por qué es necesario ese argumento de la horquilla? ¿Por qué un navegador < -> conexión de servidor web no funcionaría sin él?

Respuesta

23

Sin el fork, socat aceptará una única conexión TCP, reenviará datos bidireccionalmente entre los dos puntos finales mientras la conexión permanezca abierta, luego saldrá. Esto se puede ver fácilmente a sí mismo:

  • socat Ejecutar en una ventana de terminal
  • Telnet a localhost 8080 en otra ventana de terminal. Se conecta a la instancia socat.
  • Telnet a localhost 8080 en una tercera ventana de terminal. Obtiene un error de conexión rechazada, porque socat ya no está escuchando nuevas conexiones: se ha pasado al servicio del que ya tenía.
  • Escriba una solicitud HTTP en la segunda ventana de terminal. Obtendrá una respuesta HTTP, y luego socat saldrá ya que la conexión está cerrada.

La opción fork simplemente hace que tenedor un nuevo hijo para procesar la conexión recién aceptada mientras el padre vuelve a esperar nuevas conexiones. uso

socat 's de fork() en lugar de algo más sofisticado como preforking o agrupación de conexiones es la razón por la que no le gustaría implementar middleware de alto rendimiento con socat!

+0

Muchas gracias Celada. Eso tiene buen sentido. – user691307

+0

Lo que en realidad estoy tratando de hacer es escribir mi propio programa "intermedio" entre un navegador y un servidor web. Abre una conexión TCP del cliente al servidor web y un servidor TCP "escuchado" en otro puerto. El navegador abre una conexión de cliente al puerto de escucha. Entonces en el lado del navegador, hay una secuencia de múltiples sesiones TCP que se abren y cierran. Pero en el lado del servidor web, solo hay una conexión TCP establecida. Eso falla Estoy pensando que mi intermediario homebrew podría cerrar y volver a abrir la conexión del servidor web cada vez que un cliente inicie y detenga una conexión de tcp. ¿suena bien? – user691307

+0

Suena bien, y también es lo más simple de hacer. Su código abre una nueva conexión con el servidor cada vez que lo hace el agente de usuario HTTP y también los cierra al mismo tiempo. Eso es mucho menos trabajo que interpretar los contenidos de las solicitudes HTTP para averiguar cuándo podría o no ser capaz de ajustar los contenidos para agregar varias conexiones del cliente en una conexión hacia el servidor. ¡De esa forma se encuentra la implementación de un servidor proxy HTTP completo! – Celada

Cuestiones relacionadas