2009-01-04 12 views
17

Recientemente, en una entrevista me preguntaron cómo abordaría una aplicación de cliente de chat en línea. Pasé por la solución estándar de "sondeo", pero me cortaron porque el entrevistador estaba buscando el método "HTTP 1.1 keep-alive". Habiendo usado HTTP por bastante tiempo y recordando que todo el punto era ser "sin estado", esto nunca se me ocurrió (además, sin mencionar que el mantenimiento de la vida no se implementa de manera consistente).Usar HTTP Keep-Alive para que el servidor se comunique con el cliente

Mi pregunta es, ¿es posible que un servidor web transmita y/o envíe información a un cliente cuando se ha establecido el encabezado "keep-alive"?

Respuesta

8

Con HTTP 1.1, keep-alive es el comportamiento predeterminado. (En HTTP 1.0, el comportamiento predeterminado era cerrar la conexión.) El servidor debe enviar el encabezado 'Conexión: cerrar' para terminar la conexión con la primera respuesta. De modo que todavía hay un socket TCP disponible para enviar datos, pero solo presionar datos desde el servidor violaría el protocolo HTTP de una manera importante. Incluso usando keep-alive, el cliente aún tendría que sondear el servidor.

Es importante distinguir entre HTTP Keepalive y TCP Keepalive. la conexión de ser cerrada por el servidor o cliente. TCP keepalive se utiliza cuando la conexión puede estar inactiva durante un período de tiempo prolongado y puede ser eliminada por un proxy NAT o firewall. TCP keepalive se activa por socket por setsockopt() llamadas.

Whe n haciendo una 'encuesta larga' para eliminar la necesidad de volver a realizar una encuesta, puede ser necesario el TCP keepalive.

5

Puede leer más sobre Comet servidores. Eso suena básicamente como el enfoque sobre el que el entrevistador preguntaba. Su efectividad es discutida por algunos, pero se ha usado en varias situaciones similares.

Por ejemplo, creo que gmail usa tecnologías de cometas para algunas cosas (pero no me cites).

Otro ejemplo que parece relevante es BOSH, que es un protocolo para transmitir información de chat usando HTTP y XMPP. Pero no creo que el uso de Keep-alive esté involucrado en eso.

9

Keep-alive simplemente tiene un socket TCP abierto, por lo que cada vez que sondea, guarda la sobrecarga de los paquetes de configuración/desmontaje de TCP, pero aún tiene que sondear.

Sin embargo, "larga encuesta" es una estrategia para que el servidor web difunda las notificaciones al cliente. Esencialmente, el cliente emite una solicitud GET, pero en lugar de responder de inmediato, el servidor web espera hasta que tenga una notificación para enviar, momento en el que responde a la solicitud GET. Esto elimina la necesidad de que los paquetes vayan a través del cable para fines de sondeo, y mantiene la conexión sin estado, que como usted menciona correctamente es uno de los propósitos del protocolo.

Cuestiones relacionadas