cliente-servidor aspectos tecnicos tcp sockets

26
? Modelo Cliente – Servidor: El Interfaz de Sockets Bibliografia: - Java Network Programing, E. Rusty Harold, 2ª Ed. - Documentacion API: paquete java.net Direccionamiento IP y DNS Direccionamiento IP ? Dirección de un elemento de nivel de RED IP ? Dirección de 32 bits (4 bytes) ejemplo: 138.34.289.2 (cada byte separado por un punto) ? Cada dirección identifica un interfaz a la red interfaz ethernet, interfaz ATM, interfaz frame relay, .... ? 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 } Ethernet maquina: ej.dit.upm.es 138.34.211.2 router 138.3.2.1 138.3.2.4 138.3.2.7 Envio de datagramas IP ? Información se envía en bloques de datos ? Se denominan: datagramas ? Envío de un paquete cada paquete lleva una dirección de origen y destino Si red destino en tabla: envío según tabla Si no: envío a ruta por defecto (router) Ethernet router maquina a 138.34.289.4 maquina a 138.34.289.5 138.34.289.7 identificación longitud paq. offset frag. codigo error dir IP origen TOS V4 l-c datos (opcionales) ............................... dir IP destino opciones TTL 1 byte 2 bytes Paquete IP F 138.34.111.12 Redes lógicas y físicas ? Subinterfaces lógicos ? varias direcciones IP en un mismo interfaz físico definen subredes lógicas dentro de una red física Pueden tener (rutas por defecto diferentes) Ethernet maquina a 138.34.289.2 router b Conmutador ATM router b router c 138.34.289.4 138.34.289.8 DNS: Domain Name System ? Servicio de nombres simbólicos: ? direcciones fáciles de recordar por usuarios denominadas: direcciones de dominio ? crea un nivel de direccionamiento simbólico sobre el direccionamiento IP permite resolución directa e inversa – de IP a dirección de dominio – de dirección de dominio a IP ? la relación no es unívoca ? Ejemplo una dirección IP con varias direcciones de dominio

Upload: viviana-valenzuela

Post on 24-Apr-2015

54 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

Modelo Cliente – Servidor:El Interfaz de Sockets

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

Direccionamiento IP y DNS

Direccionamiento IP? Dirección de un elemento de nivel de RED IP

? Dirección de 32 bits (4 bytes)• ejemplo: 138.34.289.2 (cada byte separado por un punto)

? Cada dirección identifica un interfaz a la red• interfaz ethernet, interfaz ATM, interfaz frame relay, ....

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

Ethernetmaquina:ej.dit.upm.es

138.34.211.2

router

138.3.2.1138.3.2.4

138.3.2.7

Envio de datagramas IP? Información se envía en bloques de datos

? Se denominan: datagramas? Envío de un paquete

• cada paquete lleva una dirección de origen y destino• Si red destino en tabla: envío según tabla• Si no: envío a ruta por defecto (router)

Ethernet router

maquina a138.34.289.4

maquina a

138.34.289.5

138.34.289.7

identificación

longitud paq.

1 byte

offset frag.

codigo error

dir IP origen

TOSV4 l-c

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

dir IP destino

opciones

prot.TTL

1 byte 2 bytes

Paquete IP

F

138.34.111.12

Redes lógicas y físicas? Subinterfaces lógicos

? varias direcciones IP en un mismo interfaz físico • definen subredes lógicas dentro de una red física

• Pueden tener (rutas por defecto diferentes)

Ethernet

maquina a138.34.289.2

router b

ConmutadorATM router brouter c

138.34.289.4 138.34.289.8

DNS: Domain Name System? Servicio de nombres simbólicos:

? direcciones fáciles de recordar por usuarios• denominadas: direcciones de dominio

? crea un nivel de direccionamiento simbólico • sobre el direccionamiento IP

• permite resolución directa e inversa

– de IP a dirección de dominio

– de dirección de dominio a IP

? la relación no es unívoca? Ejemplo una dirección IP con varias direcciones de

dominio

Page 2: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

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

? Estructuración jerárquica• definida implícitamente en la dirección: lab.dit.upm.es

? Un servidor de nombres conoce como mínimo:? 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

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

}

? Mostrar todas las direcciones IP de una maquina

InetAddress: El DNS desde Java

public final class InetAddress extends Object implements..... Serializable {public static InetAddress getByName(String host)

throws UnknownHostEx. ;crea un objeto de acceso a hostpublic 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

......

? No tiene constructores (es un clase estática)? Clase InetAddress: crea objetos “dirección de red”

? String host => dos formatos “122.8.3.4” o “maq.dom.es”

InetAddress (II)

........public boolean isMulticastAddress()public String getHostName() ;devuelve direcc. de dominiopublic 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

}

? InetAddress permite búsqueda inversa? Error en Java 1.0 y 1.1

Ejercicio Socket 1? Realizar un programa que trate de encontrar

el nombre del servidor que responde a la dirección 204.29.207.217 (o a otra dirección conocida)

Modelo Cliente - Servidor

Page 3: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

El Modelo Cliente - Servidor

? Arquitectura de sistema distribuido ? Clientes: dan acceso a los servicios

? Servidores: contienen información, servicios, ...

? Cliente y Servidor son roles en una aplicación? Una maquina puede ser cliente en un servicio y

servidor en otro

