Análisis de los protocolos TCP y UDP mediante la implementación de sockets en Java y C
1. RESUMEN
A continuación en el presente informe se mostrara los resultados obtenidos en el taller
de comunicación entre procesos. En el transcurso del taller se usan protocolos como lo
son TCP (Transmission Control Protocol) y UDP (User Datagram Protocol). A lo largo de la
práctica veremos algunas de sus características así como también veremos cómo da
soporte Java a UDP, tanto para envío unicast, como multicast, de igual manera para TCP.
También se mostrara los resultados de interoperabilidad, accediendo al servidor escrito en
Java mediante un cliente TCP desarrollado en lenguaje C.
2. INTRODUCCION
Hoy por hoy, los procesos que se ejecutan en una computadora necesitan obtener o
enviar información a otros procesos que se localizan en una computadora diferente, esto
se logra utilizando los protocolos de comunicación TCP y UDP.
UDP es un protocolo no orientado a conexión. O sea para efecto de ejemplo: cuando una
maquina A envía paquetes a una maquina B, el flujo es unidireccional. La transferencia de
datos es realizada sin haber realizado previamente una conexión con la máquina de
destino (maquina B), y el destinatario recibirá los datos sin enviar una confirmación al
emisor (la maquina A)
El protocolo TCP establece un conducto de comunicación punto a punto entre dos
computadoras, lo que quiere decir que cuando se solicita la transmisión de un flujo de
datos entre dos equipos, es decir a diferencia de UDP el TCP si es orientado a conexión, el
protocolo TCP implanta un conducto exclusivo entre dichos equipos para que los datos
sean transmitidos y este perdurará hasta que la transmisión haya finalizado, gracias a esto
TCP garantiza que los datos enviados de un extremo de la conexión lleguen al otro
extremo y en el mismo orden en que fueron enviados. Las características que posee TCP
hacen que el protocolo sea conocido como un protocolo orientado a conexión.
Finalmente, para establecer una comunicación entre estos procesos se emplean sockets,
los sockets forman el mecanismo para la entrega de paquetes de datos provenientes de la
tarjeta de red a los procesos o hilos apropiados. Un socket queda definido por un par de
direcciones IP local y remota, un protocolo de transporte y un par de números de puerto
local y remoto. Los sockets poseen un ciclo de vida dependiendo si son sockets de
servidor, que esperan a un cliente para establecer una comunicación, o socket cliente que
busca a un socket de servidor para establecer la comunicación.
3. Método experimental:
Para efectos del taller, se diseñó y desarrolló una interfaz gráfica sencilla usando Java
Swing. El cliente cuenta con un selector de protocolos: UDP, TCP y MultiCast: un spinner
para seleccionar la cantidad de mensajes, y una barra deslizante para seleccionar el
tamaño del paquete. Además, dos campos de texto: respuesta y mensaje, en el primero se
muestran las respuestas del servidor y en el segundo se le envían mensajes.
Para iniciar el programa, es necesario tener instalado el entorno el entorno de desarrollo
NetBeans en su versión 8.0 con una versión del Java SE Development Kit superior a la 8.31.
Para correr el código fuente en lenguaje C, se debe compilar en una maquina con el
sistema operativo Linux, para fines de la practica, se utilizo Virtual Box, un simulador de
sistemas operativos, cabe destacar que aunque no se use Linux de forma nativa en la
maquina, posee las mimas funcionalidades de red, por lo que no afecta la practica del
taller, el software se ejecuto en Linux debían 7.
Resultados
1. Socket UDP
Verifique si el servidor detecta la pérdida de mensajes enviados por el cliente.
Variando número de mensajes de acuerdo al viejo cono monetario nacional y el
tamaño en 8, 10, 20, 50 y 100 kb.
La primera prueba consiste en enviar un conjunto de paquetes desde el cliente hasta el
servidor y determinar cuantos paquetes han llegado satisfactoriamente.
Es importante destacar la ubicación del cliente y el servidor, ya que pueden tener distintos
resultados cuando el servidor y el cliente están ubicados en la misma maquina que cuando
están en equipos separados.
Comenzamos realizando la prueba de conexión en la misma maquina, enviando 20
mensajes y variando en cada iteración el tamaño de cada mensaje.
4. Figura 1. Estado inicial del servidor y el cliente antes de la prueba en la misma maquina, a
la izquierda la ventana del cliente y la derecha el servidor, configurado para enviar 20
paquetes de 8kb de tamaño.
Luego de la prueba, el servidor recibió los 20 paquetes de prueba exitosamente, el cliente
luego de enviar el paquete fue respondido de forma inmediata por el servidor.
Figura 2. Estado final del servidor y el cliente después de la prueba en la misma maquina.
Se obtuvo el mismo resultado al variar el tamaño de los paquetes.
5. Modifique el programa cliente para leer repetidamente una entrada de usuario.
Envíe esta entrada al servidor y adapte el código del servidor para responder al
cliente. Establezca un tiempo de espera (timeouts) en el socket para que el cliente
se entere cuando el servidor no responde.
Para comprobar el tiempo de espera del cliente, se envió un mensaje con el servidor
desconectado.
Figura 3. Prueba de tiempo de espera, el cliente (la ventana izquierda) luego de 30
segundos de haber enviado el paquete, notificara al usuario de que el mensaje no se pudo
entregar.
Finalmente se comprueba si un mensaje llega exitosamente al servidor.
6. Figura 4. Prueba de mensajes, el cliente (la ventana izquierda) envía un mensaje al
servidor, el servidor recibirá el mensaje y enviara una respuesta para notificar al cliente
que su mensaje fue recibido.
2. Socket TCP
Modifique los programas TCPClient y TCPServer para que el cliente lea
repetidamente varias entradas de usuario de una línea y los escriba en el stream
de datos del cliente. El servidor recibe el stream de datos e imprime el resultado
de cada lectura.
Luego hacer las modificaciones necesarias de los códigos adjuntados para resolver las
peticiones de dicho taller presentamos los siguientes resultados:
El funcionamiento de los Socket que necesitamos para una conexión TCP consta de dos
componentes, en el que podemos distinguir dos tipos de Socket el del Servidor y el del
Cliente.
-Servidor: Para crear los socket se crea un objeto del tipo TCPServer, una vez que hemos
creado el objeto mandamos un parámetro que indicará el puerto por el que se realzará las
comunicaciones.
-Cliente: Para crear los socket se crea un objeto del tipo TCPlient, le indicamos donde se va
a ejecutar el cliente, en nuestro caso indicamos que será en “localhost”.
Para establecer una conexión se fija el protocolo que se desea emplear mediante el
selector de protocolos, en este caso el protocolo usado es el TCP, una vez que se inicia el
servidor el siguiente paso es hacer lo mismo con el cliente, como se puede apreciar en la
figura 1, el cliente establece una conexión satisfactoria con el servidor ejecutado.
7. Figura 1.
Se procede a hacer la prueba enviando varios mensajes, haciendo que el cliente lea varios
mensajes repetidamente, cada vez más largos que son enviados por el stream de datos, el
servidor recibe todos los mensajes y muestra el resultado de cada lectura, como se puede
evidenciar en la figura 2 y 3.
8. Figura 2.
Figura 3.
3. UDP Multicast
Use el programa MultiCastPeer con los mismos datos usados en el ejercicio 1, para
establecer las condiciones bajo las cuales un mensaje es perdido por alguno de los
miembros del grupo de multidifusión. Modifique el programa para que el proceso de
envío sea múltiple.
En este apartado podemos darnos cuenta que el Multicast o Multidifusión es un método de
direccionamiento IP. Una dirección multicast está afiliada con un conjunto de receptores
interesados , el emisor envía un único datagrama a la dirección multicast y el router se encargará
de hacer copias y enviarlas a todos los receptores que hayan informado de su interés por los datos
de ese emisor.
Para ingresar a un grupo se utiliza: joinGroup(InetAddress mcastaddr) así, el socket
pertenecerá a un grupo de multidifusión en un puerto dado y recibirá los datagramas
enviados por los procesos en otros computadores a ese grupo en ese puerto. De la misma
manera se puede dejar un grupo invocando el método leaveGroup(InetAddress
mcastaddr) de su socket multicast.
Para enviar datos se emplea el método send(DatagramPacket p, byte ttl), este método es
muy equivalente al de la clase DatagramSocket, la diferencia es que este datagrama será
enviado a todos los miembros del grupo multicast.
Y finalmente para recibir datos de un grupo multicast se utiliza el método
receive(DatagramPacket p) de la clase DatagramSocket superclase de MulticastSocket.
9. Para esta prueba basta con ejecutar varios clientes, se conectan todos al mismo destino,
por lo que cada mensaje que se envie llegara para todos los sockets conectados al grupo,
como se puede evidenciar en la figura 4.
Figura 4.
4. Multiplataforma:
Programe un cliente en lenguaje c, plataforma linux, y verifique interoperabilidad
con los servidores de las actividades 1 y 2.
Programe un nodo en lenguaje c, plataforma linux, y agregue al grupo de
multidifusión en activida 3
Para la prueba de interoperabilidad, se creo un cliente TCP para ejecutarse en una
maquina con Linux.
Desde la maquina nativa Windows, se inicio el servidor TCP desarrollado en Java, mientras
que en Linux Debian se trato de establecer una conexión desde el cliente desarrollado en
C.
Se pudo confirmar una conexión exitosa entre el cliente y el servidor, independiente de su
plataforma o lenguaje desarrollado, ambos pudieron conectarse y también comunicarse
sin problemas.
11. CONCLUSION
UDP no establece una conexión entre el cliente y el servidor, sino que estos se
comunican a través de paquetes enviados entre si.
En UDP, Para confirmar que un paquete fue entregado desde el cliente al servidor,
el servidor debe de estar siempre a la espera de nuevos paquetes, y al recibir
alguno, reenviar otro paquete para confirmar al cliente que su paquete fue
recibido. El cliente por su parte después de enviar el paquete debe
inmediatamente estar a la espera del paquete.
Debido a que la llamada al método para recibir paquetes en UDP es bloqueante
(no se ejecutara ninguna línea de código hasta haber recibido el paquete),
normalmente se establece un tiempo de espera al cliente para evitar bloqueos
extensos.
TCP establece una conexión entre el cliente y el servidor, siendo más segura que el
UDP. Sin embargo siendo más lenta que el UDP.
A diferencia del UDP, TCP maneja conexiones de flujo de datos entre el cliente y el
servidor.
El rol del servidor TCP es estar siempre a la escucha de nuevas peticiones de
conexión, una ves recibida una petición, el servidor debe crear un hilo o thread
para el nuevo cliente. Este hilo tendrá como objetivo estar a la espera de nuevos
mensajes, y responderlos apropiadamente.
UDP Multicast tiene como objetivo realizar transmisión de información sin
importar el destinatario.
Un cliente multicast es tanto cliente como servidor a la vez.
Cuando un cliente multicast envía un mensaje, todos aquellos que estén
conectados a la red multicast recibirán el mensaje.
Se pueden establecer conexiones y comunicación entre distintos sockets
independientes del sistema operativo en el que estén ejecutándose o el lenguaje
de programación en el que se hayan desarrollado.