UT4: Servicios en red - Programación de Servicios y Procesos PDF
Document Details

Uploaded by MiraculousMossAgate8885
Tags
Summary
Este documento, titulado "UT4: Servicios en red", abarca conceptos esenciales de los servicios de red. Explora protocolos como DNS, FTP, SMTP y HTTP, y analiza la programación de estos protocolos en Java. Incluye una descripción del modelo cliente-servidor y la capa de aplicación. El documento es de nivel universitario.
Full Transcript
UT4: Servicios en red Programación de Servicios y Procesos DAM 1. Introducción a los servicios en red 2. La capa de aplicación 3. Protocolos de la capa de aplicación Servicios en red a....
UT4: Servicios en red Programación de Servicios y Procesos DAM 1. Introducción a los servicios en red 2. La capa de aplicación 3. Protocolos de la capa de aplicación Servicios en red a. b. c. DNS FTP SMTP Índice d. HTTP 4. Programación de protocolos HTTP a. Programación de DNS en Java b. Programación con URL c. Cliente HTTP d. Servidor HTTP 1. Introducción a los servicios en red ¿Qué es un servicio? Un servicio es un software capaz de responder a eventos o a solicitudes de datos de otros sistemas. Normalmente, este servicio se queda esperando una petición, por lo que no realiza ninguna acción por sí mismo, siempre se enfoca en servir a otro proceso o dispositivo. Como ya sabemos, la tecnología más extendida en la informática se basa en el modelo cliente-servidor. Este hace posible la distribución de tareas y el intercambio de información entre distintos dispositivos, o entre distintos procesos dentro de un mismo dispositivo. Los servicios siguen esta misma estructura, funcionando como un servidor que atiende a uno o múltiples clientes al mismo tiempo. 1. Introducción a los servicios en red Definiciones Servidor: Es el programa que ofrece el servicio. Está escuchando permanentemente las peticiones de los clientes para actuar en consecuencia. Cliente: Es un programa que tiene la capacidad de comunicarse con un servidor a través de un protocolo concreto. El objetivo de esta comunicación puede ser obtener información para presentarla al usuario, o enviar información a otro cliente. Protocolo: Es el conjunto de normas que rigen el proceso de comunicación, dependiendo de la actividad que se esté ejecutando entre los procesos. Arquitectura: Es la forma en la que se organiza el servicio. Normalmente, como hemos dicho, se trata de una estructura cliente-servidor, aunque existen otras como P2P (“Peer-to-Peer”). 2. La capa de aplicación La capa más alta del modelo TCP/IP Si en el tema 3 estudiamos los protocolos que se encargaban de la capa de transporte del modelo TCP/IP, en este tema nos centraremos en la capa de aplicación. La capa de aplicación es la más alta del modelo, responsable de proporcionar interfaces y servicios que permiten la interacción directa entre aplicaciones de usuario y la red. Esta capa trabaja directamente con los datos de aplicación. Como ya sabemos, esos datos deben ser encapsulados en forma de mensajes para ser entregados a la capa inferior (la de transporte), y así sucesivamente hasta la capa de acceso a red, a través de la cual se puede establecer la comunicación. Para esta capa existen una serie de protocolos DNS HTTP específicos , que definen cómo deben actuar los Telnet dispositivos en su más alto nivel, según el tipo de aplicación que se implemente. HTTPS SMTP FTP 3. Protocolos de la capa de aplicación 3.1. DNS El Servicio de Nombres de Dominio (DNS) es un protocolo que se encarga de traducir las direcciones IP en nombres fáciles de recordar (y viceversa), facilitando la comunicación en la red (por ejemplo, a la IP 142.250.185.78 le corresponde el nombre de dominio www.google.com). Sus componentes son: Cliente DNS: es el que solicita la consulta del nombre de dominio. Servidor DNS: recibe la petición del cliente y responde con la IP correspondiente. Este servidor no contiene todos los nombres existentes, ya que tardaría mucho más tiempo en encontrar el que busca, sino que consulta a su vez en otros servidores llamados subdominios hasta que encuentra el nombre solicitado. Caché DNS: cuando un servidor ha respondido a una petición, almacena la información en caché, de forma que las siguientes veces la respuesta será directa. Puerto utilizado para el protocolo DNS: 53 3. Protocolos de la capa de aplicación 3.2. SMTP El protocolo SMTP (Simple Mail Transfer Protocol) es el encargado de la transferencia de mensajes de correo electrónico desde el emisor (cliente) a los servidores, y entre servidores. Trabaja junto con otros protocolos como POP3 o IMAP. ¿Cómo funciona? 1. El usuario envía un correo a través de su cliente (Outlook, Gmail…) 2. El correo pasa al servidor SMTP del proveedor. 3. El servidor reenvía el correo al destinatario. 4. El destinatario descarga el correo con POP3 o lo sincroniza con IMAP. Puertos utilizados para el protocolo SMTP: Puerto estándar para comunicación: 25 Puerto para envío con autenticación: 587 3. Protocolos de la capa de aplicación 3.3. FTP FTP (File Transfer Protocol) es un protocolo estándar para transferencia de archivos en red. Se utiliza tanto para subir archivos del cliente al servidor, como para descargar archivos desde el servidor al cliente. Modos de transferencia: Activo : el servidor inicia la conexión con el cliente. Pasivo: el cliente inicia ambas conexiones. La principal desventaja de FTP es que transmite los datos sin cifrar, por lo que es vulnerable a ataques. Para corregirlo, existen otros protocolos relacionados: SFTP: FTP con cifrado SSH. FTPS: FTP con cifrado SSL/TLS. Puertos utilizados para el protocolo FTP: Control de conexión: 20 Transferencia activa de datos: 21 3. Protocolos de la capa de aplicación 3.4. HTTP El protocolo HTTP (HyperText Transfer Protocol) se utiliza para transferir información entre un cliente y un servidor web. Sirve para solicitar y transferir páginas web, descargar recursos de sitios web, o enviar formularios al servidor. También tiene su versión segura con cifrado, HTTPS. ¿Cómo funciona? 1. El cliente realiza una solicitud HTTP al servidor a través del navegador. 2. El servidor procesa la solicitud y devuelve el contenido solicitado. La comunicación puede usar métodos como GET (solicitar información) o POST (enviar datos). Versiones: HTTPS/1. HTTPS/2 HTTPS/3 1 Puertos utilizados para el protocolo HTTP: Sin cifrar: 80 Con cifrado SSL/TLS (HTTPS): 443 4. Programación de protocolos HTTP Una vez estudiados los protocolos más comunes de la capa de aplicación, vamos a proceder a programar protocolos en Java. Cada protocolo tiene sus librerías y herramientas específicas para trabajar en cada lenguaje de programación: nosotros nos centraremos en HTTP y DNS, que están estrechamente relacionados. DNS HTTP Librería java.net Clase InetAddress Librería java.net Clase URL Clase HttpURLConnection Clase HttpClient Clase HttpRequest Clase Response 4. Programación de protocolos HTTP 4.1. Programación de DNS en Java La finalidad del protocolo DNS es obtener información sobre un dominio, como su IP local o nombre de host. Esto se puede realizar de forma sencilla en Java, tanto para direcciones locales como en red. Los métodos más importantes para el uso de DNS son: Devuelve la dirección IP para el InetAddress direccion = InetAddress.getByName(“nombre de dominio”); nombre de dominio indicado Devuelve la dirección IP local del InetAddress direccion = InetAddress.getLocalHost(); dispositivo (“localhost”) Devuelve el nombre de host para String host = direccion.getHostName(“dirección IP”); la dirección IP indicada Devuelve la dirección IP del dominio String direccion = nombreHost.getHostAddress(“dominio”); directamente en formato String Con estos objetos y métodos simples, podemos realizar un ejemplo sencillo de DNS. Ejemplo 1 4. Programación de protocolos HTTP 4.2. Programación con URL Una URL es una cadena que se utiliza para identificar y localizar un recurso en la red, como una página web, una imagen, un archivo, etc. Tiene una estructura común que incluye varios componentes: Indica el tipo de comunicación Dominio o El propio nombre del Protocolo (http, https, ftp) nombre de host servidor (www.google.com) El puerto utilizado para la capa de transporte. Es opcional : si no se indica, se usa el Puerto puerto por defecto (80 para HTTP, 443 para HTTPS) Es el camino hasta el recurso concreto solicitado dentro de la web (por ejemplo, Ruta /ruta/pagina/archivo.html) Consulta o Son opcionales , y sirven para pedir información con parámetros (mediante ?) o fragmento hacer referencia a una sección del documento (con #). 4. Programación de protocolos HTTP Ejemplo 2 4.2. Programación con URL La clase URL en Java permite almacenar, como su nombre indica, una URL. Esta se debe instanciar a partir de una clase URI, mediante el método toURL() : URI uri = new URI("https://www.ejemplo.com:8080/ruta/archivo.html?param=valor#referencia”); URL url = uri.toURL(); Además, se dispone de varios métodos para obtener información sobre la URL: Devuelve el protocolo Devuelve el nombre de host url.getProtocol() url.getHost() de la url o de dominio de la url Devuelve el puerto (si Devuelve la ruta del archivo de la url.getPort() url.getFile() no se especifica, -1) url, incluyendo los parámetros url.getDefaultPort Devuelve el puerto Devuelve los parámetros de consulta url.getQuery() () por defecto (?), o null si no se especifican Devuelve la ruta sin Devuelve el fragmento de url.getPath() url.getRef() referencias (#), o null si no es parámetros especifican 4. Programación de protocolos HTTP Ejemplo 3 4.3. Programación de cliente HTTP Ya hemos visto cómo trabajar con DNS y URLs, por lo que podemos comenzar a programar un cliente que use el protocolo HTTP, permitiendo enviar solicitudes a un servidor y procesar las respuestas. Los pasos a seguir son: 1. Crear URL (como hemos visto anteriormente). HttpURLConnection conexion = 2. Abrir conexión HTTP con la URL (HttpURLConnection) url.openConnection(); conexion.setRequestMethod(“GET” 3. Configurar el método de solicitud (en este caso, GET) ); 4. Obtener el código de respuesta. El código de respuesta es un número entero. El código 200 significa que todo está correcto (OK). El resto de códigos se pueden comprobar en el siguiente enlace: Códigos HTTP int codigoRespuesta = conexion.getRespondeCode(); 5. Si la respuesta fue exitosa (200), se pueden leer los datos obtenidos mediante un InputStreamReader y BufferedReader, o solo un parámetro de la cabecera mediante: String parametroCabecera = conexion.disconnect( 6. Cerrar conexión conexion.getHeaderField(“ Parámetro ); ”); Ampliación Ejemplo 4 ¿De qué nos puede servir obtener el código HTML de un sitio web? Estos datos pueden ser analizados o procesados por parte del cliente para obtener información relevante. También se puede interactuar con el servidor enviando formularios (para ello se usaría POST en lugar de GET). Una posible aplicación más práctica y sencilla sería guardar todo el código en un archivo, con extensión.html , y abrir ese archivo en el navegador para visualizar la página. Todo esto se puede hacer desde Java. Lo podemos ver en un ejercicio resuelto. Esta parte de código será siempre igual, por lo que basta con copiarlo y aplicarlo en cada ejercicio. 4. Programación de protocolos HTTP 4.4. Programación de servidor HTTP Si el cliente HTTP obtenía una respuesta de un servidor (en este caso, uno ya existente), ahora vamos a crear un servidor HTTP que defina las respuestas que se quieren enviar. El proceso de creación de un servidor HTTP es inicialmente similar a cualquier ServerSocket, como los que vimos en el tema anterior. Simplemente hay que leer la solicitud que llega desde el cliente, y enviar la respuesta en formato HTTP. Estructura de una respuesta HTTP Línea de estado Versión Código Descripción Ejemplo: “HTTP/1.1 200 OK \r\n Salto de línea (\r\n ) Date: Tue, 01 Jan 2025 08:30:00 GMT \r\n Content-Type: text/html; charset=UTF-8 \r\n Parámetro: Valor Salto de línea Cabecera Content-Length: 120 \r\n Parámetro: Valor Más información \r\n Doble salto de línea (\r\n\r\n ) sobre las cabeceras Contenido de la respuesta puede Contenido ser código HTML, un archivo en …… el formato que corresponda… ” 4. Programación de protocolos HTTP Ejemplo 5 4.4. Programación de servidor HTTP Los pasos a seguir para programar el servidor HTTP son los siguientes: 1. Abrir servidor con ServerSocket, en el puerto que queramos ServerSocket servidor = new ServerSocket(8080); 2. Dentro de un bucle while infinito (para poder enviar múltiples respuestas), aceptar conexiones de clientes en un Socket Socket conexion = servidor.accept(); 3. Si es necesario, leer la solicitud recibida por el cliente mediante un BufferedReader 4. Crear la respuesta HTTP que se va a enviar al servidor, en formato String, con la estructura definida en la diapositiva anterior String respuesta HTTP = “HTTP/1.1 200 OK \r\n”+........; 5. Enviar la respuesta HTTP al cliente a través del Socket, usando un BufferedWriter o PrintWriter escritor.write(respuestaHTTP ); 6. Cerrar la conexión con el cliente conexion.close( ); 4. Programación de protocolos HTTP Ejemplo 6 4.4. Programación de servidor HTTP Además de este ejercicio simple, es interesante que nuestro servidor sea capaz de procesar diferentes tipos de respuesta según la ruta indicada por el cliente. Para ello, lo único que va a cambiar es cómo se va a formar la respuesta HTTP. Para ello: Se lee la primera línea de la solicitud del cliente. Esta primera línea siempre tendrá la siguiente estructura: MÉTODO RUTA VERSIÓN Como ya sabemos, esta línea se puede leer con un BufferedReader a partir de la conexión creada en el Socket, simplemente usando lector.readLine(). A continuación, nos interesa quedarnos solo con la ruta. Para ello, se separa la línea por espacios, y nos quedamos con el segundo elemento: String ruta = linea.split(“ “); Finalmente, mediante un switch…case , establecemos las distintas respuestas posibles, según cuál sea la ruta indicada. Cuando no se indique nada, la ruta será la raíz, es decir, /. Podemos establecer también una respuesta por defecto (default), en caso de que la ruta indicada no exista. En ese caso, la respuesta no contendrá el código 200 OK , sino 404 Not Found. Ampliación Ejemplo 7 Uso de la clase HttpServer en Java Aunque hemos visto cómo crear un servidor HTTP en Java de la forma más simple, que es leyendo la solicitud y enviando la respuesta manualmente, existe una librería en Java que permite una implementación más compleja de servidores HTTP. Gracias a esta librería com.sun.net.httpserver, y a su clase HttpServer, se pueden crear distintos contextos según la ruta indicada por parte del cliente. A cada contexto le corresponde una clase que implementa HttpHandler, que funciona como un manejador distinto para cada ruta. Aunque de momento nos basta con saber implementar un servidor de la forma más sencilla, también os dejo un ejemplo resuelto usando la clase HTTPServer, ya que para servidores más complejos puede resultar más útil.