? Muy extendido en programación distribuida

? Basado en el interfaz: “socketsocket””

Ejemplos C-S? WWW: consulta a información HTML distribuida

? Cliente: visor de Web? Servidor: servidor que contiene la información

? Ftp: gestión de remota de ficheros? Cliente: cliente ftp? Servidor: servidor ftp

? 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

Cliente? El cliente da acceso al usuario a los servicios

? Solicitando el servicio a los servidores

? El cliente es anónimoanónimo

? Los clientes suelen ser PCs ? estaciones de trabajo en el pasado

? Soportan gran carga computacional:? Soportan gran parte de la lógica de la aplicación

? Interfaz de usuario• Interfaces gráficos requieren gran potencia de calculo

Servidores? El servidor da el servicio solicitado al cliente

? Suele incluir un repositorio de información o de servicios en una BD

• Aplicación a tres bandas:

– cliente + servidor + base de datos

? Deben soportar un gran numero de accesos

? Los servidores son públicospúblicos? Tienen direcciones conocidas

? Son pasivos? Esperan a ser consultados

Socket Interface? Socket: Interfaz con el servicio TCP-UDP/IP

? Aisla al programador de los detalles de la red• La comunicación se sigue realizando por envío de paquetes• El interfaz oculta la complejidad del protocolo

? Desarrollado en el proyecto BSD (UNIX de Berkeley)

? Sigue el principio básico del diseño de UNIX? Uniformidad en el acceso a dispositivos

• acceso a periféricos o ficheros, comunicación entre procesos– Uso: apertura, acceso y cierre

? La interfaz de sockets ha sido portada a otros SOs: ? Windows, Mac, MSDOS, ...

Tipos de servicio

? Los servicios de red dan acceso a las facilidades de transporte de información en una red

? Los servicios se definen en función de los siguientes parámetros? Tipo de conectividad o conexión

• Servicios orientados a conexión/sin conexión

? Direccionamiento• Mecanismo de identificación de extremos

? Tipo de envío• Forma de transportar la información

Page 4: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

Tipo de Servicio? Servicio orientado a conexión

? Primero se establece la conexión con el destinatario• Envío y recepción de información:

– A través de los extremos del circuito• El envío suele ser fiable y garantiza la integridad de la información

? Las conexiones se denominan circuitos virtuales? Ejemplo: flujos de Java, servicio TCP, ...

? Servicio no orientado a conexión? Los mensajes se envían individualmente

• Encapsulados en un paquete

? Normalmente no es fiable• Puede haber perdidas, duplicaciones y desorden

? Ejemplo: UDP• Se denomina también servicio de datagramas

Servicios TCP-UDP/IP

? Servicio dado por el protocolo TCP? Servicio orientado a conexión

• fiable y bidireccional

? No existe comunicación de grupo fiable

? Servicio dado por el protocolo UDP? Servicio de datagramas

• no fiable:

– perdida, desorden y duplicación de paquetes

? Soporta comunicación de grupo no fiable

Direccionamiento? Direccionamiento:

? Mecanismo de identificación de los ente conectados a una red

? Cada nivel de comunicación posee su propio

direccionamiento

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

? Tipos de direccionamientos mas habituales:

? Direccionamiento a proceso

? Direccionamiento a lugar

? Direccionamiento a grupo

Direccionamiento a proceso? Los mensajes se envían a un proceso en un “host”

? La dirección identifica un proceso

? Direccionamiento rígido• El remitente debe conocer la dirección del proceso receptor

? Ejemplos: ? el modelo de comunicación de SDL

? Carta enviada a: José Pérez López (sin dirección)

P1

Pn

P

Direccionamiento a lugar? Los mensajes se envían a un lugar en un “host”

? La dirección identifica un lugar• Estructura de datos denominada: puerto, buzón, ...

? Varios procesos pueden coger los mensajes

? Ejemplos: ? Sockets: el lugar se denomina puerto (port)? Correo: una carta lleva una dirección (lugar)

P1

Pn

P1´

Pn´

Puerto

Puertos de TCP-UDP? Puerto (port):

? dirección de nivel de transporte de 16 bits• Es una dirección localdirección local

– Debe concatenarse con la dirección IP para ser única en la red? Identifican aplicaciones en una misma maquina

• Hay dos espacios de puertos: de TCP y de UDP

? División 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 situación– ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers

? Puertos 1024 a 65535 se pueden utilizar “libremente”? Uso de puertos basado en comportamiento cívico de usuarios

• Peligro de conflictos

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

Page 5: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

Algunos puertos reservados

Puerto Servicio Protocolo

7 echoRFC 862

tcp/udp

13 daytimeRFC 867

tcp/udp

20, 21 ftp(-data) tcp

23 telnet tcp

25 smtpRFC 821

tcp

37 time tcp/udp

43 whois tcp

79 fingerRFC 1288

tcp

80 httpRFC 2068

tcp

110 pop3 tcp

119 nntp tcp

1099 RMIRegistry

tcp

8080 Jeeves tcp

Direccionamiento a grupo? Los mensajes se envían a un grupo de

destinatarios? La dirección identifica solo el grupo? Existen múltiples tipos de grupos

• dinámicos o estáticos• cerrados o abiertos• de procesos o de lugares

? La gestión de un grupo es compleja

Grupo x

P2

PnP1

P3 P’

