Redes de ordenadores Capítulo 2 Capa de aplicación (aplication layer) (principios de nivel de aplicación. Servicios ofrecidos por la capa de transporte(TCP/UDP) a la capa de aplicación. Ejemplo de aplicación. DNS) ¿Objetivos? - - - Aspectos conceptuales de implementación de los protocolos de aplicación de red. modelos de servicio de capa de transporte o paradigma cliente-servidor o paradigma de igual a igual aprenda sobre protocolos examinando protocolos populares de nivel de aplicación o HTTP o FTP o SMTP / POP3 / IMAP o DNS programación de aplicaciones de red o API de socket La arquitectura de computadores, como ya tratamos diseña como son los elementos de un sistema, como funcionan y como interactúan entre sí. Capa de aplicación. Creación de aplicaciones de red distribuida Contiene las aplicaciones de internet, las cuales son la razón de que exista internet, para poder ejecutarlas. El desarrollo de una aplicación de red implica escribir programas que se ejecuten en distintos sistemas terminales y que se comuniquen entre sí a través de la red. Por ejemplo, en la aplicación Web se emplean dos programas diferentes que se comunican entre sí: el navegador que se ejecuta en el host del usuario (una computadora de escritorio, un portátil, una PDA, un teléfono móvil, etc.) y el programa del servidor web que se ejecuta en el host servidor web. Otro ejemplo sería el caso de un sistema de compartición de archivos P2P en el que se emplea un programa en cada host que participa en la comunidad de compartición de archivos. En este caso, los programas instalados en los distintos hosts pueden ser similares o idénticos. Una cuestión importante es que no es necesario escribir software que se ejecute en los dispositivos del núcleo de la red, como por ejemplo los routers o switches de la capa de enlace. Ya que los dispositivos del núcleo de red no ejecutan aplicaciones de red. Este criterio funcional del diseño ha facilitado el rápido desarrollo y la implementación de una gran cantidad de aplicaciones de red. La comunicación de una aplicación de red tiene lugar entre sistemas terminales en la capa de aplicación. Un caso en el que no es así es la red telefónica donde hay muy pocas aplicaciones (bloquear llamadas, buzón de voz, mensajes de texto, redirecciones de llamadas, llamadas entre 3 personas), esto se debe a que no se puede programar en el terminal, la aplicación debe de ser programada en la red, y por tanto cada vez que se crea una aplicación hay que cambiar la red, lo que tiene el riesgo de estropear lo que ya hay, y por eso no se diseñan cosas nuevas, ya que hay más riesgos. Con internet solo tuenes que bajarte la aplicación, gracias a que las apps se ejecutan en los extremos y no es necesario modificar los routers, explicando porque internet da lugar a la creatividad. Arquitecturas de las aplicaciones de red (app distribuidas) Desde la perspectiva del desarrollador de aplicaciones, la arquitectura de red es fija y proporciona un conjunto específico de servicios a las aplicaciones, este se encarga de diseñar la arquitectura de la aplicación, que establecera como la aplicación debe estructurarse en los distintpps sistemas terminales. Hay fundamentalmente dos tipos de arquitecturas de aplicaciones: - Cliente-servidor - P2P (peer-to-peer) Aunque también se habla de aplicaciones híbridas donde una parte de la aplicación se comporta de modo clienteservidor y la otra P2P. Además, es necesario añadir hoy en día las arquitecturas cloud que se pueden simplificar como una arquitectura cliente servidor donde el servidor está distribuido en la nuve. Arquitectura cliente-servidor: Siempre existe un host activo, denominado servidor, que da servicio a las solicitudes de muchos otros hosts, que son los clientes. Los hosts clientes pueden estar activos siempre o de forma intermitente. Las principales características de un servidor en esta arquitectura son: - Está siempre activo normalmente esperando a conexiones de los clientes y por tanto tendrá una dirección IP fija permanente y conocida, a la que esos clientes se pueden dirigir para solicitarle los servicios que ofrezca - El principal problema de los servidores será el escalado según la demanda de los servicios, ya que el servidor tiene que tener más recursos a medida que aumentan los clientes, porque sino se satura. Las principales características de los clientes: - Estos se conectan de forma intermitente con el servidor por tanto no están siempre activos pudiendo cambiar su dirección IP (en distintas conexiones, pero cuando establecen una conexión la IP es fija) usando direccionamiento dinámico, además los clientes no se comunican directamente entre sí. Arquitectura P2P pura: Donde tenemos que los hosts pueden actuar como servidores o clientes de forma simultánea, por lo que los servidores no estarán siempre activos y los hosts clientes se podrán comunicar entre si pudiendo también cambiar su dirección IP. De tal forma que explota la comunicación directa entre parejas de hosts conectados de forma intermitente, conocidos como peers (pares). Estas arquitecturas son altamente escalables, ya que son auto escalables ya que un peer es un cliente y un servidor a la vez, ofreciendo él los recursos a la vez que va creciendo, pero muy difíciles de gestionar, y de garantizar la calidad del servicio ya que no hay un compromiso. Los principales problemas a los que se tienen que enfrentar son: - Orientación al ISP: las infraestructuras de red que han desplegado los ISP están orientadas a arquitecturas clientes servidor donde es mayor el tráfico de bajada que de subida, aunque hoy en día la fibra está permitiendo el uso simétrico del ancho de banda. - La seguridad, dada la naturaleza extremadamente distribuida y abierta. - Por último, en estas hay que crear políticas con incentivos para motivar a los usuarios a ofrecer voluntariamente recursos de ancho de banda, almacenamiento y computación. - Las empresas, desde el punto de vista de negocio prefieren una arquitectura cliente-servidor. Un ejemplo es BitTorrent, una plataforma de intercambio de archivos, donde hay distintos hosts y todos ellos ofrecen y consumen servicios. Arquitectura híbrida: Hay arquitecturas p2p donde no todos los hosts son iguales, no son p2p puras y se les denomina híbridas. Algunas aplicaciones tienen arquitecturas híbridas que combinan elementos cliente-servidor y P2P. Skype - aplicación de voz sobre IP P2P - servidor centralizado: búsqueda de la dirección de la parte remota: - Conexión cliente-cliente: directo (no a través del servidor) Mensajería instantánea - chatear entre dos usuarios es P2P - servicio centralizado: detección de presencia del cliente / ubicación o el usuario registra su dirección IP con el servidor central cuando se conecta o el usuario contacta al servidor central para encontrar las direcciones IP de sus amigos Por ejemplo, en muchas aplicaciones de mensajería instantánea los servidores se utilizan para hacer un seguimiento de las direcciones IP de los usuarios, pero los mensajes de usuario a usuario se envían directamente entre los hosts de dichos usuarios (sin pasar por los servidores intermedios). Un ejemplo clásico es Skype, en ella tenemos peers o pares normales y superpeers estableciendo una jerarquía en la red. Se tienen también un servidor centralizado del login, pero el índice que asigna los nombres de usuario a las IPS está distribuido entre los superpeers, probablemente con DHT (tabla has distribuida). De tal forma que para establecer la llamada el cliente solo sabe el ID, que mediante Un servicio cliente servidor, el servidor de login, te dice donde está la persona con ese ID. Procesos de comunicación: Comunicación entre procesos Los programas que se ejecutan en varios sistemas terminales se comunican entre sí. En la jerga de los sistemas operativos, realmente no son los programas sino los procesos los que se comunican. Un proceso puede interpretarse como un programa que se ejecuta dentro de un sistema terminal. - Cuando los procesos se ejecutan en el mismo sistema terminal, pueden comunicarse entre sí mediante la comunicación entre procesos aplicando las reglas gobernadas por el sistema operativo del sistema terminal. - Los procesos de dos sistemas terminales diferentes se comunican entre ellos intercambiando mensajes a través de la red de computadoras. Un proceso emisor crea y envía mensajes a la red; un proceso receptor recibe estos mensajes y posiblemente responde devolviendo mensajes. De tal forma que distinguimos dos tipos de procesos: un proceso cliente, el cual es el encargado de iniciar la comunicación y un proceso servidor que espera hasta que alguien se le conecte. No hay que confundir esto con la arquitectura, ya que en aplicaciones con arquitectura p2p también hay procesos cliente y servidor en cada peer. sockets Los procesos enviaran los mensajes desde la capa de aplicación a la capa de transporte (es decir un proceso envía mensajes a la red y nos recibe a través de una interfaz software denominada socket) mediante una interfaz (API) que denominaremos sockets (puerta tras la cual la app manda la información al SO). Un proceso es análogo a una casa y un socket es análogo a la puerta de la casa. Cuando un proceso desea enviar un mensaje a otro proceso que se está ejecutando en otro host, envía el mensaje a través de la puerta (socket). Este proceso emisor supone que existe una infraestructura de transporte al otro lado de la puerta que llevará el mensaje hasta la puerta del proceso de destino. Una vez que el mensaje llega al host de destino, éste pasa a través de la puerta (socket) del proceso receptor, actuando entonces el proceso receptor sobre el mensaje. Como se muestra en la figura, un socket es la interfaz entre la capa de aplicación y la capa de transporte de un host. También se conoce como 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 tiene el control sobre todos los elementos del lado de la capa de aplicación del socket, pero apenas tiene control sobre el lado de la capa de transporte del socket. El único control que tiene el desarrollador de la aplicación sobre el lado de la capa de transporte es: (1) la elección del protocolo de transporte (TCP o UDP) (2) quizá la capacidad de fijar unos pocos parámetros de la capa de transporte, como por ejemplo los tamaños máximos del buffer y de segmento (lo que veremos en el Capítulo 3). Una vez que el desarrollador de la aplicación ha seleccionado un protocolo de transporte (si hay disponibles varios entre los que elegir), la aplicación se crea utilizando los servicios de la capa de transporte proporcionados por dicho protocolo. Protocolos de la capa de aplicación Recordamos que un protocolo de red define el tipo de mensaje intercambiado (solicitud, respuesta), especificando su formato tanto la sintaxis (qué campos en los mensajes y cómo se delinean los campos) como la semántica (significado de la información en los campos) del mensaje y las reglas para cuándo y cómo los procesos envían y responden mensajes (su orden y las acciones que se realizaran). Estos protocolos pueden ser: - Protocolos de dominio público: definidos en RFCs que permiten la interoperabilidad entre sistemas como e.g. HTTP, SMTP - Protocolos propietarios como los empleados por Skype ¿Qué protocolos de servicio de transporte necesita una aplicación? Bajo la capa de aplicación, está la capa de transporte que nos podrá ofrecer a las apps, determinados servicios como: teniendo en cuenta que las distintas apps pueden ser sensibles de distintas maneras a los sistemas de comunicación/transporte : 1. Transferencia fiable: si quieres asegurarte de que los mensajes llegan al destinatario sin errores completos y ordenados. 2. Temporización o timing: el tiempo desde que se envía hasta que se recibe el mensaje. 3. Tasa de transferencia: velocidad a la que te va llegando el mensaje 4. La seguridad: hablando en términos de confidencialidad, integridad de datos, autenticación… Teniendo en cuenta que las distintas apps pueden ser sensibles de distintas maneras a los sistemas de comunicación/transporte : Por ejemplo, teniendo en cuenta estas dos aplicaciones: o Transferencia de archivos (A) o Llamada de voz (B) 1.A es una app intolerante a fallos, si se pierde un bit del archivo este ya no sirve para nada 1.B la comunicación por voz es bastante robusta al ruido, apenas te das cuenta de la perdida de datos, por tanto, es un servicio del que puede prescindir. 2.A como la trasferencia de archivos ya necesita tiempo, que haya un retardo no es muy significativo 2.B el retarde en la comunicación por voz es bastante perjudicial, ya que se superponen las distintas palabras y no se entendería nada. 3.A se puede demorar más o menos tiempo, pero al final se logra transmitir el archivo es una “aplicación elástica” usan la tasa de trasferencia disponible. 3.B es una “aplicación sensible al ancho de banda” y por tanto pide una tasa de transferencia mínima garantizada para poder entender la voz. DISTINTAS APPS TIENEN DISTINTA SENSIBILIDAD A DISTINTAS CARACTERISTICAS DE LOS SERVICIOS DE COMUNICACIÓN Algunos de estos servicios no los proporciona internet y tienen que añadirse en la aplicación. Servicios de protocolos de transporte por internet (servicios de comunicación disponibles en internet) La capa de transporte nos provee de dos servicios o protocolos de transporte más usados que son: - Protocolo TCP - Protocolo UDP El protocolo TCP: - Orientado a la conexión: requiere configuración entre los procesos del cliente y el servidor - Transporte confiable entre el proceso de envío y recepción - Control de flujo: el remitente no abrumará al receptor - Control de congestión: acelerador del remitente cuando la red está sobrecargada - No proporciona: tiempo, garantías de rendimiento mínimo, seguridad El protocolo UDP: - Transferencia de datos poco confiable entre el proceso de envío y recepción (best-efford) - No proporciona: configuración de conexión, confiabilidad, control de flujo, control de congestión, sincronización, garantía de rendimiento o seguridad Sabiendo esto, ¿Quién usa UDP? Hay aplicaciones como las llamadas las cuales se pueden permitir la perdida de datos, y usan UDP para usar menos recursos y ser más rápidas, ya que la mejora de fiabilidad que ofrece TCP tiene un coste en tiempo ya que si algo falla se pide varias veces para comprobar el mensaje y además se retienen el resto de los mensajes, cosa que a una llamada perjudicaría mucho. Direccionamiento de procesos ¿Cómo indica un proceso con qué proceso desea comunicarse utilizando estos servicios? ¿Cómo especifica un proceso que se ejecuta en un host situado en Amherst, Massachusetts, Estados Unidos, que desea comunicarse con un determinado proceso que está ejecutándose en un host ubicado en Bangkok, ¿Tailandia? Para identificar al proceso de recepción, tienen que especificarse dos elementos de información: (1) el nombre o dirección del host (2) un identificador que especifique el proceso de recepción en el host de destino. Suponemos que tenemos un proceso cliente que se quiere comunicar con un proceso servidor en otro host a través de internet. Quiere mandar un mensaje, pero necesita alguna forma de identificar el destino (se necesita un elemento fundamental para establecer la comunicación), por tanto, se necesita que el cliente pueda identificar al servidor y este necesitará saber el del cliente para ofrecerle el servicio. La función de la capa de red era poner un encabezado al mensaje con el origen y destino de este. En internet, la capa IP nos provee de un ID para cada elemento, una dirección IP esta dirección es una magnitud de 32 bits que identifica de manera unívoca a un host. Por lo tanto, en un mensaje se debe de incluir la IP del proceso servidor y la IP del proceso usuario (origen), pero con esto no es suficiente, ya que una vez el mensaje llegue al servidor, necesita saber a qué aplicación quiere ir Necesitas identificar también a dicha aplicación a la que va destinado el mensaje porque en cada dispositivo corren distintas aplicaciones. La IP identifica al dispositivo, pero dentro de él no sabes identificar los distintos procesos en ejecución, para ello necesitamos algo más, esto son los puertos. (números de puerto) Cada dispositivo tiene un rango de puertos que identifican las aplicaciones que se ejecutan en el dispositivo, por tanto, en la cabecera del mensaje debe ir el par (IP, puerto) el cual identifica al socket de la aplicación y esta combinación debe de ser única. Para recibir mensajes, el proceso debe tener un identificador el dispositivo host tiene una dirección IP exclusiva de 32 bits P: ¿la dirección IP del host en el que se ejecuta el proceso es suficiente para identificar el proceso? R: No, muchos procesos pueden ejecutarse en el mismo host El identificador incluye tanto la dirección IP como los números de puerto asociados con el proceso en el host. Ejemplos de números de puerto: Servidor HTTP: 80 Servidor de correo: 25 enviar un mensaje HTTP al servidor web gaia.cs.umass.edu: Dirección IP: 128.119.245.12 Número de puerto: 80 más brevemente ... DNS (domain name system) Veremos ahora el protocolo DNS, en internet las máquinas tienen direcciones IP, pero para evitar recordar esos números empleamos nombres de dominio (alias) ¿Qué correspondencia hay entre la IP y su nombre de dominio? El DNS es el sistema que permite almacenar las correspondencias entre direcciones IP y nombres de dominio, también con DNS nos vamos a referir al protocolo que se empleará para consultar esa base de datos distribuida. Por lo tanto, DNS puede referirse a: - base de datos distribuida implementada de forma jerárquica con varios servidores de nombres - protocolo de la capa de aplicación que permite a los hosts consultar esa base de datos distribuida. Este protocolo ira sobre UDP y el servidor esperará conexiones en el puerto 53. Servicios que ofrece DNS: - El principal servicio de DNS será por tanto la traducción del nombre de dominio (del host) a dirección IP. - Proporciona Alias para esas máquinas (hosts) y servidores de correo. - También ayuda a la distribución de la carga haciendo corresponder un único nombre con varias direcciones IP (con servidores web replicados, un conjunto de direcciones IP para un único nombre canónico). Siendo un servicio transparente al usuario. Además, se hace de forma descentralizada porque un DNS centralizado sería un único punto de fallo, tendría un gran volumen de tráfico, problemas de distancia a la base de datos centralizada, problemas de mantenimiento y problemas de escalado. Por tanto, se ha desarrollado una base de datos distribuida y jerárquica: En la que los servidores se distribuyen principalmente en tres niveles: - servidores DNS Raíz - servidores DNS doble del domain (.com, .es, .org …) - servidores DNS autoritativos (Google.com, uc3m.com, youtube.com…) Por ejemplo, si quisiésemos saber la dirección IP de www.uc3m.es, se la pedimos al servidor raíz, este devuelve la dirección IP del servidor TLD “.es” a este le pedimos la IP del servidor autoritativo y nos devuelve la IP del servidor autoritativo “uc3m.es” y a este servidor se la pedimos nuevamente y nos devuelve la IP de www.uc3m.es. Los servidores raíz son 13 “servidores” (10 en EEUU uno en Japón, otro en Estocolmo y otro en Londres), no todos son iguales, hay una raíz maestra donde se hacen las modificaciones (Washington) y los 12 restantes son los esclavos los cuales replican al maestro (etiquetados de la A a la M) y estos están replicados (mirrors) y configurados en clúster (por seguridad y fiabilidad) por todo el mundo. Los servidores TLD (top-level domain): son los responsables de los dominios de nivel superior (.com, .org, .net, .edu … y de los dominios de países (.es, .uk, .fr, .ca, .jp, …). Los servidores DNS autoritativos: son los que tendrán los registros DNS de los hosts que están accesibles al público como los servidores web y de correo. Estos son mantenidos por la organización o por un proveedor externo. Los servidores DNS locales, o servidores de nombres predeterminados, que son implementados por cada ISP (domestico, empresa, uni…) y no pertenecen a la jerarquía. Cuando un host pide una IP para un determinado nombre se conecta con el servidor Local (son a los que primero pedimos una traducción a IP y son los encargados de buscarla por la jerarquía DNS). Estos actúan como proxy: devuelve la IP si la tiene y si no envía la petición a la jerarquía de servidores DNS, esto se debe a que tienen una caché, por lo que de cada búsqueda que hacen se quedan una copia y así si se vuelve a pedir no tienen que volver a buscarla. Los registros DNS almacenados en estas cachés expiran al cabo de un tiempo y hay mecanismos de actualización y notificación para tener la información al día. Es habitual que la información sobre los servidores TLD esté cacheada en nuestro DNS local y no se hagan muchas consultas a los servidores raíz preguntando por los TLD. Tipos de resolución de una consulta: La consulta DNS más habitual es la consulta iterativa en la que delegamos en nuestro DNS local, y este es el que va buscando (ejemplo El host quiere la IP de www.uc3m.es): 1. 2. 3. 4. 5. 6. 7. 8. mensaje de consulta al DNS local el DNS local envía la consulta al DNS raíz toma el sufijo .es y devuelve la IP del TLD correspondiente ahora el DNS local consulta al TLD .es éste toma el sufijo uc3m.es y devuelve la IP de DNS autoritativo correspondiente y el DNS local consulta al DNS autoritativo uc3m.es y este devuelve al DNS local la IP de www.uc3m.es y el DNS local finalmente devuelve la IP al host. Otra opción para la resolución de nombre serían las consultas recursivas donde se pregunta a un servidor que a su vez pregunta a otro servidor, este es desaconsejable por la carga que requieren, además de que los DNS raíz se saturaran por tanta demanda. Aquí el DNS local haría una consulta recursiva, en la que pide al DNS raíz que haga toda la consulta por él y así sucesivamente cargando en exceso a los servidores raíz y TLD. Registros DNS Desde el punto de vista de DNS es una base distribuida que almacena registros de recursos. Los registros DNS o resource records (RR) serán los que se almacenan en los servidores DNS y no son mas que una tupla con un nombre, un valor, un tipo y un tiempo de vida o ttl indicando el tiempo que se debe almacenar este registro en una caché. Hay varios tipos de registros DNS, pero los más comunes son: - Tipo = A: en el que el campo nombre tendremos el nombre del host y en el campo valor su dirección IP. - Tipo = NS: en el que el campo nombre tendrá el nombre del dominio (e.g. Google.com) y en el valor, el nombre de un DNS autoritativo para dicho dominio. - Tipo = CNAME: en el que en el campo nombre está el alias para un host cuyo nombre canónico es el que figura en el campo valor. - Tipo = MX: es como el CNAME, pero para servidores de correo electrónico. Valor es el nombre canónico del servidor de correo con alias nombre. Si un servidor es autoritativo de un host tendrá un registro tipo A para ese host indicando su IP, si no lo es lo podría tener en su caché o tener un registro NS con el nombre del servidor DNS que tenga el dominio del host y otro registro tipo A con la IP de ese servidor. Tenemos entonces que DNS es una base de datos distribuida que consultan los equipos empleando un protocolo. ¿Cómo son los mensajes de ese protocolo DNS? Mensajes y protocolo DNS Protocolo DNS: Tenemos solo dos tipos de mensajes para hacer las consulta y respuesta, ambos con el mismo formato (nslookup): Tienen una cabecera del mensaje: - Con un número de identificación de 16 bits que identifican la consulta. (este número se inserta en la respuesta) - - Una serie de indicadores (flags de1 bit) que dirán: o si se trata de una consulta o de una respuesta o si se desea emplear recursión o se activa si se soporta dicha recursión o se activa a 1 si la respuesta es de un DNS Después vienen cuatro campos que nos van a indicar el número de consultas, el número de registros de respuesta, el número de registros autoritativos o el número de registros adicionales que lleva ese mensaje, de esta forma tras estos cuatro números vendrán esas consultas, respuestas, registros autoritativos o registros adicionales que se devuelven.