Apuntes redes

No vayas a access.log, donde habitan los monstruos.

Anexo: Diálogo HTTP con curl

Para ilustrar cómo funciona el Protocolo de Transferencia de Hipertexto (HTTP), mostramos un ejemplo esquematizado del diálogo cliente-servidor usando la herramienta de línea de comandos curl. Este ejemplo realiza una solicitud HTTP a example.com y muestra la respuesta del servidor, destacando las partes clave de la comunicación.

¿Qué es curl?

curl es una herramienta de línea de comandos para realizar solicitudes a servidores, compatible con HTTP, FTP, y otros protocolos. Con la opción -v (verbose), muestra los detalles de la solicitud enviada y la respuesta recibida, incluyendo los encabezados HTTP. Esto permite ver cómo un cliente (tu terminal) se conecta a un servidor web usando TCP/IP, y cómo HTTP estructura el intercambio de datos.

Ejemplo de curl -v http://example.com

A continuación, presentamos una salida esquematizada de curl -v http://example.com, con las líneas más relevantes de cada paso y su explicación.

Paso 1: Resolución de DNS y conexión

*   Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80
  • Explicación: curl resuelve el nombre de dominio example.com a la dirección IP 93.184.216.34 usando DNS, como se mostró en el anexo de dig +trace. El resolvedor local (configurado en /etc/resolv.conf en Linux o en la configuración de red en Windows) facilita esta resolución. TCP establece una conexión con el servidor en el puerto 80 (predeterminado para HTTP), como se describió en la subsección TCP/IP.

Paso 2: Solicitud HTTP

> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.81.0
> Accept: */*
  • Explicación: curl envía una solicitud HTTP con el método GET para la página principal (/), usando la versión HTTP/1.1. Los encabezados Host (indica el dominio solicitado) y User-Agent (identifica el cliente) son esenciales. TCP divide esta solicitud en segmentos, y IP la enruta como paquetes a la dirección IP del servidor, como se explicó en la subsección TCP/IP.
  • El encabezado Accept: */* indica que el cliente acepta cualquier tipo de contenido (como HTML, JSON, o archivos binarios), permitiendo al servidor elegir el formato de la respuesta

Paso 3: Respuesta HTTP

< HTTP/1.1 200 OK
< Content-Type: text/html
< Server: ECS (bsa/EB13)
< Connection: keep-alive
  • Explicación: El servidor responde con un código de estado 200 OK, indicando que la solicitud fue exitosa. Los encabezados Content-Type (especifica que el contenido es HTML) y Server (indica el tipo de servidor) proporcionan metadatos. TCP asegura que esta respuesta llegue completa y en orden al cliente.
  • Explicación: El encabezado Connection: keep-alive indica que la conexión TCP permanecerá abierta para permitir más solicitudes HTTP, optimizando la eficiencia descrita en la subsección TCP/IP.

Paso 4: Cuerpo de la respuesta

<!doctype html>
<html>
<body><h1>Example Domain</h1>
  • Explicación: El servidor envía el cuerpo de la respuesta, que contiene el HTML de la página web. Por brevedad, mostramos solo las primeras líneas. TCP reensambla los segmentos recibidos y los entrega a curl, que muestra el contenido en la terminal.

Nota sobre redirecciones

En algunos casos, el servidor responde con un código de redirección, como 301 Moved Permanently. Por ejemplo, una solicitud a un dominio puede redirigir a su versión con "www":

< HTTP/1.1 301 Moved Permanently
< Location: http://www.example.com/

Esto indica que el recurso se ha movido a una nueva URL. Con curl -L, el cliente seguiría la redirección automáticamente, solicitando la nueva URL. Las redirecciones son comunes para estandarizar URLs o redirigir a versiones seguras (HTTPS).

TOP