PP’’

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

? Grupo de difusión? Solo un emisor de información

? Grupo fijo? La pertenencia es fija

? Grupo dinámico? Debe existir un mecanismo de gestión del grupo

Tipos de envío? El tipo de envío está relacionado con el

transporte de información? La problemática se plantea a nivel de red

? Tipos de envío? Unicast o unienvío

? Multicast o multienvío

? Anycast

Envío de datagramas? Uninevío (en ingles unicast)

? Servicio de envío de datagramas a un destinatario ? Servicio sin conexión

• Cada envío es una operación independiente

? Servicio no fiable

H2

H4

H3

H1

Multienvío (multicast) de datagramas

UDP? Servicio envío 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 utilización optima del ancho de banda

? Grupo de escucha: cualquiera puede enviar• no debe pertenecer al grupo

? Implantación a gran escala en fase de investigación

Grupo

P2P3

P1

Px

Page 6: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

Envío a cualquiera(Anycast)

? Envío a un único miembro de un un grupo? Diversos criterios para elección de destinatario

• Mas cercano, mas barato, elección aleatoria, ...

? Util para muchos servicios de Internet? Elección del servidor mas próximo? Elección del servidor menos costoso

? Anycast esta todavía en fase de experimentación? IPv6 esta relanzando la investigación sobre Anycast

Grupo

P2P3

P1

Px

Arquitectura TCP-UDP/IP? Servicio fiable de transporte: TCPTCP

? Orientado a conexión• Fiabilidad: Minimiza caudal y maximiza retardo (y su varianza)

? Se utiliza en servicios no muy sensibles al retardo• FTP, correo-electrónico, Web??, News??, ...

? Servicio no fiable de transporte: UDPUDP? Servicio de datagramas

• Maximiza caudal y minimiza retardo (y su varianza)

? Se utiliza en servicios sensibles al retardo• nuevos FTPs, telefonía IP, video-conferencia sobre LAN, ...

? Servicio no fiable de red: IPIP? Servicio de datagramas sobre el que se implementa TCP

y UDP

Socket TCP

El servicio TCP? Servicio fiable orientado a conexión

? El cliente solicita la conexión ? El servidor la acepta eventualmente (si hay recursos)? Conexión bidireccional

• Intercambio de información: flujos de bytes

? El servicio garantiza la entrega de la información• No garantiza un plazo de entrega

? Imposibilidad de entrega provoca liberación del circuito• Temporizador puede ser de larga duración (~horas)

? Socket TCP: descriptor de extremo de conexión? Cada extremo posee un socket de acceso

Modelo de la comunicación

? La conmutación de paquetes se basa en

? almacenamiento y envío

• Almacenar: guardar en una cola

? Los protocolos poseen colas

? donde almacenan los mensajes hasta ser enviados

• En un sistema operativo existen múltiples colas

? Los procesadores suelen ser ineficientes

? realizando copias de memoria a memoria

Ejemplo: Colas en UNIX SystemV

Cada implementación 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: realización de copias de mensajes? La buena gestión de memoria debe copiar solo punteros

Page 7: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

Modelo del canal (simplificado)

Dispositivode Red

Cola desalida

Cola deentrada

Dispositivode Red

Cola desalida

Cola deentrada

Envío por la red

Extremo b(socket b)

Extremo a(socket a)

? El canal es fiable? El canal tiene

retardo variable? La unidad de inf.

es el byte

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

? Un servidor puede tener varios socketsestablecidos 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? Creación de un circuito virtual por el cliente

? Uso habitual del socket de cliente• 1) Creación del socket de cliente

– 2) Intento de conexión al socket del servidor

» En Java, los pasos 1 y 2 se realizan normalmente en una sola operación (creación de un objeto de clase socket)

• 3) Si la conexión se establece

– se obtienen los flujos de entrada y salida

• 4) Dialogo entre cliente y servidor

• 5) Liberación de la conexión

Ejemplo? Cliente de exploración de puertos TCP ocupados

en un servidor remoto? Invocación:

• > java findports <host>

? Funcionamiento: Intenta crear un circuito a cada puerto• Si la conexión se acepta hay servidor en el puerto

port 1......

port 1023

port 0

...

maquinaanfitrion

maquina destino

red

findports

Puertos de un servidorimport 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) {}

}}

}

La clase Socket: constructores

public class Socket extends Object {.....protected Socket() throws SocketExceptionprotected Socket(SocketImpl impl) throws SocketExceptionpublic Socket(String host, int port) throws

UnknownHostException, IOExceptionpublic Socket(InetAddress address, int port) throws IOEx.public Socket(String host, int port, InetAddress localAddr,

int localPort) throws IOExceptionpublic Socket(InetAddress address, int port,

InetAddress localAddr, int localPort) throws IOEx......

? El socket se crea solo si la conexión se establece

Page 8: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

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

? Invocación: • > java daytime <host>

? El servidor esta situado en el puerto 13 de TCP• descrito en la RFC 867 (ver servidor SWCM)

daytime

dateserverSystem.out

conexión TCP

socke bsocket a

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

}}

La clase Socket: la conexión

......public InputStream getInputStream() throws IOExceptionpublic OutputStream getOutputStream() throws IOExcep.

public synchronized void close() throws IOException

public InetAddress getInetAddress()public InetAddress getLocalAddress()public int getPort()public int getLocalPort()......

