Servidor web

Un servidor web o servidor HTTP es un programa informático que procesa una aplicación del lado del servidor, realizando conexiones bidireccionales y/o unidireccionales y síncronas o asíncronas con el cliente y generando o cediendo una respuesta en cualquier lenguaje o Aplicación del lado del cliente. El código recibido por el cliente es renderizado por un navegador web. Para la transmisión de todos estos datos suele utilizarse algún protocolo. Generalmente se usa el protocolo HTTP para estas comunicaciones, perteneciente a la capa de aplicación del modelo OSI. El término también se emplea para referirse al ordenador que ejecuta el programa.

Arquitectura de distribución de los servidores de la Fundación Wikimedia

Arquitectura

Petición GET

Un servidor web opera mediante el protocolo HTTP, de la capa de aplicación del Modelo OSI. Al protocolo HTTP se le asigna habitualmente el puerto TCP 80. Las peticiones al servidor suelen realizarse mediante HTTP utilizando el método de petición GET, en el que el recurso se solicita a través de la url al servidor Web.
GET /index.html HTTP/1.1 HOST: www.host.com

En la barra de URL de un navegador cualquiera, la petición anterior sería análoga a la siguiente dirección Web:

www.host.com/index.html

Esquema de una petición GET

Petición Web

El navegador, por medio de la interfaz de usuario, permite al usuario realizar una o varias peticiones Web. La interfaz de usuario o entorno de usuario es el conjunto de elementos del navegador que permiten realizar la petición de forma activa. Una petición Web no sólo puede ser realizada mediante un navegador, sino con cualquier herramienta habilitada para tal fin, como una consola de comandos Telnet.

Elementos del entorno de usuario más comunes en navegadores Web visuales:

Nombre Descripción
Hipervínculo enlace o link Es una porción de contenido Web, texto, imagen y otros elementos, que enlaza con una dirección Web. Al pulsar un hipervínculo, el navegador genera una petición GET automática a la dirección URL de dicho link.
Formulario Web Al realizar el envío satisfactorio de los datos de un formulario, el navegador Web genera una petición GET o POST (comúnmente POST) automática a la par que envía los datos al servidor.
Barra de direcciones Todos los navegadores incluyen una barra de direcciones mediante la cual puede accederse manualmente a cualquier dirección URL, de modo que el navegador generará una petición GET automática a dicha URL cada vez que el usuario lo desee.
Script activo o pasivo Cualquier aplicación Javascript tiene acceso al estado del navegador, cómo puede modificar los datos que describen tal estado, de forma pasiva (sin medio de la intervención del usuario) o de forma activa (mediante alguna acción del usuario).
1.1 Socket a dirección DNS

Se produce una socket con un servidor dado en dirección IP mediante TCP. Por lo general las direcciones que el navegador posee inicialmente son direcciones DNS (direcciones alfanuméricas) que deberá convertir a direcciones numéricas.

1.2 Resolución de DNS a IP

Si la dirección dada es DNS y no existe una regla en la base de datos DNS, el Host Resolver Request solicita al servidor DNS la o las direcciones IPs correspondientes. El navegador crea una nueva regla y almacena la dirección IP junto a la dirección DNS en su base de datos de reglas DNS.

1.3 Recuperación de la regla DNS

Una vez almacenada la regla, se realiza una petición a la base de datos DNS para recuperar los valores de la regla.

1.4 Socket a dirección IP

Se produce una socket con la dirección IP mediante TCP. La dirección IP puede haberse recuperado en el paso anterior.

SOCKET 192.168.0.1

1.5 Preparación de la petición

Se crea la petición GET estableciendo la url ,un flag ,la priority de la petición y el method (implícitamente GET).

1.6 Apertura Caché

Se abre y/o se crea una entrada en el http cache.

1.7 Efectuación de la petición

Se realiza la petición GET. Se leen las cabeceras HTTP de la http transaction y más tarde el cuerpo de la http transaction.

GET /index.html HTTP/1.1

1.8 Consulta en Caché

Se consulta en el caché de disco si existe una entrada en el caché asociada al recurso que se ha solicitado. Los valores son created (true o false) y key (la url del recurso).

1.9 Respuesta booleana de la existencia del recurso solicitado

