Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · •...

36
2018-2019 Comunicare intre procese in sisteme distribuite Capitolul 12

Transcript of Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · •...

Page 1: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicare intre procese in sisteme

distribuite

Capitolul 12

Page 2: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicatie intre procese in SD

• Ne referim la nivelul middleware ilustrat cu culoare mai inchisa in figura.

• Se au in vedere UDP si TCP din punctul de vedere al programatorului.

• API-ul UDP furnizeaza o abstractizare a transferului de mesaje (engl. message passing abstraction). Pachetele independente care contin mesaje de cerere sau raspuns se numesc datagrame (engl.datagram).

• API-ul TCP ofera o abstractie pentru comunicatia bidirectionala prin fluxuri (engl.2-way stream). TCP nu delimiteaza mesajele ca UDP.

Page 3: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicatia intre procese in Internet

• Comunicatia intre procese in Internet se bazeaza pe urmatoarea stiva de protcoale:

• Un programator de aplicatii nu va trebui sa cunoasca in detaliu nivelele TCP si UDP. In schimb el va utiliza serviciile unui nivel middleware care ofera un acces facil la aceste nivele.

• Spre exemplu, in platforma Java serviciile acestui nivel middleware sunt oferite de clasele definite in pachetul java.net.

Page 4: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Fiabilitate si ordonare

• Fiabilitatea presupune garantarea livrarii mesajelor de la expeditor la destinatar chiar si in prezenta unei degradari semnificative, dar rezonabile, a numarului de pachete pierdute din diverse cauze.

• Un serviciu nefiabil nu garanteaza livrarea mesajelor in situatia in care pachetele de date se pot pierde.

• Integritatea presupune in mod suplimentar ca mesajele expediate sa ajunge necorupte la destinatar.

• Ordonarea cere ca in anumite aplicatii mesajele sa fie livrate expeditorului in ordinea expedierii lor de catre destinatar. Nerespectarea acestei ordini este considerata un esec.

Page 5: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Destinatia mesajelor

• In Internet destinatia unui mesaj este o pereche (adresa IP, port

local).

• Adresa IP reprezinta o adresa a unui calculator gazda conectat

la Internet. Un port local este un numar natural ce reprezinta

destinatia unui mesaj pe un anumit calculator. Un port

reprezinta un singur destinatar, dar poate avea mai multi

expeditori.

• Un proces poate receptiona mesaje pe mai multe porturi. Orice

proces ce cunoaste numarul portului asociat unui proces

destinatie, ii poate trimite mesaje. Serverele isi publica

porturile pe care primesc mesaje de la clienti.

Page 6: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Transparenta locatiei

• Daca un client utilizeaza o adresa fixa de IP pentru a se referi la

un serviciu, atunci acel serviciu va trebui sa ruleze intotdeauna

pe acelasi calculator pentru a ramane valid. Pentru a evita acest

lucru, se pot utiliza tehnici pentru furnizarea transparentei

locatiei.

• Programele client se pot referi la servicii prin nume si pot

utiliza un server de nume (engl.name server sau binder) pentru

a translata numele in adrese fizice. Aceasta tehnica permite

relocarea serviciilor, dar nu migrarea lor (migrare = mutarea

unui serviciu in timp ce sistemul este in executie), asigurand

transparenta locatiei.

Page 7: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Socluri

• UDP si TCP folosesc o abstractie numita soclu (engl.socket). Un soclu identifica un

punct terminal de comunicare intre procese. Soclurile au fost introduse pentru prima

oara in Unix BSD. La ora actuala ele exista in majoritatea versiunilor de Unix, in Linux,

in Windows si in MacOS.

• Comunicatia intre procese consta in transmiterea unui mesaj de la un soclu al procesului

expeditor catre un soclu al procesului destinatar.

• Un proces va primi mesaje daca dispune de un soclu conectat la un port local si la adresa

de IP a calculatorului pe care ruleaza. Mesajele trimise la perechea (adresa IP, port

local) pot fi receptionate doar de procesul ce dispune de un soclu conectat la pereche.

• Un proces nu poate partaja un nume de port cu un alt proces pe acelasi calculator. Exceptie fac procesele care utilizeaza adresa IP pentru multitransmisie.

message

agreed port any port

socket socket

Internet address = 138.37.88.249 Internet address = 138.37.94.248

