I socket sono un meccanismo di comunicazione tra processi che consentono a due o piรน processi di comunicare tra loro sia allโ€™interno dello stesso sistema sia su sistemi diversi tramite rete. Nella comunicazione tra processi, i socket piรน utilizzati sono quelli di dominio UNIX e quelli di dominio Internet (IPv4 o IPv6), e lโ€™uso varia a seconda del tipo di applicazione e delle esigenze di comunicazione.

1 - Caratteristiche principali

  • Half-duplex e full-duplex: i socket possono supportare la comunicazione bidirezionale alternata (half-duplex) o bidirezionale simultanea (full-duplex), in cui i dati possono essere inviati e ricevuti rispettivamente solo in una direzione alla volta oppure in entrambe contemporaneamente.
  • Famiglia di socket: รจ un raggruppamento di socket che utilizzano gli stessi protocolli sottostanti, supporta un sottoinsieme di stili di comunicazione e possiede un proprio formato di indirizzamento.
  • Tipo di socket: definisce come i dati vengono trasmessi attraverso il socket e determina le modalitร  di comunicazione tra i dispositivi.
  • Orientamento alla connessione: il tipo di collegamento stabilito tra due dispositivi che comunicano in rete che si distingue tra connection-oriented (in cui prima di iniziare la trasmissione dei dati, viene stabilita una connessione stabile e affidabile tra i dispositivi) e connectionless (in cui non รจ necessario stabilire una connessione continua prima di inviare i dati).
  • Bloccanti e non-bloccanti: possono essere configurati per operare in modalitร  bloccante (attesa di una risposta prima di procedere) o non-bloccante (eseguono altre operazioni in attesa della risposta).

1.1 - Half-duplex e full-duplex

I dati nei socket possono essere trasferiti in due modalitร :

  • Half-duplex: i dati possono essere trasmessi in entrambe le direzioni tra due dispositivi, ma non contemporaneamente.
  • Full-duplex: i dati possono essere trasmessi simultaneamente in entrambe le direzioni tra due dispositivi.

1.1.1 - Half-duplex

Nella comunicazione half-duplex, i dati possono essere trasmessi in entrambe le direzioni tra due dispositivi, ma non contemporaneamente. Ciรฒ significa che, in un dato momento, solo un dispositivo puรฒ inviare i dati mentre lโ€™altro riceve.

Le principali caratteristiche delle comunicazioni half-duplex sono:

  • Comunicazione alternata: se un dispositivo sta inviando, lโ€™altro deve attendere prima di poter trasmettere.
  • Ritardo: a causa della trasmissione alternata, possono verificarsi ritardi quando il controllo passa da un dispositivo allโ€™altro.

Esempi di utilizzo delle comunicazioni half-duplex sono:

  • Walkie-talkie: in un walkie-talkie, solo una persona alla volta puรฒ parlare mentre lโ€™altra ascolta.
  • Reti wireless: alcune reti Wi-Fi possono utilizzare modalitร  half-duplex per gestire il traffico.

1.1.2 - Full-duplex

Nella comunicazione full-duplex, i dati possono essere trasmessi simultaneamente in entrambe le direzioni tra due dispositivi, permettendo cosรฌ una comunicazione bidirezionale continua.

Le principali caratteristiche delle comunicazioni full-duplex sono:

  • Trasmissione simultanea: entrambi i dispositivi possono inviare e ricevere dati contemporaneamente.
  • Maggiore efficienza: riduce il ritardo poichรฉ non รจ necessario alternare tra invio e ricezione.

Esempi di utilizzo delle comunicazioni full-duplex sono:

  • Telefonia: durante una chiamata telefonica, entrambi gli interlocutori possono parlare e ascoltare simultaneamente.
  • Ethernet: molti cavi Ethernet supportano la comunicazione full-duplex, migliorando la velocitร  di trasferimento dei dati.

1.1.3 - Tabella riassuntiva delle differenze

Ecco una tabella riassuntiva che confronta la modalitร  half-duplex e la modalitร  full-duplex:

CaratteristicaHalf-duplexFull-duplex
Direzione dei datiBidirezionale, ma non simultanea (un solo dispositivo trasmette alla volta)Bidirezionale e simultanea (entrambi i dispositivi possono trasmettere contemporaneamente)
EfficienzaMinore, per via dellโ€™alternanzaMaggiore, grazie alla trasmissione simultanea
RitardoPotenziale ritardo dovuto allโ€™attesaRidotto, poichรฉ non cโ€™รจ attesa
EsempiWalkie-talkie, alcune reti Wi-FiTelefonia, Ethernet

1.2 - Famiglie di socket