Si la entrada no existe (si el valor de created es false) se escriben los datos en el caché de disco. Si no, se lee directamente.

2.0 Presentación visual del recurso

Se concluye la operación y se muestra en pantalla (si es preciso) la información.

Petición GET pasiva

Javascript permite realizar modificaciones en el estado del navegador. El estado del navegador viene definido por el array de objetos location del objeto global Window. Se referencia a tal objeto con window.location. En concreto window.location.href contiene la dirección actual del navegador Web.

Si una parte del script ejecuta tal sentencia:

window.location.href='http://wikipedia.org';

El navegador hará tal petición Web sin que el usuario haya mediado en tal circunstancia o sus efectos. Del mismo modo se producirá una nueva petición GET si se altera el valor de window.location.search o window.location.protocol.

Procedimiento del navegador

La tarea del navegador Web es crear la petición a partir de los datos recogidos en el entorno de usuario de elementos del mismo, como enlaces, el valor del texto de la barra de búsqueda, los metatags.

<a href="http://es.wikipedia.org">Entrar</a>

Al pulsar en el enlace, el navegador crea automáticamente la petición GET y las cabeceras de la petición sobre la base de los metatags (cabeceras definidas), los cookies y cabeceras automáticas del navegador, para luego enviarlas junto a la petición al Servidor.

Petición POST

Es el segundo tipo de petición HTTP más utilizado. Los datos a enviar al servidor se incluyen en el cuerpo de la misma petición con las cabeceras HTTP asignadas correspondientemente respecto al tipo de petición. Generalmente se asocia con los formularios web en los que los datos suelen ser cifrados para enviarlos de manera segura al servidor.

Por motivos de convención se incluye en la petición la cabecera application/x-www-form-urlencoded, que indica el formato o codificación de los datos a enviar; esta es variable->valor en el formato: variable=valor separada cada par variable->valor por &. Esta cabecera, en los formularios HTML se envía automáticamente, pero en otras tecnologías web tal como AJAX, si se desea hacer correctamente una petición POST, debe ser especificado o instanciado el objeto: setRequestHeader("Content-type:application/x-www-form-urlencode"); ajax.send(data);

Si se utilizase el método GET los datos deberían de ser añadidos a la URL, lo que los expondría a ser vistos de forma directa.

Estructura de una petición POST

Estructura típica de una petición POST

Muestra

Petition type

POST url HTTP/1.1

POST comment.php HTTP/1.1

Referer

http-url-referer

index.php

Content-Length

contentlenght-int

63

Origin

http-url-origin

http://es.wikipedia.org

User-Agent

useragent-string

Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) ...

Content-Type

content-type-string

application/x-www-form-urlencoded

Accept

mimetypes-accepted-string

application/xml,application/xhtml+xml ...

Accept-Language

language-accepted-string

es-ES,es;q=0.8

Accept-Charset

charset-accepted-string

ISO-8859-1,utf-8;q=0.7,*;q=0.3

Cookie

phpsessid-string

PHPSESSID=gm0ugf96iojuldio8i51u92716

Accept-Encoding

accept-encoding-string

gzip,deflate,sdch

Content

Content-string

&data=4&lang=es+es

Composición de una petición POST

Las cabeceras más comunes que se envían en una petición POST:

  • Petition type: Especifica el tipo de petición HTTP. (Esta cabecera no tiene nombre, se envía tal cual)
  • Referer: Especifica la url desde la cual se hizo la petición POST.
  • Content-Length: Especifica la longitud en bytes de los datos enviados en el cuerpo de la petición.
  • Origin: Especifica la url principal del sitio.[ cita requerida]
  • User-Agent:Especifica el identificador del navegador Web desde el cual se hizo la petición.
  • Content-Type: Especifica el formato o MIME de los datos enviados en el cuerpo de la petición.
  • Accept: Especifica el MIME que se espera en la respuesta.
  • Accept-Language: Especifica el código del lenguaje esperado en la respuesta.
  • Accept-Charset: Especifica la codificación que se espera en la respuesta.
  • Cookie: Especifica un identificador de sesión en la petición derivado de un cookie.
  • Accept-Encoding: Especifica el tipo de codificación (generalmente compresión) que se espera de la respuesta. (No todos los navegadores envían esta cabecera)