other ports

client server

Page 8: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

UDP si TCP

• TCP – Transport Control Protocol si UDP – User datagram Protocol sunt doua protocoale de transport.

• TCP este un protocol orientat pe conexiune si fiabil.

• UDP nu este orientat pe conexiune si nu garanteaza livrarea fiabila a mesajelor.

Page 9: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Java API pentru adrese IP

• Platforma Java dispune de pachetul java.net pentru reprezentarea convenabila a obiectelor pentru comunicatia in retele IP:

– Adrese de IP, URL-uri

– Diverse tipuri de socluri

– Reprezentarea pachetelor si mesajelor transmise

– Transmisia respectiv receptia convenabila a mesajelor si pachetelor

– Clase specializate pentru lucrul cu protocolul HTTP: reprezentarea unei conexiuni, autentificare, cookie-uri, etc

– Exceptiile ce pot apare in aplicatiile ce folosesc comunicatia in retea.

• Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate clase pentru adrese IP pe 4 si respectiv 6 octeti: Inet4Address si Inet6Address.

• Crearea unei adrese de IP se poate face simbolic: InetAddress unCalculator = Inetaddress.getByName(“software.ucv.ro”);

• Simbolul poate reprezenta si o adresa de IP: InetAddress unCalculator = Inetaddress.getByName(“127.0.0.1”);

Page 10: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicatia prin mesaje UDP

• http://en.wikipedia.org/wiki/User_Datagram_Protocol

• Definitie: UDP permite transferul de pachete numite datagrame de la un proces expeditor la un proces destinatar. Nu exista confirmare si mesajul se poate pierde sau altera datorita erorilor de transmisie.

• Comunicatia presupune realizarea pasilor: – Orice proces expeditor sau destinatar va crea intai un soclu legat la o

adresa de IP si un port local.

– Procesul destinatar isi va conecta soclul la un port pe care il va face cunoscut expeditorilor.

– Expeditorul isi poate lega soclul la orice port local disponibil.

– Expeditorul executa apelul send pentru a transmite un mesaj destinatarului.

– Apelul receive la destinatar va determina mesajul receptionat cat si adresa de IP si portul expeditorului. Se permite astfel trimiterea explicita a unui raspuns expeditorului.

Page 11: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Caracteristici ale comunicatiei prin mesaje UDP

• Dimensiunea mesajelor. Protocolul IP permite transmiterea de pachete de

pana la 216 octeti (IPv4, incluzand si antetele !). Dimensiunea uzuala a

mesajelor este de 8 Kocteti. Se determina in functie de aplicatie.

• Blocarea. Comunicatia prin datagrame UDP foloseste operatii send fara

blocare si operatii receive cu blocare. Daca nu exista procese la destinatie

cu un soclu conectat corespunzator, mesajele se pierd. Daca procesul

destinatar are de efectuat alte sarcini, el poate folosi un fir separat pentru

realizarea acestor sarcini.

• Timeout. Uneori nu este posibil ca destinatarul sa astepte nelimitat

primirea unui mesaj. Se poate seta un timeout pentru un soclu.

• Receptie de la oricine. Metoda receive nu specifica o adresa pentru

originea mesajelor – cu alte cuvinte receptia poate veni de la oricine

cunoaste adresa si portul destinatarului. Este insa posibil sa se conecteze

un soclu pentru datagrame cu un port si o adresa de IP la distanta astfel

incat comunicatia sa se faca doar cu adresa respectiva.

Page 12: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Modelul de eroare si utilizari ale UDP

• Modelul de eroare. O comunicatie fiabila e caracterizata de integritate si

validitate: mesajele sa nu fie corupte, duplicate, respectiv sa nu se piarda.

• In UDP mesajele se pot pierde fie la transmisie, fie la receptie si uneori

pot fi transmise intr-o ordine eronata.

– Erorile de omisiune se pot inlatura prin introducerea unor mesaje de confirmare.

– Asigurarea ordinii corecte se poate face printr-un nivel suplimentar si prin gestiunea

explicita a ordinii de livrare/receptie a mesajelor.

• Exemple de aplicatii ce pot folosi UDP:

– Serviciul de DNS, serviciul DHCP (Dynamic Host Configuration Protocol)

– Un server de timp care furnizeaza clientilor valoarea timpului curent

