Keep Alive

En la categoria:

Keep alive (mecanismos de mantenimiento de conexiones) se refiere generalmente a las conexiones de comunicación en una red que no están terminadas pero que se mantienen hasta que el cliente o servidor interrumpe la conexión. La característica clave de mantener las keep alive es el envío de un mensaje sin contenido entre un servidor y un cliente. Con este mensaje, uno de los usuarios de la red (cliente o servidor) puede controlar si la conexión se mantendrá y evitar que se cancele. Si la conexión todavía está disponible, se puede utilizar para el intercambio de datos.
Las conexiones Keep alive también se denominan HTTP keep-alive, conexiones HTTP persistentes y reutilización de conexiones HTTP. El protocolo HTTP 1.1 soporta keep-alive por defecto, y también utiliza la canalización HTTP para procesar peticiones en lotes. HTTP 2 amplía el proceso de conexiones persistentes con opciones adicionales (por ejemplo, multiplexación).

Información general

La comunicación de red convencional opera de acuerdo a un esquema de solicitud-respuesta. Un cliente solicita datos específicos de un servidor. El servidor responde reconociendo la presencia de los datos o negándolos y emitiendo un código de error. Una vez que los datos están disponibles, el cliente los solicita estableciendo una nueva conexión. Posteriormente, el cliente interpreta los datos y los presenta. Si no está completo, se solicitan datos adicionales para completar la visualización. Para ello se utiliza una nueva conexión y, a veces, se generan datos que no son necesarios (recargo de gastos generales). En el protocolo HTTP 1.0, siempre se establece una nueva conexión TCP para cada solicitud. Esto significa que cada petición de un cliente es tratada individualmente por el servidor y, si es posible, contestada individualmente.

Las webs suelen constar de diferentes recursos de datos. Por ejemplo, archivos HTML, secuencias de comandos CSS y secuencias de comandos que afectan a las interacciones del usuario. También se incluyen imágenes o archivos multimedia. Básicamente, HTTP 1.0 requiere una conexión separada para cada archivo, que también debe ser terminado. Este enfoque es particularmente ineficiente para webs más grandes porque la utilización de la red es muy alta (congestión de la red)[1]. Para evitar que muchas conexiones individuales se establecieran y terminaran de nuevo, la gestión de la red se amplió mediante conexiones persistentes y canalizaciones HTTP. Para el protocolo HTTP 1.1, ahora es posible implementar múltiples solicitudes y respuestas por conexión, con un mensaje específico de keep-alive que se envía entre el cliente y el servidor para cada conexión y las solicitudes ahora se pueden almacenar en el pipeline

Cómo funciona

La mayoría de los servidores pueden ser configurados para soportar “keep-alive”[2]. Por parte del cliente, los navegadores más utilizados ya son capaces de establecer conexiones persistentes. Esto es, sin embargo, una cuestión de configuración en el lado del servidor. Dependiendo de la tecnología y del lenguaje de programación utilizado, los cambios necesarios difieren ligeramente en sintaxis y semántica. Para un servidor Apache, se puede permitir keep-alive en el archivo de configuración “httpd.conf”. Tres propiedades son particularmente importantes:[3]

  • KeepAlive: Con esta propiedad, se pueden introducir los valores de encendido y apagado. Para HTTP 1.1, es el valor por defecto.[4]
  • MaxKeepAliveRequests: Esta propiedad define el máximo de solicitudes posibles por conexión. Un valor entre 50 y 100 suele ser suficiente. Sin embargo, este valor depende del tamaño del proyecto web o del número de archivos en un sitio web.
  • KeepAliveTimeout: Si el servidor no recibe ninguna petición, está inactivo y mantiene la conexión hasta que se cancele. La propiedad timeout limita el tiempo que el servidor debe esperar para una nueva petición. Aproximadamente 10 segundos se consideran ideales, pero el tiempo de espera puede ser mayor para sitios web con mucho tráfico.

Si se introducen las propiedades y valores correspondientes en la configuración del servidor, el servidor Apache envía respuestas a peticiones que tienen el siguiente aspecto:[5].

~$ curl -I https://www.domain.com/file.html
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Date: Thu, 15 Jan 2015 16:45:29 GMT
Content-Length: 1845
Keep-Alive: timeout=10, max=20
Server: Apache/2.4.9 (Unix) PHP/5.6.2

El principio es similar para todos los servidores. El cliente y el servidor intercambian mensajes muy pequeños, llamados “keep-alive-messages”. Permiten al cliente recibir múltiples archivos dentro de una conexión. El mensaje de keep alive se transmite utilizando el encabezado HTTP. Indica al cliente o servidor que se debe mantener la conexión. Cada solicitud se realiza a través de una conexión. Sólo una vez que uno de los participantes de la red rompe la conexión, ya no es posible realizar múltiples solicitudes y respuestas.

Keep alive a través de .HTACCESS

Si el operador de la web no tiene acceso a la configuración del servidor, los cambios también se pueden realizar en el archivo htaccess. El archivo .htaccess sobrescribe la configuración del servidor Apache grabando el siguiente código fuente:

<IfModule mod_headers.c>
Header set Connection keep-alive
</IfModule>

El encabezado de “Keep Alive” se añadirá a cada solicitud. Se recomienda realizar una prueba para comprobar si el servidor implementa el cambio como se desee. Sin embargo, sólo se pueden hacer definiciones más precisas de los tiempos de espera y de las solicitudes máximas en el archivo de configuración del servidor respectivo.

Relevancia para la programación

Las conexiones persistentes se proporcionan como estándar en el protocolo HTTP 1.1. El protocolo HTTP 2 amplía este estándar mediante un método de multiplexación, que optimiza aún más la transmisión de datos. El uso de estas opciones y en qué medida depende de la infraestructura técnica y del cliente. Esto significa que los protocolos permiten diferentes optimizaciones, pero la implementación a veces tiene que tener lugar en el lado del servidor.

Para ciertos proyectos web, las cabeceras Keep-alive son particularmente recomendables. Esto es válido para sitios web con muchos archivos y un amplio contenido multimedia, así como para tiendas online que dependen de conexiones HTTPS. HTTPS es generalmente intensivo en recursos en la transmisión de archivos porque la conexión está encriptada usando SSL (Secure Socket Layer). Añadiendo un encabezado de “keep alive”, la velocidad de carga de las webs puede acortarse significativamente porque se evitan por completo las latencias entre las diferentes conexiones y sólo hay una conexión que permite múltiples peticiones y respuestas que el servidor puede procesar una a la vez.

Además, dado que recursos como la CPU (unidad central de procesamiento) y la memoria son necesarios para establecer nuevas conexiones en la capa TCP/IP (que se encuentra debajo de la capa de aplicación del protocolo HTTP), la CPU también puede ser liberada por la cabecera keep-alive. El ordenador debe configurar un número significativamente menor de conexiones TCP[6].

Referencias

[1] [2] [3] [4] [5] [6]