Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di...

31

Transcript of Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di...

Page 1: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.
Page 2: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

Come comunicano i processi ? • Sulla stessa macchina

– Signal– Pipe– Memoria Condivisa– Code di Messaggi

• Su macchine diverse ( stessa LAN )– File condivisi

• Su macchine diverse NON stessa rete– Socket

Page 3: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

Perché i socket

• Tecniche di programmazione che rendano la rete "trasparente" ai processi stessi e quindi ai programmatori.

• Libreria, nata per Unix, oggi usata per la realizzazione delle applicazioni Internet per quasi tutti i sistemi operativi.

Page 4: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

Dalle pipe ai socket

• Un socket è una struttura dati i cui elementi possono essere utilizzati come argomenti delle usuali chiamate di sistema read() e write() che consentono di scrivere e leggere i file ordinari.

• E’ possibile comunicare anche con altre macchine univocamente identificate da un indirizzo IP

• Il protocollo utilizzato è TCP/IP o UDP/IP

Page 5: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

Cos’è un Socket?• Nei sistemi operativi moderni, con il termine socket si

indica un'astrazione software progettata per poter utilizzare delle API standard e condivise per la trasmissione e la ricezione di dati attraverso una rete oppure come meccanismo di IPC (Inter-Process Communication)

• È il punto in cui il codice applicativo di un processo accede al canale di comunicazione per mezzo di una porta, ottenendo una comunicazione tra processi che lavorano su due macchine fisicamente separate.

• Dal punto di vista di un programmatore un socket è una particolare struttura dati nella quale leggere e scrivere i dati da trasmettere o ricevere.

Page 6: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

6

Socket Application• A socket is a connection between two hosts

(endpoints).• A socket can perform 7 basic operations.

– Connect to a remote machine– Send data– Receive data– Close a connection– Bind to a port– Listen for incoming data– Accept connections from remote machines on

the bound port

Page 7: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

7

Internet Socket

• Ci sono due tipi principali di Socket:– Stream Socket (SOCK_STREAM)

• Reliable

• Two way connected

• Utilizzano il TCP-Transmission Control Protocol (RFC.793)

– Datagram Socket (SOCK_DGRAM)• Not reliable

• Connectionless

• Utilizzano lo UDP-User Datagram Protocol (RFC. 768)

Page 8: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

8

Comunicazione Browser/Server Web

Browser Server Web

GET / HTTP\1.1

HTTP\1.1 200 OK

<HTML>…..</HTML>

Page 9: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

9

Come avviene la comunicazione?

Browser

TCP

IP

UDP

TSAP

Server Web

TCP

IP

UDP

TSAPAPI fornite dal S.O.

Il Transport Service Access Point è individuato da un indirizzo di livello 3 (indirizzo IP) ed un indirizzo di livello 4 (port TCP) composto da 16 bit.

Page 10: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

TCP Client-Serversocket()

bind()

listen()

accept()

Server

socket()

connect()

send()

recv()

Client

(Block until connection)“Handshake”

recv()

send()

Data (request)

Data (reply)

close()End-of-Filerecv()

close()

“well-known”

port

Page 11: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

11

funzione socket()• int socket (int family, int type, int protocol);

• family specifica la famiglia di protocolli da utilizzare.PF_INET IPv4 protocolPF_INET6 IPv6 protocolPF_LOCAL Unix domain protocols (ex PF_UNIX)

• type specifica quale tipo di protocollo vogliamo utilizzare all’interno della famiglia di protocolli specificata da family.

SOCK_STREAM socket di tipo stream (connesso affidabile)SOCK_DGRAM socket di tipo datagramSOCK_RAW socket di tipo raw (livello network)

• protocol di solito è settato a 0, tranne che nel caso dei socket raw.

Page 12: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

12

funzione connect()

• La funzione connect() è usata per stabilire una connessione con un server TCP.

#include <sys/socket.h>

int connect (int socketfd, const struct sockaddr *servaddr, int addrlen);

