Skip to content

5 Protocolo HTTP

Protocolo HTTP

El protocolo HTTP (HyperText Transfer Protocol, protocolo de transferencia de hipertexto) es el protocolo de comunicación principal en la Web, que define las reglas, tipos de peticiones y estructura de datos que deben utilizar los programas para comunicarse entre sí a través de la web.

Se trata de un protocolo sin estado que utiliza internamente el protocolo TCP para el transporte de los datos. Define una estructura de metadatos (datos sobre los datos), llamada cabecera, que deben ser utilizadas tanto para realizar las peticiones como para devolver las respuestas.

El funcionamiento del protocolo es el siguiente:

Funcionamiento del protocolo HTTP

  1. El cliente inicia un proceso de petición de un recurso a través del protocolo HTTP (por ejemplo haciendo click en un enlace de una página web o escribiendo la dirección del recurso en la barra de direcciones del navegador).
  2. Se establece una conexión TCP con el servidor web en el puerto especificado (si no se especifica será usado el puerto 80 del servidor).
  3. Una vez establecida la conexión TCP, el cliente envía al servidor un mensaje HTTP con la petición del recurso, que incluye la cabecera necesaria.
  4. El servidor envía un mensaje de respuesta a la petición recibida, que incluye la cabecera necesaria.
  5. Se cierra la conexión TCP.

Protocolo HTTP

Figura 3 - Protocolo HTTP

Los mensajes del protocolo HTTP están formados por líneas de texto plano (ASCII) con las órdenes y parámetros necesarios escritos según la sintaxis definida por el protocolo. Existen dos tipos de mensajes: los mensajes de petición, que son lo que envía el cliente al servidor, y los mensajes de respuesta, que son los que envía el servidor al cliente.

Peticiones

Los mensajes de petición (request) están formados por las siguientes partes:

Petición HTTP

Figura 4 - Petición HTTP
  • Línea inicial, que incluye:
    • Método utilizado para la petición: GET, POST, ... (enseguida los explicamos)
    • Servidor de destino (extraído de la URL).
    • Versión del protocolo (opcional).
  • Línea/s de cabecera: Determinan cómo debe ser procesada la petición por parte del servidor. Cada cabecera está formada por un par encabezado: valor y se escribe en una línea aparte. Si no hay cabeceras se envía un 0. Detrás de la última cabecera se envía una línea en blanco.
  • Cuerpo del mensaje (opcional): Contiene parámetros o ficheros a enviar al servidor.
GET http://es.kioskea.net HTTP/1.0
Accept : text/html
If-Modified-Since : Saturday, 15-January-2000 14:37:11 GMT
User-Agent : Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)

El método de petición especifica el tipo de operación que el cliente quiere que lleve a cabo el servidor. Existen distintos métodos de petición, algunos de los cuales detallaremos más adelante:

  • GET: Para obtener cualquier tipo de información del servidor.
  • POST: Para solicitar al servidor que acepte información que se envía adjunta en la petición.
  • HEAD: Para obtener solamente las cabeceras de la respuesta. Similar al método GET pero NO se obtiene el cuerpo de la respuesta.
  • PUT: Para insertar (subir) un recurso al servidor. No está habilitado normalmente, salvo para peticiones a servidores RESTful.
  • DELETE: Para eliminar un recurso del servidor. No está habilitado normalmente, salvo en servidores RESTful.
  • TRACE: Para obtener la ruta que ha seguido la petición a través de proxies y cortafuegos. Se usa para depurar errores en redes complejas.
  • OPTIONS: Para solicitar al servidor información sobre qué métodos HTTP están disponibles para un determinado recurso.

El método GET se emplea para obtener cualquier tipo de información del servidor. Es el método invocado automáticamente cuando se introduce una URL en un navegador o se pulsa un enlace. Permite enviar parámetros al servidor escribiéndolos en la propia URL. Esta zona, conocida como cadena de consulta (query string), se concatena al final de la URL y está formada por el carácter ? seguido de una lista de pares parámetro=valor separados por el carácter &, sustituyendo los espacios en blanco por el carácter +.

Por ejemplo, en http://www.informaticasaladillo.es/mostrar.php?nombre=Baldomero&apellidos=Llegate+Ligero, se están enviando dos parámetros: el parámetro nombre con el valor Baldomero y el parámetro apellidos con el valor Ramos Fuerte. Estos parámetros se incluyen en la línea inicial del mensaje de petición.

Los mensajes de petición enviados con el método GET no disponen de la zona conocida como cuerpo del mensaje y no pueden ser utilizados para enviar gran cantidad de datos al servidor (por ejemplo para subir un archivo).

