2. DEFINICIÓN: CONCEPTO Y
ESTRUCTURA
• UN DATAGRAMA ES UN FRAGMENTO DE
PAQUETE (ANÁLOGO A UN TELEGRAMA)
QUE ES ENVIADO CON LA SUFICIENTE
INFORMACIÓN PARA QUE LA RED PUEDA
SIMPLEMENTE ENCAMINAR EL
FRAGMENTO HACIA EL EQUIPO TERMINAL
DE DATOS RECEPTOR, DE MANERA
INDEPENDIENTE A LOS FRAGMENTOS
2
RESTANTES.
4. 4
Te va todo
esto
a quién le importa
sólo envíalo lo
a quién le importa
sólo envíalo lo
más rápido
más rápido
Los datagramas también son la agrupación lógica de información que se
envía como una unidad de capa de red a través de un medio de
transmisión sin establecer con anterioridad un circuito virtual. Los
datagramas IP son las unidades principales de información de Internet.
5. USER DATAGRAM PROTOCOL
(UDP)
• ES UN PROTOCOLO DEL NIVEL DE TRANSPORTE BASADO EN
EL INTERCAMBIO DE DATAGRAMAS (PAQUETE DE DATOS).
• PERMITE EL ENVÍO DE DATAGRAMAS A TRAVÉS DE LA RED SIN
QUE SE HAYA ESTABLECIDO PREVIAMENTE UNA CONEXIÓN,
YA QUE EL PROPIO DATAGRAMA INCORPORA SUFICIENTE
INFORMACIÓN DE DIRECCIONAMIENTO EN SU CABECERA.
• TAMPOCO TIENE CONFIRMACIÓN NI CONTROL DE FLUJO, POR
LO QUE LOS PAQUETES PUEDEN ADELANTARSE UNOS A
OTROS.
• TAMPOCO SE SABE SI HA LLEGADO CORRECTAMENTE, YA
QUE NO HAY CONFIRMACIÓN DE ENTREGA O RECEPCIÓN.
5
6. ENRUTAMIENTO
ENRUTAR ES EL PROCESO DE SELECCIÓN DE UN
CAMINO PARA EL ENVÍO DE PAQUETES. LA
COMPUTADORA QUE HACE ESTO ES LLAMADA
ROUTER.
En general se puede dividir el
enrutamiento en Entrega Directa y
Entrega Indirecta. La Entrega Directa es
la transmisión de un Datagrama de una
maquina a otra dentro de la misma red
física. La Entrega Indirecta ocurre
cuando el destino no está en la red
local, lo que obliga al Host a enviar el
Datagrama a algún Router intermedio
Puertos UDP utiliza puertos para permitir la comunicación entre
6
aplicaciones. El campo de puerto tiene una longitud de 16 bits, por lo que
el rango de valores válidos va de 0 a 65.535.
7. EL PROTOCOLO UDP
(USERDATAGRAM PROTOCOL)
ES UN PROTOCOLO NO ORIENTADO A
CONEXIÓN DE LA CAPA DE TRANSPORTE DEL
MODELO TCP/IP, LO QUE SIGNIFICA QUE NO
GARANTIZA NI LA ENTREGA DE PAQUETES NI
QUE LOS PAQUETES LLEGUEN EN ORDEN
SECUENCIAL, DONDE EL CONTROL SOBRE EL
DESTINO FINAL DE UN PAQUETE UDP RECAE
EN EL EQUIPO QUE LO ENVÍA.
7
8. UN SOCKET
ES UNA REFERENCIA INDIRECTA A UN PUERTO PARTICULAR USADA POR EL PROCESO
RECEPTOR EN LA MÁQUINA RECEPTORA.
LOS SOCKETS UDP PUEDE RECIBIR DATOS DE MÁS DE UN HOST. SI HAY VARIAS MÁQUINAS
ºDEBE HABER COMUNICACIÓN, ENTONCES UDP PUEDE SER MÁS CONVENIENTE QUE OTROS
MECANISMOS COMO TCP.
º
8
9. COMUNICACIÓN BASADA EN
DATAGRAMAS
UN DATAGRAMA ES TRANSMITIDO ENTRE PROCESOS CUANDO
UN PROCESO LO ENVÍA Y OTRO PROCESO LO RECIBE.
CUALQUIER PROCESO QUE NECESITE ENVIAR O RECIBIR
MENSAJES DEBE EN PRIMER LUGAR CREAR UN SOCKET A UNA
DIRECCIÓN DE HOST Y UN PUERTO LOCAL.
UN SERVIDOR ENLAZARÁ ESE SOCKET A UN PUERTO SERVIDOR
– IDENTIFICANDO AL CLIENTE DE MANERA QUE PUEDAN ENVIAR
MENSAJES AL MISMO. UN CLIENTE ENLAZA SU SOCKET A
CUALQUIER PUERTO LOCAL LIBRE. EL MÉTODO RECEPTOR
DEVUELVE LA HOST Y EL PUERTO DEL EMISOR, ADEMÁS DEL
MENSAJE, PERMITIENDO A LOS RECEPTORES ENVIAR 9
UNA
RESPUESTA.
10. Las clases Java para establecer comunicaciones mediante datagramas
son:
1.java.net.DatagramPacket
10
Permite enviar o recibir paquete
2. java.net.DatagramSocket
Permite crea un socket de datagrama, con destino al puerto x
11. MÉTODOS
• INETADDRESS GETADDRESS() - DEVUELVE LA DIRECCIÓN IP DESDE QUE
UNDATAGRAMPACKET FUE ENVIADO, O (SI EL PAQUETE VA A SER ENVIADO A UNA MÁQUINA
REMOTA), LA DIRECCIÓN IP DE DESTINO.
• BYTE [] GETDATA () - DEVUELVE EL CONTENIDO DE LA DATAGRAMPACKET, REPRESENTADO
COMO UNA MATRIZ DE BYTES.
• INT GETLENGTH INT () - DEVUELVE LA LONGITUD DE LOS DATOS ALMACENADOS EN UN
DATAGRAMPACKET. ESTO PUEDE SER MENOR QUE EL TAMAÑO REAL DEL BÚFER DE DATOS
• INT GETPORT () - DEVUELVE EL NÚMERO DE PUERTO DESDE DONDE SE ENVIÓ UN
DATAGRAMPACKET, O (SI EL PAQUETE VA A SER ENVIADO A UNA MÁQUINA REMOTA), EL
NÚMERO DE PUERTO DE DESTINO.
• SETADDRESS (INETADDRESS ADDR) - ASIGNA UNA NUEVA DIRECCIÓN DE DESTINO A UN
DATAGRAMPACKET.
• SETDATA (BYTE [] BUFFER) - ASIGNA UN BUFFER DE DATOS NUEVOS A LA DATAGRAMPACKET.
11
• SETLENGTH (INT LENGTH) - ASIGNA UNA NUEVA LONGITUD DE LA DATAGRAMPACKET.
• SETPORT (INT PORT) - ASIGNA UN PUERTO DE DESTINO A UN NUEVO DATAGRAMPACKET.
12. • JAVA PROPORCIONA CLASES PARA DAR SOPORTE A LA
COMUNICACIÓN VÍA DATAGRAMAS UDP, TODAS ELLAS
CONTENIDAS EN EL PAQUETE JAVA.NET.
• ESTAS CLASES SON
• DATAGRAMSOCKET,
• DATAGRAMPACKET
12
13. CLASE DATAGRAMSOCKET
• LA CLASE DATAGRAMSOCKET PROPORCIONA ACCESO A
UN SOCKET UDP, LO QUE PERMITE QUE LOS PAQUETES
UDP PUEDAN SER ENVIADOS Y RECIBIDOS.
• EL MISMO DATAGRAMSOCKET PUEDE SER USADO PARA
RECIBIR LOS PAQUETES TANTO COMO PARA ENVIARLOS.
13
14. • DatagramSocket(): constructor sin argumentos que
permite que el sistema elija un puerto entre los que
estén libres y selecciona una de las direcciones
locales.
• DatagramSocket(int port): constructor que toma un
número de puerto como argumento, apropiado para
los procesos que necesitan un número de puerto
(servicios).
• DatagramSocket(int port, InetAddress laddr):
constructor que toma como argumentos el número
14
de puerto y una determinada dirección local.
DatagramSocket:
maneja sockets para enviar y recibir datagramas
UDP. Proporciona tres constructores:
15. MÉTODOS DE LA CLASE
DATAGRAMSOCKET
• SEND(DATAGRAMPACKET P) Y RECEIVE(DATAGRAMPACKET P): ESTOS
MÉTODOS SIRVEN PARA TRANSMITIR DATAGRAMAS ENTRE UN PAR DE
CONECTORES. EL ARGUMENTO DE SEND ES UNA INSTANCIA DE
DATAGRAMPACKET CONTENIENDO EL MENSAJE Y EL DESTINO. EL
ARGUMENTO DE RECEIVE ES UN DATAGRAMPACKET VACÍO EN EL QUE
COLOCAR EL MENSAJE, SU LONGITUD Y SU ORIGEN.
• SETSOTIMEOUT(INT TIMEOUT): ESTE MÉTODO PERMITE ESTABLECER
UN TIEMPO DE ESPERA LÍMITE. CUANDO SE FIJA UN LÍMITE, EL
MÉTODO RECEIVE SE BLOQUEA DURANTE EL TIEMPO FIJADO Y
DESPUÉS LANZA UNA EXCEPCIÓN INTERRUPTEDIOEXCEPTION
• CONNECT(INETADDRESS ADDRESS, INT PORT): ESTE MÉTODO SE
UTILIZA PARA CONECTARSE A UN PUERTO REMOTO Y A UNA
DIRECCIÓN INTERNET CONCRETOS, EN CUYO CASO EL CONECTOR
SÓLO PODRÁ ENVIAR Y RECIBIR MENSAJES DE ESA DIRECCIÓN. 15
16. ENVIAR Y RECIBIR LOS DATAGRAMPACKET
PARA ENVIAR EL DATAGRAMPACKET, DEBEMOS LLAMAR AL MÉTODO
SEND() DE DATAGRAMSOCKET PASANDO COMO PARÁMETRO EL
DATAGRAMPACKET QUE ACABAMOS DE CREAR.
ENVIAR DATAGRAMPACKET
SOCKET.SEND(DATO);
•PARA RECIBIR, IGUAL PERO CON SOCKET.RECEIVE().
RECIBIR DATAGRAMPACKET
SOCKET.RECEIVE(DATO);
16
17. MÉTODOS
• CLOSE() - CIERRA UN SOCKET, Y SE DESLIGA DEL PUERTO LOCAL.
• CONNECT (INETADDRESS REMOTE_ADDR REMOTE_PORT INT) – RESTRINGE EL ACCESO A LA DIRECCIÓN
ESPECIFICADA A DISTANCIA Y EL PUERTO.
• DISCONNECT() - DESCONECTA EL DATAGRAMSOCKET.
• INETADDRESS GETINETADDRESS () - DEVUELVE LA DIRECCIÓN REMOTA A LA QUE EL SOCKET ESTÁ CONECTADO, O
NULL SI NO EXISTE NINGUNA TAL CONEXIÓN.
• INT GETPORT () - DEVUELVE EL PUERTO REMOTO AL QUE ESTÁ CONECTADO EL SOCKET, O -1 SI NO EXISTE DICHA
CONEXIÓN.
• INETADDRESS GETLOCALADDRESS () - DEVUELVE LA DIRECCIÓN LOCAL A LA QUE EL SOCKET ESTA ENLAZADO.
• INT GETLOCALPORT () - DEVUELVE EL PUERTO LOCAL AL QUE ESTÁ ENLAZADO EL CONECTOR.
• INT GETRECEIVEBUFFERSIZE() THROWS JAVA.NET.SOCKETEXCEPTION – DEVUELVE EL TAMAÑO MÁXIMO DEL
BÚFER UTILIZADO PARA LOS PAQUETES UDP ENTRANTES.
• INT GETSENDBUFFERSIZE() THROWS JAVA.NET.SOCKETEXCEPTION - DEVUELVE EL TAMAÑO MÁXIMO DE BÚFER
UTILIZADO PARA PAQUETES UDP SALIENTES.
• GETSOTIMEOUT INT () THROWS JAVA.NET.SOCKETEXCEPTION - DEVUELVE EL VALOR DE LA OPCIÓN DE CONECTOR
DE TIEMPO DE ESPERA. ESTE VALOR SE UTILIZA PARA DETERMINAR EL NÚMERO DE MILISEGUNDOS QUE UNA
OPERACIÓN DE LECTURA BLOQUEARA ANTES DE LANZAR UN JAVA.IO.INTERRUPTEDIOEXCEPTION. DE MANERA
PREDETERMINADA, ESTE VALOR SERÁ IGUAL A CERO, LO QUE INDICA QUE EL BLOQUEO DE E / S SE UTILIZARÁ.
• RECEIVE (DATAGRAMPACKET PACKET)) THROWS JAVA.IO.IOEXCEPTION- LEE UN PAQUETE UDP Y ALMACENA EL
CONTENIDO EN EL PAQUETE ESPECIFICADO. LA DIRECCIÓN Y EL PUERTO.
17
18. CLASE DATAGRAMPACKET
• UN DATAGRAMPACKET SE UTILIZA PARA
REPRESENTAR UN PAQUETE UDP, Y DEBE SER
CREADO ANTES DE RECIBIR LOS PAQUETES.
• PROPORCIONAN CONSTRUCTORES PARA CREAR
INSTANCIAS A PARTIR DE LOS DATAGRAMAS
RECIBIDOS Y PARA CREAR INSTANCIAS DE
DATAGRAMAS QUE VAN A SER ENVIADOS
18
19. 1.Constructores para datagramas que
van a ser enviados:
DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int length, InetAddress address, int port).
Estos constructores crean una instancia de datagrama
compuesta por una cadena de bytes que almacena el
mensaje, la longitud del mensaje y la dirección de Internet y el
número de puerto local del conector destino, tal y como sigue:
19
DatagramPacket
20. 20
2.Constructores para datagramas recibido:
DatagramPacket(byte[] buf, int offset, int length)
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port).
Estos constructores nos permiten crear instancias de los datagramas
recibidos, especificando la cadena de bytes en la que alojar el mensaje, la
longitud de la misma y el offset dentro de la cadena.
Dentro de esta clase hay métodos para obtener los diferentes componentes
de un datagrama, tanto recibido como enviado:
1.getData() : para obtener el mensaje contenido en el datagrama.
2.getAddress() : para obtener la dirección IP.
3.getPort(): para obtener el puerto.
21. EL FLUJO DEL PROGRAMA EN EL
EMISOR Y RECEPTOR
1.Remitente del programa
Crear un socket de datagramas y vincularlo o cualquier puerto local.# Colocar
la data en una matriz de bytes.
Crear un paquete de datagramas, especificando la matriz de datos y la
dirección del receptor.
Invocar el método de envío del socket con una referencia al paquete de
datagramas.
1.Receptor del programa
Crear un socket de datagrama y enlazarlo a un puerto local específico.
Crear una matriz de bytes para la recepción de los datos.
Crear un paquete de datagramas, especificando la matriz de datos.
Invocar el método de recepción del socket con una referencia a los paquetes
de datagramas 21
22. EJEMPLO DE PROTOCOLO DE DATAGRAMAS DE
USUARIO
PARA DEMOSTRAR CÓMO LOS PAQUETES UDP
SE ENVÍAN Y RECIBEN, VAMOS A COMPILAR Y
EJECUTAR DOS PEQUEÑOS EJEMPLOS.
EL PRIMERO SE ENLAZARÁ A UN PUERTO
LOCAL, LEERÁ UN PAQUETE, Y MOSTRARÁ SU
CONTENIDO E INFORMACIÓN DE
DIRECCIONAMIENTO.
EL SEGUNDO EJEMPLO ENVIARÁ EL PAQUETE
LEÍDO POR EL PRIMERO.
22
25. TALLER GRUPO DE 2
ESTUDIANTES
1. ESCRIBA EL CÓDIGO DE LOS DOS PROGRAMAS.
2. COMPILE Y EJECUTE EL CÓDIGO DEL EJEMPLO EN UNA MÁQUINA USANDO
``LOCALHOST'' COMO NOMBRE DE MÁQUINA. POR EJEMPLO HOST
LOCALHOST PUERTO 3000 MENSAJE HOLA MUNDO
3. EJECUTE LOS DOS PROGRAMAS ARRANCANDO PRIMERO AL RECEPTOR Y
DESPUÉS AL EMISOR. EL MENSAJE QUE SE ENVÍE NO DEBERÍA EXCEDER LA
LONGITUD MÁXIMA PERMITIDA QUE ES DE 25 CARACTERES. DESCRIBA EL
RESULTADO DE LA EJECUCIÓN.
4. VUELVA A EJECUTAR LAS APLICACIONES, ESTA VEZ EJECUTANDO PRIMERO
AL ENVIA Y LUEGO AL QUE RECIBE. DESCRIBA Y EXPLIQUE EL RESULTADO.
5. REPITA EL APARTADO , ESTA VEZ MANDANDO UN MENSAJE DE LONGITUD
MÁS GRANDE QUE LA MÁXIMA LONGITUD PERMITIDA. DESCRIBA Y EXPLIQUE
LA SALIDA PRODUCIDA.
6. EN MÁQUINAS SEPARADAS EJECUTE SOLAMENTE AL QUE RECIBE Y EN
OTRA MÁQUINA EJECUTE AL QUE ENVIA. DESCRIBA Y EXPLIQUE EL
RESULTADO.
7. MODIFIQUE EL CODIGO DEL QUE RECIBE PARA QUE MUESTRE LA SIGUIENTE
INFORMACIÓN
25
26. INDICACIONES DE SEGURIDAD
• PASOS
• DESACTIVAR LOS FIREWORKS Y ANTIVIRUS.
• EN AMBAS MAQUINAS LA QUE TRABAJARA COMO CLIENTE Y LA OTRA COMO SERVIDOR
INCLUIR ESTE CÓDIGO EN EL JDK ARCHIVO (JAVA.POLICY)
• C:PROGRAM FILESJAVAJDK1.7.0_25JRELIBSECURITY
// CAMBIAR ESTOS DATOS
PERMISSION JAVA.NET.SOCKETPERMISSION "*:1024-65535",
"CONNECT,ACCEPT,LISTEN,RESOLVE";
•
• // ESTOS PERMITEN TENER ACCESO DESDE OTRO EQUIPO, SI TIENE LOCALHOST DEJE EL
PUERTO QUE TIENE
PERMISSION JAVA.NET.SOCKETPERMISSION ""LLOOCCAALLHHOOSSTT::80"",,
""CCOONNNNEECCTT,,AACCCCEEPPTT,,LLIISSTTEENN,,RREESSOOLLVVEE"";;
26
• RECORDAR MODIFICARLO EN LOS DOS EQUIPOS