– Comanda ping pentru testarea comunicatiei intre doua programe in retea

– SNMP (Standard Network Management Protocol)

– VOIP (Voice Over IP)

• Avantajul UDP este ca evita supraincarcarea necesara garantarii unei

comunicatii fiabile, specifica TCP. O aplicatie isi va implementa propriile

mecanisme de asigurare a unei comunicatii fiabile, atat cat este necesar.

Page 13: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Java API pentru comunicatie UDP – DatagramPacket

• Clasa DatagramPacket. Aceasta clasa furnizeaza un constructor pentru un mesaj UDP de expediat format dintr-un vector de octeti, lungimea mesajului, si o pereche (adresa IP, numar port) corespunzatoare unui soclu destinatie: DatagramPacket(byte[] buf, int length, InetAddress

address, int port)

• Clasa dispune de un alt constructor pentru receptionarea unui mesaj UDP: DatagramPacket(byte[] buf, int length)

• Mesajul se determina cu getData, iar portul si adresa expeditorului cu getPort si getAddress.

• Obiectele acestei clase pot fi transmise cu primitiva send si sunt preluate si returnate de catre primitiva receive a clasei DatagramSocket.

Page 14: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Java API pentru comunicatie UDP – DatagramSocket

• Clasa DatagramSocket implementeaza socluri pentru expedierea si

receptionarea de datagrame UDP.

• Furnizeaza un constructor ce primeste un port, cat si un constructor fara

parametrii care permite sistemului sa aleaga un port liber. public DatagramSocket() throws SocketException

public DatagramSocket(int port) throws SocketException

• Clasa DatagramSocket furnizeaza metode ce permit urmatoarele: – Expedierea si receptia de mesaje cu send si receive. send primeste un obiect

DatagramPacket ce contine mesajul si destinatia sa. receive primeste un obiect

DatagramPacket cu mesaj vid pentru receptionarea unui nou mesaj. public void send(DatagramPacket p) throws IOException

public void receive(DatagramPacket p) throws IOException

• Alte metode: – setSoTimeout pentru setarea unui timeout. Metoda receive se va bloca pentru timpul

specificat. Daca timpul expira se va genera exceptie SocketTimeoutException.

– Conectarea la un anumit port si adresa IP la distanta cu connect. In acest fel soclul

se va utiliza doar pentru comunicatia cu adresa respectiva.

Page 15: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Client UDP import java.net.*;

import java.io.*;

public class UDPClient {

public static void main(String args[]) {

DatagramSocket aSocket = null;

try {

aSocket = new DatagramSocket();

byte [] m = args[0].getBytes(); // Conversie mesaj in sir de octeti.

InetAddress aHost = InetAddress.getByName(args[1]); // Get hostname.

int serverPort = 6789;

DatagramPacket request =

new DatagramPacket(m, args[0].length(), aHost, serverPort);

aSocket.send(request);

byte[] buffer = new byte[1000];

DatagramPacket reply = new DatagramPacket(buffer, buffer.length);

aSocket.receive(reply);

System.out.println("Reply: " +

new String(reply.getData(),0,reply.getLength()))

} catch (SocketException e)

{System.out.println("Socket: "+e.getMessage());

} catch (IOException e) {System.out.println("IO: " + e.getMessage());

} finally {if (aSocket != null) aSocket.close();}

}

}

args[0] este mesajul

args[1] este numele serverului

Creare soclu si expediere mesaj

Receptioneaza ecoul mesajului

Page 16: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Server UDP import java.net.*;

import java.io.*;

public class UDPServer{

public static void main(String args[]){

DatagramSocket aSocket = null;

try {

aSocket = new DatagramSocket(6789);

byte[] buffer = new byte[1000];

while (true) {

DatagramPacket request = new DatagramPacket(buffer, buffer.length);

aSocket.receive(request);

DatagramPacket reply =

new DatagramPacket(request.getData(), request.getLength(),

request.getAddress(),request.getPort());

aSocket.send(reply);

}

} catch

(SocketException e){System.out.println("Socket: " + e.getMessage());

} catch (IOException e) {System.out.println("IO: " + e.getMessage());

} finally {if(aSocket != null) aSocket.close();}

}

}

Legarea soclului la portul 6789 al serverului

Receptionare mesaj

Expediaza mesajul in ecou