? La información se intercambia a través de flujos? El socket se cierra con close()? Acceso a los 4 parámetros que definen la conexión

Ejemplo:? Diseñar 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)

echoClient

echoserver

System.out

sysInconexión TCP

socke bsocket a(netIn

netOut)

Cliente de acceso a ecoimport 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 = newPrintWriter(s.getOutputStream(), true);

LineNumberReader sysIn = new LineNumberReader(new InputStreamReader(System.in));

........

.............

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

}}

Cliente de acceso a eco (II)

Page 9: Cliente-servidor Aspectos Tecnicos Tcp Sockets

?

Ejercicio Socket 2? Realizar un cliente de finger

? Especificación: RFC 1288 (ver servidor SWCM)? Invocación: >java finger <host> <user>

? Comportamiento del cliente? Abre un circuito al puerto 79 de <host>? Envía el segundo argumento a través 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 línea es un comando (acabado en cr+lf), ejemplos:

• línea en blanco: devuelve los usuarios conectados• Nombre usuario: devuelve información del usuario

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

Parámetros de TCP

? TcpNoDelay: control empaquetado de bytes? True => la información se envía inmediatamente? False => la información se envía “eficazmente”

? SoLinger: control envío después de muerte? define tiempo de intento de envío de paquetes

antes de liberar la conexión y tirar la información no enviada

? SoTimeout: temporizador de lectura de datos? Limita el tiempo de espera de lectura (read())? Activa InterruptedException

La clase Socket: parámetros

......public void setTcpNoDelay(boolean on) throws SocketExc.public boolean getTcpNoDelay() throws SocketExceptionpublic void setSoLinger(boolean on, int val) throws SocketEx.public int getSoLinger() throws SocketExceptionpublic synchronized void setSoTimeout(int timeout)

throws SocketExceptionpublic synchronized int getSoTimeout() throws SocketExcep.public String toString()public static synchronized void setSocketImplFactory(

SocketImplFactory fac) throws IOException}

? Control de parámetros del socket son? TcpNoDelay, SoLinger, SoTimeout

Liberación 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 conexión

seguirá existiendo, aunque haya sido liberada

? Las conexiones TCP se pueden liberar por el proveedor del servicio? Cuando el transporte de información se interrumpe

durante un tiempo (>30 minutos) libera la conexión

El Servidor? Un servidor es una aplicación que atiende

solicitudes de conexión TCP? El servidor debe tener una dirección IP conocida por

el cliente• La dirección de puerto(s) debe ser publica

? Cada servicio se atiende a través de uno o varios puertos

? El servidor es pasivo? espera solicitudes de conexión de los clientes? Si es aceptada se establece una conexión a través

de la cual dialoga con el cliente

Socket de servidor

? Uso habitual de un socket de servidor:? 1) Creación del SocketDeServidor

? 2) Espera de solicitudes de conexión de cliente

? 3) Si una solicitud de conexión es aceptada• se devuelve el socket de la conexión establecida

? 4) Se obtienen los streams de entrada y salida

? 4) Dialogo entre cliente y servidor

? 5) Liberación de la conexión

? 6) El servidor vuelve al paso 2

Page 10: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ejemplo: hello serverimport 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); }

}}

Ejercicio Socket 3? 1) Modificar helloserver para que cada vez que

acepte una conexión envíe 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 conexión TCP circular, es decir de un puerto en una dirección IP a ese mismo puerto en esa misma dirección?

Formatos

identificación

longitud paq.

1 byte

offset frag.

codigo error

dir IP origen

TOSV4 l-c

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

dir IP destino

opciones

prot.TTL

1 byte 2 bytes

Paquete IP

Segmento TCP

puerto origen puerto dest.

ventana

numero de secuencia

datos...............................

numero asentido

opciones

cod.hle

4 bit, 6 bit, 6bit, 1 byte, 1 byte

resv.

Padd.

Checksum puntero urg.

F

Codigo: tipo de segmento? Codigo: tiene 6 bits? Cada bit indica una función? 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 conexión)? Bit 5: SYN (sincronizar números de secuencia)? Bit 6: FIN (emisor alcanza fin de flujo)

Establec. de la conexión TCP

Rec SYN

Send SYN seq=x

Send SYN seq=y, ACK=x+1

Rec SYN + ACK

Send ACK=y+1

Rec ACK

c = new socket(host, 13);

Socket c = s.accept();

CLIENTE SERVIDOR

Liberación de la conexión TCP

Rec FIN

Send FIN seq=x

Send FIN seq=y, ACK=x+1

Rec FIN + ACK

Send ACK=y+1

Rec ACK

c.close();

socket desconectado

CLIENTE SERVIDOR

Page 11: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

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

? Realizar como programa de prueba? Un cliente ejecutandose en la misma máquina

• en otra ventana (Por ejemplo, en MSDOS)• Debe establecer una conexión con el servidor• Debe presentar la información 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); }

}}

Ejemplo: helloThreadclass 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); }}

}

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

}}

