HTTP/Conexiones/Conexiones Persistentes
En los primeros días de la web, un agente de usuario podría abrir y cerrar una conexión para cada petición individual se envía a un servidor. Esta aplicación estaba de acuerdo con la idea de HTTP de ser un protocolo sin estado completamente. A medida que el número de solicitudes por página creció, también lo hizo los gastos indirectos generados por apretones de manos TCP y las estructuras de datos en memoria necesaria para establecer cada socket TCP.
Las conexiones persistentes, es la idea de utilizar la misma conexión TCP para enviar y recibir múltiples peticiones HTTP/respuestas, en lugar de abrir una nueva para cada par petición/respuesta única. El uso de conexiones persistentes es muy importante para mejorar el rendimiento de HTTP.
Los clientes Web a menudo abren conexiones para el mismo sitio. Por ejemplo, la mayoría de las imágenes incrustadas en una página web a menudo vienen del mismo sitio web, y un número significativo de hipervínculos a otros objetos a menudo apuntan al mismo sitio. Por lo tanto, una aplicación que inicia una petición HTTP a un servidor probablemente hará más solicitudes a ese servidor en un futuro próximo (a buscar las imágenes en línea, por ejemplo). Esta propiedad se denomina sitio localidad.
Por esta razón, HTTP / 1.1 (y versiones mejoradas de HTTP / 1.0) permite que los dispositivos HTTP mantengan las conexiones TCP abiertas después de completar las transacciones y reutilizar las conexiones preexistentes para futuras peticiones HTTP. Conexiones TCP que no se mantengan cerradas después de completar las transacciones se llaman conexiones persistentes. Conexiones no persistentes se cierran después de cada transacción. Las conexiones persistentes permanecen abiertas entre operaciones, hasta que el cliente o el servidor decide cerrarlas.
Las conexiones persistentes, también evitan el arranque lento, que es parte del control de congestión de TCP, haciendo que las conexiones persistentes funcionan mejor con el tiempo. En resumen, las conexiones persistentes reducen el uso de memoria, el uso de CPU, la congestión de la red, la latencia, y en general mejoran la respuesta de una página con el tiempo. Pero, como todo en la vida hay un inconveniente.
Como se menciona anteriormente, un servidor tiene un número finito de conexiones entrantes que puede soportar. Pero cada servidor soporta una cantidad de conexiones diferentes dependiendo de ciertos factores que hacen que el servidor se encuentre configurado para limitar el número de conexiones simultáneas, pero este límite se encuentra por debajo del punto donde el servidor se caiga. Unos de estos factores es que depende de la cantidad de memoria disponible, la configuración del servidor software, el rendimiento de la aplicación, entre otras.
La configuración es una medida de seguridad para ayudar a prevenir la denegación de servicio por ataques. Es relativamente fácil para alguien crear un programa que abrirá miles de conexiones persistentes con un servidor y el servidor no pueda responder a los clientes reales.
Las conexiones persistentes son una optimización del rendimiento, pero también una vulnerabilidad. Y teniendo en cuenta este detalle, hay que tener presente el periodo de tiempo que se debe mantener una conexión persistente abierta.
Las conexiones pueden permanecer abiertas durante el tiempo que el sitio web se ejecute, pero también se ve afectada por el límite de conexiones que para ese momento el servidor esté soportando, y por eso la gran mayoría de ellos están configurados para cerrar las conexiones persistentes que se encuentran inactivas durante un determinado periodo de tiempo.
Además de cerrar las conexiones persistentes, una cantidad de software de servicio web, de igual manera puede desactivar estas conexiones. Esto es muy común en servicios compartidos. En estos servidores compartidos se sacrifica el rendimiento del sitio web para permitir múltiples conexiones, tantas como sean posibles. Debido a la persistencia estas conexiones son el estilo de conexión predeterminado con HTTP 1.1 . Un servidor que no permite conexiones persistentes tiene que incluir una cabecera de conexión en cada respuesta HTTP. El código siguiente es un ejemplo.
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.0 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Connection: close Content-Length: 17149
La conexión: lo que se encuentra en connection es un estado close, esto quiere decir que el sitio web no cuenta con una conexión persistente y debe ser cerrada tan pronto como sea posible. El agente no está autorizado a hacer una segunda solicitud en la misma conexión.