restituisce 0 se la connessione viene stabilita, -1 in caso di errore.

Page 13: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

13

funzione connect()

int connect (int socketfd, const struct sockaddr *servaddr, int addrlen);

• socketfd è un descrittore socket ottenuto da una chiamata alla funzione socket().

• servaddr è un puntatore alla struttura sockaddr_in, e deve specificare l’indirizzo IP e il numero di porta del server al quale connettersi.

• addrlen specifica la dimensione della struttura dati che contiene l’indirizzo del server servaddr, viene di solito assegnata mediante la sizeof(servaddr).

Il client può non specificare il proprio indirizzo IP e la propria porta, chiedendo al sistema operativo di assegnargli una porta TCP qualsiasi e come indirizzo IP l’indirizzo della sua interfaccia di rete. Quindi non è necessaria la chiamata alla bind() prima della connect().

Page 14: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

14

funzione bind()

• La funzione bind() collega al socket un indirizzo locale. Per TCP e UDP ciò significa assegnare un indirizzo IP ed una porta a 16-bit.

#include <sys/socket.h>

int bind (int sockfd, const struct sockaddr *myaddr, int addrlen);

restituisce 0 se tutto OK, -1 in caso di errore.

Page 15: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

15

funzione bind()

int bind (int sockfd, const struct sockaddr *myaddr, int addrlen);

• sockfd è un descrittore ottenuto da una chiamata socket().

• myaddr è un puntatore alla struttura sockaddr_in, e specifica l’eventuale indirizzo IP locale e l’eventuale numero di porta locale a cui il sistema operativo deve collegare il socket.

• addrlen specifica la dimensione della struttura myaddr.

Page 16: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

16

funzione bind()

• Chiamando la bind() si può specificare o no l’indirizzp IP e la porta, assegnando valori ai due campi sin_addr e sin_port della struttura sockaddr_in

• L’assegnazione viene fatta con le istruzioni:

struct sockaddr_in localaddr;

localaddr.sin_addr.s_addr = htonl(INADDR_ANY);

localaddr.sin_port = htons(port_number);

Page 17: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

17

funzione listen()

• La funzione listen è utilizzata solo per implementare un server TCP e esegue due azioni:1) ordina al kernel di far passare il socket dallo stato iniziale CLOSED allo stato LISTEN, e di accettare richieste di inizio connessione per quel socket, mettendole in una coda del kernel.

• 2) specifica al kernel quante richieste di inizio connessione può accodare al massimo per quel socket.

#include <sys/socket.h>int listen (int socketfd, int backlog );

restituisce 0 se tutto OK, -1 in caso di errore.

Page 18: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

18

funzione listen()

int listen (int socketfd, int backlog );

• socketfd è un descrittore ottenuto da una chiamata socket().

• backlog è un intero che specifica quante richieste di inizio connessione il kernel può mantenere in attesa nelle sue code.

Page 19: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

19

funzione accept()

• La funzione accept è chiamata solo dal TCP server e restituisce la prima entry nella coda delle connessioni già completate per quel socket. Se la coda è vuota la accept resta in attesa

.

#include <sys/socket.h>

int accept (int socketfd, struct sockaddr *cli_addr, int *ptraddrlen);

restituisce un descrittore socket >=0 se tutto OK, -1 in caso di errore.

Page 20: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

20

funzione accept()

int accept (int socketfd, struct sockaddr *cli_addr, int *ptraddrlen);

• socketfd è un descrittore ottenuto da una chiamata a socket() sul quale sono state effettuate le chiamate bind() e listen(). Tale listening socket viene utilizzato per accedere alla coda delle connessioni instaurate come si è visto nella funzione listen().

• cli_addr è un puntatore alla struttura sockaddr_in, su cui la funzione accept scrive l’indirizzo IP e il numero di porta del client, con cui è stata instaurata la connessione a cui si riferisce il socket che viene restituito come risultato .

