Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

HTTP 1.1 Protocolo HTTP

El protocolo HTTP 1.1 amplía las capacidades de la versión anterior y agrega hosts virtuales. Ahora veremos para qué se utiliza y cómo funciona.

En la versión anterior, solo necesitábamos la línea de solicitud, donde especificamos la ruta del sitio web que queremos ver, sin mencionar el sitio web en sí. Al conectarnos a una dirección IP específica a través de telnet, parecía que el concepto de dominio (nombre de dominio) no importaba en HTTP 1.0. Esta versión se creó cuando se creía que una dirección IP correspondía a un único sitio web, lo cual rápidamente se volvió obsoleto con el rápido crecimiento de Internet.

Con la introducción de HTTP 1.1, se agregó el concepto de hosts virtuales. En términos de implementación en el protocolo HTTP, se añadió un pequeño detalle: además de la línea de solicitud, se hizo obligatorio un encabezado llamado 'host'. Este encabezado determina qué dominio debe ser devuelto desde esa dirección IP.

HEAD / HTTP/1.1
host: codica.la

En realidad, a veces se incluyen suposiciones en el comportamiento de HTTP y los servidores, por ejemplo, pueden corregir los errores de los usuarios. Es decir, se puede hacer una solicitud HTTP 1.1 sin especificar el host y obtener una respuesta. En realidad, esta solicitud no debería pasar, pero a menudo los servidores web devuelven el sitio web que está configurado de forma predeterminada. Por ejemplo, en Nginx hay un sitio web predeterminado. Pero no se deben hacer solicitudes de esta manera en principio, no cumple con el estándar. Siempre se debe especificar el host, de lo contrario, la respuesta no está garantizada. Hoy es uno, mañana es otro. Algunas bibliotecas pueden no funcionar de esta manera en absoluto. Los hosts virtuales son un atributo integral de HTTP 1.1. No se pueden ignorar.

Ahora podemos hacer una solicitud GET utilizando la versión del protocolo 1.1 y ver qué nos devuelve:

telnet google.com 80

GET / HTTP/1.1
host: google.com

HTTP/1.1 301 Moved Permanently
Location: https://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Fri, 28 Feb 2020 06:06:40 GMT
Expires: Sun, 29 Mar 2020 06:06:40 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>

Como ya sabemos, hay muchos códigos de respuesta diferentes. Al final, recibimos una respuesta con un código diferente a 200. Aquí hay otro detalle interesante introducido en HTTP 1.1. Después de realizar la solicitud, no salimos de telnet ni volvemos a bash. Esto significa que la conexión no se cerró y podemos seguir ingresando datos. Haremos una solicitud HEAD al mismo dominio:

HEAD / HTTP/1.1
host: google.com

HTTP/1.1 301 Moved Permanently
Location: https://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Fri, 28 Feb 2020 06:11:31 GMT
Expires: Sun, 29 Mar 2020 06:11:31 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

Recibimos una respuesta nuevamente, pero sin el cuerpo, ya que usamos HEAD en lugar de GET:

Mecanismo de keep-alive

HTTP 1.1 también introduce otro concepto por defecto llamado keep-alive. keep-alive significa que la conexión TCP a través de la cual se envía HTTP no se cierra. Además, por defecto, todos los servidores web deben comportarse de esta manera. El objetivo principal de esta característica es reducir el uso de recursos, disminuir la carga en el procesador, abrir menos conexiones TCP (el establecimiento de cada conexión TCP lleva tiempo), reducir el tiempo de espera (latencia). Cuando abrimos un sitio web, generalmente se cargan varios recursos desde un solo dominio. keep-alive permite abrir y utilizar una sola conexión que no se cerrará hasta que se indique explícitamente o se produzca un tiempo de espera. El tiempo de espera depende del navegador y del servidor web utilizado.

También podemos indicar que queremos cerrar la conexión. Para hacer esto, después de establecer la conexión y enviar los encabezados estándar, debemos enviar otro encabezado. Se llama connection: close. Entonces keep-alive se desactivará y después de recibir la respuesta veremos el mensaje de que el host ha cerrado la conexión: Connection closed by foreign host.


Materiales adicionales

  1. Estándar HTTP 1.1
  2. Conexión HTTP persistente

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY