Compresión HTTP

Unofficial Content

Concepto

La compresión HTTP es una capacidad que se puede utilizar en servidores web y clientes web para hacer un mejor uso de ancho de banda disponible, y proporcionar mayores velocidades de transmisión entre ambos.

Los datos HTTP se comprimen antes de ser enviados desde el servidor. Para ello el navegador del cliente le informa al servidor web cuales son los métodos de compresión que soporta. El servidor en base a dichos valores, comprimirá el contenido antes de ser enviado al cliente. Los navegadores que no soportan ningún método de compresión, recibirá, contenido (por parte del servidor web) sin comprimir. Existen diferentes esquemas de compresión de contenido, pero los más comunes son deflate y gzip.

 

Mecanismo de Negociación Cliente - Servidor

A bajo nivel, consiste en una “negociación” entre el servidor web y el navegador que se realiza en dos pasos.

1) El cliente web incluye un “cabezal” (header) Accept-Encoding en la solicitud HTTP que incluye los encodings o esquemas de compresión que soporta el navegador del cliente. Los encoding soportados se delimitan por “;”. El formato del cabezal de la solicitud HTTP es la siguiente:

 

GET /encrypted-area HTTP/1.1
Host: www.genexus.com
Accept-Encoding: gzip, deflate

2) Si el servidor web soporta alguno de los esquemas que declaró el cliente en la solicitud HTTP (gzip, deflate), los datos que transferirá el servidor web hacia el cliente irá comprimido con alguno de los esquemas definidos. Seguidamente el servidor web contestará un mensaje HTTP en el cual añadirá un header en la respuesta HTTP de tipo “Content-Encoding” que permitirá dar a conocer que esquema se necesita utilizar para descomprimir el mensaje.  Un ejemplo sería el siguiente: 

HTTP/1.1 200 OK
Date: Tue, 18 May 2010 10:38:34 GMT
Server: Microsoft-IIS/7.5
Content-Length: 438
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip

En modo gráfico sería algo como lo siguiente:

Compresión HTTP 01

Cabe destacar que más allá que el navegador soporte la compresión de contenido, no necesariamente recibirá un contenido comprimido por parte del servidor. La razón es porque los esquemas de compresión son definidos en el servidor web y puede haber ocasiones en los cuales esté deshabilitado por determinadas razones. 

En general se proporciona las siguientes opciones de compresión:

 

Sólo archivos estáticos

Sólo respuestas dinámicas de aplicaciones

Tanto archivos estáticos como respuestas dinámicas de aplicaciones

 

Beneficios

Dependiendo del tipo de archivo, en algunas circunstancias se puede obtener un ratio de compresión del 90% y en promedio, el ancho de banda que se ahorra puede ser dos o tres veces menos que de no utilizar esta capacidad. Para casos en donde la velocidad de los clientes es baja o el ancho de banda que se utiliza tiene un alto impacto sobre la estructuras de costos de la organización, esta “feature” puede resultar realmente interesante. Más aún pensando en la nube (Cloud Computing) en donde los proveedores de hosting cobran por cada megabyte “uploded/downloaded” utilizado. 

Aspectos negativos de la compresión dinámica

La compresión de respuestas dinámicas de aplicaciones puede afectar a los recursos de la CPU porque el servidor no almacena en memoria caché versiones comprimidas de resultados dinámicos. Si está habilitada la compresión de respuestas dinámicas y el servidor recibe una solicitud de un archivo con contenido dinámico, la respuesta enviada se comprimirá cada vez que se solicite. Dado que la compresión dinámica consume una gran cantidad de tiempo y recursos de memoria de la CPU, conviene utilizarla sólo en los servidores que tengan conexiones de red lentas pero suficiente tiempo de CPU.

A diferencia de las respuestas dinámicas, las respuestas estáticas comprimidas pueden almacenarse en caché sin degradar los recursos de CPU.

 

Resumen ventajas/desventajas:

Ventajas:

Menor consumo de ancho de banda, traducido en menor gasto de dinero $$. 

Menor tiempo de transferencia de datos entre el servidor y el cliente (respuestas más rápidas).

Desventajas:

Mayor utilización del CPU del servidor. 

 

Que hace GeneXus?

GeneXus predeterminadamente tiene la propiedad Auto Compress Http Traffic Property activada, por lo que comprime el contenido dinámico de la aplicación (en .NET solo para  IIS 6.0 o superior). En otras palabras, comprime el HTML de la página web. Cabe destacar que esta propiedad es independiente de si esta activada o no HTTP Compression a nivel del servidor web (notar que tiene que estar instalada dicha característica en el servidor). 

 

Test

A continuación se realizaron algunas pruebas para medir la diferencia que se obtiene al comprimir contenido en el servidor. Para este caso concreto se utilizó una aplicación generada con GeneXus XEv1 U3. El objeto que se invoca es un webpanel con una grilla con 10 columnas y 500 filas.  Además, el servidor web con el que se cuenta es un IIS 7 en Windows 7 Enterprise. Para los siguientes casos, se habilita/deshabilita la compresión HTTP a nivel del servidor y la propiedad del generador (en GeneXus) "y AutoCompress HTTP Traffic".

 

Caso 1: Sin compresión HTTP y AutoCompress HTTP Traffic = OFF

Tamaño total de la respuesta HTTP del servidor = 1536.0 kbytes (1.5 megabytes). 

Tiempo de descarga aproximado en una conexión (1024 kbits): 15,36 segundos. 

Caso 2: Sin compresión HTTP y AutoCompress HTTP Traffic = ON

Tamaño total de la respuesta HTTP del servidor = 456.6 kbytes.

Tiempo de descarga aproximado en una conexión (1024 kbits): 4,56 segundos. 

Caso 3: Con compresión HTTP y AutoCompress HTTP Trafic = OFF

Tamaño total de la respuesta HTTP del servidor = 137.4 kbytes.

Tiempo de descarga aproximado en una conexión (1024 kbits): 1,4 segundos. 

 Caso 4: Con compresión HTTP y AutoCompress HTTP Trafic = ON

Tamaño total de la respuesta HTTP del servidor = 137.4 kbytes.

Tiempo de descarga aproximado en una conexión (1024 kbits): 1,4 segundos. 

 

En términos generales, el tamaño de la respuesta HTTP se redujo en un 90% mejorando considerablemente el tiempo de transferencia de dichos datos.

 

Compresión HTTP 02

 

¿Como activar la compresión?

How to enable HTTP Compression in Java (Tomcat)

How to enable HTTP Compression in .NET (IIS 6 or later)