Page 17: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicatia prin fluxuri TCP • http://en.wikipedia.org/wiki/Transmission_Control_Protocol

• Comunicatia este abstractizata prin crearea unui flux virtual si sigur de octeti intre procesul expeditor si procesul destinatar.

• Dimensiunea mesajelor:

– Aplicatia este cea care alege dimensiunea datelor scrise sau citite din flux.

• Mesajele pierdute. TCP utilizeaza intern mesaje de confirmare. De exemplu, pentru fiecare pachet IP trimis se asteapta o confirmare de primire. TCP foloseste o schema bazata pe o fereastra alunecatoare pentru a limita numarul de confirmari necesare.

• Controlul fluxului. TCP incearca sa se adapteze la vitezele actuale de transmisie sau receptie ale proceselor implicate. De exemplu, daca expeditorul este mai rapid decat destinatarul, el va fi blocat pana cand destinatarul poate receptiona din nou.

• Ordonarea si duplicarea mesajelor. Se asociaza identificatori de mesaje pentru fiecare pachet IP, fapt ce permite destinatarului sa detecteze si sa rejecteze duplicatele, sau sa reordoneze pachetele ce nu au fost receptionate in ordinea in care au fost trimise.

• Destinatia mesajelor. Comunicatia este bazata pe conceptul de conexiune. Perechea de procese comunicante stabileste intai o conexiune inainte de a comunica pe flux. Conexiunea furnizeaza fluxurile care vor fi citite respectiv scrise, nefiind nevoie de a indica de fiecare data adresele de IP si numarul portului. Stabilirea conexiunii presupune executarea unui apel connect de la expeditor, urmat de un apel accept la destinatar.

Page 18: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Probleme ale comunicatiei prin fluxuri TCP

• API pentru comunicatia pe flux presupune ca procesele care comunica au roluri de server, respectiv client, pe parcursul stabilirii conexiunii.

• Rolul client presupune crearea unui soclu legat la orice port disponibil si apoi executarea unui apel connect de cerere a unei conexiuni catre un proces server, pe un anumit port public al serverului.

• Rolul server presupune crearea unui soclu de ascultare legat la un port al serverului si asteptarea cererilor de conexiune de la clienti. Soclul de ascultare mentine o coada de cereri de conexiune. Cand soseste o noua cerere, se creaza un nou soclu pe server pentru comunicatia cu clientul. Soclul de ascultare e mentinut pentru tratarea de noi cereri.

• Fiecare dintre cele doua socluri dispune de cate o pereche de fluxuri. Expedierea / receptia se realizeaza prin scrierea / citirea din cele 2 fluxuri.

• Blocare. Cand un proces vrea sa citeasca date din fluxul de intrare se poate bloca pana cand datele devin disponibile. Expeditorul se poate bloca de catre mecanismul TCP daca trimite cu o viteza prea mare.

• Fire. Cand un server accepta o noua conexiune el va crea un nou fir pentru gestionarea comunicatiei cu clientul.

Page 19: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Modelul de eroare si utilizari ale TCP

• Satisfacerea proprietatii de integritate a unui canal sigur:

– TCP foloseste sume de control pentru a detecta mesajele corupte si numere de

secventa pentru a realiza ordonarea corecta a mesajelor si a rejecta duplicatele.

• Daca pierderea de pachete depaseste o limita maxima admisibila sau daca

reteaua atinge limite neacceptabile de congestie, TCP va intrerupe

conexiunea. La intreruperea unei conexiuni, procesele implicate vor fi

informate in mod corespunzator atunci cand vor incerca sa o foloseasca.

Efectul este insa ca procesele nu vor putea distinge intre o eroare a retelei

sau o eroare in procesul de la celalalt capat al conexiunii si nu vor sti daca

mesajele recent transmise au fost sau nu livrate corect.

• Foarte multe dintre serviciile Internet ruleaza peste TCP:

– HTTP, protocolul pentru comunicatia intre clientii si serverele de Web

– FTP, protocolul pentru transfer de fisiere

– Telnet, protocolul de acces la un sistem folosind un terminal aflat la distanta.

– SMTP, protocolul pentru transferul postei electronice.

Page 20: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Java API pentru comunicatie TCP - I

