You are on page 1of 26

Envio de datagramas IP

? Informacin se enva en bloques de datos


? Se denominan: datagramas ? Envo de un paquete

Modelo Cliente Servidor: El Interfaz de Sockets


Bibliografia: - Java Network Programing, E. Rusty Harold, 2 Ed. - Documentacion API: paquete java.net
138.34.289.4

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

longitud paq. F offset frag. codigo error

maquina a maquina a

identificacin TTL
138.34.289.5

prot.

dir IP origen dir IP destino opciones

Ethernet
138.34.289.7

router

138.34.111.12

datos (opcionales) ...............................

Redes lgicas y fsicas


? Subinterfaces lgicos
? varias direcciones IP en un mismo interfaz fsico
definen subredes lgicas dentro de una red fsica Pueden tener (rutas por defecto diferentes)

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)

DNS: Domain Name System


? Servicio de nombres simblicos:
? direcciones fciles de recordar por usuarios
denominadas: direcciones de dominio

? Cada direccin identifica un interfaz a la red


interfaz ethernet, interfaz ATM, interfaz frame relay, ....

? crea un nivel de direccionamiento simblico


sobre el direccionamiento IP permite resolucin directa e inversa de IP a direccin de dominio de direccin de dominio a IP

? 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

? Un servidor de nombres conoce como mnimo:


? servidores de nombres de sus subdominios ? servidores de nombres de su dominio superior

? Caches: contienen punteros a dominios de acceso frecuente

Ejemplo: acceso a DNS


? Mostrar todas las direcciones IP de una maquina
import java.io.*; import java.net.*; public class inetaddrs { public static void main (String args[]) { String host = "localhost"; if (args.length > 0) { host=args[0]; } try { InetAddress[] addrs = InetAddress.getAllByName(host); for (int i = 0; i < addrs.length; i++) { System.out.println(addrs[i]); } } catch (UnknownHostExcept. e) {System.err.println(e);} } }

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)

InetAddress: El DNS desde Java


? No tiene constructores (es un clase esttica) ? Clase InetAddress: crea objetos direccin de red
? String host => dos formatos 122.8.3.4 o maq.dom.es public final class InetAddress extends Object implements ..... Serializable { public static InetAddress getByName(String host) throws UnknownHostEx. ;crea un objeto de acceso a host public static InetAddress[] getAllByName (String host) throws UnknownHostEx. ;crea objetos de acceso para todos los interfaces de host public static InetAddress getLocalHost() throws UnknownHostEx. ;objeto de acceso a host local ......

Modelo Cliente - Servidor

El Modelo Cliente - Servidor


? Arquitectura de sistema distribuido
? Clientes: dan acceso a los servicios ? Servidores: contienen informacin, servicios, ...

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

? Cliente y Servidor son roles en una aplicacin


? Una maquina puede ser cliente en un servicio y servidor en otro

? Deben soportar un gran numero de accesos

? Los servidores son pblicos


? Tienen direcciones conocidas

? Muy extendido en programacin distribuida


? Basado en el interfaz: socket socket

? 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

? Ftp: gestin de remota de ficheros


? Cliente: cliente ftp ? Servidor: servidor ftp

? Desarrollado en el proyecto BSD (UNIX de Berkeley)

? Sigue el principio bsico del diseo de UNIX


? Uniformidad en el acceso a dispositivos
acceso a perifricos o ficheros, comunicacin entre procesos Uso: apertura, acceso y cierre

? Correo-e: permite enviar mensajes electronicos


? Cliente: Gestor de correo (POP3, IMAP, ..) ? Servidor: servidor local de correo
Servicio distribuido: se comunica con otros servidores hasta entregar los mensajes en el servidor local del destinatario

? La interfaz de sockets ha sido portada a otros SOs:


? Windows, Mac, MSDOS, ...

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

? El cliente es annimo ? Los clientes suelen ser PCs


? estaciones de trabajo en el pasado

? Soportan gran carga computacional:


? Soportan gran parte de la lgica de la aplicacin ? Interfaz de usuario
Interfaces grficos requieren gran potencia de calculo

? 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)

