Servicios y Características de UDP
Servicios y Características de UDP
Servicios UDP
UDP es un protocolo de transporte ligero y simple que proporciona unos servicios mínimos. No está
orientado a la conexión, por lo que no tiene lugar un procedimiento de negociación antes de que los
dos procesos comiencen a comunicarse. UDP proporciona un servicio de transferencia de datos no
fiable; es decir, cuando un proceso envía un mensaje a un socket UDP, el protocolo UDP no ofrece
ninguna garantía de que el mensaje vaya a llegar al proceso receptor. Además, los mensajes que sí
llegan al proceso receptor pueden hacerlo de manera desordenada.
UDP no incluye tampoco un mecanismo de control de congestión, por lo que el lado emisor de
UDP puede introducir datos en la capa inferior (la capa de red) a la velocidad que le parezca. (Sin
embargo, tenga en cuenta que la tasa de transferencia extremo a extremo real puede ser menor que
esta velocidad, a causa de la capacidad de transmisión limitada de los enlaces intervinientes o a
causa de la congestión.)
Algunos protocolos de la capa de aplicación están especificados en documentos RFC y, por tanto,
son de dominio público. Por ejemplo, el protocolo de la capa de aplicación para la Web, HTTP
(HyperText Transfer Protocol [RFC 2616]), está disponible como un RFC. Si quien desarrolla
un navegador web sigue las reglas dadas en el RFC que se ocupa de HTTP, el navegador podrá
recuperar páginas web de cualquier servidor web que también se ajuste a las reglas de dicho RFC.
Existen muchos otros protocolos de la capa de aplicación que son propietarios y que intencio-
nadamente no están disponibles para todo el mundo. Por ejemplo, Skype utiliza protocolos de la
capa de aplicación propietarios.
Es importante diferenciar entre aplicaciones de red y protocolos de la capa de aplicación. Un
protocolo de la capa de aplicación es únicamente un elemento de una aplicación de red (¡aunque
uno muy importante, desde nuestro punto de vista!). Veamos un par de ejemplos. La Web es una
aplicación cliente-servidor que permite a los usuarios obtener documentos almacenados en servidores
web bajo demanda. La aplicación Web consta de muchos componentes, entre los que se incluyen
un estándar para los formatos de documentos (es decir, HTML), navegadores web (como Firefox
y Microsoft Internet Explorer), servidores web (por ejemplo, servidores Apache y Microsoft) y un
protocolo de la capa de aplicación. El protocolo de la capa de aplicación de la Web, HTTP, define el
formato y la secuencia de los mensajes que se pasan entre el navegador web y el servidor web. Por
tanto, HTTP es sólo una pieza (aunque una pieza importante) de la aplicación Web. Otro ejemplo
sería una aplicación de correo electrónico Internet, la cual también está constituida por muchos
componentes, entre los que se incluyen los servidores de correo que albergan los buzones de los
usuarios; los clientes de correo (como Microsoft Outlook) que permiten a los usuarios leer y crear
mensajes; un estándar para definir la estructura de los mensajes de correo electrónico y protocolos
de la capa de aplicación que definen cómo se pasan los mensajes entre los servidores, cómo se pasan
los mensajes entre los servidores y los clientes de correo y cómo se interpretan los contenidos de las
cabeceras de los mensajes. El principal protocolo de la capa de aplicación para el correo electrónico
es SMTP (Simple Mail Transfer Protocol, Protocolo simple de transferencia de correo) [RFC 5321].
2.2 • LA WEB Y HTTP 81
Por tanto, el protocolo principal de la capa de aplicación para correo electrónico, SMTP, sólo es un
componente (aunque un componente importante) de la aplicación de correo electrónico.
[Link]
Servidor ejecutando un
servidor web Apache
Re
P sp
ue
TT st
H TP So a
ud HT lic HT
li cit ta
itu
d TP
So es HT
s pu TP
Re
interfaces de socket. Como se ha descrito en la Sección 2.1, en el lado del cliente la interfaz de socket
es la puerta entre el proceso cliente y la conexión TCP; en el lado del servidor, es la puerta entre el
proceso servidor y la conexión TCP. El cliente envía mensajes de solicitud HTTP a su interfaz de
socket y recibe mensajes de respuesta HTTP procedentes de su interfaz de socket. De forma similar,
el servidor HTTP recibe mensajes de solicitud a través de su interfaz de socket y envía mensajes de
respuesta a través de la misma. Una vez que el cliente envía un mensaje a su interfaz de socket, el
mensaje deja de estar en las manos del cliente y pasa “a las manos” de TCP. Recuerde, de la Sección
2.1, que TCP proporciona un servicio de transferencia de datos fiable a HTTP. Esto implica que cada
mensaje de solicitud HTTP enviado por un proceso cliente llegará intacto al servidor; del mismo
modo, cada mensaje de respuesta HTTP enviado por el proceso servidor llegará intacto al cliente.
Esta es una de las grandes ventajas de una arquitectura en capas: HTTP no tiene que preocuparse por
las pérdidas de datos o por los detalles sobre cómo TCP recupera los datos perdidos o los reordena
dentro de la red. Ése es el trabajo de TCP y de los protocolos de las capas inferiores de la pila de
protocolos.
Es importante observar que el servidor envía los archivos solicitados a los clientes sin
almacenar ninguna información acerca del estado del cliente. Si un determinado cliente pide
el mismo objeto dos veces en un espacio de tiempo de unos pocos segundos, el servidor no
responde diciendo que acaba de servir dicho objeto al cliente; en su lugar, el servidor reenvía
el objeto, ya que ha olvidado por completo que ya lo había hecho anteriormente. Dado que un
servidor HTTP no mantiene ninguna información acerca de los clientes, se dice que HTTP es un
protocolo sin memoria del estado. Debemos destacar también que la Web utiliza la arquitectura
de aplicación cliente-servidor, descrita en la Sección 2.1. Un servidor web siempre está activo,
con una dirección IP fija, y da servicio a solicitudes procedentes de, potencialmente, millones de
navegadores distintos.
[Link]
1. El proceso cliente HTTP inicia una conexión TCP con el servidor [Link] en
el puerto número 80, que es el número de puerto predeterminado para HTTP. Asociados con la
conexión TCP, habrá un socket en el cliente y un socket en el servidor.
2. El cliente HTTP envía un mensaje de solicitud HTTP al servidor a través de su socket. El men-
saje de solicitud incluye el nombre de la ruta /unDepartmento/[Link]. (Más adelante
veremos con más detalle los mensajes HTTP.)
3. El proceso servidor HTTP recibe el mensaje de solicitud a través de su socket, recupera el objeto
/unDepartmento/[Link] de su medio de almacenamiento (RAM o disco), encapsula el
objeto en un mensaje de respuesta HTTP y lo envía al cliente a través de su socket.
4. El proceso servidor HTTP indica a TCP que cierre la conexión TCP. (Pero TCP realmente no
termina la conexión hasta que está seguro de que el cliente ha recibido el mensaje de respuesta
en perfecto estado.)
5. El cliente HTTP recibe el mensaje de respuesta. La conexión TCP termina. El mensaje indica
que el objeto encapsulado es un archivo HTML. El cliente extrae el archivo del mensaje de
respuesta, examina el archivo HTML y encuentra las referencias a los 10 objetos JPEG.
6. Los cuatro primeros pasos se repiten entonces para cada uno de los objetos JPEG referenciados.
Cuando el navegador recibe la página web, la muestra al usuario. Dos navegadores distintos
pueden interpretar (es decir, mostrar al usuario) una página web de formas ligeramente distintas.
HTTP no tiene nada que ver con cómo un cliente interpreta una página web. Las especificaciones
HTTP ([RFC 1945] y [RFC 2616]) únicamente definen el protocolo de comunicación entre el
programa cliente HTTP y el programa servidor HTTP.
Los pasos anteriores ilustran el uso de las conexiones no persistentes, donde cada conexión TCP
se cierra después de que el servidor envíe el objeto: la conexión no se mantiene (no persiste) para los
restantes objetos. Observe que cada conexión TCP transporta exactamente un mensaje de solicitud
y un mensaje de respuesta. Por tanto, en este ejemplo, cuando un usuario solicita la página web, se
generan 11 conexiones TCP.
En los pasos descritos anteriormente, hemos sido intencionadamente vagos en lo que respecta
a si el cliente obtiene las diez imágenes JPEG a través de diez conexiones TCP en serie o si algunas
de dichas imágenes se obtienen a través de conexiones TCP en paralelo. De hecho, los usuarios
pueden configurar los navegadores modernos para controlar el grado de paralelismo. En sus modos
predeterminados, la mayoría de los navegadores abren entre 5 y 10 conexiones TCP en paralelo y
cada una de estas conexiones gestiona una transacción solicitud-respuesta. Si el usuario lo prefiere, el
número máximo de conexiones en paralelo puede establecerse en uno, en cuyo caso se establecerán
diez conexiones en serie. Como veremos en el siguiente capítulo, el uso de conexiones en paralelo
reduce el tiempo de respuesta.
Antes de continuar, vamos a realizar un cálculo aproximado para estimar la cantidad de tiempo
que transcurre desde que un cliente solicita el archivo base HTML hasta que recibe dicho archivo
completo. Para ello, definimos el tiempo de ida y vuelta (RTT, Round-Trip Time), que es el
tiempo que tarda un paquete pequeño en viajar desde el cliente al servidor y volver de nuevo al
cliente. El RTT incluye los retardos de propagación de los paquetes, los retardos de cola en los
routers y switches intermedios y los retardos de procesamiento de los paquetes (estos retardos se
explican en la Sección 1.4). Consideremos ahora lo que ocurre cuando un usuario hace clic en un
hipervínculo. Como se muestra en la Figura 2.7, esto hace que el navegador inicie una conexión
TCP entre el navegador y el servidor web, lo que implica un proceso de “acuerdo en tres fases” (el
cliente envía un pequeño segmento TCP al servidor, el servidor reconoce la recepción y responde
con otro pequeño segmento TCP y, por último, el cliente devuelve un mensaje de reconocimiento
al servidor). Las dos primeras partes de este proceso de acuerdo en tres fases tardan un periodo de
tiempo igual a RTT. Después de completarse las dos primeras fases de la negociación, el cliente envía
a la conexión TCP el mensaje de solicitud HTTP combinado con la tercera parte de la negociación
(el mensaje de reconocimiento). Una vez que el mensaje de solicitud llega al servidor, este envía el
2.2 • LA WEB Y HTTP 85
Inicio de la
conexión
TCP
RTT
Solicitud de
archivo
RTT
Tiempo invertido en
transmitir el archivo
Tiempo en Tiempo en
el cliente el servidor
Figura 2.7 ♦ Cálculo aproximado del tiempo necesario para solicitar y recibir un
archivo HTML.
archivo HTML a través de la conexión TCP. Este mensaje de solicitud/respuesta HTTP consume
otro periodo de tiempo RTT. Luego el tiempo de respuesta total es aproximadamente igual a dos
RTT más el tiempo de transmisión del archivo HTML por parte del servidor.
Podemos aprender muchas cosas si miramos en detalle este sencillo mensaje de solicitud. En
primer lugar, podemos comprobar que el mensaje está escrito en texto ASCII normal, por lo que
cualquier persona con conocimientos informáticos puede leerlo. En segundo lugar, vemos que el
mensaje consta de cinco líneas, cada una de ellas seguida por un retorno de carro y un salto de
línea. La última línea va seguida de un retorno de carro y un salto de línea adicionales. Aunque
este mensaje en concreto está formado por cinco líneas, un mensaje de solicitud puede constar
de muchas más líneas o tener tan solo una. La primera línea de un mensaje de solicitud HTTP se
denomina línea de solicitud y las siguientes son las líneas de cabecera. La línea de solicitud consta
de tres campos: el campo de método, el campo URL y el campo de la versión HTTP. El campo que
especifica el método puede tomar diferentes valores, entre los que se incluyen GET, POST, HEAD,
PUT y DELETE. La inmensa mayoría de los mensajes de solicitud HTTP utilizan el método GET.
Este método se emplea cuando el navegador solicita un objeto, identificándose dicho objeto en el
campo URL. En este ejemplo, el navegador está solicitando el objeto /unadireccion/pagina.
html. El campo correspondiente a la versión se explica por sí mismo; en este ejemplo, el navegador
utiliza la versión HTTP/1.1.
Analicemos ahora las líneas de cabecera de este ejemplo. La línea de cabecera Host: www.
[Link] especifica el host en el que reside el objeto. Podría pensarse que esta línea de
cabecera es innecesaria, puesto que ya existe una conexión TCP activa con el host. Pero, como
veremos en la Sección 2.2.5, las cachés proxy web necesitan la información proporcionada por
la línea de cabecera del host. Al incluir la línea de cabecera Connection: close, el navegador
está diciendo al servidor que no desea molestarse en trabajar con conexiones persistentes, sino que
desea que el servidor cierre la conexión después de enviar el objeto solicitado. La línea de cabecera
User-agent: especifica el agente de usuario, es decir, el tipo de navegador que está haciendo la
solicitud al servidor. En este caso, el agente de usuario es Mozilla/5.0, un navegador Firefox. Esta
línea de cabecera resulta útil porque el servidor puede enviar versiones diferentes del mismo objeto
a los distintos tipos de agentes de usuario (todas las versiones tienen la misma dirección URL). Por
último, la línea de cabecera Accept-language: indica que el usuario prefiere recibir una versión
en francés del objeto, si tal objeto existe en el servidor; en caso contrario, el servidor debe enviar
la versión predeterminada. La línea de cabecera Accept-language: sólo es una de las muchas
cabeceras de negociación del contenido disponibles en HTTP.
2.2 • LA WEB Y HTTP 87
Cuerpo de
entidad
Una vez visto un ejemplo, vamos a estudiar el formato general de un mensaje de solicitud,
ilustrado en la Figura 2.8. Podemos comprobar que el formato general es muy similar al usado en el
ejemplo anterior. Sin embargo, fíjese en que después de las líneas de cabecera (y el retorno de carro
y el salto de línea adicionales) se incluye un “cuerpo de entidad”. Este campo queda vacío cuando
se utiliza el método GET, pero no cuando se usa el método POST. A menudo, un cliente HTTP utiliza
el método POST cuando el usuario completa un formulario; por ejemplo, cuando especifica términos
para realizar una búsqueda utilizando un motor de búsqueda. Con un mensaje POST, el usuario
solicita también una página web al servidor, pero el contenido concreto de la misma dependerá de
lo que el usuario haya escrito en los campos del formulario. Si el valor del campo de método es
POST, entonces el cuerpo de la entidad contendrá lo que el usuario haya introducido en los campos
del formulario.
No podemos dejar de mencionar que una solicitud generada con un formulario no necesaria-
mente utiliza el método POST. En su lugar, a menudo los formularios HTML emplean el método
GET e incluyen los datos de entrada (especificados en los campos del formulario) en el URL
solicitado. Por ejemplo, si un formulario emplea el método GET y tiene dos campos, y las entradas a
esos dos campos son monos y bananas, entonces el URL tendrá la estructura [Link]/
busquedadeanimales?monos&bananas. Probablemente habrá visto direcciones URL ampliadas
de este tipo, al navegar por la Web.
El método HEAD es similar al método GET. Cuando un servidor recibe una solicitud con el
método HEAD, responde con un mensaje HTTP, pero excluye el objeto solicitado. Los desarrolla-
dores de aplicaciones a menudo utilizan el método HEAD para labores de depuración. El método
PUT suele utilizarse junto con herramientas de publicación web. Esto permite a un usuario cargar
un objeto en una ruta específica (directorio) en un servidor web determinado. Las aplicaciones que
necesitan cargar objetos en servidores web también emplean el método PUT. El método DELETE
permite a un usuario o a una aplicación borrar un objeto de un servidor web.
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
88 CAPÍTULO 2 • LA CAPA DE APLICACIÓN
Examinemos detenidamente este mensaje de respuesta. Tiene tres secciones: una línea de
estado inicial, seis líneas de cabecera y después el cuerpo de entidad. El cuerpo de entidad es
la parte más importante del mensaje, ya que contiene el objeto solicitado en sí (representado por
datos datos datos datos datos ...). La línea de estado contiene tres campos: el que
especifica la versión del protocolo, un código de estado y el correspondiente mensaje explicativo
del estado. En este ejemplo, la línea de estado indica que el servidor está utilizando HTTP/1.1
y que todo es correcto (OK); es decir, que el servidor ha encontrado y está enviando el objeto
solicitado.
Veamos ahora las líneas de cabecera. El servidor utiliza la línea de cabecera Connection:
close para indicar al cliente que va a cerrar la conexión TCP después de enviar el mensaje. La línea
de cabecera Date: indica la hora y la fecha en la que se creó la respuesta HTTP y fue enviada por el
servidor. Observe que esta línea no especifica la hora en que el objeto fue creado o modificado por
última vez; es la hora en la que el servidor recupera el objeto de su sistema de archivos, inserta el
objeto en el mensaje de respuesta y lo envía. La línea de cabecera Server: indica que el mensaje
fue generado por un servidor web Apache; es análoga a la línea de cabecera User-agent: del
mensaje de solicitud HTTP. La línea de cabecera Last-Modified: especifica la hora y la fecha en
que el objeto fue creado o modificado por última vez. Esta línea Last-Modified:, que enseguida
estudiaremos en detalle, resulta fundamental para el almacenamiento en caché del objeto, tanto en
el cliente local como en los servidores de almacenamiento en caché de la red (también conocidos
como servidores proxy). La línea de cabecera Content-Length: especifica el número de bytes del
objeto que está siendo enviado. La línea Content-Type: indica que el objeto incluido en el cuerpo
de entidad es texto HTML. (El tipo de objeto está indicado oficialmente por la línea de cabecera
Content-Type: y no por la extensión del archivo.)
Una vez visto un ejemplo, vamos a pasar a examinar el formato general de un mensaje de
respuesta, ilustrado en la Figura 2.9. Este formato general de mensaje de respuesta se corresponde
con el del ejemplo anterior. Vamos a comentar algunas cosas más acerca de los códigos de estado
y sus descripciones. El código de estado y su frase asociada indican el resultado de la solicitud.
Algunos códigos de estado comunes y sus frases asociadas son:
¿Le gustaría ver un mensaje de respuesta HTTP real? ¡Esto es muy recomendable y además es
Nota de vídeo
muy fácil de hacer! En primer lugar, establezca una conexión Telnet con su servidor web favorito.
Uso de Wireshark para
investigar el protocolo
A continuación, escriba un mensaje de solicitud de una línea para obtener algún objeto que esté
HTTP. almacenado en ese servidor. Por ejemplo, si tiene acceso a la línea de comandos (prompt), escriba:
telnet [Link] 80
GET /kurose_ross/interactive/[Link] HTTP/1.1
Host: [Link]
2.2 • LA WEB Y HTTP 89
Líneas de
cabecera
Nombre campo
sp valor cr lf
cabecera:
Línea en cr lf
blanco
Cuerpo de
entidad
(Pulse dos veces la tecla retorno de carro después de escribir la última línea.) De este modo se abre
una conexión TCP en el puerto 80 del host [Link] y luego se envía el mensaje de
solicitud HTTP. Debería ver un mensaje de respuesta que incluya el archivo base HTML de los pro-
blemas interactivos de repaso de este libro. Para ver simplemente las líneas del mensaje HTTP y no
recibir el objeto, sustituya GET por HEAD.
En esta sección hemos visto una serie de líneas de cabecera que pueden utilizarse en los
mensajes HTTP de solicitud y respuesta. La especificación de HTTP define un gran número de otras
líneas de cabecera que pueden ser insertadas por los navegadores, servidores web y servidores de
almacenamiento en caché de la red. Hemos cubierto únicamente una pequeña parte de la totalidad
de líneas de cabecera disponibles. A continuación veremos unas pocas más y en la Sección 2.2.5
algunas otras, al hablar del almacenamiento en cachés web de la red. Puede leer una exposición
enormemente clara y comprensible acerca del protocolo HTTP, incluyendo sus cabeceras y códigos
de estado en [Krishnamurty 2001].
¿Cómo decide un navegador qué líneas de cabecera incluir en un mensaje de solicitud?
¿Cómo decide un servidor web qué líneas de cabecera incluir en un mensaje de respuesta? Un
navegador generará líneas de cabecera en función del tipo y la versión del navegador (por ejemplo,
un navegador HTTP/1.0 no generará ninguna línea de cabecera correspondiente a la versión 1.1),
de la configuración del navegador que tenga el usuario (por ejemplo, el idioma preferido) y de
si el navegador tiene actualmente en caché una versión del objeto, posiblemente desactualizada.
Los servidores web se comportan de forma similar: existen productos, versiones y configuraciones
diferentes, que influyen en las líneas de cabecera que se incluirán en los mensajes de respuesta.