• Clasa ServerSocket. Este utilizata de server pentru a crea un soclu de ascultare pe portul serverului. Metoda accept preia o cerere de conexiune de la un client din coada de cereri primite. Daca coada este vida atunci se blocheaza procesul server pana la aparitia unei conexiuni. public class ServerSocket {

// Creaza un soclu server nelegat la nici un port

ServerSocket();

// Creaza un soclu server legat la "port"

ServerSocket(int port);

// Apare in plus dimensiunea maxima

// a cozii de cereri "backlog"

ServerSocket(int port, int backlog);

// Asteapta o conexiune cu blocare

public Socket accept();

// Inchide soclul

public void close();

...

}

Page 21: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Java API pentru comunicatie TCP - II

• Clasa Socket se utilizeaza de catre o pereche de procese implicate intr-o conexiune. Clientul va crea un obiect Socket specificand numele si portul serverului. Constructorul realizeaza automat si conectarea la server. public class Socket {

// Creaza un soclu neconectat

public Socket();

// Creaza un soclu pentru comunicare pe flux legat la "port“ si adresa

// de IP "address"

public Socket(InetAddress address, int port);

// Se specifica in plus adresa de IP locala "localAddr" si portul

// local "localPort"

public Socket(InetAddress address,int port,

InetAddress localAddr,int localPort);

// Creaza un soclu. Gazda unde se conecteaza se indica prin nume "host"

public Socket(String host,int port);

// Determina fluxul de intrare asociat soclului

public InputStream getInputStream();

// Determina fluxul de iesire asociat soclului

public OutputStream getOutputStream();

...

}

Page 22: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Client TCP - I

import java.net.*;

import java.io.*;

public class TCPClient {

public static void main(String args[]) {

Socket s = null;

try {

int serverPort = 6789;

s = new Socket(args[1], serverPort);

DataInputStream in =

new DataInputStream(s.getInputStream());

DataOutputStream out =

new DataOutputStream(s.getOutputStream());

out.writeUTF(args[0]); // UTF is a string encoding.

String data =

in.readUTF();

System.out.println("Received: "+ data) ;

}

args[0] este mesajul

args[1] este numele serverului

Crearea soclului si legarea sa la portul 6789 al serverului

Creare fluxuri de I si E

Expediere si receptionare mesaj folosind fluxurile

Page 23: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Client TCP - II

} catch (UnknownHostException e) {

System.out.println("Socket:"+e.getMessage());

} catch (EOFException e) {

System.out.println("EOF:"+e.getMessage());

} catch (IOException e) {

System.out.println("readline:"+e.getMessage());

} finally {

if (s != null)

try {

s.close();

} catch (IOException e) {

System.out.println("close:"+e.getMessage());

}

}

}

}

Page 24: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Server TCP. Acceptarea unei conexiuni

import java.net.*;

import java.io.*;

public class TCPServer {

public static void main (String args[]) {

try {

int serverPort = 6789;

ServerSocket listenSocket =

new ServerSocket(serverPort);

while (true) {

Socket clientSocket = listenSocket.accept();

Connection c = new Connection(clientSocket);

}

} catch(IOException e) {

System.out.println("Listen socket:"+e.getMessage());

}

}

}

Legarea soclului la portul 6789 al serverului

Serverul asteapta cereri de conexiune

Pentru fiecare cerere de conexiune serverul creaza

un fir responsabil cu tratarea conexiunii.

Page 25: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Server TCP. Tratarea unei conexiuni - I

class Connection extends Thread {

DataInputStream in;

DataOutputStream out;

Socket clientSocket;

public Connection(Socket aClientSocket) {

try {

clientSocket = aClientSocket;

in =

new DataInputStream(clientSocket.getInputStream());

out =

new DataOutputStream(clientSocket.getOutputStream());

this.start();

} catch(IOException e)

System.out.println("Connection:"+e.getMessage());

}

}

Creare fluxuri de I si E

Page 26: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Server TCP. Tratarea unei conexiuni - II

public void run() {

try { // An echo server.

String data =

in.readUTF();

out.writeUTF(data);

} catch (EOFException e) {

System.out.println("EOF:"+e.getMessage());

} catch(IOException e) {

System.out.println("readline:"+e.getMessage());

} finally {

try {

clientSocket.close();

}

catch(IOException e) { /* close failed */ }

}

}

}

Firul citeste un mesaj din fluxul de intrare si