? Servicio no orientado a conexin


? Los mensajes se envan individualmente
Encapsulados en un paquete

? 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, ...

? No existe comunicacin de grupo fiable

? Varios procesos pueden coger los mensajes

? Ejemplos:
? Sockets: el lugar se denomina puerto (port) ? Correo: una carta lleva una direccin (lugar)
P1 Puerto Pn Pn P1

? Servicio dado por el protocolo UDP


? Servicio de datagramas
no fiable: perdida, desorden y duplicacin de paquetes

? Soporta comunicacin de grupo no fiable

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

? Cada nivel de comunicacin posee su propio direccionamiento


? Nivel MAC, de red (IP), de transporte (TCP/UDP), ...

? Identifican aplicaciones en una misma maquina


Hay dos espacios de puertos: de TCP y de UDP

? Divisin del espacio de puertos


? Puertos para servicios: 0 a 1023
asignados a servicios por: IANA (Internet Assign. Number Authority) RFCs y STDs de internet tratan de ordenar la situacin ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers

? Tipos de direccionamientos mas habituales:


? Direccionamiento a proceso ? Direccionamiento a lugar ? Direccionamiento a grupo

? Puertos 1024 a 65535 se pueden utilizar libremente ? Uso de puertos basado en comportamiento cvico de usuarios
Peligro de conflictos

? Mapa de puertos en UNIX: /etc/services(o ports)

Algunos puertos reservados


Puerto Servicio echo RFC 862 13 daytime RFC 867 20, 21 ftp(-data) 23 25 37 telnet smtp RFC 821 time 7 Protocolo tcp/udp tcp/udp tcp tcp tcp tcp/udp

Tipos de envo
? El tipo de envo est relacionado con el transporte de informacin
? La problemtica se plantea a nivel de red

43 79 80 110 119 1099 8080

whois finger RFC 1288 http RFC 2068 pop3 nntp RMI Registry Jeeves

tcp tcp tcp tcp tcp tcp tcp

? 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

? La gestin de un grupo es compleja


P Grupo x P1 P2 P3 Pn P

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

Multienvo (multicast) de datagramas UDP

Px

P1 P2

Grupo P3

? Servicio envo a grupo (de datagramas)


? Los miembros deben haberse registrado ? Cada miembro recibe una copia de cada mensaje
los mensajes solo se copian en puntos de divergencia garantiza una utilizacin optima del ancho de banda

? Grupo de difusin
? Solo un emisor de informacin

? Grupo fijo
? La pertenencia es fija

? Grupo dinmico
? Debe existir un mecanismo de gestin del grupo

? Grupo de escucha: cualquiera puede enviar


no debe pertenecer al grupo

? Implantacin a gran escala en fase de investigacin

Envo a cualquiera (Anycast)


P1 P2

El servicio TCP
Grupo P3 Px

? Servicio fiable orientado a conexin


? El cliente solicita la conexin ? El servidor la acepta eventualmente (si hay recursos) ? Conexin bidireccional
Intercambio de informacin: flujos de bytes

? Envo a un nico miembro de un un grupo


? Diversos criterios para eleccin de destinatario
Mas cercano, mas barato, eleccin aleatoria, ...

? El servicio garantiza la entrega de la informacin


No garantiza un plazo de entrega

? Util para muchos servicios de Internet


? Eleccin del servidor mas prximo ? Eleccin del servidor menos costoso

? Imposibilidad de entrega provoca liberacin del circuito


Temporizador puede ser de larga duracin (~horas)

? Socket TCP: descriptor de extremo de conexin


? Cada extremo posee un socket de acceso

? Anycast esta todava en fase de experimentacin


? IPv6 esta relanzando la investigacin sobre Anycast

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

? Se utiliza en servicios no muy sensibles al retardo


