Você está na página 1de 12

Juan Pavón Mestras

Dep. Sistemas Informáticos y Programación


Universidad Complutense de Madrid
jpavon@sip.ucm.es
http://bogart.sip.ucm.es/~juan

Internet
Protocolos en Internet

SMTP FTP Telnet HTTP ...

TCP/UDP

IP

Protocolo de
Acceso a Red

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 2

1
Internet
Opciones hardware típicas
• Ethernet
➫ tecnología CSMA a 10Mbps, limitada a paquetes de 1400 bytes.
Usa cable coaxial.
• Bridged Ethernet
➫ común en redes locales grandes, anillo con varios segmentos
Ethernet
• Fast Ethernet
➫ versión de Ethernet a 100Mbps
• FDDI (Fiber Distributed Data Interface) y DQDB
(Distributed Queue Dual Bus)
➫ para unir LANs en un campus o un área metropolitana
• ATM
➫ tecnología de conmutación para fibra óptica. Las interfaces de
usuario se definen a 155Mbps o 600 Mbps
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 3

Internet
Internet Protocol (IP)
• Parte superior del nivel de red
• Protocolo datagrama, no orientado a conexión y no fiable
➫ No hay recuperación de errores
➫ Hay comprobación de errores, y los paquetes IP erróneos se tiran,
sin notificar al emisor
➫ Soporta fragmentación de datos en paquetes IP (<1400 bytes)
• Direcciones IP
➫ Cada máquina tiene una dirección única
➫ 4 clases de direcciones IP: A, B, C (network ID+host ID) y D
(grupos multicast)
➫ Los IP gateways encaminan los paquetes IP según su network ID
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 4

2
Internet
Internet Protocol (IP)
• Problemas con IP:
➫ Los paquetes IP no se autentifican: El emisor puede mentir sobre
su identidad, y puede enviar paquetes a cualquier máquina o puerto
en la red
➫ Un sistema puede mentir sobre su dirección de máquina
➫ Los mensajes IP no son fiables: Pueden ser retirados en cualquier
lugar
➫ El encaminamiento IP es básicamente estático (hoy día)

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 5

Internet
Protocolos de nivel de transporte
• TCP (Transmission Control Protocol)
➫ Protocolo orientado a conexión, fiable (recuperación de errores), y
con control de flujo
➫ Establece un camino de bytes (byte stream)
• UDP (User Datagram Protocol)
➫ Protocolo no orientado a conexión y no fiable
➫ Si se recibe un paquete sin errores se pasa al proceso de usuario
destinatario, si no, se descarta silenciosamente
➫ Límite de tamaño de datagrama: 64 KB
➫ UDP Multicast

+ En una red local, UDP es más eficiente y normalmente no hay errores


+ A través de Internet es más seguro utilizar TCP
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 6

3
Internet
Protocolo de ventana deslizante en TCP
El emisor pone datos
La ventana tiene k ÒsegmentosÓ

mi+k mi+k-1 .... mi


Un paquete IP por segmento

El receptor responde con acks


y nacks
- - mi+k-2 - mi+k-3 ... mi
El emisor retransmite los
datos perdidos

el receptor consume los datos


+ El tamaño de la ventana se reconfigura dinámicamente
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 7

Internet
DNS (Domain Name System)
Correspondencia entre nombres de máquinas y direcciones IP

int com edu gov mil org net jp us es fr ar É

amazon ooc sun acm ieee omg ucm eunet uba

java
GenŽricos Pa’ses

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 8

4
Internet
Protocolos de nivel de aplicación
• FTP: File Transport Protocol
• Telnet: Terminal Remoto
• Email: Simple Mail Transfer Protocol (SMTP)
• News: Network News Transfer Protocol (NNTP)
• DNS: Domain name service protocol
• NIS: Network information service ( “Yellow Pages”)
• NFS: Network file system protocol
• X11: X-server display protocol
• Web: HyperText Transfer Protocol (HTTP)

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 9

Puertos
Cada servicio está asociado a un puerto
inetd
/etc/services

echo 7/tcp Aplicación ftp telnet echo


echo 7/udp
daytime 13/udp
ftp 21/tcp Puerto 21 23 7
telnet 23/tcp telnet
smtp 25/tcp mail TCP o UDP
http 80/tcp
...
paquete
dirección IP #puerto Datos
32 bits 16 bits (0..65535)
(0..1023 están reservados)
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 10

