02.12.2014 Views

Lab 01: Programación de Sockets en TCP - Ingeniería Informática y ...

Lab 01: Programación de Sockets en TCP - Ingeniería Informática y ...

Lab 01: Programación de Sockets en TCP - Ingeniería Informática y ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO<br />

Departam<strong>en</strong>to Académico <strong>de</strong> Informática<br />

REDES Y TELECOMUNICACIONES 2<br />

<strong>Lab</strong> <strong>01</strong>: Programación <strong>de</strong> <strong>Sockets</strong> <strong>en</strong> <strong>TCP</strong><br />

Ingº Manuel Peñaloza Figueroa<br />

“Dime y lo olvidaré. Muéstrame y lo recordaré. Involúcrame y lo <strong>en</strong>t<strong>en</strong><strong>de</strong>ré”<br />

Proverbio chino<br />

1. OBJETIVOS:<br />

1.1 Ent<strong>en</strong><strong>de</strong>r lo básico <strong>de</strong> la comunicación por re<strong>de</strong>s.<br />

1.2 Programar aplicaciones <strong>de</strong> red usando sockets.<br />

1.3 Apr<strong>en</strong><strong>de</strong>r como construir aplicaciones cli<strong>en</strong>te/servidor que se comunican usando<br />

sockets<br />

1.4 Apr<strong>en</strong><strong>de</strong>r el uso <strong>de</strong> sockets <strong>en</strong> Java.<br />

2. BASE TEORICA COMPLENTARIA<br />

Capa <strong>de</strong> Transporte:<br />

- Pue<strong>de</strong> ofrecer a sus usuarios un sistema transpar<strong>en</strong>te <strong>de</strong> intercambio <strong>de</strong> datos<br />

confiable, operando <strong>de</strong> extremo a extremo (<strong>en</strong>d-to-<strong>en</strong>d).<br />

- La capa <strong>de</strong> transporte es la responsable por la <strong>en</strong>trega proceso-a-proceso – la<br />

<strong>en</strong>trega <strong>de</strong> un paquete, la parte <strong>de</strong> un m<strong>en</strong>saje, <strong>de</strong>s<strong>de</strong> un proceso a otro.


<strong>TCP</strong>: Transmission Control Protocol<br />

- RFC 793<br />

- Transporte/Servicio ori<strong>en</strong>tado a la conexión<br />

- Protocolo <strong>de</strong> transporte <strong>de</strong> Internet<br />

- Transfer<strong>en</strong>cia <strong>de</strong> datos full-dúplex<br />

- Transporte confiable:<br />

Control:<br />

o <strong>de</strong> transmisión<br />

o <strong>de</strong> flujo<br />

o <strong>de</strong> errores<br />

o <strong>de</strong> congestión <strong>de</strong> red<br />

o ...<br />

- Provee servicio a la capa <strong>de</strong> aplicación<br />

- Adaptable a LAN/WAN<br />

- Transfer<strong>en</strong>cia <strong>de</strong> un stream <strong>de</strong> bytes <strong>en</strong>tre sistemas finales (<strong>en</strong>d-to-<strong>en</strong>d)<br />

- …<br />

- Cuando 2 aplicaciones <strong>de</strong>sean comunicarse el uno al otro confiablem<strong>en</strong>te, ellos<br />

establec<strong>en</strong> una conexión y <strong>en</strong>vían datos <strong>de</strong> una parte a la otra sobre esa conexión.<br />

- <strong>TCP</strong> provee un canal punto-a-punto para aplicaciones que requier<strong>en</strong> comunicaciones<br />

confiables.<br />

o HTTP (HyperText Transfer Protocol), FTP (File Transfer Protocol), y Telnet son<br />

algunos ejemplos <strong>de</strong> aplicaciones que requier<strong>en</strong> un canal <strong>de</strong> comunicación<br />

confiable.<br />

o El or<strong>de</strong>n <strong>en</strong> la cual los datos son <strong>en</strong>viados y recibidos sobre la red es crítico<br />

para el éxito <strong>de</strong> estas aplicaciones.<br />

o Cuando HTTP es usado para leer <strong>de</strong>s<strong>de</strong> un URL, los datos ti<strong>en</strong><strong>en</strong> que ser<br />