FTP, correo-electrnico, Web??, News??, ...

? Servicio no fiable de transporte: UDP


? Servicio de datagramas
Maximiza caudal y minimiza retardo (y su varianza)

? Los protocolos poseen colas


? donde almacenan los mensajes hasta ser enviados
En un sistema operativo existen mltiples colas

? Se utiliza en servicios sensibles al retardo


nuevos FTPs, telefona IP, video-conferencia sobre LAN, ...

? Servicio no fiable de red: IP


? Servicio de datagramas sobre el que se implementa TCP y UDP

? Los procesadores suelen ser ineficientes


? realizando copias de memoria a memoria

Ejemplo: Colas en UNIX SystemV


Cada implementacin es diferente, por ejemplo: ? API de sockets TCP: Stream de bytes ? TCP: cola de segmentos ? IP: cola de paquetes ? driver: cola de tramas ? hardware: colas de bytes en dispositivos Cuello de botella: realizacin de copias de mensajes
? La buena gestin de memoria debe copiar solo punteros

Socket TCP

Modelo del canal (simplificado)


Cola de salida Extremo a (socket a) Cola de entrada Envo por la red Cola de entrada Dispositivo de Red Cola de salida Extremo b (socket b) findports maquina anfitrion Dispositivo de Red

Ejemplo
? Cliente de exploracin de puertos TCP ocupados en un servidor remoto
? Invocacin:
> java findports <host>

? El canal es fiable ? El canal tiene retardo variable ? La unidad de inf. es el byte

? Funcionamiento: Intenta crear un circuito a cada puerto


Si la conexin se acepta hay servidor en el puerto
maquina destino port 0 port 1 ... ... ... port 1023

red

Gestion de Sockets TCP


? El SO representa un socket TCP con 4 parametros
? <DirLocal, PuertoLocal, DirRemota, PuertoRemoto>
No pueden existir dos sockets TCP en la misma maquina con los mismos valores

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 servidor puede tener varios sockets establecidos en un puerto


? Sockets diferentes de un mismo puerto tienen colas de paquetes independientes

? Un puerto de cliente solo suele permitir un socket ? netstat -a muestra el estado de las conexiones

Circuito TCP: Socket de cliente


? Creacin de un circuito virtual por el cliente
? Uso habitual del socket de cliente
1) Creacin del socket de cliente 2) Intento de conexin al socket del servidor En Java, los pasos 1 y 2 se realizan normalmente en una sola operacin (creacin de un objeto de clase socket) 3) Si la conexin se establece se obtienen los flujos de entrada y salida 4) Dialogo entre cliente y servidor 5) Liberacin de la conexin

La clase Socket: constructores


? El socket se crea solo si la conexin se establece
public class Socket extends Object { ..... protected Socket() throws SocketException protected Socket(SocketImpl impl) throws SocketException public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOEx. public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOEx. .....

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)

? El servidor esta situado en el puerto 13 de TCP


descrito en la RFC 867 (ver servidor SWCM) conexin TCP

conexin TCP sysIn date server echo Client System.out


socket a (netIn netOut) socke b

System.out

day time
socket a socke b

echo server

Acceso al servidor de reloj


import java.io.*; import java.net.*; public class daytime { public static void main (String args[]) { String host = "localhost"; if (args.length > 0) { host=args[0]; } try { Socket s = new Socket(host, 13); LineNumberReader time = new LineNumberReader( new InputStreamReader(s.getInputStream())); String theTime = time.readLine(); s.close(); System.out.println("It is " + theTime + " at " + host); } catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) {} } }

Cliente de acceso a eco


