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).