il scrie in ecou in fluxul de iesire

Page 27: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Tema

• Implementare serverului TCP folosind executori.

Page 28: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicatie de grup - concept

• Schimbul unu-la-unu de mesaje in perechi de procese nu e cel mai bun mod de comunicare intre un proces si un grup.

• Un exemplu este un serviciu distribuit implementat sub forma unui grup de procese pentru toleranta la defecte sau pentru cresterea disponibilitatii.

• Se numeste operatie de trimitere multipla (engl. multicast) o operatie de trimitere a unui mesaj de la un proces catre fiecare membru al unei multimi de procese astfel incat apartenenta la grup sa fie transparenta pentru procesul expeditor.

• Trimiterea multipla nu trebuie confundata cu difuzarea (engl. broadcast) in retea. Aceasta operatie presupune trimiterea de mesaje tuturor statiilor dintr-o retea. In IPv4 exista o metoda de a determina adresa de difuzare pentru o retea. In IPv6 se foloseste trimiterea multipla la grupul all-hosts.

Page 29: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Comunicatie de grup - deziderate

• Toleranta la defecte prin replicarea serviciilor.

– Un serviciu replicat se realizeaza printr-un grup de servere.

– Mesajele clientilor trebuie trimise la toti membrii grupului de servere replicate. Clientii vor fi deserviti chiar si la caderea unora dintre aceste servere.

• Localizarea serverelor de descoperire in interconectarea spontana.

– Mesajele multiplu-trimise se pot utiliza de servere si/sau clienti pentru localizarea serviciilor de descoperire in vederea inregistrarii si/sau regasirii altor servicii ale SD impreuna cu interfetele acestora..

• Imbunatatirea performantelor prin replicarea datelor.

– Datele replicate conduc la cresterea performantelor serviciilor.

– In anumite cazuri replicarea poate avea loc pe calculatoarele clientilor. Ori de cate ori datele sunt actualizate, schimbarile sunt trimise la toate procesele replicilor.

• Propagarea instiintarilor in SD bazate pe evenimente.

– Aparitia unui eveniment determina instiintarea corespunzatoare a tutoror membrilor unui grup de procese ce si-au manifestat interesul in evenimentul respectiv.

– Ex. intr-o retea sociala sau intr-un sistem de chat (IM – instant messaging) daca o persoana si-a schimbat starea sau profilul, fiecare prieten primeste o instiintare.

Page 30: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Adresarea in Internet

• Principala functie a Internet-ului este schimbul de date intre calculatoare. Pentru aceasta fiecare calculator din Internet are asignata o adresa IP

• Versiunea cea mai raspinadita la ora actuala a protocolului IP este IPv4. In IPv4 adresa unui calculator este un sir de 32 de biti. Acest sir se reprezinta sub forma unui 4-uplu format din 4 octeti, separati prin cate un punct. Exemplu: 151.23.40.3.

• Exista si versiunea IPv6 care foloseste 128 de biti

• Multimea de adrese IP este impartita in 4 clase

– Clasa A, 0 adresa retea (7) adresa calculator (24)

– Clasa B, 10 adresa retea (14) adresa calculator (16)

– Clasa C, 110 adresa retea (21) adresa calculator (8): 192. …

– Clasa D, 1110 adresa multicast (28): 224. …

• 127.0.0.1 = adresa de loopback. Datele trimise aici se intorc inapoi la sursa. Este utila pentru testarea aplicatiilor de retea folosind un singur calculator

Page 31: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Clase de adrese in Internet

7 24

Class A: 0 Network ID Host ID

14 16

Class B: 1 0 Network ID Host ID

21 8

Class C: 1 1 0 Network ID Host ID

28

Class D (multicas t): 1 1 1 0 Multicast address

27

Class E (reserved): 1 1 1 1 unused0

Page 32: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Trimiterea multipla IP – I

• Trimiterea multipla IP (engl.IP multicast) functioneaza peste protocolul IP. Un pachet IP este adresat unui calculator. Porturile apar in TCP si UDP, la nivelul transport.

• Trimiterea multipla permite expeditorului sa trimita un singur pachet IP unei multimi de calculatoare care formeaza un grup de trimitere multipla (engl.multicast group). Identitatea destinatarilor individuali este transparenta expeditorului. Un grup de trimitere multipla se identifica printr-o adresa IP de clasa D – adica o adresa cu primii 4 biti egali cu 1110 in IPv4: 224.0.0.0 – 239.255.255.255.