import java.io.*; import java.net.*; public class echoClient { public static void main (String args[]) { String host = localhost", theLine; if (args.length > 0) { host=args[0]; } try { Socket s = new Socket(host, 7); LineNumberReader netIn = new LineNumberReader( new InputStreamReader(s.getInputStream())); PrintWriter netOut = new PrintWriter(s.getOutputStream(), true); LineNumberReader sysIn = new LineNumberReader( new InputStreamReader(System.in)); ........

La clase Socket: la conexin


? La informacin se intercambia a travs de flujos ? El socket se cierra con close() ? Acceso a los 4 parmetros que definen la conexin
...... public InputStream getInputStream() throws IOException public OutputStream getOutputStream() throws IOExcep. public synchronized void close() throws IOException public InetAddress getInetAddress() public InetAddress getLocalAddress() public int getPort() public int getLocalPort() ......

Cliente de acceso a eco (II)


............. while (true) { theLine = sysIn.readLine(); if (theLine.equals(".")) break; netOut.println(theLine); System.out.println(netIn.readLine()); } } catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) {} } }

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

? Comportamiento del cliente


? Abre un circuito al puerto 79 de <host> ? Enva el segundo argumento a travs del circuito ? Recibe la respuesta y la presenta en pantalla

? Comportamiento de un servidor de finger


? Espera comandos en ISO-Latin-1 (puerto 79) ? Cada lnea es un comando (acabado en cr+lf), ejemplos:
lnea en blanco: devuelve los usuarios conectados Nombre usuario: devuelve informacin del usuario

? Las conexiones TCP se pueden liberar por el proveedor del servicio


? Cuando el transporte de informacin se interrumpe durante un tiempo (>30 minutos) libera la conexin

? Servidores de finger: oasis.dit.upm.es, localhost, ..

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

? SoLinger: control envo despus de muerte


? define tiempo de intento de envo de paquetes antes de liberar la conexin y tirar la informacin no enviada

? Cada servicio se atiende a travs de uno o varios puertos

? 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

? SoTimeout: temporizador de lectura de datos


? Limita el tiempo de espera de lectura (read()) ? Activa InterruptedException

La clase Socket: parmetros


? Control de parmetros del socket son
? TcpNoDelay, SoLinger, SoTimeout ...... public void setTcpNoDelay(boolean on) throws SocketExc. public boolean getTcpNoDelay() throws SocketException public void setSoLinger(boolean on, int val) throws SocketEx. public int getSoLinger() throws SocketException public synchronized void setSoTimeout(int timeout) throws SocketException public synchronized int getSoTimeout() throws SocketExcep. public String toString() public static synchronized void setSocketImplFactory( SocketImplFactory fac) throws IOException }

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

Ejemplo: hello server


import java.io.*; import java.net.*; public class helloserver { public static void main (String args[]) { try { ServerSocket serv = new ServerSocket(22569); System.out.println("Helloserver created at port 22569."); while (true) { Socket c = serv.accept(); PrintWriter p = new PrintWriter(c.getOutputStream(), true); p.println("You have connec. successfully. Bye."); c.close(); } } catch (IOException e) { System.err.println(e); } } }

Codigo: tipo de segmento


? Codigo: tiene 6 bits ? Cada bit indica una funcin ? Significado de cada bit
? ? ? ? ? ? Bit 1: URG (campo puntero urgente valido) Bit 2: ACK (campo de asentimiento es valido) Bit 3: PSH (solicita un push) Bit 4: RST (resetear la conexin) Bit 5: SYN (sincronizar nmeros de secuencia) Bit 6: FIN (emisor alcanza fin de flujo)

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>

Establec. de la conexin TCP


Socket c = s.accept(); c = new socket(host, 13);
Send SYN seq=x Rec SYN Send SYN seq=y, ACK=x+1 Rec SYN + ACK Send ACK=y+1 Rec ACK

? 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

Liberacin de la conexin TCP


c.close();
Send FIN seq=x

V4 l-c puerto origen puerto dest.

TOS

longitud paq.

identificacin F offset frag. TTL prot. codigo error

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) {} } }

? Realizar como programa de prueba


? Un cliente ejecutandose en la misma mquina
en otra ventana (Por ejemplo, en MSDOS) Debe establecer una conexin con el servidor Debe presentar la informacin que reciba del servidor

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); } } }

