2012-09-03 13 views
6

Esta pregunta se refiere a conceptos generales relacionados con el protocolo tcp/ip, para los cuales ya hay buenas respuestas en So, pero espero obtener una idea de las particularidades de las bibliotecas http/net de node.jsNode.js HTTP/NET - Diferencia entre una conexión y una solicitud

Una instancia de servidor http de nodo permite que las devoluciones de llamadas se registren para dos tipos de eventos, evento 'solicitud' y 'conexión', evento. El último de estos se hereda de la biblioteca de red, junto con un campo '_connections', que cuenta el número de conexiones simultáneas que tiene actualmente el servidor.

Ahora, me parece que, dado que http es un protocolo sin estado, debe haber un 1-1 para la correspondencia entre los eventos de solicitud y conexión, pero este no es el caso. Al pasar por un servidor simple de "hello-world" en mi depurador, vi que el número de eventos solicitados excedía en número a los eventos de conexión. También vi que, incluso cuando no se realizaban llamadas al servidor (y el proceso no se detenía), el campo .connections nunca se pondría a cero. ¿Por qué el número de solicitudes no sería igual al número de conexiones y por qué el servidor mantendría una conexión abierta después de la última llamada a response.end() (cuando se supone que el buffer de respuesta se vació y las conexiones finalizaron?).

Además, ¿cómo podría el número de conexiones simultáneas para un servidor http (que no hace nada con keep-alive) alguna vez ser mayor que 1? ¿Las solicitudes básicamente no se ponen en cola en el socket y se procesan una por una? Entiendo que Node es asíncrono, pero también pensé que se comporta de una sola vez.

¡Gracias de antemano!

+2

¿Estás seguro de que keep-alive no está habilitado? Es por defecto en Node.js. Recuerde también que, si bien las solicitudes se procesan una por una, los eventos asíncronos pueden entrelazarse, lo que significa que un ciclo completo de solicitud-respuesta puede no ser 100% sincrónico. –

Respuesta

7

HTTP es apátrida, pero se ejecuta en TCP, que no es apátrida.

Configurando HTTP request headerConnection: keep-alive, es posible (y de uso frecuente) mantener abierta la conexión TCP subyacente. This is a performance optimization, ya que las conexiones TCP pueden ser costosas de configurar y desmontar repetidamente.

+0

Gracias por la respuesta; esto probablemente explica lo que estaba viendo. –

Cuestiones relacionadas