Examen Final Primavera 2011 (2014)

Examen Catalán
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería de Sistemas de Telecomunicación - 2º curso
Asignatura Aplicacions i Serveis Telematics
Año del apunte 2014
Páginas 10
Fecha de subida 08/04/2015
Descargas 2
Subido por

Vista previa del texto

AST – Examen Final 20 de juny de 2011 Data publicació notes provisionals: 27/06 Data revisió al·legacions: 29/06 a les 13:00 hores al aula S104 del C3 Data publicació notes definitives: 30/06 Professors: Jordi Casademont, Marcel Fernandez i Juan Luis Gorricho DEPARTAMENT D’ENGINYERIA TELEMÀTICA Informacions addicionals:  Duració 2:30h.
Nom Alumne: Problema 1 (2,5 punts) Es vol implementar l’eina anomenada “barrera”, aquesta té definida una única primitiva d’invocació “barrier_wait” que fa que, per una barrera d’ordre n, els n - 1 primers processos que criden “barrier_wait” s’aturen, l’enèsim procés en cridar “barrier_wait” fa que tots continuïn la seva execució. A més l’eina “barrera” ha de ser re-entrant, això vol dir que una vegada n processos han cridat “barrier_wait” aquesta torna al seu estat inicial per poder tornar-la a fer servir. Es demana implementar aquesta eina definint una classe Java: public class Barrier{ ...
public Barrier(int n) {...} public void barrier_wait( ) {…} } Problema 2 (2,5 punts) Es vol implementar una barrera d'ordre n amb sockets TCP, fent servir una arquitectura de servei client/servidor multi-thread. Es demana implementar les classes: client: public class BarrierStub{ … public BarrierStub(String host, int port) {…} public void barrier_wait( ) {…} public void close( ) {…} } servidor: public class BarrierSkeleton{ ...
public BarrierSkeleton (int n, int port) {...} ...
} public class Worker{ ...
} Problema 3 (2,5 punts) Es vol implementar un servei remot de comunicació de la data actual amb sockets TCP, fent servir una arquitectura de servei client/servidor multi-thread amb les següents característiques: es pot donar servei simultani com a molt a n clients i només es poden tenir en espera de servei com a molt a m clients, noves peticions de servei en estat de saturació del servidor han de ser rebutjades i la crida des del client retornarà null (equivalent a denegació de servei). Es demana implementar les classes: Nota: es disposa de la classe buffer vista a classe (no cal implementar) amb el mètode addicional: boolean full() d’execució atòmica per indicar si el buffer està ple.
client: public class DateStub{ … public DateStub(String host, int port) {…} public Date date( ) {…} private void connect( ) {…} private void disconnect( ) {…} } servidor: public class DateSkeleton{ ...
public DateSkeleton (int n, int m, int port) {...} ...
} public class Worker{ ...
} Problema 4 (2,5 punts) Explica totes les accions que realitza la xarxa, on surtin tots els protocols utilitzats amb les sol·licituds i respostes enviades per cadascun d’ells en les situacions descrites més avall. També has d’indicar les accions que es generen més enllà de l’ordinador client, és a dir, aquelles que es realitzen entre servidors externs a causa de l’operació que genera el nostre ordinador.
Els protocols que has de considerar (no tenen perquè sortir tots) són: IP, TCP, UDP, ICMP, ARP, POP3, DNS (indicar quin tipus de petició es realitza), SMTP, IMAP, HTTP, TELNET, FTP, DHCP.
Suposa que tots els ordinadors estan enllaçats amb Ethernet i que dins la nostra Ethernet hi ha tots els servidors locals: de correu electrònic, de DNS, ...
Indicar els protocols de nivell inferior que s’utilitzen en cada cas i quins paràmetres es necessiten. Per exemple, si utilitzés el FTP es podria posar: "Els paquets FTP tenen la següent estructura: Ethernet-ip-tcp-ftp.
Per establir la comunicació es necessita l’adreça IP i el port del destí. L'adreça la proporciona l'usuari i el port és un dels well known.
El primer que fa el FTP és establir una connexió TCP i després pregunta el login i password de l'usuari ..." Les situacions que has d’analitzar són: a) b) c) d) S’inicia un ordinador que necessita adquirir els paràmetres de xarxa de forma automàtica. (0,5 punts) A continuació, obro un client de correu electrònic (thunderbird) i descarrego el correu que tinc en el meu servidor de correu entrant. (0,5 punts) Amb el mateix client de correu electrònic envio un correu que es deposita en el mailbox del servidor de correu destí de l’usuari alumne@ub.edu (aquesta adreça pertany a un domini diferent al nostre). (1.25 punt) Finalment aturo l’ordinador. (0,25 punts) SOLUCIÓ: Problema 1 public class Barrera { private int num_threads, arribats; public Barrera(int num) { num_threads = num; arribats = 0; } public synchronized void barrier_wait() { try { arribats++; if(arribats<num_threads) { wait();} else { arribats=0; notifyAll(); } } catch(InterruptedException e) { System.out.println(e.toString());} } } Problema 2 import java.net.*; import java.io.*; class BarrierStub{ Socket sc; ObjectOutputStream out; ObjectInputStream in; public BarrierStub(String host, int port){ try{ sc = new Socket(host,port); ois = new ObjectInputStream(sc.getInputStream()); oos = new ObjectOutputStream(sc.getOutputStream()); } catch(Exception e){e.printStackTrace();} } public void barrier_wait(){ try{ oos.writeBoolean(true); ois.readBoolean(); } catch(Exception e){e.printStackTrace();} } public void close(){ try{ oos.close(); ois.close(); sc.close(); } catch(Exception e){e.printStackTrace();} } } import java.net.Socket; import java.net.ServerSocket; import java.io.*; public class BarrierSkeleton extends Thread { private Barrera barrera; private ServerSocket ss; public BarrierSkeleton(int n, int port) { barrera = new Barrera(n); ss = new ServerSocket(port); } public void run(){ try { while(true) new Worker(ss.accept(),barrera).start(); } catch (Exception e) { e.printStackTrace();} } } class Worker extends Thread { private Barrera barrera; private Socket sc; Worker(Socket sc, Barrera barrera) { this.barrera = barrera; this.sc = sc; } public void run() { ObjectInputStream ois = new ObjectInputStream(sc.getInputStream()); ObjectOutputStream oos = new ObjectOutputStream(sc.getOutputStream()); while(true) { try { ois.readBoolean(); barrera.barrier_wait(); oos.writeBoolean(true); } catch(Exception e) { e.printStackTrace();} } try { ois.close(); oos.close(); sc.close(); } catch(Exception e) { e.printStackTrace();} } } Problema 3 import java.net.Socket; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; public class DateStub { String host; int port; Socket sc; ObjectOutputStream out; ObjectInputStream in; boolean error_conexio; public DateStub(String host, int port){ this.host = host; this.port = port; } public Date date() { connect(); //això és redundant, doncs si hi ha qualsevol //excepció també retornarà null tot i no fer //servir error_conexió: if(error_conexio) return null; Object result = null; try { out.writeInt(Comms.DATE); out.flush(); result = (Date)in.readObject(); } catch (Exception e) { e.printStackTrace(); } disconnect(); return result; } public connect(){ try{ sc = new Socket(host, port); //han d'estar creuats amb l'altre comunicant, si no el constructor //ObjectInputStream es bloqueja.
out = new ObjectOutputStream(sc.getOutputStream()); in = new ObjectInputStream(sc.getInputStream()); } catch(Exception e){error_conexio = true;} } public void disconnect(){ try { out.close(); in.close(); sc.close(); } catch (Exception e) { e.printStackTrace(); } } } import java.net.Socket; import java.net.ServerSocket; import java.io.*; public class DateSkel implements Runnable { private Buffer buffer; private int port; public DateSkel(int n, int m, int port) { Buffer buffer = new Buffer(m); this.port = port; for(int i=0; i< n; i++){ Thread th = new Thread(new Worker(buffer)); th.setDaemon(true); th.start(); } Thread th = new Thread(this); th.setDaemon(true); th.start(); } public void run(){ try { ServerSocket ss = new ServerSocket(port); while(true) { Socket sc = ss.accept(); if( !buffer.full() ) buffer.put(sc); else sc.close(); } } catch (Exception e) { e.printStackTrace();} } } public class Worker implements Runnable { private Buffer buffer; Worker(Buffer buffer) { this.buffer = buffer; } public void run() { while(true) { try { Socket sc = (Socket) buffer.get(); ObjectInputStream ois = new ObjectInputStream(sc.getInputStream()); ObjectOutputStream oos = new ObjectOutputStream(sc.getOutputStream()); int metodo = ois.readInt(); switch (metodo) { case Comms.DATE: oos.writeObject(new Date()); break; } ois.close(); oos.close(); sc.close(); } catch(Exception e) { e.printStackTrace();} } } } Problema 4 a) A l’iniciar‐se, l’ordinador necessita adquirir els paràmetres de xarxa d‘un servidor DHCP. No requereix l’adreça del servidor perquè envia la sol·licitud en broadcast. Els paquets DHCP tenen la següent estructura: Ethernet‐ip‐udp‐dhcp. DHCP_DISCOVER DHCP_OFFER DHCP_REQUEST DHCP_ACK Amb aquesta operació adquirim: l’adreça IP, la màscara de xarxa, el router per defecte i les adreces dels servidors DNS. Aquests dos últims paràmetres són opcionals. b) Per descarregar el correu s’utilitza el POP3. Els paquets POP3 tenen la següent estructura: Ethernet‐ip‐tcp‐pop3. Necessita l’adreça IP del servidor de correu d’entrada que l’haurà posat l’usuari manualment. Abans de poder contactar amb el servidor de correu d’entrada necessito la seva adreça MAC. Per això s’utilitza l’ ARP. Els paquets ARP tenen la següent estructura: Ethernet‐ARP. Un cop tenim les adreces IP i Ethernet, el client de pop3 sol·licita la descàrrega dels correus rebuts i el servidor els hi transfereix. c) Per enviar un correu utilitzo el SMTP. El client de correu electrònic es connectarà al meu servidor de correu sortint. Necessito l’adreça IP del servidor de correu sortint, aquesta l’ha de posar l’usuari manualment. Un cop tingui l’adreça IP necessitaré la seva adreça MAC, per això utilitzem el protocol ARP. Amb aquestes dades, el client de correu es connecta al servidor de correu sortint, li sol·licita un enviament i li passa el correu que vull enviar. Els paquets SMTP tenen la següent estructura: Ethernet‐ip‐tcp‐smtp. Ara, el meu servidor de correu sortint ha de passar el meu correu al servidor de correu entrant del destinatari. Aquesta transferència també es realitza amb SMTP. El meu servidor de correu sortint necessita l’adreça IP del servidor de correu del destinatari. Per aconseguir aquesta adreça s’agafa el domini de l’adreça de correu del destinatari, ub.edu, i es consulta el servidor DNS utilitzant una petició tipus MX. Per consultar el sistema DNS necessito saber l’adreça IP del servidor DNS local que haurem obtingut amb el DHCP. També necessito l’adreça MAC del servidor DNS. Per això torno a utilitzar l’ARP. Un cop tinc la IP i la MAC del servidor DNS li faig la consulta. El servidor DNS local haurà de preguntar a altres servidors DNS externs a la nostra xarxa, per això necessitarà enviar‐los‐hi paquets a través del router de sortida de la xarxa. Necessitarà llavors l’adreça IP del router. També necessitarà la seva MAC, per obtenir aquesta haurem de tornar a utilitzar l’ARP. El meu servidor DNS preguntarà al servidor DNS arrel i aquest donarà l’adreça IP del servidor DNS del domini .edu. El meu servidor DNS pregunta al servidor del .edu i aquest dóna l’adreça del servidor DNS de la ub. El meu servidor DNS pregunta al servidor de la ub i aquest dóna l’adreça del servidor de correu que necessito. Els paquets DNS tenen la següent estructura: Ethernet‐ip‐udp‐dns. Ara el meu servidor de correu sortint es connectarà al servidor de correu de la UB amb l’adreça IP obtinguda anteriorment. Utilitzant el SMTP li passarà el correu que nosaltres hem escrit i es desconnectarà. d) Per apagar‐se, l’única acció que ha de realitzar l’ordinador es retornar l’adreça que li ha deixat el servidor DHCP. Envia un DHCP_RELEASE al servidor DHCP. Necessita l’adreça del servidor DHCP però ja la té de l’inici. Si no fa el Release el servidor DHCP s’adornarà de que està fora de servei quan expiri el Lease time. ...