public class ServerSocket extends Object {.......public ServerSocket(int port) throws IOException

; Escucha en todos los interfaces de redpublic ServerSocket(int port, int queuelength) throws IOEx.

; El tamaño por defecto de la cola de; peticiones en espera de conexión es 5

public ServerSocket(int port, int queuelength, InetAddress bindAddr) throws IOException

; Escucha solo en interfaz bindAddr.......

La clase ServerSocket? Sockets de servidor

? Posee un cola de solicitudes de conexión (tamaño 5)• Para evitar rechazos en situaciones de congestión se debe

incrementar el tamaño de la cola, por ejemplo a 50

La clase ServerSocket (II)

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

? Peticiones de conexión se aceptan con “accept()”? “accept()” devuelve el socket de acceso a la conexión

TCP establecida

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

Page 12: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

......public sync. void setSoTimeout (int tout) throws SocketEx.public synchronized int getSoTimeout() throws IOExceptionpublic String toString()protected final void implAccept(Socket s) throws IOExcep.public static synchronized void

setSocketFactory(SocketImplFactory fac) throws IOEx.}

? SoTimeout define el tiempo de espera de accept()? antes de activar InterruptedIOException

La clase ServerSocket (III)

Limitaciones del servicio TCP? No soporta control de la “Calidad de Servicio”

? Caudal (throughput) o retardo (delay)

? TCP garantiza entrega, pero a cambio? aumenta el retardo medio y su varianza

? limita el caudal enviado

? No existe control de la liberación de conexiones? Una conexión TCP bloqueada consume recursos de

las maquinas de los extremos

? No soporta un multienvío fiable

Ejercicio Socket 4? 1) Modificar concHelloServer

? Transformarlo en un servidor de eco? Debe crear 10 hebras en el momento de su creación

• Así se evita crear y destruir una hebra para cada cliente– La creación/destrucción de hebras consume recursos

• De esta forma se conseguirá un servidor mas eficaz en situaciones de congestión

? Las hebras creadas aceptarán 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

? Aumentar tamaño cola de peticiones de conexión a 50

Concurrencia:Procesos y Hebras

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

Procesos y Hebras? Proceso: unidad de concurrencia y protección

? Pertenece normalmente a un usuario

? Espacio de memoria propio• Costoso en consumo de recursos

? Ejemplo: procesos UNIX

? Hebra: unidad de concurrencia? Pertenecen normalmente a un proceso

? Comparte memoria con el proceso y otras hebras• Poco costosos en consumo de recursos

? Ejemplo: threads de Java

Hebras en Java

? Hebras o hilos (threads): Unidades de ejecución concurrente dentro de un programa Java? Son objetos que ejecutan en concurrencia con el

resto del programa el codigo predefinido en run()

? Se crean por herencia? Clase Thread

? Interfaz Runnable

? Son procesos ligeros? comparten memoria (variables)

Page 13: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ej. 1: arranque en constructorpublic 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); } }}

Ej. 2: arranque en programapublic 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); }}

Comienzo y fin de una hebra? Comienzo de la ejecución de una hebra

? start(): Arranca ejecución concurrente del método run()? Final de la ejecución de una hebra

? Al retornar de run()? Al ejecutar stop()? Al ocurrir una excepción 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(); }

}}

Estados de una hebra? No nacido: el objeto no ha sido creado todavía? Creado: objeto creado pero no arrancado? En ejecución: posee el procesador? Activo: preparado para ejecutarse ? Bloqueado

? dormido: esperando terminación 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 región critica (synchronized)

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

Page 14: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ejecución y Prioridades? Prioridad de una hebra

? Valores enteros delimitados por const. de obj. Thread• MIN_PRIORITY < NORM_PRIORITY < MAX_PRIORITY

? Asignación del procesador? Round-Robin entre las hebras de máxima 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

Clase Thread? Permite derivar objetos que se ejecutan en una

hebra separada? Los métodos estáticos actúan sobre la hebra en

ejecución, o sobre el conjunto de hebras

? Los métodos de instancia actúan sobre el objeto indicado

? Una clase derivada de thread • no puede derivar de otra clase

– Por eso existe el interfaz Runnable

? El código ejecutable de la hebra se define en el método run()

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

// Constantspublic static final int MAX_PRIORITY;public static final int MIN_PRIORITY;public static final int NORM_PRIORITY;......

Clase Thread

// Class methodspublic 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 methodspublic void checkAccess();public native int countStackFrames();public void destroy();public final String getName();public final int getPriority();public final ThreadGroup getThreadGroup();public void interrupt();..........

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 threadpublic void run(); // defines thread codepublic 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 threadpublic final synchronized void stop(Throwable o);public final void suspend(); // suspends a thread temporarilypublic String toString(); // Overrides Object

}

Preguntas? ¿Una hebra que realiza una operación “yield()”

se queda en el mismo estado que si realiza la operación “sleep()”?

? ¿Que ocurre si una hebra realiza una operación yield y ninguna otra puede ejecutarse?

? ¿Que ocurre si una hebra realiza una operación “yield()” y solo hay otra hebra de menor prioridad dispuesta a ejecutarse?? ¿Y si realiza “sleep()” en vez de “yield()”?

Page 15: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

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

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

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 ejecución concurrente

? El método run contiene ? el programa que se ejecuta concurrentemente

public abstract interface Runnable {public abstract void run();

}

Concurrencia(Transparencias complementarias)

Proceso: clase Process

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

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

Clase Runtime

? Runtime modela el soporte de ejecución de Java? intérprete de la máquina virtual Java en ejecución

? Permite acceder al proceso Java y a sus parámetros

? Permite crear procesos externos