Estructura de una respuesta POST

Estructura típica de una respuesta POST Muestra
HTTP version & state HTTP-version-state HTTP/1.1 200 OK
Date date-string Tue, 07 Jun 2011 05:52:31 GMT
Server server-string Apache/2.2.17 (Win32) mod_ssl/2.2.17...
Expires expire-date-string Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control Cache-control-string no-store, no-cache, must-revalidate...
Pragma pragma-string no-cache
Content-Length Content-length-int 297
Content-Type Content-type-string text/html
Keep-Alive Keep-alive-string timeout=5, max=98
Connection Connection-string Keep-Alive
X-Powered-By X-powered-by-string PHP/5.3.5

Codificación del mensaje del cuerpo de la petición

Los datos que se envían en el cuerpo de la petición POST deben tener algún formato que permita manipularlos en un futuro procesamiento. Por ello la petición debe tener asignada la cabecera Content-Type cuyo valor será la codificación de los datos. De este modo el sistema podrá diferenciar entre variables aisladas, datos binarios, texto plano, o cualquier otro tipo de formato. El formato de una cadena de datos se denomina MIME y es el valor que deberá ser incluido en esta cabecera.[1]

En HTML la cabecera Content-Type se especifica automáticamente y su valor es application/x-www-form-urlencoded, no obstante pueden especificarse por estándar otros dos valores: multipart/form-data y text/plain utilizando el atributo enctype del elemento form de la siguiente manera

<form enctype="multipart/form-data">...</form>
<form enctype="text/plain">...</form>
<form enctype="application/x-www-form-urlencoded">...</form>

O cualquier otro valor MIME. El multipart/form-data se utiliza para enviar grandes cadenas binarias que suponen cualquier otro tipo de documento que no sea texto plano, como imágenes, vídeos o ejecutables. Para varios valores, separar por comas.

El application/x-www-form-urlencoded codifica de forma automática los valores de todos los elementos del formulario del modo variable=valor, separados por &. El atributo name de un input suele ser el nombre de la variable y su value el valor. Los espacios se reemplazan por + y los caracteres no alfanuméricos por $HH donde HH representa el número hexadecimal del carácter ASCII.

id=valor+de+la+variable&tama%A4o=4

que representado de otra forma es:

id: valor de la variable
tamaño: 4

Procedimiento del navegador

El navegador recopila la información del formulario para crear la petición y enviarla. Las cabeceras las envía junto a la petición POST, y se recopilan sobre la base de los metatags definidos en el código, los automáticos del navegador y los Cookies. Es el navegador, también, el que codifica los datos si es necesario. [ cita requerida]

Other Languages
Afrikaans: Webbediener
العربية: خادوم ويب
অসমীয়া: ৱেব চাৰ্ভাৰ
azərbaycanca: Veb server
беларуская: Вэб-сервер
беларуская (тарашкевіца)‎: Вэб-сэрвэр
български: Уеб сървър
bosanski: Web server
català: Servidor web
čeština: Webový server
dansk: Webserver
Deutsch: Webserver
English: Web server
Esperanto: TTT-servilo
فارسی: سرور وب
français: Serveur web
עברית: שרת HTTP
हिन्दी: वेब सर्वर
hrvatski: Web server
magyar: Webszerver
interlingua: Servitor web
Bahasa Indonesia: Server web
íslenska: Vefþjónn
italiano: Server web
日本語: Webサーバ
қазақша: Веб сервер
한국어: 웹 서버
Кыргызча: Веб-сервер
lumbaart: Web server
олык марий: Web-сервер
македонски: Мрежен опслужувач
മലയാളം: വെബ് സെർവർ
монгол: Вэб сервер
Bahasa Melayu: Pelayan web
Nederlands: Webserver
norsk bokmål: Webserver
polski: Serwer WWW
português: Servidor web
română: Server web
русский: Веб-сервер
Scots: Wab server
srpskohrvatski / српскохрватски: Web server
Simple English: Web server
slovenčina: Webový server
slovenščina: Spletni strežnik
svenska: Webbserver
Türkçe: Web sunucusu
українська: Веб-сервер
oʻzbekcha/ўзбекча: WEB Server