La clase ServerSocket (II)


? Peticiones de conexin se aceptan con accept()
? accept() devuelve el socket de acceso a la conexin TCP establecida

? close() deja el puerto desatendido (sin servidor)


...... public Socket accept() throws IOException public void close() throws IOException public InetAddress getInetAddress() public int getLocalPort() ......

??

La clase ServerSocket (III)


? SoTimeout define el tiempo de espera de accept()
? antes de activar InterruptedIOException ...... public sync. void setSoTimeout (int tout) throws SocketEx. public synchronized int getSoTimeout() throws IOException public String toString() protected final void implAccept(Socket s) throws IOExcep. public static synchronized void setSocketFactory(SocketImplFactory fac) throws IOEx. }

Concurrencia: Procesos y Hebras

Bibliografia: - Java Network Programing, E. Rusty Harold, 2 Ed.

Limitaciones del servicio TCP


? No soporta control de la Calidad de Servicio
? Caudal (throughput) o retardo (delay)

Procesos y Hebras
? Proceso: unidad de concurrencia y proteccin
? Pertenece normalmente a un usuario ? Espacio de memoria propio
Costoso en consumo de recursos

? TCP garantiza entrega, pero a cambio


? aumenta el retardo medio y su varianza ? limita el caudal enviado

? Ejemplo: procesos UNIX

? No existe control de la liberacin de conexiones


? Una conexin TCP bloqueada consume recursos de las maquinas de los extremos

? Hebra: unidad de concurrencia


? Pertenecen normalmente a un proceso ? Comparte memoria con el proceso y otras hebras
Poco costosos en consumo de recursos

? No soporta un multienvo fiable

? Ejemplo: threads de Java

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()

? Las hebras creadas aceptarn conexiones


Directamente sobre el socket de servidor Compitiendo unas con otras por las peticiones accept se puede invocar concurrentemente cuando terminen con un cliente vuelven a aceptar peticiones de servicio de nuevos clientes

? Se crean por herencia


? Clase Thread ? Interfaz Runnable

? Son procesos ligeros


? comparten memoria (variables)

? Aumentar tamao cola de peticiones de conexin a 50

??

Ej. 1: arranque en constructor


public class DosHebras1 { public static void main (String args[]) { Hebra h1 = new Hebra(1); Hebra h2 = new Hebra(2); } } class Hebra extends Thread { int i; Hebra (int j) { i=j; this.start();} public void run () { while (true) { System.out.println(i); } } }

Estados de una hebra


? ? ? ? ? No nacido: el objeto no ha sido creado todava Creado: objeto creado pero no arrancado En ejecucin: posee el procesador Activo: preparado para ejecutarse Bloqueado
? dormido: esperando terminacin de sleep() ? suspendido: entre suspend() y resume() ? esperando: en un semaforo de objeto despues de hacer wait() ? esperando e/s : esperando a recibir datos de e/s ? esperando: entrar en una regin critica (synchronized)

Ej. 2: arranque en programa


public class DosHebras2 { public static void main (String args[]) { Hebra h1 = new Hebra(1); Hebra h2 = new Hebra(2); h2.start(); h1.start(); } } class Hebra extends Thread { int i; Hebra (int j) { i=j; } public void run () { while (true) System.out.println(i); } } }

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) }

Comienzo y fin de una hebra


? Comienzo de la ejecucin de una hebra
? start(): Arranca ejecucin concurrente del mtodo run()

Otros metodos
? suspend() y resume()
? suspend() deja la hebra bloqueada hasta invocar resume()

? Final de la ejecucin de una hebra


? Al retornar de run() ? Al ejecutar stop() ? Al ocurrir una excepcin no capturada public class Hebra extends Thread { int i; Hebra (int j) { i=j; this.start();} void run () { while (true) { System.out.write(i); stop(); } } }

? 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

? Asignacin del procesador