Le famiglie di socket sono i raggruppamenti in cui vengono divisi i vari tipi di socket in base al tipo di protocollo di rete e il metodo di indirizzamento utilizzato per la comunicazione. Le principali famiglie di socket sono:

  • UNIX domain socket (AF_UNIX o AF_LOCAL): permette la comunicazione tra processi sullo stesso sistema operativo e utilizza file di sistema come punto di connessione, infatti il nome del socket รจ identificato dal percorso del file (/<path>/<filename>).
  • Internet socket (AF_INET e AF_INET6): permette la comunicazione su reti IP, sia locale che su Internet e usa indirizzi IP (IPv4 e IPv6 rispettivamente per AF_INET e AF_INET6) e numeri di porta per identificare i dispositivi, infatti il nome del socket รจ identificato dalla coppia indirizzo-porta (<indirizzo IP>:<porta>).
  • Bluetooth socket (AF_BLUETOOTH): viene utilizzato per la comunicazione su reti Bluetooth e supporta connessioni wireless a corto raggio, ad esempio tra dispositivi mobili e periferiche. Per identificare i dispositivi, usa indirizzi MAC Bluetooth, che sono identificatori unici per dispositivi Bluetooth (simili agli indirizzi MAC Ethernet).
  • Packet socket (AF_PACKET): disponibile solo su Linux, permette lโ€™accesso diretto ai pacchetti a livello di rete, senza passare per un protocollo specifico (come lโ€™IP). Usato per operazioni a basso livello come sniffing di rete e diagnostica.

1.3 - Tipo di socket

Il tipo di socket definisce come i dati vengono trasmessi attraverso il socket e determina le modalitร  di comunicazione tra i dispositivi. I principali tipi di socket sono:

  • SOCK_STREAM: utilizza il TCP (Transmission Control Protocol) e fornisce una connessione affidabile (connection-oriented), cioรจ i dati vengono trasmessi in modo sequenziale e senza errori, garantendo che arrivino nellโ€™ordine giusto.
  • SOCK_DGRAM: utilizza lโ€™UDP (User Datagram Protocol) e non richiede una connessione (connectionless), cioรจ i pacchetti possono essere persi o arrivare in ordine diverso, poichรฉ non ci sono garanzie di consegna.
  • SOCK_RAW: permette lโ€™accesso diretto ai pacchetti a livello di rete, senza passare per un protocollo specifico (come TCP o UDP). Viene utilizzato per operazioni a basso livello, come il monitoraggio del traffico di rete e lโ€™analisi dei pacchetti.
  • SOCK_SEQPACKET: fornisce una connessione orientata ai pacchetti, simile a SOCK_STREAM ma con messaggi di lunghezza fissa. Garantisce la consegna dei pacchetti e mantiene lโ€™ordine.

1.4 - Orientamento alla connessione

Lโ€™orientamento alla connessione si riferisce al modo in cui le applicazioni comunicano tra loro attraverso una rete, specificando se una connessione deve essere stabilita e mantenuta prima del trasferimento dei dati. Questa modalitร  รจ particolarmente importante nel contesto dei socket e dei protocolli di comunicazione. Esistono due modalitร  di orientamento alla connessione: connection-oriented e connectionless.

1.4.1 - Connection-oriented (orientato alla connessione)

In un sistema connection-oriented (orientato alla connessione), รจ necessario stabilire una connessione affidabile tra due dispositivi (come client e server) prima che avvenga qualsiasi scambio di dati. Questo processo assicura che i dati vengano trasmessi in modo ordinato e senza perdite. Il protocollo piรน comune associato a questa modalitร  รจ il TCP (Transmission Control Protocol) che garantisce che i pacchetti di dati arrivino nella sequenza corretta e senza errori.

Le principali caratteristiche dei sistemi connection-oriented sono:

  • Handshake iniziale: prima di iniziare a inviare dati, il TCP esegue un processo di handshake a tre vie per stabilire la connessione. Durante questo processo, il client e il server scambiano messaggi per confermare che sono pronti a comunicare.
  • Affidabilitร : il TCP include meccanismi per garantire la consegna dei pacchetti, il controllo degli errori e la correzione degli errori. Se un pacchetto viene perso, il TCP si assicura che venga ritrasmesso.
  • Flusso di dati: garantisce che i dati vengano inviati e ricevuti in un ordine preciso. Questa caratteristica รจ fondamentale per applicazioni come il trasferimento di file o le comunicazioni web, in cui la trasmissione dei dati in ordine casuale potrebbe creare problemi.

Esempi di utilizzo dei sistemi connection-oriented sono:

  • Web Browsing: quando un browser si connette a un server web, stabilisce una connessione TCP per garantire che tutte le informazioni vengano ricevute correttamente e nellโ€™ordine giusto.
  • Email: i protocolli come SMTP (per inviare email) e POP3/IMAP (per ricevere email) utilizzano connessioni TCP.

