HTTP
Conexiones
En una comunicación HTTP, los clientes siempre crean la conexión. A continuación, vamos a usar telnet para crear una conexión TCP y simular una comunicación HTTP.
-
Desde el terminal teclea:
telnet httpbin.org 80y cuando se conecte pega este contenido (las 2 líneas)1:
HEAD /html HTTP/1.0❓ Pregunta: Para establecer una conexión TCP, ¿qué parámetros son necesarios? De los 2 que hemos utilizado,
telnetha traducido uno de ellos para poder establecer la conexión ¿cuál y a qué valor? -
El servidor contesta con un
OKy unas cabeceras de respuesta sin cuerpo. Vuelve a hacer el paso 1 pero esta vez ponHTTP/1.1. -
La respuesta esta vez es
Bad Requestporque esta versión obliga a enviar la cabeceraHost2. Repite el paso 1 con esta petición:HEAD /html HTTP/1.1 Host: httpbin.orgEl servidor responde
OKpero ahora el comandotelnetno termina, continúa conectado. En HTTP 1.0 la conexión la cierra el servidor inmediatamente tras enviar la respuesta (verConnection: closede esa respuesta), mientras que en HTTP 1.1 se mantiene abierta (verConnection: keep-alivede esa respuesta) a la espera de nuevas peticiones.🔍 Nota: Si esperamos unos segundos más, el comando
telnettermina porque la conexión la cierra el servidor. Por un lado, las conexiones TCP son costosas de establecer por lo que interesa mantenerlas abiertas si seguidamente se va a hacer otra petición. Pero por otro lado, mantener una conexión consume recursos del servidor que no puede malgastar con un cliente que no envía datos. -
Para saber cuál es el timeout por defecto del servidor, espera a que acabe este comando:
time telnet httpbin.org 80❓ Pregunta: El timeout para la lectura de datos permite al servidor desconectar a clientes que no envían datos. ¿Para qué valdrá un timeout similar en el lado del cliente? Identifica una situación en la que como usuario de un servicio web te haya podido suceder ese tipo de timeout.
-
Hasta ahora hemos usado el puerto TCP 80 que es el de por defecto para conexiones HTTP. El puerto por defecto para conexiones seguras es 443. Repite el paso 1 usando ese puerto.
-
El servidor nos responde con error porque espera que enviemos los mensajes de negociación de TLS para cifrar la comunicación antes de enviar nada. Repite el paso 1 usando
opensslen lugar detelnet3:openssl s_client -state -connect httpbin.org:443❓ Pregunta:
opensslse encarga de cifrar y descifrar los mensajes que enviamos y recibimos con la clave de cifrado intercambiada4. Esta forma de funcionar, ¿a qué arquitectura o modelo conceptual basado en capas se asemeja?
La línea en blanco (en realidad dos retorno de carro + nueva línea o CRLF o \r\n) indica el fin del mensaje de la petición, y en ese momento el servidor envía el mensaje de respuesta.
Es necesaria para que una misma IP pueda servir diferentes dominios web.
TLS es bastante más complicado que HTTP y no podemos escribir sus mensajes con telnet.
Al comienzo de la salida del comando openssl se pueden ver los mensajes TLS intercambiados entre cliente y servidor negociando el cifrado.