Page 16: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Clase Runtimepublic class Runtime extends Object {// No Constructor// Class Methods

public static Runtime getRuntime();public static void runFinalizersOnExit(boolean value);

// Public Instance Methodspublic 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);

}

Comunicación entre procesos

Comunicacion entre procesos (hebras)

? Comunicación a través de memoria compartida? Entre procesos que comparten una memoria

? Tipos: semáforos, regiones criticas, monitores, ..

? Comunicación sin memoria compartida? Para entornos distribuidos y/o locales

? Tipos: envío de mensajes, colas, cita (rendez-vous), llamada a procedimiento remoto, ...

Región crítica? 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 exclusión mutua

? Exclusión mutua:

? Mecanismo que garantiza a un proceso o hebra

• acceso exclusivo a una región critica

? Otros procesos (hebras) no pueden entrar

• hasta que el proceso (que ha entrado) salga de la región critica

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

}}

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 iteración del bucle a otra hebra

• se recomienda usar yield()

Page 17: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Sentencia synchronized? synchronized (objeto) { ..... }

? Delimita una región critica • donde se garantiza exclusión mutua en el acceso

? El semáforo de “objeto” controla el acceso• Todos los accesos a la región criticaregión critica deben referirse al mismo objeto

– Todos los objetos o arrays lleva asociado un semáforo

? También existen métodos sincronizados

.....synchronized (k) { // intercambio de valores

k=j;j=i; // se garantiza que una vez que eli=k; // intercambio comienza, este se realiza

} // completamente.......

Bloqueo (Deadlock)? Bloqueo: situación 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

? Deben eliminarse por completo de un programa

? Son muy difíciles 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) {}}

}

PipedStreams? Clase para crear canales de comunicación entre

hebras de Java? Las operaciones de acceso a los PipedStreams

son sincronizadas? Se garantiza exclusión mutua en el acceso

? Ejemplo: PipedIO

PipedIOPipedOutputStream

System.out cons

System.in

PipedInputStream

PipedStream: consumidorimport 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) {}

}}

PipedStream: productorimport 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);}

}

Page 18: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ejercicio Concurrencia 2

? Añadir al ejemplo de productor-consumidor? un nuevo thread consumidor

• que compita por leer del mismo stream que ya existe.

? Añadir retardos diferentes y/o algún mensaje de identificación para diferenciar ambas salidas

Comunicación entre procesos (Transparencias complementarias)

Envio de señales entre hebras? Todo objeto lleva asociado un semáforo

? Permite ordenar los accesos concurrentes? El semáforo se implementa en la clase “Object”

• El semáforo incluye una cola de procesos bloqueados a la espera de poder acceder al objeto

? wait(), notify() y notifyAll()? Métodos que permiten sincronizar hebras en el

acceso a cualquier objeto• wait(): bloquea la hebra llamante en el semáforo del objeto• notify(): despierta una hebra bloqueada en el semáforo• notifyAll(): despierta todas las hebras bloqueada en el

semáforo

? Pertenecen a la clase “Object”• por eso los hereda cualquier clase de java

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)

buffIO

System.out consum

System.in

buf

Ejemplo: bufferedIOpublic 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){}

}}

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

Monitor: buf

Page 19: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Sockets UDP

Bibliografía:- Java Network Programing, E. Rusty Harold, Ed. 2- Documentación API: paquete java.net

El servicio UDP/IP

? Servicio no fiable sin conexión? Servicio de tipo “lo mejor posible” (best effort)

• Cada envío de datagrama es independiente de los demás

• Los nodos de la red lo pueden tirar (si están muy cargados)

• puede haber: perdidas, duplicaciones, desorden, ...

? No utiliza ventana de envío? Los paquetes no esperan en colas de recepción

• se entregan nada mas llegar a su destino

– Aunque haya perdidas

? La ventana no corta el envío de paquetes • al llegar al limite del crédito

Ejemplo: audio y video? Necesitan asegurar una calidad de servicio (QoS)

? QoS: caudal mínimo y retardo máximo

? Ambos son bastante tolerantes a perdidas

? Comparación entre TCP y UDP? TCP: limita caudal y aumenta retardo

• Congestión: aumenta el retardo, fuente satura las colas

? UDP: Maximiza caudal y minimiza retardo• Congestión: se perderán paquetes

? UDP mejor en situaciones de congestión? En redes no congestionadas ambos son parecidos

Clientes y servidores en UDP

? Solo hay un tipo de sockets UDP

? En la API no se diferencia entre cliente y servidor

• La diferencia está en la aplicación

? Un servidor UDP es

? Un programa escuchando en un puerto UDP con

una función determinada

Socket UDP

? Socket UDP: descriptor de una estructura de envío/recepción de datagramas

? El S.O. define un socket UDP con 2 parámetros? <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 recepción por puerto UDP? “netstat -a” muestra el estado de los sockets UDP

Envío de datagramas UDP? Socket UDP unicast:

? Permite envío de datagramas a un destinatario• Cada envío es una operación independiente

? Utiliza direcciones de clases A, B y C• Un datagrama se envía a un puerto y a una dirección IP

? Servicio no fiable

H2

H4

H3

H1

Page 20: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ejemplo: findUDPports

? Diseñar cliente de exploración 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 excepción

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

}}

}}

findUDPports

Formatos

puerto origen