• ptraddrlen è un puntatore alla dimensione della struttura cli_addr che viene restituita.

Page 21: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

21

funzione close()

• La funzione close è utilizzata è utilizzata per chiudere un socket e terminare una connessione TCP.

int close (int socketfd);

restituisce 0 se tutto OK, -1 in caso di errore.

• socketfd è un descrittore di socket.

Page 22: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

22

funzione send()

int send (int socketfd, const void* msg, int len, unsigned int flags);

• La funzione send cerca di scrivere un numero byte pari a len sul file descriptor socketfd, leggendoli dal buffer puntato da msg.Se len è maggiore di zero viene effettuata la scrittura e viene restituito il numero di byte scritti.

Page 23: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

23

funzione recv()

int recv (int socketfd, const void* buf, int len, unsigned int flags);

• La funzione recv cerca di leggere un numero di byte pari a len dal file descriptor socketfd, scrivendoli nel buffer puntato da buf. Se len è maggiore di zero viene effettuata la lettura e viene restituito il numero di byte letti. Se viene restituito zero significa end-of-file (fine stream).

-1 indica che si è verificato un errore.

Page 24: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

24

funzione gethostbyname()

• struct hostent* gethostbyname( char *name );Prende una stringa che contiene il nome dell’host e restituisce una struttura hostent che contiene l’indirizzo (gli indirizzi) IP dell’host.

Struct hostent {char *h_name; //official host namechar **h_aliases; //other aliasesint h_length; //address typechar **h_addr_list; //list of addresses

}

Page 25: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

UDP Client-Server

socket()

bind()

recvfrom()

Server

socket()

sendto()

recvfrom()

Client

(Block until receive datagram)

sendto()

Data (request)

Data (reply)

close()

“well-known”

port

- No “handshake”- No simultaneous close- No fork()/spawn() for concurrent servers!

Page 26: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

26

funzione sendto()

int sendto (int socketfd, const void* msg, int len, unsigned int flags, struct sockaddr *to, int *tolen);

• to è un puntatore a una struct sockaddr che contiene l’indirizzo IP e la porta della destinazione.

• tolen può essere inizializzato a sizeof(struct sockaddr)

Page 27: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

27

funzione recvfrom()

• int recvfrom (int socketfd, const void* buf, int len, unsigned int flags, struct sockaddr *from, int * fromlen);

• from è un puntatore a una struct sockaddr che sarà riempita con l’indirizzo IP e la porta della macchina che si è connessa

• fromlen va inizializzato a sizeof(struct sockaddr)

Page 28: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.
Page 29: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

Ports• Numbers (typical, since vary by OS):

– 0-1023 “reserved”, must be root– 1024 - 5000 “ephemeral”– Above 5000 for general use

• (50,000 is specified max)

• Well-known, reserved services (see /etc/services in Unix):– ftp 21/tcp– telnet 23/tcp– finger 79/tcp– snmp 161/udp

Page 30: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

A generic TCP application• algorithm for TCP client

– Find the IP address and port number of server– Create a TCP socket– Connect the socket to server (Server must be up and listening for new requests)– Send/ receive data with server using the socket– Close the connection

• algorithm for TCP server– Find the IP address and port number of server– Create a TCP server socket– Bind the server socket to server IP and Port number (this is the port to which clients will

connect)– Accept a new connection from client

• returns a client socket that represents the client which is connected– Send/ receive data with client using the client socket– Close the connection with client

Page 31: Come comunicano i processi ? Sulla stessa macchina –Signal –Pipe –Memoria Condivisa –Code di Messaggi Su macchine diverse ( stessa LAN ) –File condivisi.

A generic UDP application• algorithm for UDP client

– Find the IP address and port number of server– Create a UDP socket– Send/ receive data with server using the socket– Close the connection

• algorithm for UDP server– Find the IP address and port number of server– Create a UDP server socket– Bind the server socket to server IP and Port number (this is the port to

which clients will send)– Send/ receive data with client using the client socket– Close the connection with client