recibidos <strong>en</strong> el or<strong>de</strong>n <strong>en</strong> el cual fueron <strong>en</strong>viados. De otra manera, se acabaría<br />

con un archivo HTML revuelto, un archivo ZIP corrupto, ó alguna otra<br />

información inválida.<br />

Puertos:<br />

- En g<strong>en</strong>eral, una computadora ti<strong>en</strong>e una simple conexión física a la red.<br />

o Todos los datos <strong>de</strong>stinados a una computadora <strong>en</strong> particular llega a través <strong>de</strong><br />

esa conexión.<br />

o Sin embargo, los datos pue<strong>de</strong> ser pret<strong>en</strong>didos por difer<strong>en</strong>tes aplicaciones


o<br />

corri<strong>en</strong>do <strong>en</strong> el mismo computador.<br />

¿Así como la computadora sabe a cual aplicación reexpedir los datos?<br />

A través <strong>de</strong>l uso <strong>de</strong> los puertos<br />

- Cada proceso que <strong>de</strong>sea comunicarse con otro proceso se i<strong>de</strong>ntifica a si mismo para<br />

la suite <strong>de</strong> protocolos <strong>TCP</strong>/IP por 1 ó más puertos.<br />

- Los datos trasmitidos por el Internet están acompañados por información <strong>de</strong><br />

direccionami<strong>en</strong>to que i<strong>de</strong>ntifica a la computadora y al puerto para el cual están<br />

<strong>de</strong>stinados.<br />

o<br />

o<br />

La computadora está i<strong>de</strong>ntificada por su dirección IP <strong>de</strong> 32-bit.<br />

Los puertos son i<strong>de</strong>ntificados por un número <strong>de</strong> 16-bit, los cuales <strong>TCP</strong> y UDP<br />

usan para <strong>en</strong>tregar los datos a la aplicación correcta.<br />

- Hay 2 tipos <strong>de</strong> puertos:<br />

o "Well-known" ó bi<strong>en</strong>-conocidos:<br />

0: reservado<br />

1 – 1023: procesos servidor<br />

o Efímeros:<br />

1023 - 65535: usuarios, cli<strong>en</strong>tes<br />

- Sin embargo, el IETF IANA <strong>de</strong>fine 3 rangos <strong>de</strong> puertos:<br />

o Puertos Well-Known ó bi<strong>en</strong>-conocidos<br />

rango: 0 – 1023<br />

son asignados por el IANA<br />

o Puertos Registrados<br />

rango: 1024 – 49151<br />

no <strong>de</strong>berían ser usados sin el registro <strong>de</strong>l IANA<br />

o Puertos Dinámicos y/o Privados<br />

rango: 49152 – 65535<br />

típicam<strong>en</strong>te usados como puerto fu<strong>en</strong>te por cli<strong>en</strong>tes <strong>TCP</strong> ó UDP.<br />

Socket:<br />

- una interface:<br />

o <strong>en</strong> el host local<br />

o creada por la aplicación<br />

o controlada por el SO<br />

(una "puerta") <strong>de</strong>ntro <strong>de</strong> la cual el proceso <strong>de</strong> aplicación pue<strong>de</strong> tanto <strong>en</strong>viar como<br />

recibir m<strong>en</strong>sajes a/<strong>de</strong>s<strong>de</strong> otro proceso <strong>de</strong> aplicación


- Conexiones:<br />

o Normalm<strong>en</strong>te, un servidor corre sobre una computadora específica y ti<strong>en</strong>e un<br />

socket que está LIGADO al número <strong>de</strong> puerto respectivo.<br />

o El servidor justam<strong>en</strong>te espera, escuchando al socket por un cli<strong>en</strong>te haga una<br />

petición <strong>de</strong> conexión.<br />

o<br />

En el lado <strong>de</strong>l cli<strong>en</strong>te: el cli<strong>en</strong>te sabe el nombre_<strong>de</strong>_host <strong>de</strong> la máquina <strong>en</strong> el<br />

cual el servidor está corri<strong>en</strong>do y el número <strong>de</strong> puerto <strong>en</strong> el cual el servidor<br />

esta escuchando.<br />