5
Sockets
• Abstracción programable de canal de comunicación
➫ dirección de socket = dirección IP + número de puerto
• Dos procesos se pueden intercambiar información usando
un par de sockets:
➫ Los mensajes van entre un socket de un proceso y otro socket en
otro proceso
➫ Cuando los mensajes son enviados, se encolan en el socket hasta
que el protocolo de red los haya transmitido
➫ Cuando llegan, los mensajes son encolados en el socket de
recepción hasta que el proceso receptor los recoja
• Ciclo de vida igual al sistema de E/S Unix:
➫ Creación: apertura del socket
➫ Lectura y Escritura: recepción y envío de datos por el socket
➫ Destrucción: cierre del socket
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 11

Sockets
Tipos de sockets
• Socket Stream (TCP)
➫ Servicio de transporte orientado a conexión:
m En el servidor un socket atiende peticiones de conexión
m En el cliente un socket solicita una conexión
m Una vez conectados, se pueden usar para transmitir datos en ambas
direcciones
• Socket Datagrama (UDP)
➫ Servicio de transporte no orientado a conexión:
m En cada datagrama es necesario enviar el descriptor del socket local y
la dirección del socket que debe recibir el datagrama
• Socket Raw
➫ Permite acceder a la capa de software de red subyacente o a
protocolos de más bajo nivel
m Se utiliza para depuración de código de los protocolos
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 12

6
Socket streams
Establecimiento de conexi—n

puerto petición de conexión


Servidor Cliente

puerto puerto

conexión

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 13

Programación de sockets con Java


Programación del cliente
• Crea un socket
Socket ladoCliente;
ladoCliente = new Socket (“maquina”, numeroPuerto);
• Le asocia un flujo (stream) de datos para entrada (recepción)
y otro para salida (emisión)
DataInputStream entrada; PrintStream salida;
entrada = new DataInputStream (ladoCliente.getInputStream() );
salida = new PrintStream (ladoCliente.getOutputStream() );
• Lee y escribe de los flujos asociados
• Para finalizar, cierra los flujos y el socket
salida.close( ); entrada.close( ); ladoCliente.close( );
+ Un applet Java tiene la restricción de sólo poder establecer sockets con
el nodo desde el que se transfirió su código
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 14

7
Programación de sockets con Java
Ejemplo: cliente de eco
import java.net.*;
import java.io.*; if (eco != null && entrada != null && salida != null) {
while ((texto = stdin.readLine()) != null) {
class ClienteEco { salida.println(texto);
public static void main( String args[] ) { System.out.println("echo: " + entrada.readLine());
final int PUERTOECO = 7; }
String maquina= ”localhost";
salida.close();
Socket eco = null; entrada.close();
BufferedReader entrada; eco.close();
PrintWriter salida; stdin.close();
}
BufferedReader stdin = new BufferedReader } catch (UnknownHostException e) {
(new InputStreamReader (System.in)); System.err.println("Máquina desconocida: maquina");
String texto; } catch (IOException e) {
System.err.println("Fallo en la conexión: "+e);
try { }
eco = new Socket ( maquina, PUERTOECO ); } // main
salida = new PrintWriter( new OutputStreamWriter } // ServidorEco
(eco.getOutputStream()), true );
entrada = new BufferedReader( new InputStreamReader
(eco.getInputStream()) );

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 15

Programación de sockets con Java


Programación del servidor
• Crea un socket de servidor
ServerSocket servicio;
servicio = new ServerSocket (numeroPuerto);
• Espera la recepción de peticiones de conexión
Socket socketServicio;
socketServicio = servicio.accept();
• Acepta la nueva conexión y crea flujos de entrada y salida
de datos que asocia al nuevo socket
➫ Lo normal es crear una hebra asociada para dar servicio en la
nueva conexión
• Lee y escribe de los flujos asociados
• Para finalizar, cierra los flujos y los socket
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 16

