UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO Departamento Académico de Informática REDES Y TELECOMUNICACIONES 2 Lab 01: Programación de Sockets en TCP Ingº Manuel Peñaloza Figueroa Dime y lo olvidaré. Muéstrame y lo recordaré. Involúcrame y lo entenderé Proverbio chino 1. OBJETIVOS: 1.1 Entender lo básico de la comunicación por redes. 1.2 Programar aplicaciones de red usando sockets. 1.3 Aprender como construir aplicaciones cliente/servidor que se comunican usando sockets 1.4 Aprender el uso de sockets en Java. 2. BASE TEORICA COMPLENTARIA Capa de Transporte: - Puede ofrecer a sus usuarios un sistema transparente de intercambio de datos confiable, operando de extremo a extremo (end-to-end). - La capa de transporte es la responsable por la entrega proceso-a-proceso la entrega de un paquete, la parte de un mensaje, desde un proceso a otro.
TCP: Transmission Control Protocol - RFC 793 - Transporte/Servicio orientado a la conexión - Protocolo de transporte de Internet - Transferencia de datos full-dúplex - Transporte confiable: Control: o de transmisión o de flujo o de errores o de congestión de red o... - Provee servicio a la capa de aplicación - Adaptable a LAN/WAN - Transferencia de un stream de bytes entre sistemas finales (end-to-end) - - Cuando 2 aplicaciones desean comunicarse el uno al otro confiablemente, ellos establecen una conexión y envían datos de una parte a la otra sobre esa conexión. - TCP provee un canal punto-a-punto para aplicaciones que requieren comunicaciones confiables. o HTTP (HyperText Transfer Protocol), FTP (File Transfer Protocol), y Telnet son algunos ejemplos de aplicaciones que requieren un canal de comunicación confiable. o El orden en la cual los datos son enviados y recibidos sobre la red es crítico para el éxito de estas aplicaciones. o Cuando HTTP es usado para leer desde un URL, los datos tienen que ser recibidos en el orden en el cual fueron enviados. De otra manera, se acabaría con un archivo HTML revuelto, un archivo ZIP corrupto, ó alguna otra información inválida. Puertos: - En general, una computadora tiene una simple conexión física a la red. o Todos los datos destinados a una computadora en particular llega a través de esa conexión. o Sin embargo, los datos puede ser pretendidos por diferentes aplicaciones
o corriendo en el mismo computador. Así como la computadora sabe a cual aplicación reexpedir los datos? A través del uso de los puertos - Cada proceso que desea comunicarse con otro proceso se identifica a si mismo para la suite de protocolos TCP/IP por 1 ó más puertos. - Los datos trasmitidos por el Internet están acompañados por información de direccionamiento que identifica a la computadora y al puerto para el cual están destinados. o o La computadora está identificada por su dirección IP de 32-bit. Los puertos son identificados por un número de 16-bit, los cuales TCP y UDP usan para entregar los datos a la aplicación correcta. - Hay 2 tipos de puertos: o "Well-known" ó bien-conocidos: 0: reservado 1 1023: procesos servidor o Efímeros: 1023-65535: usuarios, clientes - Sin embargo, el IETF IANA define 3 rangos de puertos: o Puertos Well-Known ó bien-conocidos rango: 0 1023 son asignados por el IANA o Puertos Registrados rango: 1024 49151 no deberían ser usados sin el registro del IANA o Puertos Dinámicos y/o Privados rango: 49152 65535 típicamente usados como puerto fuente por clientes TCP ó UDP. Socket: - una interface: o en el host local o creada por la aplicación o controlada por el SO (una "puerta") dentro de la cual el proceso de aplicación puede tanto enviar como recibir mensajes a/desde otro proceso de aplicación
- Conexiones: o Normalmente, un servidor corre sobre una computadora específica y tiene un socket que está LIGADO al número de puerto respectivo. o El servidor justamente espera, escuchando al socket por un cliente haga una petición de conexión. o En el lado del cliente: el cliente sabe el nombre_de_host de la máquina en el cual el servidor está corriendo y el número de puerto en el cual el servidor esta escuchando. Para hacer una petición de conexión, el cliente intenta citarse con el servidor en la máquina y puerto del servidor. El cliente también necesita identificar a si mismo al servidor así se liga a un puerto local que usará durante la conexión (el número de puerto es usualmente asignado por el sistema). o Si todo va bien, el servidor acepta la conexión. A la aceptación, el servidor obtiene un nuevo socket ligado a su mismo puerto local y también tiene su socket seteado a la dirección y puerto del cliente. El servidor necesita este nuevo socket a fin de poder continuar escuchando en el socket original por peticiones de conexión de otros clientes mientras atiende ó sirve a las necesidades del cliente conectado.
o o En el lado del cliente, si la conexión es aceptada, un socket es satisfactoriamente creado y el cliente puede usar este socket para comunicarse con el servidor. El cliente y el servidor pueden ahora comunicarse con escribir A ó leer DESDE sus sockets. - El par <dirección IP>, <Nº de puerto> brinda una identificación única para los servicios de capa de aplicación en un host, y sirve para identificar a un socket. o Cada lado de una conexión TCP tiene un socket que puede ser identificado por: la 3-tupla <TCP, dirección IP, # puerto> ó la 2-tupla <dirección IP, # puerto>. o Si 2 procesos están comunicándose sobre TCP, ellos tienen una conexión lógica que es de una manera única identificable por los 2 sockets involucrados, esto es, por: una 5-tupla <TCP, dirección IP local, # puerto local, dirección IP remota, # puerto remoto> ó una 4-tupla <dirección IP local, # puerto local, dirección IP remota, # puerto remoto>. o Entonces, una conexión TCP está identificada por un par de sockets (el del cliente y el del servidor) en ambos extremos. 3. RECURSOS Los recursos a utilizar en el trabajo de laboratorio son: 3.1 Java 4. DESARROLLO DE LA PRACTICA: En el presente trabajo de laboratorio se visualizará el estado de las conexiones TCP y se implementará tanto un cliente que envía datos en minúscula a un servidor, como un servidor que recibe datos en minúscula desde un cliente y lo devuelve de regreso pero en mayúsculas haciendo uso del lenguaje Java. 4.1 Estado de las conexiones TCP: - abrir una ventana DOS - en el Prompt de comandos tipear: netstat o muestra las conexiones, puertos de escucha, estado de las conexiones y
estadísticas por protocolo (-a) 4.2 Escribir una aplicación cliente/servidor que implemente el servicio CAMBIAR DATOS EN MINUSCULAS A MAYUSCULAS. - En la programación de sockets, la estructura del programa es en mucho el mismo: Abrir un socket Abrir un stream de entrada y un stream de salida para el socket. Leer desde y escribir hacia el stream conforme al protocolo del servidor. Cerrar los streams. Cerrar el socket. - Ejemplo: aplicación cliente-servidor: APLICACIÓN CLIENTE: 1. Pre-condición: El proceso servidor debe estar 1ro. en ejecución 2. Cliente lee la línea desde la entrada estándar (stream indesdeusuario), y lo envía al server vía socket (stream outalserver) 3. El servidor lee la línea desde el socket. 4. El server convierte la línea a mayúsculas, lo envía de regreso al cliente 5. Cliente lee, imprime la línea modificada desde el socket (indesdeserver)
- APLICACIÓN SERVIDOR Y CLIENTE: -
APLICACIÓN CLIENTE: ClienteTCP.java /* */ import java.io.*; import java.net.*; class ClienteTCP { public static void main(string argv[]) throws Exception { // variables String sentencia; String sentenciamodificada; // crear un stream de entrada para la entrada del usuario BufferedReader indesdeusuario = new BufferedReader(new InputStreamReader(System.in)); // crear socket cliente y conectarse al server Socket socketcliente = new Socket("id_Servidor", 6789); // crear un stream de salida ligado al socket DataOutputStream outalservidor = new DataOutputStream(socketCliente.getOutputStream()); // crear un stream de entrada ligado al socket BufferedReader indesdeservidor = new BufferedReader(new InputStreamReader(socketCliente.getInputStream())); // leer entrada sentencia = indesdeusuario.readline(); // enviar la entrada al server outalservidor.writebytes(sentencia + '\n'); // leer paquete de réplica del server sentenciamodificada = indesdeservidor.readline(); System.out.println("RESPUESTA DESDE EL SERVER: " + sentenciamodificada); // cerrar socketcliente.close(); } } APLICACIÓN SERVIDOR: ServidorTCP.java /* */
import java.io.*; import java.net.*; class ServidorTCP { public static void main(string argv[]) throws Exception { String sentenciacliente; String sentenciaenmay; // crear el socket servidor (TCP) en el puerto 6789 ServerSocket socketservidor = new ServerSocket(6789); while(true) { // el socket servidor espera, escuchando por contacto por el cliente, // si lo acepta un nuevo socket es creado y la conexión es hecha Socket socketconexion = socketservidor.accept(); // crear un stream de entrada ligado al socket BufferedReader indesdecliente = new BufferedReader( new InputStreamReader(socketConexion.getInputStream())); // crear un stream de salida ligado al socket DataOutputStream outalcliente = new DataOutputStream(socketConexion.getOutputStream()); // leer el mensaje desde el socket sentenciacliente = indesdecliente.readline(); // construir respuesta sentenciaenmay = sentenciacliente.touppercase() + '\n'; } } } // escribir el mensaje al socket outalcliente.writebytes(sentenciaenmay); - En Windows abrir 2 ventanas DOS, e ir al directorio donde se encuentran los programas fuente. - Si necesario, en ambas ventanas, establecer la ruta al compilador y al intérprete de Java SET PATH=%PATH%;C:\Archivos de programa\java\jdk1.6.0\bin - En cada ventana, compilar el correspondiente archivo de Java javac ClienteTCP.java javac ServidorTCP.java - En la ventana del servidor ejecutar la aplicación servidor java ServidorTCP
- En la ventana del cliente ejecutar la aplicación cliente. java ClienteTCP - (comentarios) 5. CONTROL: TRABAJOS DE LABORATORIO. 5.1 Investigar y documentar en netstat las opciones: -n, -r, -b 5.2 Investigar y documentar en netstat opciones sobre las interfaces presentes en la PC. 5.3 La asistencia al laboratorio se considera como tal si se cumple con lo solicitado en 4.