Envío de datos en una petición GET

GET /mostrar.php?nombre=Baldomero&apellidos=Llegate+Ligero HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20130101 Firefox/4.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Keep-alive: 115
Connection: keep-alive
Referer: http://www.iessaladillo.es/form_post.html

El método POST es utilizado para enviar al servidor información que queremos que acepte. El cuerpo del mensaje incluye los parámetros y valores que se desean enviados, no siendo visibles en la URL (como ocurre en el caso del método GET).

Dado que estamos enviando información al servidor para que éste realice alguna tarea en concreto, una operación realizada con POST NO debería en principio ser reenviada, ya que conllevaría que se llevara a cabo la operación una segunda vez, algo que en la mayoría de las ocasiones no es lo deseado, por ejemplo en el caso de que la operación corresponda a ordenar una transferencia bancaria. Por este motivo, los navegadores solicitan confirmación al usuario antes de reenviar un mensaje POST por haber refrescado la página.

El protocolo HTTP no establece un límite en la cantidad de datos que se pueden enviar mediante el método POST, por lo que lo podemos usar para, por ejemplo, enviar un archivo al servidor.

POST /mostrar.php HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20130101 Firefox/4.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Keep-alive: 115
Connection: keep-alive
Referer: http://www.iessaladillo.es/form_post.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 39

nombre=Baldomero&apellidos=Llegate+Ligero

Respuestas

Por su parte, los mensajes de respuesta enviados por el servidor están formados por las siguientes partes:

Respuesta HTTP

Figura 5 - Respuesta HTTP
  • Línea inicial de respuesta (línea e estado). Incluye:
    • La versión de HTTP utilizada.
    • El código de estado o código de error, que informa al cliente de cómo se ha procesado la petición. Por ejemplo, el código 200 indica que la petición se ha procesado correctamente y se ha enviado el recurso correspondiente al cliente.
    • Texto explicativo del código de estado.
  • Línea/s de cabecera: Describen los datos y la forma en la que son enviados al cliente. Cada cabecera está formada por un par encabezado: valor y se escribe en una línea aparte. Si no hay cabeceras se envía un 0. Detrás de la última cabecera se envía una línea en blanco.
  • Cuerpo del mensaje (opcional): Viene determinado por el tipo de recurso solicitado.

Respuesta HTTP

HTTP/1.1 200 OK
Date: Sun, 3 Nov 2013 11:53:00 GMT
Server: Apache/2.2.16 (Debian)
Last-Modified: Sun, 3 Nov 2013 11:51:48 GMT
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 86
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

<html>
<head>
<title>Saludo</title>
</head>
<body>
No te digo trigo...
</body>
</html>

El código de estado o error es el código que envía el servidor en las respuestas HTTP para informar al cliente de cómo ha sido procesada la petición. Corresponden a números de tres cifras, clasificados en los siguientes grupos:

  • Informativos (100 - 199): Indican que el servidor ha recibido la petición pero no ha finalizado de procesarla.
  • Éxito (200-299): Indican que la petición ha sido procesada satisfactoriamente.
    • El más habitual es el código 200 OK
  • Redirección (300-399): Indican que la petición ha sido procesada y redirigida a otra localización. Por ejemplo:
    • 302 Found indica que el recurso solicitado ha cambiado de localización, que se especifica en el encabezamiento Location de la respuesta.
    • 304 Not Modified indica que el recurso solicitado no ha sido modificado y por tanto el navegador debería obtenerlo de su caché local.
  • Error del cliente (400-499): Indican que hay algún error en la petición del cliente o no se le concede permiso para acceder al recurso. Por ejemplo:
    • 400 Bad request indica que hay un error en la sintaxis en la petición.
    • 401 Unauthorized indica que no pueden acceder al recurso los usuarios anónimos.
    • 403 Forbidden indica que está prohibido el acceso al recurso solicitado.
    • 404 Not found indica que el recurso solicitado no se encuentra en el servidor.
    • 405 Method Not Allowed indica que el método establecido en la petición no está soportado para el recurso solicitado.
    • 406 Not Acceptable indica que el servidor no es capaz de devolver los datos en ninguno de los formatos aceptados por el cliente, indicados mediante el encabezamiento "Accept" de la petición.
  • Error en el servidor (500 - 599): Indican que el servidor no puede atender la petición porque tiene algún problema. Por ejemplo:
    • 500 Internal Server Error indica que se ha producido un error interno en el servidor, por ejemplo de configuración.
    • 503 Service Unavailable indica que el servidor no responde en este momento, por ejemplo por sobrecarga de peticiones.