? Round-Robin entre las hebras de mxima prioridad ? El procesador puede asignarse por rodajas de tiempo, solo si el sistema lo soporta

? metodo: getPriority ()
? devuelve la prioridad de una hebra

? metodo: setPriority(int newPriority)


? asigna una nueva prioridad

// 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

? El cdigo ejecutable de la hebra se define en el mtodo run()


}

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()?

??

Ej. 3: arranque en constructor


(interfaz Runnable)
public class DosHebras3 { public static void main (String args[]) { Hebra h1 = new Hebra(1); Hebra h2 = new Hebra(2); } } class Hebra implements Runnable { int i; Hebra (int j) { i=j; Thread h = new Thread(this); h.start();} public void run () { while (true) { System.out.println(i); } } }

Concurrencia
(Transparencias complementarias)

Ej. 4: arranque en programa


(interfaz Runnable)
public class DosHebras4 { public static void main (String args[]) { Hebra h1 = new Hebra(1); Hebra h2 = new Hebra(2); new Thread(h2).start(); new Thread(h1).start(); } } class Hebra implements Runnable { int i; public Hebra (int j) { i=j; } public void run () { do { System.out.write(i); } } }

Proceso: clase Process


? Clase abstracta que modela las operaciones que se pueden realizar sobre un proceso ? Un proceso se crea con: Runtime.exec()
? Crea un proceso externo al interprete Java y devuelve el objeto Process correspondiente
el interprete Java es normalmente un proceso del S.O.

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

? El mtodo run contiene


? el programa que se ejecuta concurrentemente public abstract interface Runnable { public abstract void run(); }

? 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

? Otros procesos (hebras) no pueden entrar


hasta que el proceso (que ha entrado) salga de la regin critica

Ejemplo seccion critica


public class DosHebrasS { public static void main (String args[]) { Hebra h1 = new Hebra(1); Hebra h2 = new Hebra(2); } }

Comunicacin entre procesos

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) {} } }

Comunicacion entre procesos (hebras)


? Comunicacin a travs de memoria compartida
? Entre procesos que comparten una memoria ? Tipos: semforos, regiones criticas, monitores, ..

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()

? Comunicacin sin memoria compartida


? Para entornos distribuidos y/o locales ? Tipos: envo de mensajes, colas, cita (rendez-vous), llamada a procedimiento remoto, ...

??

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

? El semforo de objeto controla el acceso


Todos los accesos a la regin critica deben referirse al mismo objeto Todos los objetos o arrays lleva asociado un semforo

? 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) {} } }

? Deben eliminarse por completo de un programa

? Son muy difciles de detectar


? Su ocurrencia suele ser aleatoria

? 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.

Monitores: objetos con acceso sincr.


? Un monitor es un objeto (o estructura de datos) compartido por varios procesos o hebras
? Debe garantizar exclusion mutua en los accesos

? 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){} } }

Comunicacin entre procesos


(Transparencias complementarias)

Envio de seales entre hebras


? Todo objeto lleva asociado un semforo
? Permite ordenar los accesos concurrentes ? El semforo se implementa en la clase Object
El semforo incluye una cola de procesos bloqueados a la espera de poder acceder al objeto

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; } }

? wait(), notify() y notifyAll()


? Mtodos que permiten sincronizar hebras en el acceso a cualquier objeto
wait(): bloquea la hebra llamante en el semforo del objeto notify(): despierta una hebra bloqueada en el semforo notifyAll(): despierta todas las hebras bloqueada en el semforo

? Pertenecen a la clase Object


por eso los hereda cualquier clase de java

??

Clientes y servidores en UDP


? Solo hay un tipo de sockets UDP

Sockets UDP
Bibliografa: - Java Network Programing, E. Rusty Harold, Ed. 2 - Documentacin API: paquete java.net

? En la API no se diferencia entre cliente y servidor


La diferencia est en la aplicacin

? 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

? No utiliza ventana de envo


? Los paquetes no esperan en colas de recepcin
se entregan nada mas llegar a su destino Aunque haya perdidas

