TCP-UDP
SOCKET
Corso rapido
Cos’è una
SOCKET?
Una socket è un oggetto software
che consente lo scambio di dati tra
applicazioni usando come protocolli
di comunicazione TCP e UDP
Scenario 1
Processo
Socket
Socket
Network
Client
Server
Le socket sono usate per far comunicare applicazioni
diverse su macchine remote (applicazioni distribuite)
Scenario 2
Processo 1
Socket X
Socket Y
Processo 2
Le socket sono usate per far comunicare applicazioni
diverse sulla stessa macchina (Inter Process Comunication)
Nello stack TCP/IP le socket si
collocano al livello di trasporto
Applicazione
Trasporto
Rete
Collegamento
Fisico
Sulla stessa macchina possono essere
attivi più socket in contemporanea
App
App
.
.
.
Socket
Socket
Socket
Socket
Socket
Socket
Come possiamo
distinguerle?
Ogni socket possiede un identificativo
che la distingue, il numero di porta
App
App
.
.
.
Socket Socket Socket Socket Socket Socket
3000
4000
5000
6000
7000
8000
Il numero di porta è un intero a 16 bit
Porte Denominazione Descrizione
Utilizzate da applicazioni server
0 … 1023 Well-Known Ports
ben note (HTTP, FTP, SMTP, …)
Utilizzate da alcuni servizi e dalle
1024 … 49151 Registered Ports
socket client
49152 … 65535 Dynamic ports Utilizzabili liberamente
Per un elenco più dettagliato
http://www.iana.org/assignments/port-numbers
Tipologie di
socket
Esistono due tipologie di socket
CONNECTION ORIENTED
CONNECTIONLESS
CONNECTION ORIENTED
Una socket orientata alla connessione
utilizza TCP è necessità di una fase di
negoziazione (handshaking) prima di
poter essere utilizzata per comunicare
CONNECTION ORIENTED
Handshaking (1/8)
Socket Processo
50000 Server
Processo
Client
Network
Una delle applicazioni (che chiameremo server) crea una socket speciale,
che si porrà in ascolto di richieste di connessione
CONNECTION ORIENTED
Handshaking (2/8)
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
L’altra applicazione (che chiameremo client) crea una socket client
utilizzando un numero di porta superiore a 1024
CONNECTION ORIENTED
Handshaking (3/8)
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
Attraverso la socket il processo client invia una richiesta di connessione
alla socket del server che si suppone sia in ascolto
CONNECTION ORIENTED
Handshaking (4/8)
192.168.1.100
Porta 50000
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
Per fare una richiesta di connessione la socket del client deve conoscere
l’indirizzo IP della macchina server e la porta della socket in ascolto
CONNECTION ORIENTED
Handshaking (5/8)
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
Socket
30000
Quando riceve la richiesta di connessione, il server crea una nuova socket
che invierà un riscontro (acknowledge) al client
CONNECTION ORIENTED
Handshaking (6/8)
192.168.1.200
Porta 20000
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
Socket
30000
Per inviare l’acknowledge al client, anche in questo caso si dovranno
specificare indirizzo IP e numero porta della socket mittente
CONNECTION ORIENTED
Handshaking (7/8)
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
Socket
30000
Alla fine della negoziazione, la connessione è stabilita e le due
applicazioni possono comunicare tra loro attraverso le socket
CONNECTION ORIENTED
Handshaking (8/8)
Socket Processo
50000 Server
Processo
Client
Socket Network
20000
Socket
30000
La socket iniziale usata dal server potrà essere distrutta o riutilizzata a
seconda che il server debba o meno gestire più client (multi-client)
CONNECTION ORIENTED
Una volta stabilita la connessione il trasferimento dei
dati avviene attraverso due stream affidabili
Output Input
Stream
…01010101011010101… Stream
Input Output
…01010101011010101…
Stream Stream
[…JAVA…]
CONNECTIONLESS
Una socket senza connessione utilizza
UDP e non necessità di handshake prima
di poter essere utilizzata per comunicare
CONNECTIONLESS
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Ognuno dei processi, indipendentemente, crea una sua socket pronta per
inviare e ricevere dati senza negoziare una connessione
CONNECTIONLESS
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Quando desidera comunicare un processo crea un datagramma, un
blocco di dati etichettato con IP e Porta della socket destinazione
CONNECTIONLESS
From 10.0.0.1
Port 50001
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Il datagramma viene inoltre marcato con l’indirizzo IP e la porta della
socket mittente
CONNECTIONLESS
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Attraverso la socket il datagramma viene inviato in rete, nella speranza
che raggiunga la destinazione!
CONNECTIONLESS
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Condizione necessaria affinché il datagramma venga accettato è anche
che la socket destinataria sia in modalità ascolto (listening)
CONNECTIONLESS
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Se il datagramma arriva a destinazione, esiste il rischio che sia corrotto o
in un ordine diverso da quello di invio
CONNECTIONLESS
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
In caso tutto sia andato bene (in realtà succede molto spesso), il
datagramma può essere elaborato dal processo destinatario
CONNECTIONLESS
From 10.0.0.1
Port 50001
Processo Socket Socket Processo
Client
Porta 50001 Network
Porta 50002 Client
10.0.0.1 10.0.0.2
Per rispondere, si ripete il procedimento. In questo caso IP e Porta della
socket mittente vengono recuperati dal datagramma appena ricevuto
CONNECTIONLESS
Questo tipo di socket, in virtù
dell’assenza di una connessione,
implementa una comunicazione molti a
molti
CONNECTIONLESS
10.0.0.2
x.x.x.x
10.0.0.1
10.0.0.3
Un processo può utilizzare la stessa socket per inviare dai datagrammi a
molteplici destinatari differenti
CONNECTIONLESS
10.0.0.2
x.x.x.x
10.0.0.1
10.0.0.3
Analogamente, una socket può essere utilizzata per ricevere pacchetti da
una molteplicità di sorgenti differenti
[ …JAVA… ]
Socket
MULTICAST
Supponiamo che un’applicazione
voglia inviare lo stesso messaggio a
più destinatari interessati
INVIO UNO A MOLTI
Le tipologie di socket studiate finora possono risolvere il problema
inviando lo stesso dato più volte (quanti sono i destinatari)
Al crescere del numero dei
destinatari questo approccio tende
a rivelarsi estremamente inefficiente
Il protocollo IP prevede un
meccanismo di MULTICAST che
ottimizza le comunicazioni di tipo
uno a molti
Come funziona?
Prima fase
Group subscription
GRUPPI MULTICAST
Gruppo Multicast
239.255.1.1
I client che desiderano ricevere le informazioni da un servizio devono
utilizzare una socket particolare per iscriversi ad un gruppo multicast
Un gruppo multicast è identificato da
un particolare indirizzo IP compreso in
un range ben preciso
Rete
224.0.0.0/4
da
224.0.0.0
a
239.255.255.255
Totale
268.435.456
gruppi
L’Internet Assigned Numbers Authority (IANA) è
responsabile di assegnare gli indirizzi multicast alle
società/applicazioni che ne fanno richiesta
Per approfondire
http://en.wikipedia.org/wiki/Multicast_address
http://tools.ietf.org/html/rfc5771
http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
Per esperimenti all’interno di una rete locale
non sarà necessario fare alcuna richiesta
Possiamo usare indirizzi allocati per uso
locale
Rete
239.255.0.0/16
da
239.255.0.0
A
239.255.255.255
Totale
65536
gruppi
Una volta iscritta ad un gruppo
multicast, una socket riceverà tutti i
pacchetti destinati al gruppo
INVIO UNO A MOLTI
Gruppo Multicast
239.255.1.1
I fornitori di servizi si limitano ad inviare i dati una volta sola, delegando al
meccanismo del multicast la moltiplicazione dei pacchetti
Questa magia della moltiplicazione
dei pacchetti avviene nei dispositivi
di intradamento e switching
Un pacchetto destinato ad un gruppo multicast che
si presenta sull’interfaccia di ingresso di un router
non viene trattato come al solito
Normalmente il protocollo di routing cercherebbe di
instradare il pacchetto lungo il percorso più breve
verso la destinazione finale
Nel nostro caso però il meccanismo del multicast
suggerisce al router la possibilità di propagare il
pacchetto su tutte o quasi le connessioni in uscita
In realtà il meccanismo è più
complicato: per evitare il flooding
della rete si cerca di moltiplicare e
propagare i pacchetti solo
attraverso alcuni route
[ . . .JAVA… ]
FINE