1.4.2 - Connectionless (senza connessione)

In un sistema connectionless (senza connessione), i dati possono essere inviati senza stabilire una connessione permanente. Non รจ necessario alcun processo di handshake iniziale e i pacchetti possono viaggiare indipendentemente. Il protocollo piรน comune associato a questa modalitร  รจ lโ€™UDP (User Datagram Protocol) che non garantisce che i pacchetti vengano consegnati o che arrivino nellโ€™ordine corretto.

Le principali caratteristiche dei sistemi connectionless sono:

  • Nessun handshake: lโ€™UDP non richiede un processo di stabilimento della connessione, il che rende il trasferimento di dati piรน veloce.
  • Meno overhead: non ci sono controlli di errore e riconoscimenti, il che riduce lโ€™overhead e aumenta la velocitร  di trasmissione.
  • Inaffidabilitร : non cโ€™รจ garanzia che i dati arrivino o che vengano ricevuti nellโ€™ordine corretto. Questo puรฒ essere accettabile per alcune applicazioni, come streaming audio o video, dove la velocitร  รจ piรน importante della completezza.

Esempi di utilizzo dei sistemi connectionless sono:

  • Streaming: i servizi di streaming video e audio utilizzano lโ€™UDP per trasmettere dati in tempo reale, dove รจ piรน importante ricevere i dati rapidamente piuttosto che garantirne lโ€™integritร .
  • Giochi online: molti giochi online usano lโ€™UDP per inviare rapidamente aggiornamenti di stato ai giocatori senza lโ€™onere di garantire lโ€™affidabilitร .

1.4.3 - Tabella riassuntiva delle differenze

Ecco una tabella riassuntiva che confronta la modalitร  connection-oriented e la modalitร  connectionless:

CaratteristicaConnection-oriented (orientato alla connessione)Connectionless (senza connessione)
Protocollo comuneTCP (Transmission Control Protocol)UDP (User Datagram Protocol)
Stabilimento della connessioneRichiede un handshake iniziale a 3 vieNessun handshake necessario
Affidabilitร Garantita (controlla la consegna e lโ€™ordine dei dati)Non garantita (i dati possono andare persi o arrivare fuori ordine)
OverheadMaggiore (a causa di controlli di errore e ritrasmissione)Minore (poichรฉ non ci sono controlli di errore)
Velocitร Piรน lenta (a causa dellโ€™overhead e della gestione della connessione)Piรน veloce (grazie allโ€™assenza di overhead)
Esempi di utilizzoBrowsing web, email, trasferimento di fileStreaming video/audio, giochi online
Flusso di datiOrdinato (i dati vengono ricevuti nellโ€™ordine corretto)Non ordinato (i dati possono arrivare in ordine casuale)
Gestione degli erroriInclusa (ritrasmissione automatica in caso di errore)Assente (lโ€™applicazione deve gestire eventuali errori)
Uso di risorseMaggiore uso di risorse di rete e CPUMinore uso di risorse, poichรฉ non ci sono controlli

2 - Vantaggi e svantaggi dei socket

I principali vantaggi dei socket sono:

  • Flessibilitร : permettono una varietร  di protocolli di trasporto (TCP/UDP) e orientamento alla connessione (connection-oriented/connectionless), adattandosi a diverse esigenze di comunicazione.
  • Efficienza nella comunicazione: offrono un metodo standard per lo scambio di dati tra dispositivi, consentendo connessioni rapide tra applicazioni su macchine differenti.
  • Compatibilitร  cross-platform: le API dei socket sono disponibili e relativamente simili su molti sistemi operativi, facilitando lo sviluppo di applicazioni distribuite.
  • Affidabilitร  con il TCP: con il TCP, i socket garantiscono che i dati arrivino in modo sicuro, ordinato e senza perdite. รˆ quindi ideale per applicazioni critiche come web server, trasferimento di file e posta elettronica.
  • Supporto alla comunicazione in tempo reale con lโ€™UDP: con lโ€™UDP, i socket permettono una comunicazione veloce, poichรฉ non hanno overhead di connessione, rendendoli ideali per streaming, giochi online, e applicazioni dove la velocitร  รจ piรน importante della precisione.
  • Multithreading e scalabilitร : i socket possono essere gestiti in modo asincrono o su piรน thread, permettendo a un singolo server di gestire piรน connessioni contemporaneamente, aumentando cosรฌ la scalabilitร  dellโ€™applicazione.

