Professional Documents
Culture Documents
Introducción
En los protocolos TCP/IP la capa de transporte proporciona dos servicios básicos, orientado a conexión (a
través del protocolo TCP) y no orientado a conexión a través del protocolo UDP (User Datagram Protocol). En
este práctico se realizarán programas utilizando el protocolo UDP.
El servicio prestado por UDP es de entrega de datagramas sin conexión, este servicio es “no confiable” ya que
los datagramas pueden perderse, duplicarse o corromperse en el viaje a su destino y UDP no hace nada para
solucionar o mejorar estas dificultades. Si se decide trabajar con el protocolo UDP los controles hay que
realizarlos en capas superiores.
El protocolo esta organizado en bloques de 32 bits, el primer bloque corresponde a los puertos origen y destino,
el segundo bloque comprende los campos de longitud y suma de comprobación.
Un Datagrama UDP se encapsula en un protocolo IP. La comunicación se realiza de la siguiente forma: una
aplicación genera un datagrama UDP con los datos del usuario y lo envía a otra aplicación en un host remoto.
Si por alguna razón el datagrama no llega, o llega con errores, el Software UDP no realiza ninguna corrección.
El protocolo IP puede transportar datagramas UDP de distintas aplicaciones entre dos host (dos aplicaciones en
el host origen y dos en el host destino) por esto se requiere identificar la aplicación para conocer donde hay que
entregar los datos, UDP conoce a que aplicación debe entregar los datos identificándola con un número de
puerto.
UDP utiliza el puerto destino para realizar la demultiplexación. El proceso receptor del mensaje utiliza un
conector (un socket por ejemplo) enlazado a un puerto, este conector puede realizar operaciones de envío y
recepción de datagramas, la operación de recepción espera a recibir un datagrama a través del puerto donde
esta enlazado el conector. Si al llegar un datagrama UDP se detecta que el puerto de destino no esta enlazado
a un conector, el datagrama se descarta. El nivel UDP demultiplexa los datagramas según el puerto destino.
La figura muestra : el software IP pasa los datos (datagrama UDP) al software UDP, el software UDP válida el
datagrama y lo envía al puerto de destino, el puerto de destino esta enlazado con un conector, la aplicación
utiliza el conector para realizar la operación de ”recibir”.
Una aplicación puede acceder al servicio de UDP utilizando la Interfaz Socket. Las clases de Java que se
utilizan para realizar aplicaciones en red están agrupadas en un “Paquete” el pakage java.net. La interfaz
Socket se implementa con varias clases entre las que están : Socket, SocketServer, DatagramSocket
DatagramPacket, en este practico utilizaremos, entre otras, las correspondientes a UDP.
La clase DatagramPacket modela un Datagrama UDP, al crear un objeto DatagramPacket se crea un Paquete
UDP,
Ejercicio A
Crear un programa en Java para armar un Datagrama UDP y luego mostrar los datos del datagrama, los datos
de:
HOST (donde se enviará el datagrama )
PUERTO (puerto donde lee la aplicación remota)
DATOS (datos en el datagrama)
se obtienen desde la línea de comandos.
Por ejemplo: el siguiente programa “ArmarUDP” construye y muestra los datos del datagrama :
Buf : es un array de bytes cuyo contenido son los datos del datagrama
Length : es la longitud de los datos
Address : es la direccon de destino del datagrama
Port : es el puerto de destino.
Existen otros constructores que usted deberá verificar en la documentación de Java accediendo a :
http://java.sun.com
Observe que los datos de un datagrama UDP son del tipo array de bytes, por esto, hay que transformar los
datos de usuario de cualquier formato a un array de bytes para poder crear el Datagrama, afortunadamente
Java proporciona métodos para realizar esta transformación como se verá el la siguiente sección.
Observe también que el constructor requiere una dirección Internet ( InetAddress ) para crear el datagrama. El
protocolo UDP no tiene entre sus campos la dirección de destino, pero la suma de comprobación se calcula en
función de una pseudo cabecera que involucra la dirección IP origen y IP destino.
- Identificador 1 byte
- Número de secuencia 1 byte
- Datos 50 bytes
El identificador se utiliza para identificar a los mensajes largos, y diferenciarlos de otros mensajes fragmentados
al mismo host. El número de secuencia identifica el fragmento del mensaje.
En Java este protocolo se puede modelar con una clase, la clase diseñada de ejemplo incorpora un constructor
para crear el mensaje, un método que retorna un array de bytes ( para encapsular en un paquete UDP) y un
segundo Método constructor para transformar un array de byte (proveniente de un paquete UDP) en un MSSP.
Ejercicio B
B.a) Programa la clase MSSP, agregar a la clase métodos para setear (set) y obtener el mensaje, también
métodos set y get para el ID y el número de secuencia.
B.b) Utilizando la clase anterior realizar un programa para crear protocolos MSSP‘s, correspondientes a un
mensaje dividido en tres partes, el mensaje se identifica con el número “8”, las tres partes tienen números de
secuencia consecutivos, 1, 2, 3. Utilizar el método programados en el ejercicio anterior para mostrar los campos
de los tres protocolos MSSP.
// atributos de la clase
byte id_msn;
byte sec_msn;
String msn;
Ejercicio C
C.a) Agregar a la clase anterior métodos para setear (set) y obtener el mensaje (atributo “msn” de la clase),
también métodos set y get para el ID y el número de secuencia. (en total 6 métodos).
Ing. Ulises M. A. Rapallini - 5
Facultad Regional Concepción del Uruguay
Ingeniería en sistemas de información
Redes de información 4to año
C.b) Utilizando la clase anterior realizar un programa para crear protocolos MSSP‘s, correspondientes a un
mensaje dividido en tres partes, el mensaje se identifica con el número “8”, las tres partes tienen números de
secuencia consecutivos, 1, 2, 3. Utilizar los método programados en el ejercicio anterior para mostrar los
campos de los tres protocolos MSSP.
La clase DatagramSocket tiene varios Constructores que se utilizan con eventos diferentes, uno de ellos es:
DatagramSocket(int port)
Constructs a datagram socket and binds it to the specified port on the local host machine.
Esta clase proporciona métodos para “setear” y obtener : los datos del Socket, la dirección Internet y Puerto de
origen, la dirección Internet y puerto destino, el tamaño de los buffer de envío y recepción, el tiempo de
TimeOUT del datagrama. El Siguiente ejemplo muestra la utilización de estos métodos.
Aquí se realiza una conexión al host local para poder mostrar la dirección de destino y el puerto de destino, si
no se realiza esta conexión el socket queda inactivo hasta el envío de algún mensaje. En realidad el socket
UDP no establece conexiones, en este caso solo envía un mensaje para verificar que el puerto esta libre y todo
funciona correctamente.
try {
int port_local = 80;
DatagramSocket ds = new DatagramSocket(port_local);
ds.setReceiveBufferSize(800);
ds.setSendBufferSize(800);
ds.setSoTimeout(100);
ds.connect( InetAddress.getByName("127.0.0.0"), 81);
System.out.println("Dir Remota:"+ds.getInetAddress());
System.out.println("Puerto Remoto:"+ds.getPort());
Ejercicios D
Crear un Socket UDP, “setear” el tamaño del buffer de envío y de recepción, también activar el TimeOUT del
socket a 1000 milisegundos. Imprimir el estado del socket,
Por razones de claridad en el programa no se muestra la declaración ni la creación del objeto paqueteUDP, fue
creado como se indica más arriba. Este simple programa envía un datagrama UDP.
El siguiente segmento de programa muestra como se crea un datagrama, se crea un socket UDP y se envía al
host “www.google.com” al puerto 80.
}
catch(Exception e) {
System.out.println(e);
}
}
El programa muestra solo la parte de recepción del socket, tome en cuenta que no esta la creación del
socket, tampoco se muestran las variables de la clase donde esta la variable final LON_MAX.
El constructor que se utiliza para la clase DatagramPacket es diferente que el usado anteriormente para el
envío, este recibe un buffer array de bytes que se utiliza solo para crear un DatagramPaquet Vacio.
El método receive( pkg) requiere de un DatagramPacket “vacío” para cargar en él el paquete recibido. Observe
que el array de bytes que se crea para el paquete no se utiliza para otra cosa, los datos recibidos se deben
obtener con el método getData() y asignar en un array de bytes distinto al creado para el DatagramPacket.
En el programa no se indica en que puerto se leen los datos, esto se indica cuando se crea el socket con el
constructor:
Ejercicio E
Crear un programa que lee en el puerto 80 de su host paquetes UDP, transforme los datos de array de bytes a
String y muestre el String por consola.
Ejercicio F
Utilizando la clase MSSP realice dos aplicaciones una para enviar mensajes y otra para recibir mensajes.