miércoles, 19 de septiembre de 2012

Compresión HTTP

En un post anterior hablaba de que habilitar la compresión HTTP es una acción sencilla que puede mejorar enormemente el rendimiento de nuestra web. El funcionamiento está especificado en el estándar HTTP1.1 y forma parte del protocolo que implementan los navegadores y los servidores.

El concepto es muy sencillo: el servidor comprime automáticamente los datos antes de enviarlos y el navegador los descomprime cuando los recibe. El proceso de compresión y descompresión es rapidísimo. Nos permite ahorrar ancho de banda y mejorar los tiempos de respuesta al transmitir menos datos.

¿Y si algún navegador no soporta la compresión?

Todos los navegadores modernos lo soportan (incluso IE6), pero también existen otro tipo de clientes que pueden no implementarlo, como algunos robots de búsqueda o algunos browsers muy simplificados. En cualquier caso esto no supone ningún problema. Los navegadores que no soportan la compresión HTTP van a recibir los ficheros sin comprimir.

Cada vez que el navegador hace una petición al servidor, le indica, mediante una cabecera HTTP, que puede recibir contenido comprimido. El servidor, si está configurado para comprimir los datos, los enviará comprimidos y con una cabecera indicando el tipo de compresión aplicada.
Si el navegador no indica que puede manejarlo, el servidor nunca va a comprimir los ficheros
Este sería un ejemplo (simplificado) de la petición HTTP del cliente:

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

Vemos como el navegador indica al servidor que acepta contenido comprimido y le pasa una lista de formatos que puede descomprimir. En este caso gzip y deflate.

El servidor, en su respuesta con el contenido, incluirá las siguientes cabeceras (entre otras):

HTTP/1.1 200 OK
Date: Wed, 19 Sep 2012 13:42:14 GMT
Server: Apache/2.0
Content-Encoding: gzip
Content-Length: 1285

Indica al navegador que el contenido ha sido comprimido con gzip. Si la compresión HTTP no estuviera habilitada no incluiría la cabecera Content-Encoding y lo enviaría sin comprimir. El navegador, al no recibir la cabecera, sabría que no necesita descomprimir los ficheros.

No todos los ficheros se deben comprimir

El servidor web requiere una configuración para poder comprimir el contenido. Ademas de habilitar la funcionalidad debemos tambien indicar qué tipo de ficheros ( MIME type ) deben comprimirse, porque no todos lo necesitan.

Normalmente se configura sólo para ficheros de tipo texto ( JS, CSS, HTML, JSON, etc ). Las imágenes (JPG, PNG ) y el contenido multimedia ya están en formatos comprimidos y no ganamos nada comprimiendolos de nuevo. Estaríamos añadiendo carga de procesador tanto en el servidor como en el cliente sin ningún beneficio.


No hay comentarios:

Publicar un comentario