8
Programación de sockets con Java
Ejemplo: servidor de eco
import java.net.*;
import java.io.*; if (cliente != null && entrada != null && salida != null) {
while ( true ) {
class ServidorEco { texto = entrada.readLine();
public static void main( String args[] ) { salida.println(texto);
final int PUERTOECO = 10007; System.out.println("echo: " + texto);
}
ServerSocket s = null;
Socket cliente = null; }
BufferedReader entrada; } catch (IOException e) {
PrintWriter salida; System.err.println("Fallo en la conexion: "+e);
}
String texto; } // main
} // ServidorEco
try {
s = new ServerSocket (PUERTOECO);

cliente = s.accept();
salida = new PrintWriter( new OutputStreamWriter(
cliente.getOutputStream()), true );
entrada = new BufferedReader( new InputStreamReader
(cliente.getInputStream()) );

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 17

Programación de sockets con Java


Ejemplo: servidor de eco para múltiples clientes
puerto

petición de conexión
Servidor Eco MT Cliente

crea
puerto
puerto

Hebra Eco
conexión

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 18

9
Programación de sockets con Java
Ejemplo: servidor de eco con múltiples clientes
import java.net.*;
import java.io.*;
class ServidorEcoMT {
public static void main( String args[] ) {
final int PUERTOECO = 10007;
ServerSocket s = null;
try {
s = new ServerSocket (PUERTOECO);
while ( true )
new HebraEco ( s.accept() ).start();
} catch (IOException e) {
System.err.println("Fallo en la conexion: "+e);
}
} // main
} // ServidorEco
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 19

Programación de sockets con Java


Ejemplo: servidor de eco con múltiples clientes
import java.net.*;
import java.io.*;
class HebraEco extends Thread {
private Socket socket = null;
private String texto;
public HebraEco (Socket s) {
super("HebraEco");
socket = s;
}
public void run() {
try {
PrintWriter salida = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()), true );
BufferedReader entrada = new BufferedReader( new InputStreamReader (socket.getInputStream()) );
while ( true ) {
texto = entrada.readLine();
salida.println(texto);
System.out.println("echo ["+socket.getPort()+"]: " + texto);
}
} catch (IOException e) { System.out.println("Se cerro la conexion " + socket.getPort()); }
} // run
} // HebraEco

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 20

10
Programación de datagramas con Java
Cliente de Eco con datagrama
import java.net.*;
import java.io.*; // recibe la respuesta:
paquete = new DatagramPacket(buf, buf.length);
class ClienteEcoDatagrama { eco.receive(paquete);
public static void main( String args[] ) { recibido = new String(paquete.getData());
final int PUERTOECO = 7; System.out.println("echo: " + recibido);
}
BufferedReader stdIn = new BufferedReader
(new InputStreamReader (System.in)); eco.close();
String texto, recibido;
byte[] buf = new byte[256]; }
catch (UnknownHostException e) {System.err.println(e); }
try { catch (SocketException e) {System.err.println(e); }
InetAddress direccion = catch (IOException e) {System.err.println(e); }
InetAddress.getByName("localhost");
DatagramSocket eco = new DatagramSocket(); } // main
DatagramPacket paquete; } // ServidorEcoDatagrama

while ((texto = stdIn.readLine()) != null) {


// envia el texto al servidor de eco:
buf = texto.getBytes();
paquete = new DatagramPacket (buf, buf.length, direccion, PUERTOECO);
eco.send(paquete);
System.out.println(texto);

© Juan Pavón Mestras, UCM, 1999 Programación con sockets 21

URL
• URL (Universal Resource Locator)
➫ Representa un objeto o servicio en Internet
http://maquina/directorio/fichero.html
nombre de recurso (p.ej., un fichero)
Identificador de protocolo
• Clase URL
URL javasoft = new URL(“http://www.javasoft.com/”);
URL javadownload = new URL(javasoft, “download.html”);
➫ Métodos para manipular el URL:
m getProtocol
m getHost
m getPort
m getFile
m getRef
m openStream
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 22

11
URL
Lectura de un URL
class EjemploLecturaURL {
public static void main(String[] args) {
try {
URL yahoo = new URL("http://www.yahoo.com/");
DataInputStream dis = new DataInputStream(yahoo.openStream());
String inputLine;

while ((inputLine = dis.readLine()) != null) {


System.out.println(inputLine);
}
dis.close();
} catch (MalformedURLException me) {
System.out.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.out.println("IOException: " + ioe);
}
}
}
© Juan Pavón Mestras, UCM, 1999 Programación con sockets 23

12

Você também pode gostar