Para hacer una petición <strong>de</strong> conexión, el cli<strong>en</strong>te int<strong>en</strong>ta citarse con el<br />

servidor <strong>en</strong> la máquina y puerto <strong>de</strong>l servidor.<br />

El cli<strong>en</strong>te también necesita i<strong>de</strong>ntificar a si mismo al servidor así se<br />

liga a un puerto local que usará durante la conexión (el número <strong>de</strong><br />

puerto es usualm<strong>en</strong>te asignado por el sistema).<br />

o<br />

Si todo va bi<strong>en</strong>, el servidor acepta la conexión.<br />

A la aceptación, el servidor obti<strong>en</strong>e un nuevo socket ligado a su mismo<br />

puerto local y también ti<strong>en</strong>e su socket seteado a la dirección y puerto<br />

<strong>de</strong>l cli<strong>en</strong>te.<br />

El servidor necesita este nuevo socket a fin <strong>de</strong> po<strong>de</strong>r continuar<br />

escuchando <strong>en</strong> el socket original por peticiones <strong>de</strong> conexión <strong>de</strong> otros<br />

cli<strong>en</strong>tes mi<strong>en</strong>tras ati<strong>en</strong><strong>de</strong> ó sirve a las necesida<strong>de</strong>s <strong>de</strong>l cli<strong>en</strong>te<br />

conectado.


o<br />

o<br />

En el lado <strong>de</strong>l cli<strong>en</strong>te, si la conexión es aceptada, un socket es<br />

satisfactoriam<strong>en</strong>te creado y el cli<strong>en</strong>te pue<strong>de</strong> usar este socket para<br />

comunicarse con el servidor.<br />

El cli<strong>en</strong>te y el servidor pue<strong>de</strong>n ahora comunicarse con escribir A ó leer DESDE<br />

sus sockets.<br />

- El par , brinda una i<strong>de</strong>ntificación única para los<br />

servicios <strong>de</strong> capa <strong>de</strong> aplicación <strong>en</strong> un host, y sirve para i<strong>de</strong>ntificar a un socket.<br />

o Cada lado <strong>de</strong> una conexión <strong>TCP</strong> ti<strong>en</strong>e un socket que pue<strong>de</strong> ser i<strong>de</strong>ntificado<br />

por:<br />

la 3-tupla <br />

ó<br />

la 2-tupla .<br />

o Si 2 procesos están comunicándose sobre <strong>TCP</strong>, ellos ti<strong>en</strong><strong>en</strong> una conexión<br />

lógica que es <strong>de</strong> una manera única i<strong>de</strong>ntificable por los 2 sockets involucrados,<br />

esto es, por:<br />

una 5-tupla <br />

ó<br />

una 4-tupla .<br />

o Entonces, una conexión <strong>TCP</strong> está i<strong>de</strong>ntificada por un par <strong>de</strong> sockets (el <strong>de</strong>l<br />

cli<strong>en</strong>te y el <strong>de</strong>l servidor) <strong>en</strong> ambos extremos.<br />

3. RECURSOS<br />

Los recursos a utilizar <strong>en</strong> el trabajo <strong>de</strong> laboratorio son:<br />

3.1 Java<br />

4. DESARROLLO DE LA PRACTICA:<br />

En el pres<strong>en</strong>te trabajo <strong>de</strong> laboratorio se visualizará el estado <strong>de</strong> las conexiones <strong>TCP</strong> y se<br />

implem<strong>en</strong>tará tanto un cli<strong>en</strong>te que <strong>en</strong>vía datos <strong>en</strong> minúscula a un servidor, como un<br />

servidor que recibe datos <strong>en</strong> minúscula <strong>de</strong>s<strong>de</strong> un cli<strong>en</strong>te y lo <strong>de</strong>vuelve <strong>de</strong> regreso pero<br />

<strong>en</strong> mayúsculas haci<strong>en</strong>do uso <strong>de</strong>l l<strong>en</strong>guaje Java.<br />

4.1 Estado <strong>de</strong> las conexiones <strong>TCP</strong>:<br />

- abrir una v<strong>en</strong>tana DOS<br />

- <strong>en</strong> el Prompt <strong>de</strong> comandos tipear:<br />