longitud

2 bytes

puerto destino

codigo error

2 bytes

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

longitud paq.

1 byte

codigo error

dir IP origen

TOSV4 l-c

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

dir IP destino

opciones

prot.TTL

1 byte 2 bytes

Paquete IP

Segmento UDPidentificación offset frag.F

La clase DatagramPacketpublic 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)

}

Ejemplo: UDPdaytime

? Diseñar cliente de consulta al servicio daytimede 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

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

Cliente de daytime en UDP (I)

Page 21: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

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

}}

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

La clase DatagramSocket.......public void send(DatagramPacket p) throws IOExceptionpublic 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()}

Envío y recepción de datagramas

? Envío:? Se crea un objeto datagrama con el contenido deseado

• se dan todos los parámetros

? se envía el datagrama invocando send()

? Recepción:? Se crea un objeto datagrama vacío

• de tamaño mayor al datagrama esperado

? Se espera la recepción de un datagrama (receive())• si el tamaño del datagrama es mayor, se trunca

Envio de datagramas

Rec dpacket

Send dpacket

Send dpacket

ds.send(dpacket);

ds´.receive(dpacket);

ds´.send(dpacket);

Rec dpacket

ds.receive(dpacket);

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

Page 22: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ejemplo: UDPdateServerimport 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) {}

}}

}

Ejercicio Socket 5? 1) Transformar el programa UDPdaytime

? en un programa de prueba de UDPdateServer

? Pasos recomendados? Transformar UDPdateServer y UDPdaytime en

• dos hebras de un mismo programa – que se comunican entre si a través de datagramas

• Las dos hebras se ejecutan en dos ventanas diferentes

? modificar el puerto de envio de datagramas de UDPdaytime a 4444

? Nota: la comunicación es en un entorno local• los datagramas no salen a la red.

Difusión y Multicast

Bibliografia:- Java Net. Prog., E. Rusty Harold, Ed. 2- Documentacion API: paquete java.net

Difusión (broadcast)? Difusión: servicio de envío a todos los miembros

de una (sub)red? Todos los receptores de la red deben recibir una copia

del mensaje? Existen tecnologías que soportan la difusión de

información de forma natural? Topologías tipo bus: Ethernet? Topologías en anillo? Redes por satélite o cable

? Existen tecnologías donde es costoso construir servicios de difusión? conmutadores, routers, bridges, ....

Difusión en Internet? Servicio al que se accede a través de direcciones

IP reservadas ? Solo se soporta difusión de datagramas UDP

• Acceso al servicio: envío a la dirección de difusión

? Direcciones de difusión? Dirección con todos sus bits a “1”

• Ningún ordenador puede tener asignada una dirección de difusión

? La difusión se puede definir a varios niveles? Difusión limitada a RAL: \hFFFFFFFF (no pasa routers)

• útil en arranque, cuando no se conoce la subred

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

Ejemplo: red Ethernet? Subred de una clase B

? Dirección de red clase B: 138.4.0.0• Dirección de subred: 0.0.23.0• Mascara de red 255.255.255.0

? Dirección de difusión a subred: 138.4.23.255? Dir. de difusión a todas las subredes: 138.4.255.255

1 2 nrouter

138.4.23.22138.4.23.1 138.4.23.50

138.4.23.33

Ethernet

Page 23: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Difusión: envío y recepción? Envío de paquetes

? Envío a dirección de difusión y a un puerto

? Recepción de paquetes? El paquete se recibe en la cola del puerto

• El paquete se distingue por la dirección de envío

? Ejemplo? Envío a: dir=138.4.23.255, puerto= 13, datos=“hola”

• Se envía un paquete UDP al servidor de echo de todos los ordenadores de la subred

? Envío a: dir=138.4.23.255, puerto= 79, datos=“tomas”• Se envía un paquete UDP de búsqueda del usuario tomas al

servidor de finger de todos los ordenadores de la subred

Difusión: conclusiones? Utilidad: cuando se desconoce la red

? Buscar el servidor que atiende terminales sin disco (BOOTP)

? Conocer los servidores activos: daytime, echo, ..? Búsquedas en la red: finger

? Carga mucho los ordenadores de una red? Todos los ordenadores deben recibir el paquete

• Es necesario realizar múltiples copias• Pueden provocarse tormentas de mensajes

? Routers: deben tener una opción para inhibir la difusión de mensajes

Ejemplo broadcast? Programa que envía un datagrama

? a los servidores daytime de los ordenadores de la subred

? a través de la dirección de difusión de subred• debe presentar las respuestas por la pantalla

? Subred del laboratorio B-123? Dirección de subred: 138.100.27.00? Mascara de subred: 255.255.255.128

? Invocación? java UDPdaytimeb <dir de difusión>

• java UDPdaytimeb 138.100.27.127

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

}}

Ejercicio Socket 6? Realizar un programa que envíe un mensaje

a los servidores de echo de los ordenadores de la subred? a través de la dirección de difusión de subred? presentar las respuestas por la pantalla.

? Invocación? java UDPechob <dir de difusión> <mensaje>

Multicast? Servicio eficaz de comunicación en grupo

? Comunicación de N a N• Evita la multiplicación de trafico

? Normalmente basado en envío de datagramas

? Se puede simular con unicast? Creando una malla entre todos los miembros

• Muy ineficaz (n-plica el trafico)