I principali svantaggi dei socket sono:

  • Complessitร  di gestione: richiedono una gestione accurata dei processi di connessione e chiusura, con il rischio di problemi come il blocco dei socket, connessioni non terminate correttamente, o errori di timeout.
  • Overhead con il TCP: le connessioni che usano il TCP implicano un certo overhead per il controllo di errori e la garanzia di consegna, aumentando la latenza. Non รจ ideale per applicazioni che richiedono un trasferimento estremamente rapido di piccoli pacchetti di dati.
  • Limitata sicurezza intrinseca: di per sรฉ, i socket non offrono cifratura o autenticazione dei dati. Per garantire sicurezza, รจ necessario implementare soluzioni aggiuntive come TLS/SSL.
  • Vulnerabilitร  a attacchi: i socket sono esposti ad attacchi come DDoS (Distributed Denial of Service) e hijacking, in cui malintenzionati possono sfruttare le connessioni aperte.
  • Supporto limitato per la trasmissione multicast: sebbene lโ€™UDP supporti il multicast, cioรจ lโ€™invio di dati a piรน destinatari, i socket TCP non lo fanno nativamente, limitando la comunicazione a un solo client per connessione.
  • Problemi di firewall e NAT: i firewall e i router NAT possono bloccare o ostacolare la connessione dei socket, causando problemi di accesso e richiedendo configurazioni aggiuntive.

3 - Internet socket

Gli Internet socket sono una famiglia di socket utilizzati per la comunicazione su reti basate su IP, come Internet. Questi socket possono essere utilizzati per stabilire connessioni tra dispositivi che si trovano anche in posizioni geografiche diverse.

Gli internet socket hanno le seguenti principali caratteristiche:

  • Indirizzamento: ogni socket รจ identificato univocamente da un indirizzo IP e da una porta, che consentono ai dispositivi di indirizzare correttamente i dati.
  • Protocollo: i socket utilizzano protocolli di trasporto che determinano come vengono trasferiti i dati. I due protocolli piรน usati sono il TCP (Transmission Control Protocol), che crea una connessione stabile e affidabile e garantisce la consegna dei dati in modo ordinato e senza perdite, e lโ€™UDP (User Datagram Protocol), che crea una connessione piรน leggera e veloce, ma non garantisce affidabilitร , sequenzialitร  o controllo della perdita di pacchetti.

3.1 - Funzionamento degli internet socket

Il funzionamento base di un socket รจ il seguente:

  1. Creazione di un socket: unโ€™applicazione crea un socket, specificando il tipo di protocollo (come TCP o UDP) e altre opzioni (ad esempio, indirizzo IP e porta). Nei sistemi basati su UNIX, questo avviene tipicamente con la funzione socket(), che restituisce un identificatore del socket.
  2. Associazione (binding): nel caso di un server, il socket viene โ€œassociatoโ€ a un indirizzo IP e una porta con lโ€™operazione di binding. Questo assicura che il socket ascolti su uno specifico indirizzo e sia accessibile per le connessioni in entrata. Ad esempio, in un server web, il socket รจ spesso associato alla porta 80 (HTTP) o 443 (HTTPS).
  3. Modalitร  dโ€™ascolto e connessione: server e client svolgono funzioni diverse.
    • Server: il socket entra in modalitร  dโ€™ascolto con la funzione listen(), in attesa di connessioni in entrata. Quando un client tenta di connettersi, il server accetta la connessione con la funzione accept(), che restituisce un nuovo socket per gestire la comunicazione con il client.
    • Client: il client richiede una connessione con il server attraverso il socket e la funzione connect(), specificando lโ€™indirizzo IP e la porta del server.
  4. Trasferimento dei dati: una volta stabilita la connessione, il client e il server possono scambiarsi dati. I dati sono inviati e ricevuti (in pacchetti) tramite funzioni di lettura e scrittura, come send() e recv() in TCP, che garantiscono la consegna, oppure sendto() e recvfrom() in UDP, dove non รจ garantita.
  5. Chiusura della connessione: al termine della comunicazione, il socket viene chiuso. Nel TCP, entrambe le parti devono chiudere il socket per terminare la connessione (half-close), garantendo che non ci siano dati persi. Nellโ€™UDP, che รจ senza connessione, la chiusura non ha bisogno di un processo specifico.

Fonti

  • Abraham Silberschatz, Peter Baer Galvin, Greg Gagne - Sistemi Operativi (10แตƒ Edizione) - Pearson, 2019 - ISBN: 9788891904560.
  • ๐Ÿซ Lezioni e slide del Prof. Aldinucci Marco del corso di Sistemi Operativi (canale B), Corso di Laurea in Informatica presso lโ€™Universitร  di Torino, A.A. 2024-25: