Socket: cosa sono e a cosa servono?

di | 15 Aprile 2019

I socket (letteralmente “presa elettrica”) sono un’interfaccia software che viene utilizzata nella comunicazione tra nodi all’interno delle reti o tra processi all’interno di un nodo.

Esistono quindi 2 famiglie di Socket: Internet Socket (per la comunicazione tra processi di macchine remote) e Unix Domain Socket (per la comunicazione tra processi sulla stessa macchina).

In questo articolo ci concentriamo sulla prima famiglia

Premessa: in una rete di calcolatori, abbiamo nella maggior parte dei casi, una comunicazione in cui sono coinvolti due diverse figure: il client (il nodo che fruisce del servizio) e il server (il nodo che fornisce il servizio).

La comunicazione avviene secondo alcune fasi:

  • il Client manda un messaggio di richiesta al Server (Request)
  • il Server elabora la risposta e la spedisce al Client (Response)

Esempio, se consideriamo il protocollo HTTP per la navigazione delle pagine web, il procedimento sarà:

  • il Client richiede la pagina web al Server (Request)
  • Il Server, dopo aver “creato” la pagina (nel caso di pagine dinamiche) spedisce l’html (Response).

Ma, come possono, due nodi che si trovano magari a migliaia di chilometri di distanza, riuscire a identificarsi e come è possibile riuscire a identificare esattamente il protocollo HTTP e non, magari un altro protocollo di livello application?

Utilizzando, appunto i Socket

Vediamo di fare chiarezza:

Un nodo, in una rete è identificato da un indirizzo IP (indirizzamento a livello network).

Ma, un nodo, potrà avere più processi in esecuzione (potrebbe essere un Server Web, un server Mail, un server FTP, tutti installati e funzionanti nella stessa macchina).

Ecco che entrano in gioco, per rilevare il processo in esecuzione su una macchina, le porte.

Le porte sono rappresentate attraverso un numero compreso tra 0 e 65535 e rappresentano l’indirizzamento a livello transport (65536 porte TCP e altrettante associate al protocollo UDP).

Un server, si “mette in ascolto” su un numero di porta ben preciso, ad esempio, nel caso dell’HTTP, la porta 80 e la 443 nel caso di HTTPS che rappresentano il processo in esecuzione sulla macchina.

un client, quindi, per visitare la pagina web di un server, dovrà rivolgersi a un ben preciso processo di una ben precisa macchina che sarà rappresentato in questo modo

indirizzoIP:porta

Questo è appunto, il meccanismo socket: possiamo considerare quindi l’indirizzo IP come l’indirizzo di una casa (in questo caso la macchina nella rete), mentre la porta rappresenta una delle persone che vivono in quella casa (il servizio o processo che è in ascolto su quella porta).

Dopo aver chiarito gli internet socket, possiamo a loro volta classificarli in

  • Stream Socket:
  • Datagram Socket
  • Raw Socket

Vediamoli un po’ più nel dettaglio.

Stream Socket

In questo caso, si realizza una connessione affidabile (utilizzati dal protocollo TCP): il server si mette in ascolto su una porta (connection socket), ad ogni nuova richiesta di collegamento dei client, crea, per ognuno, un “canale virtuale” per la comunicazione tra client e server (data Socket).

Questo tipo ti comunicazione è quella che viene utilizzata ogni volta che abbiamo a che fare con protocolli di livello application che richiedono una certa affidabilità come HTTP/HTTPS e le email.

Datagram Socket

In questo caso, basato sul protocollo UDP, non viene creata una connessione affidabile: il server si mette in ascolto su una porta, alla ricezione delle richieste dei client, invia la risposta.

Questo tipo di comunicazione è quella utilizzata ogni volta che abbiamo necessità di avere una certa velocità e non è necessaria l’affidabilità (ad esempio lo streaming video).

Raw Socket

Sono utilizzati nello sviluppo dei protocolli

Conclusioni

Il meccanismo dei socket permette di far comunicare processi all’interno dello stesso nodo (Unix Domain Socket) e/o processi tra nodi remoti (internet socket), in quest’ultimo caso, si basa sulla coppia di informazioni indirizzo_ip:porta; con il primo si identifica la macchina nella rete, con la porta si identifica il processo su quella macchina).

Abbiamo quindi introdotto in maniera semplice e teorica il meccanismo alla base dei socket.

Se però hai anche la necessità di qualcosa di maggiormente pratico relativamente alla programmazione socket, di seguito alcune risorse interessanti:

Programmazione socket in java

Programmazione socket in C

Programmazione socket in C#