Tema N 2 Capa de Aplicacion
Tema N 2 Capa de Aplicacion
Tema N 2 Capa de Aplicacion
Las aplicaciones de red son la razón de ser de una red de computadoras ya que sin
ellas no existiría la necesidad de diseñar protocolos de red para darles soporte.
Entre estas aplicaciones se incluyen las clásicas aplicaciones basadas en texto que se
hicieron populares en las décadas de 1970 y 1980, como son el correo electrónico de
texto, el acceso remoto a computadoras, la transferencia de archivos, los grupos de
noticias y los chats de texto. Entre éstas, también se incluye la tan conocida World
Wide Web, acompañada de la navegación web, las búsquedas web y el comercio
electrónico. Además, tenemos que citar las dos aplicaciones estrella aparecidas a
finales del milenio: la mensajería instantánea con listas de contactos y la
compartición de archivos P2P. Asimismo, también se incluyen muchas aplicaciones
de audio y vídeo, como la telefonía por Internet, la compartición de vídeos y los
flujos de vídeo, la radio por Internet y la televisión IP (IPTV).
Procesos Cliente/Servidor
Una aplicación de red consta de parejas de procesos que se envían mensajes entre sí a
través de una red, donde el proceso que inicia la comunicación es rotulado cómo
cliente mientras que el proceso que espera ser contactado para comenzar la sesión es
caratulado cómo servidor. En una aplicación web, un navegador sería un proceso
cliente y el servidor web un proceso servidor.
Un proceso envía mensajes a la red y los recibe a través de un socket, siendo un
proceso análogo a una casa y un socket análogo a la puerta de esta.
Un socket es la interfaz entre la capa de aplicación y la capa de transporte de un host,
también conocido cómo Interfaz de programación de aplicaciones (API,
Application Programming Interface), que opera entre la aplicación y la red, ya que el
socket es la interfaz de programación con la que se construyen las aplicaciones de red.
El desarrollador de la aplicación del socket tiene el control sobre todos los elementos
del lado de la capa de aplicación del socket pero apenas sobre el lado de la capa de
transporte de éste: el programador puede elegir el protocolo de transporte y fijar, por
ejemplo, los tamaños máximos del buffer y de segmento.
Direccionamiento de procesos
Para enviar una carta a un destino concreto, ese destino necesita disponer de una
dirección. Similarmente, para que un proceso que se está ejecutando en un host pueda
enviar paquetes a otro proceso ejecutándose en un proceso distinto, el proceso
receptor necesita tener una dirección.
Para identificar el proceso receptor, tienen que especificarse dos elementos de
información: la dirección del host (dirección IP) y un identificador del proceso de
recepción de destino.
El identificador del proceso receptor es necesario puesto que el host podría estar
ejecutando muchas aplicaciones de red. Un número de puerto de destino sirve a este
propósito ya que las aplicaciones populares tiene asignados números de puerto
específicos. Por ejemplo, un servidor web tiene el número 80 y un proceso de servidor
de correo (que utilice SMTP) tiene el número 25.
Tipos de Servidores
En la comunicación basada en sockets, un servidor corre en un host en particular y
tiene un socket que está ligado a un puerto en particular. El servidor espera y escucha
en ese socket a que el cliente le haga un pedido de conexión. Si todo está bien, el
servidor acepta el pedido de conexión. Pero, ¿qué sucede cuando varios clientes tratan
de conectarse al mismo tiempo a un servidor?
Servidor Iterativo
Estos servidores procesan una petición a la vez: reciben la petición, la procesan y
luego envían la respuesta antes de manejar otra petición. Durante la conversación, el
puerto no puede escuchar otras peticiones.
Si hay interacción del servicio con el usuario, por ejemplo, transferir un archivo y
digitar el nombre, el servidor queda en espera de que el usuario conteste, al igual que
el resto de las peticiones, si las hubiera. Si se espera demasiado tiempo, se produce un
timeout de petición, y se procede a escuchar a la siguiente petición.
Servidor Concurrente
Pueden atender a múltiples clientes al mismo tiempo. Se trata de crear una nueva línea
de ejecución, un thread, cada vez que llega un nuevo cliente. Este thread se hace
cargo de las peticiones de ese cliente y luego termina (exit).
Este tipo de servidores no pueden usar un sólo puerto debido a las múltiples
conexiones abiertas en simultáneo. Se necesitan muchos puertos, pero un servidor
puede usar sólo un puerto bien-conocido, por lo que la solución es tener, además,
muchos puertos efímeros. Luego de establecida la conexión en el puerto
bien-conocido, el servidor asigna un puerto temporario a esa conexión de modo de
librar el puerto bien-conocido para el siguiente cliente que desee establecer una
conexión.
Con estado
Para entenderlo, consideremos una analogía: una llamada telefónica. En este caso la
conexión, una vez establecida, es mantenida de principio a fin para asegurar la
comunicación continua. Si un cliente hace una petición a un servidor, espera una
respuesta de algún tipo. Si no la recibe, la envía de vuelta.
Sin embargo, la característica principal es que mantiene el estado de todas sus
sesiones, ya sea de autenticación o una solicitud de información. Son aquellos que se
pueden usar repetidamente, cómo el online banking o el email, donde lo que sucedió
en transacciones anteriores puede tener impacto en la transacción actual.
Un ejemplo sería FTP, donde, durante una sesión FTP, el cliente establece una
conexión de control, y luego se lleva a cabo la transferencia de datos.
Si bien ofrece un rendimiento superior debido al seguimiento continuo de la
información, requiere asignación de memoria para almacenar los datos (lo cual no lo
hace muy seguro) y, por lo general, requieren almacenamiento de respaldo.
Sin estado
Consideremos otra analogía: mensajes de texto. El emisor simplemente manda un
SMS, pero no tiene confirmación de que ha sido recibido. No puede haber verificación
cruzada de estado o reintentos.
Aquí, el emisor envía el estado de sesión relevante al receptor de tal manera que cada
solicitud puede interpretarse sin referencia al estado de sesión de solicitudes
anteriores, que el receptor retiene.
HTTP es un ejemplo ya que cada solicitud es ejecutada independientemente de las
solicitudes anteriores.
Temporización
Las garantías de temporización pueden darse de diversas formas, cómo puede ser la
garantía que cada bit que el emisor empuja por su socket llegará a destino en no más
de 100 milisegundos. Las aplicaciones cómo la telefonía por Internet, los entornos
virtuales y los juegos multijugador tienen restricciones de temporización estrictas
sobre la entrega de datos para que sean efectivas puesto que retardos largos darían
lugar a pausas antinaturales en una conversación o un retardo entre la acción y la
visualización de esa acción en un juego.
Seguridad
Un protocolo puede proporcionar uno o más servicios de seguridad. Por ejemplo,
cifrar los datos transmitidos por el emisor, lo que implica que el servicio debe
proporcionar confidencialidad entre los procesos, incluso si los datos son observados
en el camino.
Otros servicios pueden ser los mecanismos para garantizar la integridad de los datos y
mecanismos de autenticación en el punto terminal.
Cada página Web, también, puede contener algunos enlaces a otras páginas Web en el
mismo o en otros sitios. Es decir, una página web puede ser simple (no tiene enlaces a
otras páginas) o compuesta.
Página web simple, que tiene imágenes incrustadas y puede recuperarse utilizando
una sola transacción de solicitud/respuesta.
Página web compuesta; supongamos que el documento que queremos recuperar
contiene referencias a otro archivo y a una imágen. El documento principal y la
imagen están almacenados en archivos diferentes en el mismo sitio (archivo A y
archivo B) y el archivo referenciado está en otro sitio (archivo C). Cómo son tres
archivos, se necesitan tres transacciones. Primero se recupera una copia del
documento principal, el cual posee referencias a los otros dos archivos. El usuario, al
navegar, puede hacer click en la referencia a la imagen para invocar la segunda
transacción y recuperar una copia de la imagen. Lo mismo para el archivo
referenciado, se invoca la tercera transacción.
Componentes
Cliente web (Navegador)
Interpretan y muestran un documento web. Cada navegador consiste, usualmente, de
tres partes: un controlador, un protocolo cliente e intérpretes.
El controlador recibe información del teclado o del mouse y usa los programas del
cliente para acceder al documento. Una vez que se ha accedido al documento, el
controlador utiliza uno de los intérpretes para mostrar el documento en la pantalla.
El protocolo del cliente puede ser FTP, TELNET o HTTP. El intérprete puede ser
HTML, Java o JavaScript, dependiendo del tipo de documento.
Servidor web
La página web está guardada en un servidor. Cada vez que llega una solicitud de
cliente, el documento correspondiente es enviado. Para mejorar la eficiencia, los
servidores por lo general almacenan los archivos solicitados en un caché en memoria.
Un servidor también puede volverse más eficiente a través de múltiples subprocesos o
multiprocesamiento. En este caso, un servidor puede responder a más de una solicitud
a la vez.
Ejemplo: http://www.cs.washington.edu/index.html
Este enlace tiene tres partes: el protocolo (http), el nombre DNS del host
(www.cs.washington.edu) y el nombre de la ruta (index.html).
Documentos estáticos
Son documentos de contenido fijo que son creados y almacenados en un servidor, y
donde el cliente sólo puede obtener una copia del documento. Es decir, el contenido
del documento es determinado cuando es creado, no cuando es usado. Este tipo de
documentos se preparan usando lenguajes cómo: HTML (Hypertext Markup
Language), XML (Extensible Markup Language), XSL (Extensible Style Language) y
XHTML (Extended Hypertext Markup Language).
Documentos dinámicos
Son creados por un servidor web cada vez que un navegador solicita el documento.
Cuando llega una solicitud, el servidor web ejecuta un programa de aplicación o un
script que crea un documento dinámico, retornando el resultado al navegador. Cómo
un nuevo documento es creado de solicitud en solicitud, los contenidos pueden variar.
Un ejemplo simple es la recuperación del tiempo y fecha de un servidor.
Interfaz de Entrada Común (CGI, Common Gateway Interface): es una tecnología
que crea y maneja documentos dinámicos. CGI es un conjunto de estándares que
define cómo se escribe un documento dinámico, cómo se ingresan los datos al
programa y cómo se usa el resultado de salida. Estos programas pueden estar escritos
en cualquier lenguaje que sea conveniente para el desarrollador, como Python, Ruby,
Perl, etc.
Common: indica que el estándar define un conjunto de reglas común a cualquier
lenguaje o plataforma.
Gateway: significa que un programa CGI puede ser usado para acceder a otros
recursos cómo bases de datos, paquetes gráficos, etc.
Interface: significa que es un conjunto de términos predefinidos, variables, llamadas,
etc.
Documentos activos
Para muchas aplicaciones, se necesita un programa o script que se ejecute del lado del
cliente, por ejemplo, cuando se quiere ejecutar un programa que crea gráficos
animados o un programa que interactúa con el usuario.
Java Applets: Una forma de crear documentos activos es usando Java applets. Un
applet es un programa escrito en Java en el servidor, compilado y listo para ejecutarse.
El proceso cliente (navegador) crea una instancia de esta applet y la ejecuta usando
una de dos formas: solicitando el applet en la URL y recibiendolo en forma binaria, ó
recibiendo y ejecutando un archivo HTML que tiene insertado la dirección del applet
cómo una etiqueta.
Tipos de Conexiones
En muchas aplicaciones de Internet, el cliente y el servidor están en comunicación
durante un periodo de tiempo amplio, realizando una serie de solicitudes y respuestas.
El desarrollador de la aplicación debe decidir si cada par de solicitud/respuesta se
envía a través de una conexión TCP separada o enviarse todas las solicitudes con sus
respuestas a través de la misma conexión.
Si se usa el primer método, la aplicación utiliza conexiones no persistentes; si se usa
la segunda opción, se habla de conexiones persistentes.
Conexión NO persistente
Supongamos que hemos solicitado una página que consiste de un archivo base HTML
y diez imágenes JPEG, todos en un mismo servidor, y que la página es
http://www.unaEscuela.edu/unDepartamento/home.index. Lo que ocurre es:
1. El proceso cliente HTTP inicia una conexión TCP con el servidor
www.unaEscuela.edu en el puerto 80, y asociados a la conexión habrá un
socket en el cliente y uno en el servidor.
2. El cliente HTTP envía un mensaje de solicitud HTTP al servidor a través de
su socket, incluyendo el nombre de la ruta /unDepartamento/home.index.
3. El proceso servidor HTTP recibe el mensaje, recupera el objeto (de RAM o
disco), lo encapsula en un mensaje de respuesta HTTP y lo envía al cliente.
4. El proceso servidor HTTP indica a TCP que cierre la conexión (aunque este
no lo hace hasta asegurarse que el cliente ha recibido el mensaje en perfecto
estado).
5. El cliente HTTP recibe el mensaje de respuesta. Termina la conexión TCP. El
mensaje indica que el objeto es un archivo HTML; se extrae el archivo, se
examina y localizan las referencias a los 10 objetos JPEG.
6. Los cuatro primeros pasos se repiten para cada objeto JPEG.
Para estimar la cantidad de tiempo que transcurre desde que un cliente solicita el
archivo base hasta que lo recibe, 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 al cliente.
Cuando un usuario hace clic en un hipervínculo, hace que el navegador inicie una
conexión TCP entre éste 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, éste lo reconoce y
responde con otro segmento TCP y, por último, el cliente devuelve un mensaje de
reconocimiento al servidor. Las dos primeras partes de este proceso tarda un periodo
de RTT. Luego de estas dos primeras partes, el cliente envía a la conexión TCP el
mensaje de solicitud HTTP combinado con la tercera parte de la negociación. Luego
de que el mensaje llega, el servidor envía el archivo HTML a la conexión. Este
mensaje de solicitud/respuesta consume otro RTT.
El tiempo de respuesta total es aproximadamente dos RTT más el tiempo de
transmisión del archivo HTML en el servidor.
Conexión persistente
Las conexiones no persistentes presentan ciertos inconvenientes, cómo el de
establecer y mantener una conexión nueva por cada objeto solicitado, lo que implica
asignar buffers TCP, mantener las variables TCP tanto en cliente cómo en servidor.
Esto puede sobrecargar al servidor si éste está sirviendo cientos de solicitudes de
cientos de clientes. Además está el tiempo de retardo de entrega de dos RTT.
Con las conexiones persistentes, se deja abierta la conexión TCP luego de enviar
una respuesta, de modo que las siguiente solicitudes y respuestas entre mismo cliente
y servidor se envíen a través de la misma conexión. Es decir, una página completa
(un archivo base y diez imágenes) se podría enviar a través de una misma conexión
(procesamiento en cadena).
También existe la posibilidad de pipelining donde se envían solicitudes una tras otra
sin esperar a obtener las respuestas de las solicitudes pendientes
La parte (a) muestra tres solicitudes, una después de la otra en conexiones separadas.
En la parte (b), la página se obtiene mediante una conexión persistente.
Y en la parte (c) hay una conexión persistente con solicitudes canalizadas.
Para las conexiones persistentes surge el problema de cuándo cerrar la conexión. Una
conexión a un servidor debe permanecer abierta mientras se carga la página, de modo
que si el cliente clickea en un vínculo que solicita otra página del servidor, está
solicitud entra de inmediato. Pero no hay garantía de que esto suceda, por lo que es
común que las conexiones se cierren luego de un período de inactividad o cuando
haya una gran cantidad de conexiones abiertas y se necesite cerrar algunas.
Mensajes HTTP
Los mensajes HTTP, son los medios por los cuales se intercambian datos entre
servidores y clientes. Hay dos tipos de mensajes: solicitudes, enviadas por el cliente al
servidor, para pedir el inicio de una acción; y respuestas, que son la respuesta del
servidor.
Las peticiones y respuestas HTTP, comparten una estructura similar, compuesta de:
Mensajes de solicitud
Un mensaje de solicitud consiste de una línea de solicitud, una cabecera y, a veces,
un cuerpo. Por ejemplo:
GET /unadireccion/pagina.html HTTP/1.1
Host: www.unaescuela.edu
Connection: close
User-agent: Mozilla/4.0
Accept-language: fr
La primera línea es la línea de solicitud y las siguientes son las líneas de cabecera.
La línea de solicitud consta de tres campos: el campo método (el tipo de solicitud),
el campo URL, y el campo de la versión HTTP. En el ejemplo está solicitando
(GET) el objeto /unadireccion/pagina.html, y está utilizando la versión 1.1 de HTTP.
Luego de la línea de solicitud, pueden haber cero o más líneas de cabecera, las cuáles
son información adicional que envía el cliente al servidor.
La línea Host: www.unaescuela.edu específica el host donde reside el objeto, útil
para las caches de proxy.
La línea Connection: close, el navegador le dice al servidor que cierre la conexión
después de enviar el objeto solicitado.
La línea User-agent específica el tipo de navegador que está haciendo la solicitud
(pueden haber diferentes versiones del objeto dependiendo del agente de usuario).
La línea Accept-language indica que el usuario prefiere recibir una versión, en este
ejemplo, en francés del objeto, si estuviera disponible; caso contrario, se envía la
versión por defecto.
Mensajes de respuestas
Un mensaje de respuesta típico:
HTTP/1.1 200 OK
Connection: close
Date: Sat, 07 Jul 2007 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 6 May 2007 09:23:24 GMT
Content-Length: 6821
Content-Type: text/html
(datos datos datos datos datos ...)
Tiene tres secciones: una línea de estado inicial, seis líneas de cabecera, y el cuerpo
de entidad.
If-Modified-Since
La siguiente respuesta se generó a las 22:22 y tiene max-age de 1 hora, por lo que se
sabe que es fresh hasta las 23:22.
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2022 22:00:00 GMT
Cache-Control: max-age=3600
<!doctype html>
...
A las 23:22, la respuesta se vuelve stale y la caché no puede ser reutilizada. Así que la
caché realiza una petición con un header If-Modified-Since, para preguntar al
servidor si han habido cambios desde el tiempo especificado
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-Modified-Since: Tue, 22 Feb 2022 22:00:00 GMT
El servidor responderá con un 304 Not Modified si el contenido no ha cambiado
desde el tiempo especificado.
Al recibir esta respuesta, el cliente revierte la respuesta stale en fresh y puede ser
reutilizada durante 1 hora.
En este modelo básico de FTP, el cliente tiene tres componentes: interfaz de usuario,
el proceso de control de clientes, y el proceso de transferencia de datos del cliente.
El servidor tiene dos componentes: el proceso de control del servidor y el proceso
de transferencia de datos del servidor. La conexión de control se realiza entre los
procesos de control. La conexión de datos se realiza entre los procesos de
transferencia de datos.
Conexiones
Conexión de control
Se crea en dos pasos:
1) El servidor emite una apertura pasiva en el conocido puerto 21 y espera a un
cliente.
2) El cliente usa un puerto efímero y emite una apertura activa.
La conexión permanece abierta durante todo el proceso. El tipo de servicio, utilizado
por el protocolo IP, es minimizar la demora porque se trata de una conexión
interactiva entre un usuario (humano) y un servidor. El usuario escribe comandos y
espera recibir respuestas sin demora significativa.
Conexión de datos
Se crea de la siguiente forma:
1) El cliente emite una apertura pasiva utilizando un puerto efímero. Es hecho por
el cliente ya que es éste el que emite los comandos para transferir archivos.
2) El cliente envía este número de puerto al servidor utilizando el comando PORT.
3) El servidor recibe el número de puerto y emite una apertura activa utilizando el
puerto bien-conocido 20 y el número del puerto efímero recibido.
Cuando un usuario inicia una sesión FTP con un host remoto, el lado del cliente
(usuario) establece una conexión de control TCP con el lado de servidor (host remoto)
en el puerto 21, donde el cliente envía la identificación y contraseña del usuario cómo
parte de los comandos FTP. Cuando el servidor recibe un comando para realizar una
transferencia de archivo, éste inicia una conexión de datos TCP con el cliente. FTP
envía un archivo a través de la conexión de datos y luego se cierra. Si durante la
misma sesión, el usuario desea transferir otro archivo, FTP abre otra conexión de
datos.
La conexión de datos permanece abierta mientras dura la sesión, pero se crea una
nueva conexión de datos para cada archivo transferido (no es persistente).
A lo largo de la sesión, el servidor FTP tiene que mantener un estado del usuario. En
concreto, el servidor debe asociar la conexión de control con una cuenta de usuario
específica y debe estar al tanto del directorio actual del usuario cuando éste se mueve
por el árbol del directorio remoto. Llevar el control de esta información de estado para
cada sesión de usuario activa restringe de forma significativa el número total de
sesiones que FTP puede mantener simultáneamente.
Comandos y respuestas
Los comandos (cliente → servidor) y las respuestas (servidor → cliente) se envían a
través de la conexión de control en formato ASCII de 7 bits. Cada comando consta de
cuatro caracteres ASCII en mayúsculas, y algunos emplean argumentos opcionales:
- USER nombre_de_usuario: se usa para enviar la identificación del usuario
al servidor.
- PASS contraseña: envía la contraseña al servidor.
- LIST: se usa para pedir una lista de todos los archivos existentes en el
directorio remoto actual, la cual se envía a través de una conexión de datos.
- RETR nombre_de_archivo: hace que el host remoto inicie una conexión de
datos y envíe el archivo solicitado.
- STOR nombre_de_archivo: se usa para almacenar (introducir) un archivo
en el directorio actual del host remoto.
Cada comando va seguido de una respuesta las cuáles son números de tres dígitos con
un mensaje opcional:
- 331 Username OK, password required
- 125 Data connection already open; transfer starting
- 425 Can’t open data connection
- 452 Error writing file
Componentes
Agentes de usuario
Permiten a los usuarios leer, responder, reenviar, guardar y componer mensajes.
Cuando un usuario A termina de componer su mensaje, su agente de usuario envía el
mensaje a su servidor de correo, donde es colocado en la cola de mensajes salientes
del servidor de correo. Cuando el usuario B quiere leer su mensaje, su agente de
usuario recupera el mensaje de su buzón, que se encuentra en el servidor de correo.
Servidores de correo
Los servidores de correo forman el núcleo de la infraestructura del correo
electrónico. Cada destinatario tiene un buzón de correo en uno de los servidores de
correo. Si el servidor del usuario A no puede enviar el mensaje al servidor del usuario
B, entonces el servidor del usuario A mantiene el mensaje en una cola de mensajes e
intenta enviarlo más tarde (cada 30 minutos, más o menos). Si después de varios días
no se ha conseguido, el servidor elimina el mensaje y notifica al emisor.
SMTP
SMTP es el principal protocolo de la capa de aplicación para el correo electrónico.
Utiliza TCP para transferir el correo desde el servidor emisor al servidor destinatario.
SMTP tiene dos lados, cliente y servidor. Cuando un servidor de correo envía
mensajes, actúa cómo un cliente SMTP. Cuando un servidor recibe mensajes, actúa
cómo un servidor SMTP.
Un ejemplo del funcionamiento básico de SMTP:
1) Ana invoca a su usuario de agente de usuario (AU), proporciona la dirección
de correo de Ben, compone un mensaje e indica al AU que lo envíe.
2) El AU envía el mensaje al servidor de correo de Ana, donde se coloca en una
cola de mensajes.
3) El lado del cliente de SMTP (en servidor de correo de Ana) ve el mensaje, abre
una conexión TCP con el servidor SMTP ejecutándose en el servidor de correo
de Ben.
4) Después de la fase de negociación, el cliente SMTP envía el mensaje a través
de la conexión TCP.
5) En el servidor de correo de Ben, el lado del servidor de SMTP recibe el
mensaje, y el servidor de correo coloca el mensaje en el buzón de Ben.
6) Ben invoca a su agente de usuario para leer el mensaje cuando quiera.
SMTP usa comandos y respuestas para transferir mensajes entre cliente y servidor.
Comandos
Enviados desde el cliente al servidor, consisten de una palabra clave seguida de cero o
más argumentos.
HELO: usado por el cliente para identificarse, el argumento es el dominio del host del
cliente. HELO: challenger.atc.fhda.edu
MAIL FROM: usado por el cliente para identificar al emisor, el argumento es el correo
del emisor. MAIL FROM: forouzan@challenger.atc.fhda.edu
RCPT TO: usado por el cliente para identificar el destinatario, el argumento es el correo
del destinatario. Si son múltiples, el comando se repite.
DATA: este comando envía el mensaje. Todas las líneas luego de DATA son tratadas
cómo el mensaje, el cual termina con una línea conteniendo un punto.
Respuestas
Código de tres dígitos enviado desde el servidor al cliente que puede ser seguido de
información textual adicional (similar a HTTP):
El primer dígito indica la categoría de la respuesta
- 2XX: operación concluida con éxito
- 3XX: orden, el servidor está pendiente de que el cliente le envíe nuevos datos.
- 4XX: respuesta de error transitorio, pero se espera a que se repita la
instrucción.
- 5XX: indica una condición de error permanente, por lo que no debe repetirse la
orden
Cabeceras MIME
El correo electrónico tiene una estructura simple, y esa simplicidad viene con un
precio: limitaciones. No puede ser usada para lenguajes que no sean inglés y no se
puede usar para enviar archivos binarios o datos de video o audio.
MIME (Multipurpose Internet Mail Extensions, extensiones de correo de Internet
multipropósito) es un protocolo complementario que permite enviar datos que no son
ASCII a través del correo electrónico transformando datos no-ASCII en el sitio del
emisor a datos NVT ASCII y los entrega al agente de usuario del cliente para ser
enviados. El mensaje se transforma a los datos originales en el destinatario.
MIME define cinco cabeceras que pueden ser añadidas para definir los parámetros de
transformación:
Clases de servidores
Existen tres clases de servidores DNS: DNS raíz, DNS de dominio de nivel superior
(TLD, Top-Level Domain) y DNS autoritativos.
DNS autoritativos
Las organizaciones con hosts accesibles públicamente proporcionan registros DNS
que establecen la correspondencia entre nombres y direcciones IP, las cuáles son
albergadas por estos servidores.
En este diseño los nombres son definidos en una estructura de árbol invertido con la
raíz al principio.
Resolución de nombres
Un host que necesita asignar una dirección a un nombre o un nombre a una dirección
llama a un cliente DNS llamado resolutor. Este accede al servidor DNS más cercano
con una solicitud de mapeo. Si el servidor tiene la información, satisface al resolutor;
sino lo remite a otros servidores o solicita a otros servidores que proporcionen la
información.
Luego de recibir el mapeo, lo interpreta para ver si es una solución o un error, y
finalmente entrega el resultado al proceso que lo pidió.
Resolución recursiva
El cliente (resolutor) puede solicitar una respuesta recursiva de un servidor de
nombres. Esto significa que el resolutor espera que el servidor proporcione la
respuesta final. Si el servidor es la autoridad para el nombre de dominio, chequea su
base de datos y responde. Caso contrario, envía la solicitud a otro servidor (el padre,
usualmente) y espera la respuesta, y así sucesivamente. Cuando se resuelve la
consulta, la respuesta viaja hasta el cliente que la solicitó.
Resolución iterativa
El cliente envía la solicitud. Si el servidor es la autoridad para el nombre, envía la
respuesta. Si no le envía al cliente la dirección IP de un servidor que piensa podría
resolver la consulta, por lo que el cliente es responsable de repetir la consulta al
segundo servidor, y así sucesivamente. Es iterativo porque el cliente debe repetir la
misma consulta a diferentes servidores.
Caché DNS
Cada vez que un servidor recibe una consulta por un nombre que no está en su
dominio, debe chequear su base de datos por direcciones IP de servidores. La
reducción de esta búsqueda incrementaría la eficiencia, y DNS lo maneja con caché.
Cuando un servidor pregunta por un mapeo a otro servidor, éste lo guarda en su
memoria caché antes de enviarlo al cliente. Si el mismo u otro cliente pide el mismo
mapeo, chequea su memoria caché y resuelve el problema (también marca la respuesta
cómo sin autorización).
Acelera procesos pero también tiene sus problemas. Si un servidor mantiene un mapeo
en caché por un largo tiempo, puede terminar enviando un mapeo desactualizado. Para
esto se utilizan dos técnicas. Primero, el servidor autorizado siempre añade el
time-to-live (TTL) que define en segundos por cuánto tiempo se puede cachear la
información. Luego de ese tiempo es invalido y se debe enviar una nueva consulta al
servidor. Segundo, DNS requiere que cada servidor mantenga un contador TTL para
cada mapeo que cachea. La memoria caché debe ser buscada periódicamente en busca
de mapeos expirados, y eliminarlos.
Mensajes DNS
DNS tiene dos tipos de mensajes: consulta y respuesta. Ambos tienen el mismo
formato. La consulta consiste de una cabecera y registros de preguntas. La
respuesta consiste de una cabecera, registros de preguntas, registros de respuestas,
registros de autorización y registros adicionales.
Componentes
Cabecera
12 bytes
Sección de preguntas
Contiene uno o más registros de preguntas, presente en mensajes de consulta y
respuesta.
Sección de respuestas
Contiene uno o más registros de recursos, presente sólo en mensajes de respuesta, e
incluye la respuesta del servidor al cliente.
Sección autorizada
Contiene uno o más registros de recursos, presente sólo en mensajes de respuesta.
Provee información (nombre de dominio) acerca de uno o más servidores autorizados
para la consulta.
Sección de información adicional
Contiene uno o más registros de recursos, presente sólo en mensajes de respuesta.
Provee información adicional que puede ayudar al resolutor Por ejemplo, el servidor
puede dar el nombre de dominio de un servidor autorizado al resolutor en la sección
de autorización, e incluir la dirección IP de éste en la sección de información
adicional.
Tipos de registros
Registros de preguntas
Usados por el cliente para obtener información de un servidor, contiene el nombre del
dominio.
- Nombre de consulta: campo de longitud variable que contiene un nombre de
dominio. El campo count refiere al número de caracteres en cada sección.
Registros de recursos
Cada nombre de dominio está asociado con un registro llamado registro de recursos.
La base de datos de un servidor consiste en registros de recursos, y estos son también
los que devuelve un servidor al cliente.
Encapsulación
DNS puede usar UDP o TCP, ambos en el puerto 53. UDP es usado cuando el tamaño
de la respuesta es menor a 512 bytes.
Si el resolutor tiene conocimiento previo del tamaño de la respuesta, elige con
anterioridad cuál protocolo usar.
Si no lo sabe, puede usar UDP. Sin embargo, si la respuesta excede los 512 bytes, el
servidor trunca el mensaje y activa el bit TC. Luego, el resolutor abre una conexión
TCP y repite la solicitud para obtener una respuesta completa.
Los comandos o textos en este formato viajan a través de Internet y llegan al stack
TCP/IP de la máquina remota. Aquí son entregados al sistema operativo y pasado al
servidor TELNET, el cual transforma los caracteres para que puedan ser entendidos
por la computadora remota. Sin embargo, estos no pueden ser pasados directamente al
SO porque no está diseñado para recibir caracteres de un servidor TELNET, sino de
un driver de terminal. La solución es añadir un software llamado driver de
pseudo-terminal que pretende que los caracteres vienen de un terminal. De ahí el SO
los pasa al correspondiente programa de aplicación.
TELNET usa sólo una conexión TCP. El servidor usa el puerto bien conocido 23 y el
cliente usa un puerto efímero. La misma conexión es usada para enviar los datos y los
caracteres de control y esto se logra al incorporar los caracteres de control en el flujo
de datos. Para distinguir datos de control, cada secuencia de caracteres de control debe
estar precedida un caracter de control especial llamado interpret as control (IAC,
interpretar cómo control).
Por ejemplo, suponer que un usuario quiere que un servidor muestre un archivo en un
servidor remoto y tipea: cat file1. Excepto que comete un error y tipea filea en vez de
file1, por lo que el usuario borra un caracter y el resultado seria:
cat file<backspace>1
Pero el usuario no puede editar localmente así que el backspace es traducir a dos
caracteres remotodos ( IA EC), los cuáles se incorporan en la información y se envían
al servidor remoto.
SSH
Secure Shell proporciona un mecanismo para autenticar un usuario remoto, transferir
entradas desde el cliente al host y retransmitir la salida de vuelta al cliente. El servicio
se creó como un reemplazo seguro para el TELNET sin cifrar y utiliza técnicas
criptográficas para garantizar que todas las comunicaciones hacia y desde el servidor
remoto sucedan de manera encriptada.
Componentes
Posee cuatro componentes:
Aplicación SSH
Al terminar la fase de conexión, SSH permite a programas de aplicación usar la
conexión. Cada aplicación puede crear un canal lógico y beneficiarse de una conexión
segura.
Técnicas de cifrado
Cifrado simétrico
Se utiliza una clave secreta tanto para el cifrado cómo para el descifrado de un
mensaje, tanto por el cliente como por el host durante una sesión SSH. Cualquiera con
la clave puede descifrar el mensaje. A menudo se llama clave compartida (shared
key). El proceso de creación de una clave simétrica se lleva a cabo mediante un
algoritmo de intercambio de claves.
Lo que hace que este algoritmo sea particularmente seguro es que la clave nunca se
transmite entre cliente y servidor. Estos comparten datos públicos y luego los
manipulan para calcular de forma independiente la clave secreta. Incluso si un tercero
captura los datos, no será capaz de calcular la clave porque no se conoce el algoritmo.
Cifrado asimétrico
Utiliza dos claves separadas para el cifrado y el descifrado. Estas se conocen como la
clave pública (public key) y la clave privada (private key), y juntas forman el par
de claves pública-privada (public-private key pair).
La clave pública se distribuye abiertamente y se comparte con todas las partes. Está
vinculada estrechamente con la clave privada en términos de funcionalidad, la clave
privada no se puede calcular matemáticamente desde la clave pública. La relación
entre ambas es compleja: un mensaje cifrado por la clave pública de una máquina sólo
puede ser descifrado por la misma clave privada de la máquina. Está relación
unidireccional significa que la clave pública no puede descifrar sus propios mensajes
ni nada cifrado por la clave privada. Por lo tanto, cualquier parte con la capacidad de
descifrar mensajes firmados públicamente debe poseer la clave privada
correspondiente.
Este cifrado no se usa para cifrar toda la sesión SSH. Antes de iniciar una conexión
segura, ambas partes generan pares de claves públicas-privadas temporales y
comparten sus respectivas claves privadas para producir la clave secreta compartida.
Una vez que se ha establecido una comunicación simétrica segura, el servidor utiliza
la clave pública de los clientes para generar y desafiar y transmitirla al cliente para su
autenticación. Si el cliente puede descifrar correctamente el mensaje, significa que
contiene la clave privada necesaria para la conexión. Y entonces comienza la sesión
SSH.
Hashing
Difiere de las dos anteriores en el sentido de que nunca están destinadas a ser
descifradas. Generan un valor único de una longitud fija para cada entrada que no
muestra una tendencia clara que pueda explotarse. Esto los hace prácticamente
imposibles de revertir.
Es fácil generar un hash criptográfico de una entrada dada, pero imposible de generar
la entrada del hash. Esto significa que si un cliente tiene la entrada correcta, pueden
generar el hash criptográfico y comparar su valor para verificar si poseen la entrada
correcta. SSH utiliza hashes para verificar la autenticidad de los mensajes. Esto se
hace usando HMACs, o códigos de autenticación de mensajes basados en hash. Esto
asegura que el comando recibido no se altere de ninguna manera.
BitTorrent
Es un popular protocolo P2P para la distribución de archivos. En la jerga de
BitTorrent, la colección de todos los pares que participan en la distribución de un
determinado archivo se conoce cómo torrent (torrente). Los peers de un torrent
descargan fragmentos del mismo tamaño del archivo de uno a otro (típicamente es
de 256KB). Cuando un par se une por primera vez a un torrent, no tiene fragmentos. A
lo largo del tiempo los va acumulando. A la vez que descarga fragmentos, actualiza
fragmentos en otros pares. Una vez un par ha adquirido el archivo completo, puede
abandonar el torrent, o puede permanecer y continuar suministrando fragmentos a
otros pares.
Funcionamiento
Cada torrente tiene un nodo de infraestructura denominado tracker (rastreador) que
son los que organizan la distribución de un archivo, y son los que tienen la
información necesaria para que los diferentes usuarios se conecten entre sí. Por lo
tanto, estos trackers serían como el único punto de encuentro al que los clientes deben
conectarse obligatoriamente. Cuando un par se une a un torrent, se registra mediante
el tracker y, periódicamente, informa de que todavía se encuentra allí. Así, el tracker
sigue la pista a los pares que están participando en el torrent.
Solicitando fragmentos
Para decidir qué fragmentos solicitar, se utiliza la técnica primero el menos común,
que consiste en determinar de entre los fragmentos que uno no tiene, los fragmentos
menos comunes (fragmentos con menor número de copias repetidas) entre sus
vecinos, y solicita esos primero. Así, estos fragmentos se redistribuirán más
rápidamente, consiguiendo que el número de copias sea aproximadamente igual
dentro del torrent.
Enviando fragmentos
Para determinar a qué solicitudes responder, BitTorrent utiliza un algoritmo de
intercambio inteligente donde la idea es dar prioridad a los vecinos que están
suministrando sus datos a mayor velocidad, el algoritmo de bloqueo.
Este se describe desde el punto de vista del par local, por lo que “interesado”
es interesado en el par local y “bloqueado” es bloqueado por el par local.
1) En este algoritmo, cómo máximo, 4 pares remotos pueden estar desbloqueados
e interesados a la vez.
2) Cada 10 segundos, los pares remotos interesados se ordenan de acuerdo a su
velocidad de bajada hacia el par local, y los 3 más rápidos son desbloqueados.
3) Cada 30 segundos, un par interesado adicional se desbloquea aleatoriamente.
Esto se llama desbloqueo optimista (optimistic unchoke), que tiene dos
objetivos: permite evaluar la capacidad de bajada de nuevos pares y posibilita
que los pares que no tienen fragmentos, puedan compartir su primer fragmento.
Funcionamiento
Cuando se indica al navegador del host de un usuario que extraiga un vídeo concreto
(identificado mediante URL), la CDN debe interpretar la solicitud para determinar
un clúster de servidores de la CDN adecuado para ese cliente y redirigir la solicitud a
un servidor situado en dicho clúster. La mayoría de las CDN aprovechan DNS para
hacer esto.
Ejemplo: Un proveedor de contenido (NetCinema) utiliza una empresa proveedora de
servicios CDN (KingCDN). En las páginas de NetCinema, cada vídeo tiene una URL que
incluye la palabra “video” y un ID unívoco (Transformers →
http://video.netcinema.com/6Y7B23V)
1) El usuario visita la página de NetCinema.
2) El usuario hace clic sobre el link de Transformers. Allí, el host del usuario
envía una solicitud DNS preguntando por video.netcinema.com.
3) El servidor DNS local (LDNS), retransmite la solicitud a un servidor DNS
autoritativo de NetCinema, que observa la cadena “vídeo”. Para “transferir” la
consulta DNS a KingCDN, el servidor autoritativo envía al LDNS un nombre
de host perteneciente al dominio de KingCDN (por ejemplo,
a1105.kingcdn.com).
4) La consulta entra en la infraestructura DNS privada de KingCDN. LDNS envía
una segunda consulta, preguntando por a1105.kingcdn.com y el sistema
devuelve al LDNS las direcciones IP de un servidor de contenido de KingCDN.
Es aquí donde se específica el servidor CDN desde el cual recibirá el cliente su
contenido.
5) El LDNS reenvía al host del usuario la dirección IP del nodo CDN encargado
de servir el contenido.
6) Recibida la dirección, se establece una conexión TCP directa con el servidor
situado en dicha dirección IP y transmite una solicitud GET HTTP para el
video deseado. Si se usa DASH, el servidor enviará primero al cliente un
archivo de manifiesto con una lista de URL, uno para cada versión del vídeo, y
el cliente selecciona dinámicamente segmentos de las distintas versiones.