? El puerto 0 significa cualquier puerto libre ? UDP tiene espacio de puertos propio (distinto de TCP)

? La ventana no corta el envo de paquetes


al llegar al limite del crdito

? Hay una nica cola de recepcin por puerto UDP ? netstat -a muestra el estado de los sockets UDP

Ejemplo: audio y video


? Necesitan asegurar una calidad de servicio (QoS)
? QoS: caudal mnimo y retardo mximo ? Ambos son bastante tolerantes a perdidas

Envo de datagramas UDP


? Socket UDP unicast:
? Permite envo de datagramas a un destinatario
Cada envo es una operacin independiente

? Comparacin entre TCP y UDP


? TCP: limita caudal y aumenta retardo
Congestin: aumenta el retardo, fuente satura las colas

? Utiliza direcciones de clases A, B y C


Un datagrama se enva a un puerto y a una direccin IP

? Servicio no fiable
H1 H4

? UDP: Maximiza caudal y minimiza retardo


Congestin: se perdern paquetes

? UDP mejor en situaciones de congestin


? En redes no congestionadas ambos son parecidos

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

Cliente de daytime en UDP (I)


import java.io.*; import java.net.*; public class UDPdaytime { public static void main (String args[]) { DatagramSocket sock; byte[] d = new byte[256]; DatagramPacket dp = new DatagramPacket(d, d.length); String host = "localhost, s; ........

V4 l-c

TOS

longitud paq.

identificacin F offset frag.

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) ...............................

datos (opcionales) ...............................

??

Cliente de daytime en UDP (II)


......... if (args.length > 0) { host=args[0]; } try { InetAddress a = InetAddress.getByName(host); sock = new DatagramSocket(); sock.send(new DatagramPacket(d, d.length, a, 13)); sock.receive(dp); s = new String(dp.getData(), 0, dp.getLength()); System.out.println("It is " + s + " at " + host); } catch (UnknownHostExcep. e) {System.err.println(e); } catch (IOException e) {} } }

Envo y recepcin de datagramas


? Envo:
? Se crea un objeto datagrama con el contenido deseado
se dan todos los parmetros

? se enva el datagrama invocando send()

? Recepcin:
? Se crea un objeto datagrama vaco
de tamao mayor al datagrama esperado

? Se espera la recepcin de un datagrama (receive())


si el tamao del datagrama es mayor, se trunca

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() }

Ejemplo: Servidor UDP


? Programa UDPdateServer
? Crear un servidor de fechas que atienda en el puerto 4444

? 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

? Existen tecnologas que soportan la difusin de informacin de forma natural


? Topologas tipo bus: Ethernet ? Topologas en anillo ? Redes por satlite o cable

? Existen tecnologas donde es costoso construir servicios de difusin


? conmutadores, routers, bridges, ....

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.

? La difusin se puede definir a varios niveles


? Difusin limitada a RAL: \hFFFFFFFF (no pasa routers)
til en arranque, cuando no se conoce la subred

? Subredes clase A,B,C,.. : direccin de (sub)red + 11..11

Ejemplo: red Ethernet


? Subred de una clase B
? Direccin de red clase B: 138.4.0.0
Direccin de subred: 0.0.23.0 Mascara de red 255.255.255.0

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

??

Difusin: envo y recepcin


? Envo de paquetes
? Envo a direccin de difusin y a un puerto

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

? Envo a: dir=138.4.23.255, puerto= 79, datos=tomas


Se enva un paquete UDP de bsqueda del usuario tomas al servidor de finger 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.

? Carga mucho los ordenadores de una red


? Todos los ordenadores deben recibir el paquete
Es necesario realizar mltiples copias Pueden provocarse tormentas de mensajes

? Invocacin
? java UDPechob <dir de difusin> <mensaje>

? Routers: deben tener una opcin para inhibir la difusin de mensajes

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

? Normalmente basado en envo de datagramas