netstat<br />

o muestra las conexiones, puertos <strong>de</strong> escucha, estado <strong>de</strong> las conexiones y


estadísticas por protocolo (-a)<br />

4.2 Escribir una aplicación cli<strong>en</strong>te/servidor que implem<strong>en</strong>te el servicio “CAMBIAR<br />

DATOS EN MINUSCULAS A MAYUSCULAS”.<br />

- En la programación <strong>de</strong> sockets, la estructura <strong>de</strong>l programa es <strong>en</strong> mucho el<br />

mismo:<br />

Abrir un socket<br />

Abrir un stream <strong>de</strong> <strong>en</strong>trada y un stream <strong>de</strong> salida para el socket.<br />

Leer <strong>de</strong>s<strong>de</strong> y escribir hacia el stream conforme al protocolo <strong>de</strong>l servidor.<br />

Cerrar los streams.<br />

Cerrar el socket.<br />

- Ejemplo: aplicación cli<strong>en</strong>te-servidor:<br />

APLICACIÓN CLIENTE:<br />

1. Pre-condición: El proceso servidor <strong>de</strong>be estar 1ro. <strong>en</strong> ejecución<br />

2. Cli<strong>en</strong>te lee la línea <strong>de</strong>s<strong>de</strong> la <strong>en</strong>trada estándar (stream inDes<strong>de</strong>Usuario), y<br />

lo <strong>en</strong>vía al server vía socket (stream outAlServer)<br />

3. El servidor lee la línea <strong>de</strong>s<strong>de</strong> el socket.<br />

4. El server convierte la línea a mayúsculas, lo <strong>en</strong>vía <strong>de</strong> regreso al cli<strong>en</strong>te<br />

5. Cli<strong>en</strong>te lee, imprime la línea modificada <strong>de</strong>s<strong>de</strong> el socket (inDes<strong>de</strong>Server)


-<br />

APLICACIÓN SERVIDOR Y CLIENTE:<br />

-


APLICACIÓN CLIENTE:<br />

Cli<strong>en</strong>te<strong>TCP</strong>.java<br />

/*<br />

*/<br />

import java.io.*;<br />

import java.net.*;<br />

class Cli<strong>en</strong>te<strong>TCP</strong> {<br />

public static void main(String argv[]) throws Exception<br />

{<br />

// variables<br />

String s<strong>en</strong>t<strong>en</strong>cia;<br />

String s<strong>en</strong>t<strong>en</strong>ciaModificada;<br />

// crear un stream <strong>de</strong> <strong>en</strong>trada para la <strong>en</strong>trada <strong>de</strong>l usuario<br />

BufferedRea<strong>de</strong>r inDes<strong>de</strong>Usuario =<br />

new BufferedRea<strong>de</strong>r(new InputStreamRea<strong>de</strong>r(System.in));<br />

// crear socket cli<strong>en</strong>te y conectarse al server<br />

Socket socketCli<strong>en</strong>te = new Socket("id_Servidor", 6789);<br />

// crear un stream <strong>de</strong> salida ligado al socket<br />

DataOutputStream outAlServidor =<br />

new DataOutputStream(socketCli<strong>en</strong>te.getOutputStream());<br />

// crear un stream <strong>de</strong> <strong>en</strong>trada ligado al socket<br />

BufferedRea<strong>de</strong>r inDes<strong>de</strong>Servidor = new BufferedRea<strong>de</strong>r(new<br />

InputStreamRea<strong>de</strong>r(socketCli<strong>en</strong>te.getInputStream()));<br />

// leer <strong>en</strong>trada<br />

s<strong>en</strong>t<strong>en</strong>cia = inDes<strong>de</strong>Usuario.readLine();<br />

// <strong>en</strong>viar la <strong>en</strong>trada al server<br />

outAlServidor.writeBytes(s<strong>en</strong>t<strong>en</strong>cia + '\n');<br />

// leer paquete <strong>de</strong> réplica <strong>de</strong>l server<br />

s<strong>en</strong>t<strong>en</strong>ciaModificada = inDes<strong>de</strong>Servidor.readLine();<br />

System.out.println("RESPUESTA DESDE EL SERVER: "<br />

+ s<strong>en</strong>t<strong>en</strong>ciaModificada);<br />

// cerrar<br />

socketCli<strong>en</strong>te.close();<br />

}<br />

}<br />

