Professional Documents
Culture Documents
cada paquete lleva una direccin de origen y destino Si red destino en tabla: envo segn tabla Paquete IP Si no: envo a ruta por defecto (router)
1 byte 1 byte 2 bytes
V4 l-c
TOS
maquina a maquina a
identificacin TTL
138.34.289.5
prot.
Ethernet
138.34.289.7
router
138.34.111.12
Direccionamiento IP y DNS
maquina a 138.34.289.2 Ethernet 138.34.289.4 138.34.289.8 router b
router c
Conmutador ATM
router b
Direccionamiento IP
? Direccin de un elemento de nivel de RED IP
? Direccin de 32 bits (4 bytes)
ejemplo: 138.34.289.2 (cada byte separado por un punto)
? Uso habitual
Maquina ej.dit.upm.es tiene un interfaz: {138.34.289.2} Router tiene 3 interfaces= {138.3.2.1, 138.3.2.4, 138.3.2.7 }
138.3.2.4
? la relacin no es unvoca
? Ejemplo una direccin IP con varias direcciones de dominio
maquina: ej.dit.upm.es
138.34.211.2
138.3.2.1
Ethernet
router
138.3.2.7
DNS: el protocolo
? Servicio de directorio distribuido
? Existe una base de datos en cada (sub)dominio
Denominada: servidor de nombres (name server) puede haber mas de un servidor
InetAddress (II)
? InetAddress permite bsqueda inversa
? Error en Java 1.0 y 1.1 ........ public boolean isMulticastAddress() public String getHostName() ;devuelve direcc. de dominio public byte[] getAddress() public String getHostAddress() ; dev. dir IP como String ; 122.5.6.7" public int hashCode() public boolean equals(Object obj) public String toString }
? Estructuracin jerrquica
definida implcitamente en la direccin: lab.dit.upm.es
Ejercicio Socket 1
? Realizar un programa que trate de encontrar el nombre del servidor que responde a la direccin 204.29.207.217 (o a otra direccin conocida)
Servidores
? El servidor da el servicio solicitado al cliente
? Suele incluir un repositorio de informacin o de servicios en una BD
Aplicacin a tres bandas: cliente + servidor + base de datos
? Son pasivos
? Esperan a ser consultados
Ejemplos C-S
? WWW: consulta a informacin HTML distribuida
? Cliente: visor de Web ? Servidor: servidor que contiene la informacin
Socket Interface
? Socket: Interfaz con el servicio TCP-UDP/IP
? Aisla al programador de los detalles de la red
La comunicacin se sigue realizando por envo de paquetes El interfaz oculta la complejidad del protocolo
Cliente
? El cliente da acceso al usuario a los servicios
? Solicitando el servicio a los servidores
Tipos de servicio
? Los servicios de red dan acceso a las facilidades de transporte de informacin en una red ? Los servicios se definen en funcin de los siguientes parmetros
? Tipo de conectividad o conexin
Servicios orientados a conexin/sin conexin
? Direccionamiento
Mecanismo de identificacin de extremos
? Tipo de envo
Forma de transportar la informacin
Tipo de Servicio
? Servicio orientado a conexin
? Primero se establece la conexin con el destinatario
Envo y recepcin de informacin: A travs de los extremos del circuito El envo suele ser fiable y garantiza la integridad de la informacin
Direccionamiento a proceso
? Los mensajes se envan a un proceso en un host
? La direccin identifica un proceso ? Direccionamiento rgido
El remitente debe conocer la direccin del proceso receptor
? Las conexiones se denominan circuitos virtuales ? Ejemplo: flujos de Java, servicio TCP, ...
? Ejemplos:
? el modelo de comunicacin de SDL ? Carta enviada a: Jos Prez Lpez (sin direccin)
? Normalmente no es fiable
Puede haber perdidas, duplicaciones y desorden P1 P Pn
? Ejemplo: UDP
Se denomina tambin servicio de datagramas
Servicios TCP-UDP/IP
? Servicio dado por el protocolo TCP
? Servicio orientado a conexin
fiable y bidireccional
Direccionamiento a lugar
? Los mensajes se envan a un lugar en un host
? La direccin identifica un lugar
Estructura de datos denominada: puerto, buzn, ...
? Ejemplos:
? Sockets: el lugar se denomina puerto (port) ? Correo: una carta lleva una direccin (lugar)
P1 Puerto Pn Pn P1
Direccionamiento
? Direccionamiento:
? Mecanismo de identificacin de los ente conectados a una red
Puertos de TCP-UDP
? Puerto (port):
? direccin de nivel de transporte de 16 bits
Es una direccin local Debe concatenarse con la direccin IP para ser nica en la red
? Puertos 1024 a 65535 se pueden utilizar libremente ? Uso de puertos basado en comportamiento cvico de usuarios
Peligro de conflictos
Tipos de envo
? El tipo de envo est relacionado con el transporte de informacin
? La problemtica se plantea a nivel de red
whois finger RFC 1288 http RFC 2068 pop3 nntp RMI Registry Jeeves
? Tipos de envo
? Unicast o unienvo ? Multicast o multienvo ? Anycast
Direccionamiento a grupo
? Los mensajes se envan a un grupo de destinatarios
? La direccin identifica solo el grupo ? Existen mltiples tipos de grupos
dinmicos o estticos cerrados o abiertos de procesos o de lugares
Envo de datagramas
? Uninevo (en ingles unicast) ? Servicio de envo de datagramas a un destinatario
? Servicio sin conexin
Cada envo es una operacin independiente
? Servicio no fiable
H1 P H4
H2
H3
Tipos de grupo
? Grupo cerrado
? Solo los miembros del grupo pueden enviar y recibir
? Grupo de escucha
? Cualquiera puede enviar ? Solo reciben los miembros del grupo
Px
P1 P2
Grupo P3
? Grupo de difusin
? Solo un emisor de informacin
? Grupo fijo
? La pertenencia es fija
? Grupo dinmico
? Debe existir un mecanismo de gestin del grupo
El servicio TCP
Grupo P3 Px
Arquitectura TCP-UDP/IP
? Servicio fiable de transporte: TCP
? Orientado a conexin
Fiabilidad: Minimiza caudal y maximiza retardo (y su varianza)
Modelo de la comunicacin
? La conmutacin de paquetes se basa en
? almacenamiento y envo
Almacenar: guardar en una cola
Socket TCP
Ejemplo
? Cliente de exploracin de puertos TCP ocupados en un servidor remoto
? Invocacin:
> java findports <host>
red
Puertos de un servidor
import java.io.*; import java.net.*; public class findports { public static void main (String args[]) { Socket theSocket; String host = localhost"; if (args.length > 0) { host=args[0]; } for (int i=0; i<1024; i++) { try { theSocket = new Socket(host, i); theSocket.close(); System.out.println(Server at port " + i + " of " + host); } catch(UnknownHostEx. e){System.out.println(e); break; } catch (IOException e) {} } } }
? Un puerto de cliente solo suele permitir un socket ? netstat -a muestra el estado de las conexiones
Ejemplo:
? Cliente de acceso a un servidor de fechas
? Debe consultar el servicio daytime del servidor y presentar en la pantalla del cliente la fecha dada por el servidor ? Invocacin:
> java daytime <host>
Ejemplo:
? Disear un cliente de acceso a un servidor de eco
? Debe enviar un mensaje al servidor de eco y presentar en pantalla el eco recibido ? El servidor esta esta situado en el puerto 7 de TCP y esta descrito en la RFC 862 (ver servidor SWCM)
System.out
day time
socket a socke b
echo server
Ejercicio Socket 2
? Realizar un cliente de finger
? Especificacin: RFC 1288 (ver servidor SWCM) ? Invocacin: >java finger <host> <user>
Liberacin de conexiones
? Las conexiones TCP se pueden liberar por el usuario
? Invocando socket.close() ? Cualquier extremo puede liberarlas ? El parametro SoLinger define el tiempo que la conexin seguir existiendo, aunque haya sido liberada
Parmetros de TCP
? TcpNoDelay: control empaquetado de bytes
? True => la informacin se enva inmediatamente ? False => la informacin se enva eficazmente
El Servidor
? Un servidor es una aplicacin que atiende solicitudes de conexin TCP
? El servidor debe tener una direccin IP conocida por el cliente
La direccin de puerto(s) debe ser publica
? El servidor es pasivo
? espera solicitudes de conexin de los clientes ? Si es aceptada se establece una conexin a travs de la cual dialoga con el cliente
Socket de servidor
? Uso habitual de un socket de servidor:
? 1) Creacin del SocketDeServidor ? 2) Espera de solicitudes de conexin de cliente ? 3) Si una solicitud de conexin es aceptada
se devuelve el socket de la conexin establecida
? 4) Se obtienen los streams de entrada y salida ? 4) Dialogo entre cliente y servidor ? 5) Liberacin de la conexin ? 6) El servidor vuelve al paso 2
Ejercicio Socket 3
? 1) Modificar helloserver para que cada vez que acepte una conexin enve a la consola un mensaje:
? Connection accepted from <IP Addr> at port <port>
? 2) Realizar un servidor echo en el puerto 12334 ? 3) Pregunta: Se puede establecer una conexin TCP circular, es decir de un puerto en una direccin IP a ese mismo puerto en esa misma direccin?
CLIENTE
SERVIDOR
Formatos
Segmento TCP
4 bit, 6 bit, 6bit, 1 byte, 1 byte 1 byte
Paquete IP
1 byte 2 bytes
TOS
longitud paq.
numero de secuencia numero asentido hle resv. cod. Checksum opciones ventana puntero urg. Padd.
socket desconectado
Rec FIN Send FIN seq=y, ACK=x+1
dir IP origen dir IP destino opciones datos (opcionales) ............................... Rec FIN + ACK Send ACK=y+1
Rec ACK
datos ...............................
CLIENTE
SERVIDOR
??
Ejemplo: concHelloServer
? Transformar helloserver en un servidor concurrente
? Un servidor concurrente crea una hebra independiente para atender a cada nuevo cliente que solicita un servicio
Ejemplo: Test
public class Test { public static void main (String args[]){ try { Socket sock = new Socket("localhost", 22569); LineNumberReader i = new LineNumberReader( new InputStreamReader(sock.getInputStream())); String input = i.readLine(); System.out.println("Server says: " + input); } catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) {} } }
Ejemplo: concHelloServer
import java.io.*; import java.net.*; public class concHelloServer { public static void main (String args[]) { try { ServerSocket serv = new ServerSocket(22569); System.out.println("Helloserver created at port 22569."); while (true) { Socket conn = serv.accept(); helloThread ct = new helloThread(conn); } } catch (IOException e) { System.err.println(e); } } }
La clase ServerSocket
? Sockets de servidor
? Posee un cola de solicitudes de conexin (tamao 5)
Para evitar rechazos en situaciones de congestin se debe incrementar el tamao de la cola, por ejemplo a 50
public class ServerSocket extends Object { ....... public ServerSocket(int port) throws IOException ; Escucha en todos los interfaces de red public ServerSocket(int port, int queuelength) throws IOEx. ; El tamao por defecto de la cola de ; peticiones en espera de conexin es 5 public ServerSocket(int port, int queuelength, InetAddress bindAddr) throws IOException ; Escucha solo en interfaz bindAddr .......
Ejemplo: helloThread
class helloThread extends Thread { Socket c; helloThread (Socket conn ) {c = conn; this.start(); } public void run () { try { PrintWriter p = new PrintWriter(c.getOutputStream(), true); p.println("You have connected successfully. Bye."); c.close(); System.out.println("Helloserver: connection accepted."); } catch (IOException e) { System.err.println(e); } } }
??
Procesos y Hebras
? Proceso: unidad de concurrencia y proteccin
? Pertenece normalmente a un usuario ? Espacio de memoria propio
Costoso en consumo de recursos
Ejercicio Socket 4
? 1) Modificar concHelloServer
? Transformarlo en un servidor de eco ? Debe crear 10 hebras en el momento de su creacin
As se evita crear y destruir una hebra para cada cliente La creacin/destruccin de hebras consume recursos De esta forma se conseguir un servidor mas eficaz en situaciones de congestin
Hebras en Java
? Hebras o hilos (threads): Unidades de ejecucin concurrente dentro de un programa Java
? Son objetos que ejecutan en concurrencia con el resto del programa el codigo predefinido en run()
??
yield() y sleep(..)
? yield()
? Cede el paso a otra hebra. La hebra sigue activa.
? sleep(long millis)
? Bloquea la hebra millis milisegundos public class Hebra extends Thread { int i; public Hebra (int j) { i=j; this.start();} public void run () { while (true) { System.out.write(i); yield(); } // o sleep(100) }
Otros metodos
? suspend() y resume()
? suspend() deja la hebra bloqueada hasta invocar resume()
? Join()
? permite esperar la muerte de una hebra hija
??
Ejecucin y Prioridades
? Prioridad de una hebra
? Valores enteros delimitados por const. de obj. Thread
MIN_PRIORITY < NORM_PRIORITY < MAX_PRIORITY
? metodo: getPriority ()
? devuelve la prioridad de una hebra
// Class methods public static int activeCount(); public static native Thread currentThread(); public static void dumpStack(); public static int enumerate(Thread[] tarray); public static boolean interrupted(); public static native void sleep(long millis) throws Int.Ex.; public static void sleep(long millis, int nanos) throws Int.Ex.; public static native void yield(); // yields execution to others // Public instance methods public void checkAccess(); public native int countStackFrames(); public void destroy(); public final String getName(); public final int getPriority(); public final ThreadGroup getThreadGroup(); public void interrupt(); ..........
Clase Thread
? Permite derivar objetos que se ejecutan en una hebra separada
? Los mtodos estticos actan sobre la hebra en ejecucin, o sobre el conjunto de hebras ? Los mtodos de instancia actan sobre el objeto indicado ? Una clase derivada de thread
no puede derivar de otra clase Por eso existe el interfaz Runnable
public final native boolean isAlive(); public final boolean isDaemon(); public boolean isInterrupted(); public final synchronized void join(long millis) throws Int.Ex.; public final syn. void join(long millis, int nanos) throws Int.Ex.; public final void join() throws InterruptedException; public final void resume(); // resumes a suspended thread public void run(); // defines thread code public final void setDaemon(boolean on); public final void setName(String name); public final void setPriority(int newPriority); public synchronized native void start(); public final void stop(); // finishes thread public final synchronized void stop(Throwable o); public final void suspend(); // suspends a thread temporarily public String toString(); // Overrides Object
Clase Thread
public class Thread extends Object implements Runnable { // Public Constructors public Thread(); public Thread(Runnable target); public Thread(ThreadGroup group, Runnable target); public Thread(String name); public Thread(ThreadGroup group, String name); public Thread(Runnable target, String name); public Thread(ThreadGroup g, Runnable t, String n); // Constants public static final int MAX_PRIORITY; public static final int MIN_PRIORITY; public static final int NORM_PRIORITY; ......
Preguntas
? Una hebra que realiza una operacin yield() se queda en el mismo estado que si realiza la operacin sleep()? ? Que ocurre si una hebra realiza una operacin yield y ninguna otra puede ejecutarse? ? Que ocurre si una hebra realiza una operacin yield() y solo hay otra hebra de menor prioridad dispuesta a ejecutarse?
? Y si realiza sleep() en vez de yield()?
??
Concurrencia
(Transparencias complementarias)
public abstract class Process extends Object { public abstract void destroy(); public abstract int exitValue(); public abstract InputStream getErrorStream(); public abstract InputStream getInputStream(); public abstract OutputStream getOutputStream(); public abstract int waitFor() throws Interr.Ex.; } // waits for process to finish
Interfaz Runnable
? Cualquier clase que implemente este interfaz puede ejecutarse como una hebra separada
? Esto permite dotar a clases derivadas de otras de capacidad de ejecucin concurrente
Clase Runtime
? Runtime modela el soporte de ejecucin de Java
? intrprete de la mquina virtual Java en ejecucin
? Permite acceder al proceso Java y a sus parmetros ? Permite crear procesos externos
??
Clase Runtime
public class Runtime extends Object { // No Constructor // Class Methods public static Runtime getRuntime(); public static void runFinalizersOnExit(boolean value); // Public Instance Methods public Process exec(String command) throws IOExcep.; public Process exec(String com, String[] envp) throws IOExc.; public Process exec(String[] cmdarray) throws IOException; public Process exec(String[] cmdarray, String[] e) throws IOEx; public void exit(int status); public native long freeMemory(); public native void gc(); public InputStream getLocalizedInputStream(InputStream in); public OutputStream getLocalizedOutputS.(OutputStream out); public synchronized void load(String filename); public synchronized void loadLibrary(String libname); public native void runFinalization(); public native long totalMemory(); public native void traceInstructions(boolean on); public native void traceMethodCalls(boolean on); }
Regin crtica
? Segmento de un programa donde
? se accede a variables compartidas entre procesos o hebras
Existe peligro de llegar a resultados inconsistentes El acceso debe ser con exclusin mutua
? Exclusin mutua:
? Mecanismo que garantiza a un proceso o hebra
acceso exclusivo a una regin critica
class Hebra extends Thread { static int i = 0; int l; static Integer s = new Integer(0); public Hebra(int j) { l=j; this.start();} public void run () { try { while (true) { synchronized (s) { i++; sleep(1000); System.out.println(l + : + i); } } } catch (Exception e) {} } }
Ejercicio Concurrencia 1
? Modificar el ejemplo DosHebrasS con los siguientes requerimientos
? Crear 3 hebras (en vez de 2) ? Las hebras deben ceder el procesador en cada iteracin del bucle a otra hebra
se recomienda usar yield()
??
Sentencia synchronized
? synchronized (objeto) { ..... }
? Delimita una regin critica
donde se garantiza exclusin mutua en el acceso
PipedStreams
? Clase para crear canales de comunicacin entre hebras de Java ? Las operaciones de acceso a los PipedStreams son sincronizadas
? Se garantiza exclusin mutua en el acceso
? Tambin existen mtodos sincronizados ..... synchronized (k) { // intercambio de valores k=j; j=i; // se garantiza que una vez que el i=k; // intercambio comienza, este se realiza } // completamente .......
? Ejemplo: PipedIO
System.in PipedIO PipedOutputStream
System.out
cons
PipedInputStream
Bloqueo (Deadlock)
? Bloqueo: situacin irresoluble de espera mutua que bloquea un conjunto de hebras o procesos
? Las esperas suelen ser de acceso a regiones criticas
Especialmente cuando hay anidamientos de esperas
PipedStream: consumidor
import java.io.*; public class consum extends Thread { PipedInputStream in; public consum (PipedInputStream i) {in = i;} public void run () { int r; try { while ((r=in.read()) >= 0) System.out.write(r); } catch (Exception e) {} } }
? Ejemplo:
? DosHebrasB en transparencia siguiente
public class DosHebrasB { public static void main (String args[]) { Integer s1 = new Integer(0), s2 = new Integer(0); HebraB h1 = new HebraB(s1, s2, 1); HebraB h2 = new HebraB(s2, s1, 2); } } class HebraB extends Thread { int i, c = 0; Integer ss1, ss2; public Hebra(Integer k, Integer j, int l) { i=l; ss1=k; ss2=j; this.start();} public void run () { try { while (true) { synchronized (ss1) { c++; System.out.println(i + : entro en rc1 - + c); synchronized (ss2) { c++; System.out.println(i + : entro en rc2 - + c); } } } } catch (Exception e) {} } }
PipedStream: productor
import java.io.*; class pipedIO { public static void main (String args[]) throws Exception { int r; PipedOutputStream o = new PipedOutputStream(); PipedInputStream i = new PipedInputStream(o); consum c = new consum(i); c.start(); do { r=System.in.read(); o.write(r); } while (r >= 0); } }
??
Ejercicio Concurrencia 2
? Aadir al ejemplo de productor-consumidor
? un nuevo thread consumidor
que compita por leer del mismo stream que ya existe.
? Ejemplo bufferedIO:
? Una productor (bufferedIO) lee caracteres de consola y los pasa a un consumidor (consum) a traves de un objeto compartido (buf)
System.in buffIO
? Aadir retardos diferentes y/o algn mensaje de identificacin para diferenciar ambas salidas
buf
System.out consum
Ejemplo: bufferedIO
public class bufferedIO { public static void main (String args[]) throws Exception { buf b = new buf(); int r; cons c = new cons(b); do { r=System.in.read(); b.put(r); } while (r >= 0) } } class cons extends Thread { buf b; int r; cons (buf a) {b = a; this.start();}} public void run () { try { while ((int r = b.get()) >= 0) System.out.write(r); } catch (Exception e){} } }
Monitor: buf
public class buf { private int b[]=new int[10], e=0, s=0, n=0, a; public synchronized int get() throws Exception { while (n == 0) wait(); a = b[s]; s = incr(s); if (n-- == 10) notifyAll(); return a; } public synchronized void put(int c) throws Exception { while (n == 10) wait(); b[e] = c; e = incr(e); if (n++ == 0) notifyAll(); } private int incr(int v) { if (++v == 10) { v = 0;}; return v; } }
??
Sockets UDP
Bibliografa: - Java Network Programing, E. Rusty Harold, Ed. 2 - Documentacin API: paquete java.net
? Un servidor UDP es
? Un programa escuchando en un puerto UDP con una funcin determinada
El servicio UDP/IP
? Servicio no fiable sin conexin
? Servicio de tipo lo mejor posible (best effort)
Cada envo de datagrama es independiente de los dems Los nodos de la red lo pueden tirar (si estn muy cargados) puede haber: perdidas, duplicaciones, desorden, ...
Socket UDP
? Socket UDP: descriptor de una estructura de envo/recepcin de datagramas ? El S.O. define un socket UDP con 2 parmetros
? <DirLocal, PuertoLocal>
Una maquina no puede tener dos sockets UDP iguales
? El puerto 0 significa cualquier puerto libre ? UDP tiene espacio de puertos propio (distinto de TCP)
? Hay una nica cola de recepcin por puerto UDP ? netstat -a muestra el estado de los sockets UDP
? Servicio no fiable
H1 H4
H2
H3
??
Ejemplo: findUDPports
? Disear cliente de exploracin de puertos UDP en uso en la maquina local
? Funcionamiento:
intentar crear un socket UDP en cada puerto Si se crea => no hay servidor en el puerto Si no se crea => hay servidor en el puerto genera excepcin
La clase DatagramPacket
public final class DatagramPacket extends Object { ..... public DatagramPacket(byte buf[], int length) public DatagramPacket(byte buf[], int len, InetAddress a, int port) public synchronized InetAddress getAddress() public synchronized int getPort() public synchronized byte[] getData() public synchronized int getLength() public synchronized void setAddress(InetAddress iaddr) public synchronized void setData(byte ibuf[]) public synchronized void setLength(int ilength) }
findUDPports
import java.net.*; public class findUDPports { public static void main (String args[]) { DatagramSocket server; for (int i=0; i<1024; i++) { try { server = new DatagramSocket(i); server.close(); } catch (SocketException e) { System.out.println("Server on port " + i); } } } }
Ejemplo: UDPdaytime
? Disear cliente de consulta al servicio daytime de UDP
? El servicio es similar al de UDP, salvo que el servidor esta en el espacio de puertos de UDP ? El servidor contesta al recibir un paquete
En el puerto 13 El contenido del paquete recibido es irrelevante Devuelve la fecha y la hora en otro paquete
Formatos
1 byte
Paquete IP
1 byte 2 bytes
V4 l-c
TOS
longitud paq.
Segmento UDP
2 bytes 2 bytes
TTL
prot.
codigo error
dir IP origen puerto origen puerto destino longitud codigo error dir IP destino opciones datos (opcionales) ...............................
??
? Recepcin:
? Se crea un objeto datagrama vaco
de tamao mayor al datagrama esperado
La clase DatagramSocket
public class DatagramSocket extends Object { ..... public DatagramSocket() throws SocketException ; crea socket en algun puerto libre, ; escucha todos los interfaces public DatagramSocket(int port) throws SocketException ; crea el socket en port, escucha en todos los interfaces public DatagramSocket(int port, InetAddress laddr) throws SocketException ; crea el socket en port que escucha solo en laddr ........
Envio de datagramas
ds.receive(dpacket); ds.send(dpacket);
Send dpacket Rec dpacket
ds.receive(dpacket); ds.send(dpacket);
Send dpacket Rec dpacket
La clase DatagramSocket
....... public void send(DatagramPacket p) throws IOException public synchronized void receive(DatagramPacket p) throws IOEception public InetAddress getLocalAddress() public int getLocalPort() public synchronized void setSoTimeout(int timeout) throws SocketExcetion public synchronized int getSoTimeout() throws SocketExc. ; SoTimeout: tiempo de espera en receive(...) ; antes de activar SocketException public void close() }
? Comportamiento
? Espera la llegada de datagramas por el puerto 4444 ? Cuando llega un datagrama contesta
con otro que contiene la fecha codificada en ASCII
??
Ejemplo: UDPdateServer
import java.net.*; import java.util.Date; public class UDPdateServer { public static void main (String args[]) throws Exception { byte d[] = new byte[0]; DatagramPacket dp = new DatagramPacket(d, d.length); DatagramSocket ds = new DatagramSocket(4444); while (true) { try { ds.receive(dp); d = ((new Date()).toString()).getBytes(); ds.send(new DatagramPacket(d, d.length, dp.getAddress(), dp.getPort())); } catch (Exception e) {} } } }
Difusin (broadcast)
? Difusin: servicio de envo a todos los miembros de una (sub)red
? Todos los receptores de la red deben recibir una copia del mensaje
Ejercicio Socket 5
? 1) Transformar el programa UDPdaytime
? en un programa de prueba de UDPdateServer
Difusin en Internet
? Servicio al que se accede a travs de direcciones IP reservadas
? Solo se soporta difusin de datagramas UDP
Acceso al servicio: envo a la direccin de difusin
? Pasos recomendados
? Transformar UDPdateServer y UDPdaytime en
dos hebras de un mismo programa que se comunican entre si a travs de datagramas Las dos hebras se ejecutan en dos ventanas diferentes
? Direcciones de difusin
? Direccin con todos sus bits a 1
Ningn ordenador puede tener asignada una direccin de difusin
? modificar el puerto de envio de datagramas de UDPdaytime a 4444 ? Nota: la comunicacin es en un entorno local
los datagramas no salen a la red.
Difusin y Multicast
? Direccin de difusin a subred: 138.4.23.255 ? Dir. de difusin a todas las subredes: 138.4.255.255
138.4.23.33 138.4.23.1 138.4.23.22 138.4.23.50
router
Bibliografia: - Java Net. Prog., E. Rusty Harold, Ed. 2 - Documentacion API: paquete java.net
Ethernet
??
Ejemplo broadcast
import java.io.*; import java.net.*; import java.lang.String; public class UDPdaytimeb { public static void main (String args[]) { byte[] d = new byte[256]; DatagramPacket dp = new DatagramPacket(d, d.length); String s, host = "localhost"; if (args.length > 0) { host=args[0]; } try { InetAddress a = InetAddress.getByName(host); DatagramSocket theSocket = new DatagramSocket(); theSocket.send(new DatagramPacket(d, d.length, a, 13)); while (true) { theSocket.receive(dp); s = new String(dp.getData(), 0, dp.getLength()); System.out.println("It is " + s + " at " + dp.getHost()); } } catch (UnknownHostException e) {System.err.println(e); } catch (IOException e) {} } }
? Recepcin de paquetes
? El paquete se recibe en la cola del puerto
El paquete se distingue por la direccin de envo
? Ejemplo
? Envo a: dir=138.4.23.255, puerto= 13, datos=hola
Se enva un paquete UDP al servidor de echo de todos los ordenadores de la subred
Difusin: conclusiones
? Utilidad: cuando se desconoce la red
? Buscar el servidor que atiende terminales sin disco (BOOTP) ? Conocer los servidores activos: daytime, echo, .. ? Bsquedas en la red: finger
Ejercicio Socket 6
? Realizar un programa que enve un mensaje a los servidores de echo de los ordenadores de la subred
? a travs de la direccin de difusin de subred ? presentar las respuestas por la pantalla.
? Invocacin
? java UDPechob <dir de difusin> <mensaje>
Ejemplo broadcast
? Programa que enva un datagrama
? a los servidores daytime de los ordenadores de la subred ? a travs de la direccin de difusin de subred
debe presentar las respuestas por la pantalla
Multicast
? Servicio eficaz de comunicacin en grupo
? Comunicacin de N a N
Evita la multiplicacin de trafico
? Invocacin
? java UDPdaytimeb <dir de difusin>
java UDPdaytimeb 138.100.27.127
??
Ejemplo multicast
import java.net.*; public class mcast { public static void main (String args[]) throws java.io.IOEx. { byte[] m = {'H','e','l','l','o'}; InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(m, m.length, group, 6789); s.send(hi); byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); s.leaveGroup(group); s.close(); } }
? Grupo de recepcin
? Envo sin restricciones: para enviar a un grupo no es necesario ser miembro del grupo ? Mensajes enviados al grupo son recibidos por todos los miembros del grupo
Direcciones clase D
? Un grupo de multicast se identifica con
? direccin IP de clase D
Formato: 1110xxxxx....xxxx Una comunicacin utiliza adems una direccin de puerto Identifican grupos globales en Internet
La clase MulticastSocket
public class MulticastSocket extends DatagramSocket { public MulticastSocket() throws IOException public MulticastSocket(int port) throws IOException public void setTTL(byte ttl) throws IOException public byte getTTL() throws IOException public void joinGroup(InetAddress mcastaddr) throws IOEx. public void leaveGroup(InetAddress mcastaddr) throws IOE public void setInterface(InetAddress inf) throws SocketEx. public InetAddress getInterface() throws SocketException public synchronized void send(DatagramPacket p, byte ttl) throws IOException }
? Grupos permanentes:
? direcciones asignadas administrativamente por IANA
Internet Assignment Number Authority ftp://ftp.isi.edu/in-notes/iana/assignments/multicast-addresses
? MBONE:
? red para distribucin de audio y vdeo por internet
Direcciones reservadas: 224.2.*.*
Implementacin
? La comunicacin con un grupo se realiza a travs de un Socket UDP unicast
? Se puede utilizar cualquier socket unicast
Ejercicio Socket 7
? Realizar un programa que retransmita cada 5 segundos la hora
? Al grupo "228.5.6.7 de multicast ? Utilizando el puerto 7777 ? con TTL = 1
? Datagrama multicast
? datagrama unicast enviado a un grupo
direccin de destino es de tipo clase D
??
Arbol de multicast
? Conecta los miembros del grupo
? Ejemplo:
Grupo = {P3, P4, P8,.., P12} P1, P2, P5, P6 y P7 no estn en el grupo
? realizan copias a los ordenadores conectados al grupo ? Se comunican con IGMP con los ordenadores P7 P P1 P2 P8 P12 P3 IGMP P4 router P5 router router router P6
? All-Routers.mcast.net: 224.0.0.2
? Todos los routers en la subred (local)
? DVRMP.mcast.net: 224.0.0.4
? Routers con Distance Vector Multicast Routing Prot.
? PIM-ROUTERS.mcast.net: 224.0.0.13
? Routers con Protocol Indpendent Multicasting
Multicast en ethernet
? La red ethernet posee topologa tipo bus ? Soporta multicast de forma natural y muy eficazmente
? todas las tramas llegan a todos los ordenadores ? No es necesario hacer copias explicitas
? MICROSOFT.mcast.net: 224.0.1.24
? Servers WINS (Windows Internet Name Service)
? NBC-PRO.mcast.net: 224.0.1.25
? Canal de noticias de NBC con audio y video
? Proyecto ISIS: 224.0.6.0-127 (S.O. distribuido) ? Session directory (sd): 224.2.2.2 (puerto 4000)
? Anuncio de conferencias en MBONE
? .......
Arquitectura de multicast
? IGMP (Internet Group Management Protocol):
? Protocolo de suscripcin del ordenador al grupo
El router sondea peridicamente a los ordenadores de su red Los ordenadores responden con los grupos a los que se han suscrito los usuarios No respuesta implica desconexin
Transformacin de direcciones
? Las direcciones IP se codifican en direcciones ethernet
? En un bloque de direcciones multicast asignado a IANA ? Se descartan 5 bits ? Existe posibilidad de colisin
Baja probabilidad de dos grupos multicast en una red con direcciones iguales
Direccin IP clase D
1110
se descartan 5 bits 23 bits de direccin clase D se insertan en dir. ethernet
??
Conclusiones
? Servicio multicast tiene mltiples limitaciones
? Solo existe servicio no fiable ? Acceso a los grupos solo abierto ? Unicast y multicast no estn separados
TCP
demultiplexacin por campo prot. en paquete IP RARP demultiplexacin por campo tipo-prot. en trama enlace
??