Hypertext Transfer Protocol (HTTP) es el protocolo de aplicación no orientado a la conexión mediante el cual se comunican navegadores y servidores web haciendo uso del intercambio de mensajes en texto plano. Se soporta en el protocolo TCP en la capa de Transporte.

Mensajes

Los mensajes HTTP viajan en texto plano y dependiendo de si el mensaje lo envía el cliente o el servidor pueden ser:

Request Message

Enviado desde el cliente web y tiene la siguiente estructura:

<method> <request-URL> <version>
<headers>
<entity-body>
  • Start Line: En la primera línea encontramos tres parámetros, el método (method) usado que puede ser GET, HEAD, PUT, entre otros que veremos más adelante, así como la ubicación (request-URL) del recurso solicitado al servidor y por último la versión de HTTP usada en la comunicación.
  • Cabeceras: Una cabecera es un par ordenado de nombre/valor separados por el símbolo “:”. Las cabeceras terminan en una obligatoria linea en blanco que da comienzo al cuerpo del mensaje.
  • Cuerpo del mensaje: Contiene el payload del protocolo HTTP, la información que se quiere transmitir, como por ejemplo cuando se usa el método POST.

No todas las peticiones cuentan con un cuerpo de mensaje, en el siguiente caso se usa el método GET y el mensaje fue generado cuando se intenta acceder a google desde el navegador Chromium en Debian GNU/Linux. El mensaje generado no contiene cuerpo (entity-boby) y se pueden ver diferentes tipo de cabeceras como: Host, Proxy-Connection, User-Agent entre otras que genera el navegador. Listado completo de cabeceras HTTP:

GET http://google.com/ HTTP/1.1
Host: google.com
Proxy-Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: sdch
Accept-Language: es-419,es;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Response Message

Mensaje que surge desde el servidor web, respondiendo a una petición del cliente indicando el estado del recurso solicitado, tiene la siguiente estructura:

<version> <status-code> <reason-phrase>
<headers>
<entity-body>
  • status-code: Este código indica qué sucedió con nuestra petición, se clasifican en cinco categorías: Informativos (100-199), Peticiones correctas (200-299), Redirecciones (300-399), Errores del cliente (400-499), Errores del servidor (500-599). Listado de Status Code.
  • reason-phrase: Pequeña frase que describir de manera breve el status-code.

Métodos

No todos los navegadores implementan 100% el protocolo HTTP, para ser compatible con la versión 1.1 un servidor web debe implementar GET y HEAD, éstos métodos son denominados Safe methods ya que en teoría no deberían cambiar nada en el servidor, pero esto en realidad depende de los desarrolladores web.

GET

Es el método más utilizado, obtiene un documento (ya sean imágenes, archivos JavaScript, sonidos, etc) del servidor, la respuesta que se obtiene del servidor (código fuente del archivo) es interpretada por nuestro navegador.

GET /index.html HTTP/1.1
Host: www.ejemplo.com
Accept: *

En este caso una posible respuesta del servidor sería:

HTTP/1.1 200 OK
Content-type: text/html
Context-length: 621

<HTML>
<HEAD><TITLE>Página de ejemplo<TITLE>
...

En el caso anterior, se retornó un documento HTML y es muy común que en estos documentos los estilos de la página se guarden en archivos CSS para no mezclar código, de ser éste el caso, el navegador generará peticiones HTTP usando el método GET separadas para obtener dichos archivos del servidor. Lo mismo ocurre con las imágenes, archivos JavaScript y otro tipo de recursos que estén indicados en el HTML. Es decir, cuando escribimos la página web de nuestro interés en la barra de direcciones de nuestro navegador se desencadenarán una serie de peticiones (por lo general GET) al servidor web para construir de manera completa la página solicitada.

Funciona igual que el método GET pero en este caso, el servidor no devuelve ningún cuerpo de mensaje. Gracias a la toda la información que brindan las cabeceras de la respuesta del servidor podemos usar este método para un sin número de motivos, por ejemplo: Determinar el tipo de recurso (Content-Type), verificar el tamaño del recurso (Content-Length) y con base a lo anterior tomar posibles decisiones. También verificar si el recurso solicitado existe observando el status code.

POST

Se usa para enviar información (input data) desde el cliente para que sea procesada por la aplicación. Cuando el mensaje utiliza el método POST sí debe contener el cuerpo de mensaje, ejemplo:

POST /script.php HTTP/1.1
Host: www.ejemplo.com
Content-type: text/plain
Context-length: 21

itemid=247

TRACE

En algunas ocasiones la petición debe pasar a través de diferentes dispositivos de red (firewall, proxy, etc) que pueden llegar a modificar la petición original y éste método permite al cliente observar la manera en que su petición llega al servidor, para poder determinar si la petición ha sido modificada. El servidor lo que hace es enviar de nuevo al cliente la petición que recibió, es decir, el cuerpo del mensaje de respuesta de éste método es la petición completa que le llega al servidor:

  • Request Message:
TRACE /index.html HTTP/1.1
Accept: *
Host: www.ejemplo.com
  • Response Message
HTTP/1.1 200 OK
Content-type: text/plain
Content-length: 102
Via: 1.1 proxy.miempresa.com

TRACE /index.html HTTP/1.1
Host: www.ejemplo.com
Accept: *
Via: 1.1 proxy.miempresa.com

Como podemos ver la petición al servidor ha llegado modificada, ya que se ha agregado la cabecera Via que generalmente agregan gateways y proxies.

OPTIONS

Con este método preguntamos al servidor web con qué métodos HTTP podemos comunicarnos. Los mensajes tanto del cliente como del servidor no contienen cuerpo del mensaje, el servidor responderá en la cabecera Allow los métodos HTTP permitidos separedos por coma:

OPTIONS * HTTP/1.1
Host: www.ejemplo.com
Accept: *

La respuesta puede ser:

HTTP/1.1 200 OK
Allow: GET, POST, OPTIONS, HEAD
Context-length: 0

PUT/DELETE

Por la naturaleza de estos métodos, no están disponibles en la mayoría de los servidores web, con ellos podríamos llevar o borrar archivos al servidor respectivamente, estos no nos interesan por el momento.

Lista completa de los métodos HTTP.