? Subred del laboratorio B-123


? Direccin de subred: 138.100.27.00 ? Mascara de subred: 255.255.255.128

? Se puede simular con unicast


? Creando una malla entre todos los miembros
Muy ineficaz (n-plica el trafico)

? Invocacin
? java UDPdaytimeb <dir de difusin>
java UDPdaytimeb 138.100.27.127

? Difusin es un caso particular


? Grupo: Todos los ordenadores de una (sub)red
El grupo es fijo

??

Grupos multicast de Internet


? Grupo dinmico
? Operaciones de conexin y desconexin explcitas
Miembro del grupo = conectado al grupo

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(); } }

? Acceso libre: cualquiera puede conectarse ? Tamao ilimitado


Un grupo puede abarcar toda la Internet

? 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

? Realizar un cliente que presente en consola


? Toda la informacin que se enva a este grupo

? Una vez conectado al grupo el socket recibe


? Datagramas enviados al grupo ? Datagramas enviados al socket UDP unicast

??

Ejemplos de grupos asignados I


Reservados por IANA ? BASE-Address.mcast.net: 224.0.0.0: reservada ? All-Systems.mcast.net: 224.0.0.1
? Todos los sistemas en la subred (local), IGMP
? Routers:

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

Ejemplos de grupos asignados II


? RSVP-encapsulation.mcast.net: 224.0.0.14
? Para experimentos con protocolo RSVP

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

? Ethernet posee direcciones multicast


? octavo bit a 1
1
Direccin Ethernet

? 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

? Arbol de multicast entre routers


? Existen varios protocolos de interconexin de routers
DVMRP (Distant Vector Multicast Routing - Prot. RFC 1075, usado por MROUTED) PIM (Protocol Independent Multicast) MOSPF (Multicast Extension to Open Shortest Path First RFC 1584)

1110
se descartan 5 bits 23 bits de direccin clase D se insertan en dir. ethernet

00000001 00000000 01011110 0


Direccin Ethernet

??

Arquitectura TCP- UDP/IP


aplic. 1 aplic. n aplic. 1 aplic. n demultiplexacin por puerto en segmento

Conclusiones
? Servicio multicast tiene mltiples limitaciones
? Solo existe servicio no fiable ? Acceso a los grupos solo abierto ? Unicast y multicast no estn separados

UDP IGMP ICMP IP ARP (Addr. Res. Prot.)

TCP

demultiplexacin por campo prot. en paquete IP RARP demultiplexacin por campo tipo-prot. en trama enlace

? La red internet no soporta en este momento multicast de forma generalizada


? Existen islas multicast conectadas a travs de tneles
Tneles: interconexin de subredes multicast a travs de enlaces UDP unicast (MROUTED)

? Todava esta en fase de experimentacin


? Existe un peligro grande de saturar de trfico la red
Muchas organizaciones no lo utilizan

enlace trama entrante

Filtrado de paquetes multicast


Cada nivel filtra los paquetes que llegan de la red ? El interfaz de red acepta
? Su direccin, direccin de difusin, direcciones multicast
Algunas tarjetas aceptan un numero limitado de dir. multicast Modo promiscuo: acepta cualquier direccin multicast, difusin

? El nivel fsico (el manejador de dispositivo) filtra


? Paquetes de protocolo no soportados (IP, ARP, ...) ? Algunas direcciones multicast

? El nivel de red IP filtra

? Direcciones IP no conectadas (unicast y multicast)

? El nivel de transporte (UDP) filtra


Enva mensaje ICMP

? Segmentos dirigidos a puertos no atendidos

Limitacin de alcance: TTL


? El paquete IP tiene un campo TTL (Time To Live)
? Limita la vida de los paquetes IP ? Limita el mximo numero de routers a cruzar

? En multicast se utiliza para limitar la alcanzabilidad


? Tpicamente: campus => 4-16, pais => 32-64, ....
3 2 1 2 3 3 4 5 6

??

You might also like