La Connessione tramite socket
Introduzione ai Socket
La
Connessione
tramite socket
Tps Prof.Alessio Palma
O
9Parleremo di
- Famiglie e
tipologie di socket
- Modalità di
connessione con
TCP e UDP
- Comunicazione
multicast
Generalità sui Socket
Generalità
· Il concetto di socket è stato sviluppato come estensione diretta del paradigma
UNIX di I/O su file, che si basa sulla sequenza di operazioni open-read-write-close:
open: operazione di apertura del file
read/write: lettura e scrittura
close: terminazione dell'utilizzo del file
Sono poi necessari indirizzo porta e protocollo
COS'E' IL SOCKET
Un socket, in informatica, è un'astrazione software, gestita dal sistema operativo, che
rappresenta un canale di comunicazione di rete tra un processo e una risorsa. Per un
programmatore, un socket è un particolare oggetto sul quale leggere e scrivere i dati
da trasmettere o ricevere.Generalità
· Il client ed il server utilizzano un protocollo di trasporto (TCP o UDP) per comunicare
. Il software di gestione del protocollo di trasporto si trova all'interno del sistema operativo
. Il software dell'applicazione si trova all'esterno del sistema operativo
· Per poter comunicare due applicazioni devono interagire con i rispettivi sistemi operativi:
come? Si utilizza un meccanismo che svolge il ruolo di ponte (interfaccia) tra sistema operativo
ed applicazione di rete: Application Programming Interface (API)Generalità
FUNZIONALITÀ' ED UTILIZZO DEL SOCKET
Il socket, nei sistemi operativi moderni, serve per poter utilizzare delle API standard, condivise
attraverso la rete. Permette l'invio e la ricezione di dati, tra host remoti o tra processi locali. Socket
locali e remoti in comunicazione, formano una coppia, composta da indirizzo e porta di client e
server. Solitamente i sistemi operativi forniscono delle API per permettere alle applicazioni di
controllare e utilizzare i socket di rete.
/ protocolli utilizzabili per l'implementazione dei socket sono:
-protocollo TCP (Transfer Control Protocol);
-protocollo UDP (User Datagram Protocol);
Entrambi questi protocolli si appoggiano sul protocollo IP (Internet Protocol).
I socket possono essere implementati con svariati linguaggi di programmazione, come C, C++ e
java.Generalità
Riepilogando:
- client e server utilizzano un protocollo di trasporto (TCP o UDP) per comunicare
- Il software di gestione del protocollo di trasporto si trova all'interno del sistema
operativo
. Il software dell'applicazione si trova all'esterno del sistema operativo
· Per poter comunicare due applicazioni devono interagire con i rispettivi sistemi
operativi: come?
- Si utilizza un meccanismo che svolge il ruolo di ponte (interfaccia) tra sistema
operativo ed applicazione di rete: Application Programming Interface (API)
. Ogni sistema operativo mette a disposizione nelle API i meccanismi per realizzare
l'interfacciamento tra diversi protocolli(es.applicativi con trasporto).
· Le socket API sono delle specifiche API di protocollo che sono disponibili in
Windows, Solaris e Linux e permettono alle applicazioni di controllare e utilizzare i
socket di rete.
Funzioni API e Socket
Generalità
Cosa fa un API?
- Standardizza l'interazione con il sistema operativo (SO)
· Consente ai processi applicativi di utilizzare i protocolli di rete, definendo:
- le funzioni consentite
- gli argomenti per ciascuna funzione
Client
Server
API
TCP
UDP
IPXGeneralità
Funzioni presenti sia in C che in Java che verranno utilizzate in seguito quando verranno
programmati i socket:
- socket()/server socket(): crea un nuovo socket;
- close(): termina l'utilizzo di un socket;
- bind(): collega un indirizzo di rete a un socket;
- listen(): aspetta messaggi in ingresso;
- accept(): comincia a utilizzare una connessione in ingresso;
- connect(): crea una connessione con un host remoto;
- send()/write(): trasmette dati su una connessione attiva;
- recv()/read(): riceve dati da una connessione attiva.
Famiglie di Socket
Famiglie di Socket
Esistono varie famiglie di socket (domini)
Ogni famiglia riunisce i socket che utilizzano gli stessi protocolli (Protocol Family) sottostanti. Ciascuna
famiglia supporta un sottoinsieme di stili di comunicazione e possiede un proprio formato di
indirizzamento (Address Family).
Tra le famiglie di socket ricordiamo:
- Internet socket (AF_INET): è quella che utilizzeremo nelle nostre applicazioni e permette il
trasferimento di dati tra processi posti su macchine remote connesse tramite una LAN o
Internet;
- Unix Domain socket (AF_UNIX): permette il trasferimento di dati tra processi sulla stessa
macchina Unix. 11
- La principale differenza fra le due famiglie di socket sta nell'indirizzo:
- AF_UNIX è praticamente il pathname valido nel file system della macchina;
- AF_INET è specificato da due valori:indirizzo IP (32 bit),che individua un unico host
Internet;numero di porta logica (16 bit),che specifica una particolare processo dell'host.
Tipi di Socket
Tipi di socket
I socket sono fondamentalmente di tre tipi:
-datagram socket
-stream socket
-raw socket
I primi due sono utilizzati a livello applicativo mentre i raw socket sono utilizzati nello
sviluppo di protocolli quindi non verranno analizzati.
Stream Socket
Stream Socket
Con gli stream socket (SOCK_STREAM) si realizza una connessione sequenziale tipicamente
asimmetrica, affidabile e full-duplex basata su stream di byte di lunghezza variabile.
Ogni processo crea il proprio endpoint richiamando la primitiva socket() in C o creando l'oggetto
socket in Java e successivamente:
- Il server si mette in ascolto, in attesa di un collegamento, e quando gli arriva una richiesta la
esaudisce mediante la primitiva accept() che crea un nuovo socket dedicato alla
connessione;
- Il client si pone in coda sul socket del server e quando viene "accettato" dal server crea
implicitamente il binding con la porta locale.
Sequenziale:i file possono essere letti solo i sequenza dall'inizio alla fine
Full-duplex: permette la comunicazione in entrambe le direzioni e simultaneamenteStream Socket
Tra i due processi server e client, il server è quello che ha controllo maggiore poiché è il
processo Server che inizialmente crea il socket:
- Più client possono comunicare attraverso lo stesso socket ma solo un server può
essere associato a uno specifico socket del singolo client
- Inoltre il client ha bisogno di conoscere l'indirizzo del server mentre il server acquisisce
le informazioni del client (e, quindi, anche il suo indirizzo) solo dopo che viene stabilita la
connessione.Stream Socket
Vediamo l'esempio di un Client che vuole
connettersi a un Server web tramite
protocollo Http.
- Il server accetta la richiesta e realizza "un
canale virtuale" tra il client un nuovo
socket dell server (indicato XX),lasciano
quindi la porta libera per le ulteriori
richieste da parte di altri client.
- I due processi si scambiano i dati
(funzioni read() e write()) fino alla
chiusura del canale di connessione, che
viene
effettuata
rispettivamente
mediante la chiamata della primitiva
close()
A Inizializzazione dei processi.
Client
IP
socket
1052
Crea un socket
Server
IP
coda
socket
80
Crea un socket
Lo connette alla porta 80
Si pone in ascolto
B Il client effettua la richiesta di collegamento.
Client
Server
IP
Richiesta
di collegamento
socket
coda
socket
1052
80
C Il server accetta la richiesta e stabilisce il collegamento.
Client
Server
IP
Canale virtuale
socket
coda
socket
1052
80
socket
XXStream Socket
Il protocollo TCP è basato su questo tipo di socket.
Nella figura a lato possiamo osservare che in un
server TCP abbiamo due tipi di socket:
- un tipo per accettare connessioni (condiviso),
che chiamiamo connection socket;
- un tipo per le operazioni send() e receive() (non
condiviso), che chiamiamo data socket.
Client 1
Server
Data socket
Connection socket
Client 2
Data socket
Data socket
Se pensiamo al protocollo Http il connection socket è sulla porta 80Stream Socket
Schema logico della connessione TCP mediante Socket
Durante la fase di
binding avviene il
collegamento fra il
socket e la porta
Server
s = socket ()
Client
bind (s)
listen (s)
x = socket ()
3-way handshake
attende
una connessione
new = accept (s)
connect (x)
attende
una richiesta
read (new)
write (x)
elabora la risposta
canale
read (x)
invia la risposta
write (new)
>
read (x)
close (new)
close (x)
Le API del linguaggio Java differenziano i due tipi di socket e noi utilizzeremo due entry differenti:
- ServerSocket(int port): per creare una connection socket legata alla porta specificata per accettare connessioni
da parte del server;
- Socket(InetAddress address, int port): per creare una data socket e richiede come parametro una server socket,
cioè l'esistenza di una connessione (l'indirizzo e la porta).
Three-way Handshake
Stream Socket
Three-way Handsake
Un handshake a tre vie (Three-way handshake) è un metodo utilizzato in una rete
TCP/IP per creare una connessione tra un host/client locale e un server. Si tratta di un
metodo in tre fasi che richiede sia al client che al server di scambiare i pacchetti SYN e
ACK (riconoscimento-acknowledgment) prima dell'inizio della comunicazione dei dati.
- Un client invia un pacchetto dati SYN su una rete IP a un
server sulla stessa rete o a una rete esterna. L'obiettivo di
questo pacchetto è di chiedere se il server è disponibile per
nuove connessioni.
- Il server di destinazione deve disporre di porte aperte in grado
di accettare e avviare nuove connessioni. Quando il server
riceve il pacchetto SYN dal nodo client, risponde e restituisce
una ricevuta di conferma, il pacchetto ACK o SYN/ACK.
. Il client riceve il SYN/ACK dal server e risponde con un
pacchetto ACK.
- Al termine di questo processo, viene creata la connessione e
l'host e il server sono in grado di comunicare.
SYN
SYN-ACK
ACK
OK
Datagram Socket
Datagram Socket
I datagram socket (SOCK_DGRAM) permette di scambiare dati senza connessione (i messaggi
contengono l'indirizzo di destinazione e provenienza) mediante il trasferimento di datagrammi. I
messaggi hanno lunghezza variabile, non è garantito ne ordine ne arrivo dei pacchetti, quindi si ha
una comunicazione inaffidabile.
Permettono quindi di inviare da un socket a più destinazioni e ricevere su un socket da più sorgenti in
generale realizzano quindi il modello "molti a molti" e sono supportate dal protocollo UDP.
Ogni processo crea il proprio endpoint richiamando la primitiva che crea il socket e
successivamente:
- il server si mette in attesa di ricevere i dati (mediante la primitiva receive() in Java e alla loro
ricezione può inviare un risposta (mediante la primitiva send() i;
- il client invia il pacchetto di dati al server (mediante la primitiva send() in Java e può mettersi
in attesa di una risposta con le stesse primitive che ha utilizzato il server (cioè mediante la
primitiva receive() in Java.
Ovviamente al termine della comunicazione il socket viene chiuso.