APLICACIÓN SERVIDOR:<br />

Servidor<strong>TCP</strong>.java<br />

/*<br />

*/


import java.io.*;<br />

import java.net.*;<br />

class Servidor<strong>TCP</strong> {<br />

public static void main(String argv[]) throws Exception<br />

{<br />

String s<strong>en</strong>t<strong>en</strong>ciaCli<strong>en</strong>te;<br />

String s<strong>en</strong>t<strong>en</strong>ciaEnMay;<br />

// crear el socket servidor (<strong>TCP</strong>) <strong>en</strong> el puerto 6789<br />

ServerSocket socketServidor = new ServerSocket(6789);<br />

while(true) {<br />

// el socket servidor espera, escuchando por contacto por el cli<strong>en</strong>te,<br />

// si lo acepta un nuevo socket es creado y la conexión es hecha<br />

Socket socketConexion = socketServidor.accept();<br />

// crear un stream <strong>de</strong> <strong>en</strong>trada ligado al socket<br />

BufferedRea<strong>de</strong>r inDes<strong>de</strong>Cli<strong>en</strong>te = new BufferedRea<strong>de</strong>r(<br />

new InputStreamRea<strong>de</strong>r(socketConexion.getInputStream()));<br />

// crear un stream <strong>de</strong> salida ligado al socket<br />

DataOutputStream outAlCli<strong>en</strong>te =<br />

new DataOutputStream(socketConexion.getOutputStream());<br />

// leer el m<strong>en</strong>saje <strong>de</strong>s<strong>de</strong> el socket<br />

s<strong>en</strong>t<strong>en</strong>ciaCli<strong>en</strong>te = inDes<strong>de</strong>Cli<strong>en</strong>te.readLine();<br />

// construir respuesta<br />

s<strong>en</strong>t<strong>en</strong>ciaEnMay = s<strong>en</strong>t<strong>en</strong>ciaCli<strong>en</strong>te.toUpperCase() + '\n';<br />

}<br />

}<br />

}<br />

// escribir el m<strong>en</strong>saje al socket<br />

outAlCli<strong>en</strong>te.writeBytes(s<strong>en</strong>t<strong>en</strong>ciaEnMay);<br />

- En Windows abrir 2 v<strong>en</strong>tanas DOS, e ir al directorio don<strong>de</strong> se <strong>en</strong>cu<strong>en</strong>tran los<br />

programas fu<strong>en</strong>te.<br />

- Si necesario, <strong>en</strong> ambas v<strong>en</strong>tanas, establecer la ruta al compilador y al<br />

intérprete <strong>de</strong> Java<br />

SET PATH=%PATH%;C:\Archivos <strong>de</strong> programa\Java\jdk1.6.0\bin<br />

- En cada v<strong>en</strong>tana, compilar el correspondi<strong>en</strong>te archivo <strong>de</strong> Java<br />

javac Cli<strong>en</strong>te<strong>TCP</strong>.java<br />

javac Servidor<strong>TCP</strong>.java<br />

- En la v<strong>en</strong>tana <strong>de</strong>l servidor ejecutar la aplicación servidor<br />

java Servidor<strong>TCP</strong>


- En la v<strong>en</strong>tana <strong>de</strong>l cli<strong>en</strong>te ejecutar la aplicación cli<strong>en</strong>te.<br />

java Cli<strong>en</strong>te<strong>TCP</strong><br />

- (com<strong>en</strong>tarios) …<br />

5. CONTROL:<br />

TRABAJOS DE LABORATORIO.<br />

5.1 Investigar y docum<strong>en</strong>tar <strong>en</strong> netstat las opciones:<br />

-n, -r, -b<br />

5.2 Investigar y docum<strong>en</strong>tar <strong>en</strong> netstat opciones sobre las interfaces pres<strong>en</strong>tes <strong>en</strong> la<br />

PC.<br />

5.3 La asist<strong>en</strong>cia al laboratorio se consi<strong>de</strong>ra como tal si se cumple con lo solicitado <strong>en</strong><br />

4.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!