• Apartenenta la un grup permite unui calculator sa receptioneze toate pachetele IP adresate grupului. Apartenenta este dinamica, ea permite intrarea si parasirea dinamica a grupului, cat si inscrierea simultana la mai multe grupuri. Trimiterea de pachete catre grup nu necesita apartenenta la grup.

Page 33: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Trimiterea multipla IP – II

• Trimiterea multipla IP este disponibila programelor de aplicatie numai la nivelul UDP. Un proces poate transmite pachete UDP la o adresa de trimitere multipla si un numar de port. El poate intra intr-un grup prin adaugarea soclului sau la grup.

• La nivel IP, un calculator apartine unui grup cand unul sau mai multe dintre procesele sale are soclul apartinand grupului. Cand un mesaj de trimitere multipla ajunge la un calculator, el este inaintat tuturor soclurilor locale care sunt atasate adresei respective si au portul specificat in pachet.

• Pentru implementarea trimiterii multiple in retele IP se folosesc rutere speciale pentru trimitere multipla (engl. multicast routers).

• Adresele de trimitere multipla pot fi permanente sau temporare.

• Grupurile permanente exista chiar si daca nu au membrii. Ele au destinatie speciala, adresele lor fiind alocate de IANA – Internet Assigned Numbers Authority: http://www.iana.org/

• Ex. adresa 224.0.0.1 e folosita de NTP – Network Time Protocol.

• Un grup temporar are nevoie de o adresa libera. Pentru a evita participarea accidentala la un grup deja existent, se seteaza TTL la o valoare mica.

Page 34: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Java API pentru trimitere multipla IP

• Clasa MulticastSocket.

– Este o subclasa a clasei DatagramSocket si ofera in plus capabilitatea de intrare intr-un grup.

– Aceasta clasa are doi constructori: i) un constructor ce primeste ca parametru numarul portului; ii) constructor fara parametrii care foloseste un port local liber.

– Metoda joinGroup se foloseste pentru intrarea intr-un grup. Ea primeste ca parametru adresa de IP a grupului, sub forma de obiect InetAddress.

– Metoda leaveGroup se foloseste pentru parasirea grupului.

– Metoda setTimeToLive seteaza valoarea timpului de viata. Implicit aceasta valoare este 1, permitand doar difuzarea in reteaua locala.

• Exemplu:

– Se prezinta un program care preia de la linia de comanda un mesaj si o adresa de grup.

– Programul (procesul) se inscrie la grup, trimite mesajul grupului, realizeaza trei receptionari de mesaje de la membrii grupului si apoi se termina.

Page 35: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Program Java pentru trimitere multipla IP – I

import java.net.*;

import java.io.*;

public class MulticastPeer {

public static void main(String args[]) {

MulticastSocket s = null;

try {

InetAddress group =

InetAddress.getByName(args[1]);

s = new MulticastSocket(6789);

s.joinGroup(group);

byte [] m = args[0].getBytes();

DatagramPacket messageOut =

new DatagramPacket(m, m.length, group, 6789);

s.send(messageOut);

System.out.println("sent");

args[0] este mesajul

args[1] este adresa de trimitere multipla

Crearea soclului legat la portul 6789

Inscriere in grup

Expediere mesaj la grup

Page 36: Comunicare intre procese in sisteme distribuitesoftware.ucv.ro/~cbadica/scd/cap12.pdf · • Reprezentarea unei adrese de IP se poate face prin clasa InetAddress. Din ea sunt derivate

2018-2019

Program Java pentru trimitere multipla IP - II

byte[] buffer = new byte[1000];

for (int i=0; i< 3;i++) {

DatagramPacket messageIn = new DatagramPacket(buffer,

buffer.length);

System.out.println("prepare to receive");

s.receive(messageIn);

System.out.println("Received:" +

new String(messageIn.getData(), 0,

messageIn.getLength()));

}

s.leaveGroup(group);

System.out.println("left");

} catch (SocketException e) {

System.out.println("Socket: " + e.getMessage());

} catch (IOException e){System.out.println("IO: " +

e.getMessage());

} finally { if (s != null) s.close();}

}

}

Receptionarea a 3 mesaje

trimise grupului