HTTP es un protocolo de texto que permite la interacción entre un cliente, como un navegador, y un servidor. Funciona así: el usuario envía una solicitud al servidor, pidiendo o enviando los datos necesarios. Luego, el servidor procesa la solicitud, realiza la lógica necesaria y devuelve el resultado, que suele ser una página HTML o una redirección.
Vamos a ver cómo funciona HTTP haciendo una solicitud al servidor de Google y analizando lo que obtenemos. Para ello, utilizaremos una herramienta especial llamada telnet (ejemplo de solicitud HTTP realizada con la herramienta telnet).
# Pasamos la dirección del sitio y especificamos el puerto TCP
# Luego se establece una conexión con el servidor a través del protocolo TCP
telnet google.com 80
HTTP es un protocolo de nivel de aplicación. En otras palabras, está diseñado para la comunicación entre dos programas (cliente y servidor) que se encuentran en diferentes computadoras. Pero, por sí solo, HTTP no puede conectar dos computadoras remotas. Para esto se utilizan otros protocolos, entre ellos TCP. Es TCP el que permite conectar programas en computadoras remotas, creando un canal de comunicación entre ellos. Para esto, se deben conocer dos parámetros: la dirección IP de la computadora a la que se desea conectar y el puerto en el que se encuentra el programa necesario.
El comando telnet anterior hace precisamente eso, establece una conexión a través de TCP y solo después entra en el modo de interacción a través de HTTP. Si se especifica la dirección IP correcta y el puerto para la conexión. Y en este punto surgen dos preguntas:
¿De dónde se obtiene la dirección IP si se pasa la dirección del sitio? Cualquier dirección de sitio es simplemente un nombre detrás del cual se oculta una dirección IP. El nombre se proporciona por conveniencia, ya que es más fácil de recordar. Sin embargo, todos los programas de red, incluidos los navegadores y telnet, realizan la conversión del nombre del sitio a su dirección IP. Esto se hace mediante el sistema DNS, otro pilar de Internet.
# Ejemplo de cómo obtener una dirección IP con la herramienta ping
# En tu caso, la dirección puede ser diferente, las direcciones IP pueden cambiar
# La opción -c establece la cantidad de paquetes enviados
ping -c 4 google.com # 74.125.21.139
# Luego se puede usar para conectarse al servidor
telnet 74.125.21.139 80
¿Por qué el puerto tiene el número 80? Es un acuerdo general. Los sitios web disponibles a través de HTTP están disponibles en el puerto 80, y a través de HTTPS en el puerto 443. Es por eso que los navegadores no especifican puertos, los rellenan automáticamente.
Si la conexión se establece correctamente, telnet muestra estas líneas en la pantalla:
telnet google.com 80
Trying 74.125.21.139...
Connected to google.com.
Escape character is '^]'.
Después de la conexión, el servidor web entra en modo de espera de una solicitud HTTP. Solo queda enviarlo.
¿Qué representa la solicitud en sí?
La solicitud consta de varias partes. La primera parte es la línea de inicio (request line). La segunda parte son los encabezados.
En la línea de inicio, especificamos una palabra especial, también conocida como "verbo". HTTP tiene diferentes verbos, pero no entraremos en detalles ahora. Simplemente diremos que definen cómo responder a esta solicitud. Y en este caso, usaremos el verbo HEAD. Es muy simple y solicita al servidor que devuelva solo los encabezados, sin el contenido. El verbo más común es GET. Con GET solicitamos el contenido del sitio.
Después del verbo, se especifica la ruta al recurso request URI. Si especificamos /, esto simplemente significa la raíz del sitio. Luego, todo lo que hay que hacer es especificar el nombre del protocolo y su versión. En este curso, solo se tratan las versiones HTTP 1.0 y 1.1, que son la base del protocolo y es recomendable comenzar a familiarizarse con ellas. Entre las versiones hay diferencias fundamentales que es importante conocer y comprender. La versión 1.0 todavía se utiliza para diversos fines en las utilidades de línea de comandos.
En principio, eso es suficiente y no se necesita hacer nada más para la versión 1.0:
HEAD / HTTP/1.0
Luego vienen los encabezados. ¿Qué son? Los encabezados permiten transmitir información adicional, por ejemplo, los navegadores proporcionan información sobre sí mismos para que se sepa de dónde proviene la solicitud. Además, indican qué formatos de compresión admiten, en qué formato están dispuestos a aceptar la respuesta, etc. Hay una gran cantidad de encabezados estándar, además de los cuales se pueden agregar cualquier encabezado personalizado.
Veamos cómo se ven los encabezados. Especificamos el nombre y, a través de dos puntos, algún valor: REFERER: valor. A menudo, los encabezados se escriben en mayúsculas, pero el caso no importa aquí. El orden de los encabezados tampoco está especificado. No importa en qué orden pasemos los encabezados, el cuerpo de la respuesta se analizará solo cuando se pasen todos juntos.
Los navegadores utilizan muchos encabezados, por ejemplo, user-agent. Este encabezado se utiliza para análisis y también cuando es necesario adaptar las páginas del sitio a diferentes pantallas o navegadores. Pero incluso sin él, todo debería funcionar:
HEAD / HTTP/1.0
User-Agent: google сhrome
Es importante recordar que, dado que es un protocolo y tiene reglas específicas, no se pueden violar. HTTP es un protocolo de texto. Todas las reglas se basan en acuerdos simples. Por ejemplo, varios encabezados se separan entre sí con un salto de línea (¡y solo de esta manera!). No podemos escribirlos en una línea, separados por comas o de alguna otra manera. Todo es muy estricto. ¿Y cómo sabrá el servidor que ha terminado de enviar los datos? Debe haber algún tipo de marcador, un identificador. En HTTP, esto se hace con dos saltos de línea. Después de eso, el servidor considera que todos los datos se han enviado y no habrá más datos. Es decir, de hecho, dos saltos de línea (un salto de línea después del último encabezado y una línea vacía) conducen al envío de datos.
¿Qué representa la respuesta?
Hagamos una solicitud y veamos qué se nos devuelve como respuesta. Haremos una solicitud HEAD y veremos qué se devuelve:
telnet google.com 80
Trying 64.233.164.100...
Connected to google.com.
Escape character is '^]'.
HEAD / HTTP/1.0
HTTP/1.0 200 OK
Date: Sat, 18 Jan 2020 09:24:50 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2020-01-18-09; expires=Mon, 17-Feb-2020 09:24:50 GMT; path=/;
domain=.google.com; Secure
Set-Cookie: NID=196=wsHLMAMfnAaSyF7zduokI8TJeE5UoIKPHYC58HYH93VMnev9Nc2bAjhRdzoc4UhmuOd7ZVCorDnz
GDe51yPefsRMeVyOFnYdHYYgQNqI8A1dYuk4pDK4OJurQgL4lX8kiNGSNi_kkUESFQ-MqLCB_YspxA9JRejhZdkTRtGyHNk;
expires=Sun, 19-Jul-2020 09:24:50 GMT; path=/; domain=.google.com; HttpOnly
Accept-Ranges: none
Vary: Accept-Encoding
Connection closed by foreign host.
En respuesta, recibimos una respuesta. Consiste en una línea de estado HTTP/1.0 200 OK. Esta es la línea de respuesta que indica el protocolo (que aquí coincide) y el estado de la respuesta 200 OK. HTTP tiene muchos estados diferentes (400, 500, etc.). Pueden informar que la información no se encontró, hubo errores en el servidor, etc. Todos los estados tienen un nombre mnemotécnico que también se transmite como el último valor. 200 y OK indican que todo salió bien, ¡éxito!
Luego se muestran una gran cantidad de diferentes encabezados. No hay nada complicado en ellos y no es necesario aprenderlos todos (hay algunos comunes y son bastante comprensibles). Todos los encabezados constan de una clave, dos puntos y un valor. Se puede notar que hay cosas relacionadas con la codificación, la memoria caché. Algunos encabezados son específicos del servidor actual. Por ejemplo, X-XSS-Protection: 0, donde X indica un encabezado personalizado. Pero ningún servidor web, ningún navegador web se romperá al enviar estos encabezados adicionales.
Es en HTTP 1.0 donde, al final, después de recibir los datos, se cierra la conexión.
Al final, vemos un detalle interesante: Connection closed by foreign host. La solicitud de conexión fue cerrada por un host externo. Así es como funciona casi todo en Internet. Por lo general, los servidores están configurados para un intervalo de 30 segundos y cierran la conexión si no se recibe nada durante este intervalo.
Trabajar con telnet puede ser complicado para los principiantes, ya que escribir la solicitud lentamente puede hacer que la conexión se cierre. Por eso, es mejor escribir las solicitudes en un archivo aparte y luego pegarlas en telnet.
Materiales adicionales
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.