? Difusión es un caso particular? Grupo: Todos los ordenadores de una (sub)red

• El grupo es fijo

Page 24: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Grupos multicast de Internet? Grupo dinámico

? Operaciones de conexión y desconexión explícitas• Miembro del grupo = conectado al grupo

? Acceso libre: cualquiera puede conectarse

? Tamaño ilimitado• Un grupo puede abarcar toda la Internet

? Grupo de recepción? Envío sin restricciones: para enviar a un grupo no es

necesario ser miembro del grupo

? Mensajes enviados al grupo son recibidos por todoslos miembros del grupo

Direcciones clase D? Un grupo de multicast se identifica con

? dirección IP de clase D• Formato: 1110xxxxx....xxxx

– Una comunicación utiliza además una dirección de puerto• Identifican grupos globales en Internet

? Grupos permanentes: ? direcciones asignadas administrativamente por IANA

• Internet Assignment Number Authority• ftp://ftp.isi.edu/in-notes/iana/assignments/multicast-addresses

? MBONE: ? red para distribución de audio y vídeo por internet

• Direcciones reservadas: 224.2.*.*

Implementación? La comunicación con un grupo se realiza a través

de un Socket UDP unicast? Se puede utilizar cualquier socket unicast

? Datagrama multicast? datagrama unicast enviado a un grupo

• dirección de destino es de tipo clase D

? Una vez conectado al grupo el socket recibe? Datagramas enviados al grupo

? Datagramas enviados al socket UDP unicast

Ejemplo multicastimport 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();

}}

La clase MulticastSocket

public class MulticastSocket extends DatagramSocket {

public MulticastSocket() throws IOExceptionpublic MulticastSocket(int port) throws IOException

public void setTTL(byte ttl) throws IOExceptionpublic byte getTTL() throws IOExceptionpublic void joinGroup(InetAddress mcastaddr) throws IOEx.public void leaveGroup(InetAddress mcastaddr) throws IOEpublic void setInterface(InetAddress inf) throws SocketEx.public InetAddress getInterface() throws SocketExceptionpublic synchronized void send(DatagramPacket p, byte ttl)

throws IOException}

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

? Realizar un cliente que presente en consola? Toda la información que se envía a este grupo

Page 25: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Ejemplos de grupos asignados IReservados 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

? 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

? 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 suscripción del ordenador al grupo• El router sondea periódicamente a los ordenadores de su red

• Los ordenadores responden con los grupos a los que se han suscrito los usuarios

– No respuesta implica desconexión

? Arbol de multicast entre routers? Existen varios protocolos de interconexión 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)

Arbol de multicast? Conecta los miembros del grupo

? Ejemplo: • Grupo = {P3, P4, P8,.., P12}• P1, P2, P5, P6 y P7 no están en el grupo

? Routers: ? realizan copias a los ordenadores conectados al grupo? Se comunican con IGMP con los ordenadores

P2

P5

P

P7

router

router

P6

P4

router

router

P3

P1

P8 P12

IGMP

Multicast en ethernet? La red ethernet posee topología tipo bus ? Soporta multicast de forma natural y muy

eficazmente? todas las tramas llegan a todos los ordenadores? No es necesario hacer copias explicitas

? Ethernet posee direcciones multicast? octavo bit a 1

1

Dirección Ethernet

Transformación 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 colisión

• Baja probabilidad de dos grupos multicast en una red con direcciones iguales

00000001 00000000 01011110 0

1110

23 bits de dirección clase D se insertan en dir. ethernet

Dirección IP clase D

Dirección Ethernet

se descartan 5 bits

Page 26: Cliente-servidor Aspectos Tecnicos Tcp Sockets

??

Arquitectura TCP- UDP/IP

enlace

TCP

IPARP (Addr. Res. Prot.) RARP

UDP

IGMP ICMP

aplic. 1 aplic. naplic. 1 aplic. n

demultiplexaciónpor puerto

en segmento

demultiplexaciónpor campo prot.

en paquete IP

demultiplexaciónpor campo tipo-prot.

en trama enlace

trama entrante

Filtrado de paquetes multicastCada nivel filtra los paquetes que llegan de la red? El interfaz de red acepta

? Su dirección, dirección de difusión, direcciones multicast• Algunas tarjetas aceptan un numero limitado de dir. multicast • Modo promiscuo: acepta cualquier dirección multicast, difusión

? El nivel físico (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? Segmentos dirigidos a puertos no atendidos

• Envía mensaje ICMP

Limitación de alcance: TTL? El paquete IP tiene un campo TTL (Time To Live)

? Limita la vida de los paquetes IP? Limita el máximo numero de routers a cruzar

? En multicast se utiliza para limitar la alcanzabilidad? Típicamente: campus => 4-16, pais => 32-64, ....

3

2 2

3

1

34

4

5 6

Conclusiones? Servicio multicast tiene múltiples limitaciones

? Solo existe servicio no fiable? Acceso a los grupos solo abierto? Unicast y multicast no están separados

? La red internet no soporta en este momento multicast de forma generalizada? Existen islas multicast conectadas a través de túneles

• Túneles: interconexión de subredes multicast a través de enlaces UDP unicast (MROUTED)

? Todavía esta en fase de experimentación? Existe un peligro grande de saturar de tráfico la red

• Muchas organizaciones no lo utilizan