Un socket è un endpoint software che consente ai programmi di inviare e ricevere dati tra dispositivi o tra processi sulla stessa macchina.

Che cos'è una presa?
Una presa è una sistema operativo astrazione che rappresenta un'estremità di un canale di comunicazione, esponendo un'uniforme API per inviare e ricevere bytes su vari meccanismi di trasporto. Ogni socket è vincolato a un indirizzo nel suo spazio dei nomi, in genere un IP più una porta per socket Internet o un percorso del file system per UNIX socket di dominio e associati a un endpoint remoto per formare una connessione (per protocolli orientati al flusso) o per scambiare messaggi discreti senza una connessione persistente (per protocolli datagramma).
Internamente, il Kernel mantiene buffer, stato e opzioni per il socket (ad esempio, timeout, modalità non bloccante, flag di riutilizzo), mediando l'affidabilità, l'ordinamento e il comportamento di congestione in base al valore scelto protocollo ad esempio TCP (flusso di byte, orientato alla connessione) o UDP (orientato ai messaggi, senza connessione). Le applicazioni interagiscono tramite chiamate di sistema come create, bind, connect, listen, accept, send e receive, abilitando il full duplex. I / O tra processi sullo stesso host o attraverso reti. Funzionalità di livello superiore come TLS può essere stratificato sulla presa per fornire riservatezza e integrità, mentre il socket stesso rimane l'interfaccia endpoint dello stack di rete.
Tipi di prese
Ecco i principali tipi di socket che puoi incontrare, ognuno ottimizzato per un diverso schema di comunicazione e famiglia di indirizzi:
- Socket di flusso (TCP). I socket di flusso forniscono un flusso di byte affidabile e ordinato tra due endpoint utilizzando il protocollo TCP. Il sistema operativo gestisce la configurazione della connessione, la ritrasmissione, il controllo della congestione e il controllo del flusso, in modo che le applicazioni possano leggere e scrivere come se si trovassero in un canale continuo. Sono ideali per protocolli che richiedono integrità e sequenziamento, come HTTP/ 1.1, SMTPe banca dati autisti.
- Socket datagramma (UDP). I socket datagramma inviano messaggi discreti senza stabilire una connessione persistente, utilizzando UDP. La consegna, l'ordine e la duplicazione non sono garantiti, il che riduce il sovraccarico e la latenza, ma sposta l'affidabilità verso applicazioneSono adatti per scenari in tempo reale o multicast come DNS query, VoIP e telemetria in streaming.
- Socket di dominio UNIX (IPC locale). I socket di dominio UNIX collegano i processi sullo stesso host tramite un percorso del file system o uno spazio dei nomi astratto invece di un IP/portoOffrono una latenza inferiore e una migliore semantica di sicurezza rispetto al loopback TCP/UDP perché i dati non raggiungono mai lo stack di rete. Gli usi comuni includono la comunicazione tra un sito web server e un'app server (ad esempio, Nginx ↔ uWSGI).
- Prese grezze. I socket raw espongono i pacchetti di rete con un'elaborazione minima del kernel, consentendo alle applicazioni di creare e ispezionare direttamente le intestazioni (ad esempio, ICMP da ping, protocolli personalizzati, scanner di rete). Richiedono privilegi elevati a causa dei rischi per la sicurezza e sono utilizzati principalmente per la diagnostica, l'acquisizione di pacchetti e gli strumenti di protocollo. Affidabilità e framing dipendono interamente dall'applicazione.
- Socket a pacchetti sequenziati (SCTP). I socket SCTP forniscono limiti di messaggio come UDP ma aggiungono affidabilità, ordinamento per flusso e multi-homing per la ridondanza del percorso. Supportano più flussi indipendenti in un'unica associazione, riducendo il blocco in testa alla linea. Ciò rende SCTP adatto alla segnalazione e al controllo del traffico delle telecomunicazioni, dove la struttura dei messaggi e la resilienza sono importanti.
- WebSocket (socket a livello applicativo su TCP). WebSocket aggiorna una connessione HTTP a un canale persistente full-duplex trasportato su un socket TCP. Una volta stabilito, cliente e server può inviare messaggi in qualsiasi momento con un basso overhead di framing, consentendo applicazioni interattive come chat, dashboard ed editor collaborativi. Sebbene utilizzi TCP, le applicazioni lo trattano come un'API "socket" orientata ai messaggi.
- Bluetooth e altre prese per famiglie di indirizzi. Oltre a IP e IPC locale, esistono anche prese per altri trasporti e famiglie, come Bluetooth (RFCOMM/L2CAP), CAN bus o Netlink su LinuxQuesti mantengono lo stesso modello API socket (create, bind/connect, send/recv) mappando indirizzi e semantica al mezzo specifico. Sono utilizzati per la comunicazione tra dispositivi, la messaggistica del kernel e reti industriali specializzate.
Come funziona una presa?
Ecco come funziona un socket dall'installazione allo spegnimento:
- Creare il socket. L'applicazione chiede al sistema operativo di creare un socket con una famiglia di indirizzi (ad esempio, IPv4/IPv6 o Unix), un tipo (stream/datagramma) e un protocollo (TCP/UDP). Questo alloca lo stato del kernel e i buffer e restituisce un handle che l'app utilizzerà per l'I/O.
- Collegati a un indirizzo locale. Servers Associa il socket a un indirizzo locale (IP/porta o percorso del file system) in modo che il sistema operativo sappia dove indirizzare il traffico in entrata. I client possono saltare l'associazione esplicita e lasciare che il sistema operativo scelga una porta temporanea, semplificando la configurazione.
- Stabilire o attendere una connessione. Per TCP (flusso): un client chiama connect per eseguire l'handshake con un indirizzo remoto; un server le chiamate ascoltano le connessioni in entrata in coda, quindi accettano di creare un nuovo socket per client. Per UDP (datagramma): no stretta di mano è obbligatorio; l'app può facoltativamente chiamare connect per impostare un peer predefinito o utilizzare sendto/recvfrom per ogni messaggio.
- Scambio datiUna volta connessa (TCP) o indirizzata (UDP), l'app utilizza i protocolli send/recv (o write/read) per spostare i byte. TCP fornisce una consegna affidabile e ordinata di un flusso di byte; UDP invia messaggi indipendenti che potrebbero arrivare fuori ordine o non arrivare affatto. Il kernel gestisce il buffering, la segmentazione e (per TCP) le ritrasmissioni e il controllo di flusso.
- Configurare il comportamento. Le applicazioni ottimizzano le opzioni del socket (timeout, modalità non bloccante, dimensioni del buffer, keepalive, flag di riutilizzo) per soddisfare le esigenze del carico di lavoro. Queste impostazioni influenzano latenza, produttività e utilizzo delle risorse, contribuendo a evitare blocchi sotto carico.
- Monitorare la prontezza e gli errori. Per scalare e rimanere reattive, le app monitorano i socket con meccanismi di eventi (select/poll/epoll/kqueue/IOCP) per capire quando sono leggibili/scrivibili o quando si verificano errori. Questo consente di gestire più connessioni in modo efficiente senza bloccarne nessuna.
- Chiudere e pulire. Al termine della comunicazione, l'app chiude il socket. TCP esegue uno shutdown ordinato (FIN/ACK) per svuotare i dati; UDP rilascia semplicemente le risorse. Il sistema operativo elimina lo stato del kernel e restituisce i buffer al sistema, completando il ciclo di vita.
A cosa serve una presa?

I socket alimentano la maggior parte delle comunicazioni di rete e interprocesso. Di seguito sono riportati gli usi più comuni e la loro importanza.
- Servizi Web e API. HTTP/HTTPS funziona tramite socket TCP, consentendo browser e i client richiedono risorse, chiamano endpoint REST/GraphQL e trasmettono le risposte in modo efficiente.
- Applicazioni servers. Web servers (ad esempio, Nginx/Apache) e app servers accettare connessioni client su socket di ascolto, richieste multiplex e restituire contenuti dinamici.
- Messaggistica in tempo reale. Chat, notifiche, editor collaborativi e dashboard mantengono un socket persistente (ad esempio, WebSocket su TCP) in modo che entrambe le parti possano inviare aggiornamenti istantaneamente.
- Streaming multimediale e telefonia. I flussi video/audio e VoIP utilizzano socket (spesso UDP/RTP o QUIC) per ridurre al minimo la latenza, tollerando al contempo una certa perdita.
- Il gioco online. Clienti di gioco e servers scambiare frequenti aggiornamenti di stato tramite socket con bassa latenza, utilizzando UDP o livelli di affidabilità personalizzati quando necessario.
- Accesso e amministrazione remoti. SSH, RDP e VNC si basano su socket per fornire crittografato sessioni shell e desktop su tutte le reti.
- Connettività al database. I client si connettono ai database (PostgreSQL, MySQL, Redis) tramite socket di dominio TCP o UNIX per query con ordinamento prevedibile e affidabilità.
- Servizio-servizio (microservizi). I servizi interni comunicano tramite socket utilizzando gRPC/HTTP, con bilanciatori di carico e service mesh che gestiscono numerose connessioni simultanee.
- Protocolli di risoluzione e controllo dei nomi. DNS, DHCP, NTPe i piani di controllo personalizzati scambiano messaggi compatti tramite socket per coordinare il comportamento della rete.
- Comunicazione locale tra processi. Su una macchina, i socket di dominio UNIX collegano i componenti (ad esempio, Nginx ↔ app runtime) con un overhead inferiore e autorizzazioni più restrittive rispetto al loopback TCP.
Come garantire una comunicazione sicura tra socket?
Garantire una comunicazione sicura tramite socket significa proteggere i dati in transito, verificare l'identità dei peer e ridurre al minimo l'esposizione agli attacchi. I seguenti passaggi delineano le misure chiave per mantenere interazioni sicure tramite socket:
- Utilizzare la crittografia (TLS/SSL). Proteggere sempre i canali di comunicazione con Transport Layer Security (TLS) o il suo predecessore SSL. Questo protocollo crittografa i dati in modo che il traffico intercettato non possa essere letto o modificato. Per i socket TCP, questo protocollo viene spesso implementato tramite HTTPS, SMTPS o driver di database che supportano la negoziazione TLS.
- autenticare endpoint. Entrambe le parti devono verificare reciprocamente l'identità prima di scambiare dati sensibili. Questo può essere fatto tramite certificati (TLS reciproco), chiavi pre-condivise o meccanismi basati su token come OAuth per protocolli di livello superiore.
- Convalida l'input e sanifica i dati. Non fidarti mai di input esterni che arrivano tramite un socket. Convalida le intestazioni del protocollo, la lunghezza del payload e i tipi di contenuto per prevenire buffer overflow, attacchi di iniezione o exploit di deserializzazione.
- imporre privilegio minimo. Associa i socket solo alle interfacce e alle porte necessarie ed esegui i servizi di rete con privilegi minimi del sistema operativo. Questo riduce l'impatto di una potenziale compromissione.
- Implementare timeout e limiti. Configurare timeout di lettura/scrittura, limiti di connessione e limiti di buffer per mitigare i tentativi di negazione del servizio (DoS) causati da connessioni lente o eccessive.
- Mantieni aggiornato il software. Applicare regolarmente patch ai sistemi operativi, alle librerie e dipendenze che gestiscono le prese. Molti vulnerabilità sfruttare stack di protocolli obsoleti o suite di cifratura deboli.
- Usa il firewall e controlli di accesso. Limita il traffico in entrata e in uscita a indirizzi e porte noti. Combina il filtraggio a livello di rete con l'autenticazione a livello di applicazione per una sicurezza a più livelli.
- Monitorare e registrare l'attività. Gestisci i log delle connessioni socket, dei guasti e delle anomalie. Gli strumenti di monitoraggio possono rilevare modelli sospetti come ripetuti handshake falliti o picchi di traffico imprevisti, contribuendo a identificare e bloccare tempestivamente gli attacchi.
I vantaggi e le sfide dell'utilizzo delle prese
Le prese supportano la maggior parte delle comunicazioni digitali, offrendo una connessione veloce, flexUn modo possibile per le applicazioni di comunicare tra host o all'interno della stessa macchina. Consentono lo scambio di dati in tempo reale, interfacce standard e un ampio supporto di protocolli, ma introducono anche complessità operativa, rischi per la sicurezza e problemi di affidabilità che devono essere gestiti. Le sezioni seguenti illustrano i principali vantaggi e le sfide comuni per aiutarvi a progettare sistemi basati su socket tenendo ben presenti i compromessi.
Vantaggi della presa
I socket forniscono una base versatile ed efficiente per la comunicazione tra applicazioni. Espongono un'API coerente su piattaforme e protocolli, consentendo di gestire qualsiasi cosa, dall'IPC locale ai servizi su scala Internet, con un controllo preciso del comportamento. Ecco i principali vantaggi:
- Basso overhead e basse prestazioni. L'accesso diretto allo stack di rete del sistema operativo riduce al minimo i livelli, garantendo bassa latenza e produttività elevata, soprattutto con offload del kernel e buffer ottimizzati.
- Protocollo flexflessibilità. La stessa API supporta TCP, UDP, SCTP, socket di dominio UNIX e altro ancora, così puoi scegliere l'affidabilità, l'ordinamento o i limiti dei messaggi in base al carico di lavoro.
- Comunicazione full-duplex in tempo reale. Le connessioni persistenti (ad esempio, TCP, WebSocket) consentono a entrambe le parti di inviare dati immediatamente, consentendo app interattive, streaming e telemetria in tempo reale.
- Opzioni di affidabilità. TCP garantisce una distribuzione ordinata e senza perdite; SCTP offre l'ordinamento per flusso con multi-homing; le applicazioni possono anche creare un'affidabilità personalizzata su UDP quando necessario.
- Scalabilità con I/O degli eventi. I socket e i reattori non bloccanti (epoll/kqueue/IOCP) multiplexano in modo efficiente migliaia di connessioni per processo, supportando servizi ad alta concorrenza.
- Stratificazione della sicurezza. È possibile aggiungere TLS/mTLS per crittografare il traffico e autenticare i peer, mentre i controlli del sistema operativo (indirizzi di associazione, privilegi, firewall) riducono superficie di attacco.
- Portabilità e interoperabilità. La semantica POSIX/WinSock è onnipresente, rendendo le applicazioni basate su socket portabili tra i sistemi operativi e interoperabili tra le reti.
Sfide della presa
I socket sono potenti, ma comportano compromessi operativi e di progettazione. Di seguito sono riportate le sfide più comuni che è necessario pianificare e mitigare:
- Complessità del ciclo di vita della connessione. La gestione di connessioni non bloccanti, letture/scritture parziali, timeout e arresti ordinati (FIN/RST) aggiunge una gestione complessa dello stato e casi limite.
- Scalabilità ed eventi. Per multiplexare in modo efficiente migliaia di connessioni sono necessari modelli epoll/kqueue/IOCP, threading accurato ed evitare hotspot di thundering-herd e di contesa.
- Controllo della contropressione e del flusso. Velocità produttore/consumatore non corrispondenti possono causare il sovraccarico dei buffer o l'arresto delle pipeline; è necessario propagare la contropressione e regolare i buffer del socket e dell'applicazione.
- Compromessi tra affidabilità e ordinazione. Il blocco in testa alla linea e le ritrasmissioni del TCP possono aumentare la latenza; l'UDP non fornisce alcuna garanzia di consegna, spostando l'affidabilità fino all'applicazione.
- Insidie per la sicurezza. Una configurazione errata del TLS (cifrature deboli, mTLS mancante), l'affidamento a input non convalidati o l'esposizione di porte/interfacce non necessarie ampliano la superficie di attacco.
- NAT, firewall e ostacoli al routing. I middlebox eliminano o riscrivono il traffico, complicando la scoperta dei peer, i keepalive e l'hole-punching per i protocolli peer-to-peer o a bassa latenza.
- Differenze tra piattaforme/stack. Il comportamento varia a seconda delle versioni POSIX/WinSock e del sistema operativo (ad esempio, opzioni socket, semantica del backlog, stranezze IPv6/dual-stack), con un impatto sulla portabilità.
- Osservabilità e debug. La perdita di pacchetti, i nuovi tentativi e la crittografia TLS rendono i problemi difficili da diagnosticare; sono necessarie strategie di registrazione strutturate, metriche e acquisizione di pacchetti per classificare gli incidenti di produzione.
FAQ sulle prese
Ecco le risposte alle domande più frequenti sulle prese.
Spina vs. presa
Esaminiamo le differenze tra una spina e una presa:
| Aspetto | Tappo | presa di corrente |
| Idea base | Il connettore lato client che avvia la comunicazione. | L'astrazione dell'endpoint gestita dal sistema operativo per l'invio/ricezione dei dati. |
| Ruolo in una connessione | Chiama o si collega attivamente a un endpoint di ascolto. | Ascolta, accetta o mantiene le connessioni; utilizzato anche dai client dopo la connessione. |
| Chi lo crea | In genere l'applicazione client quando avvia una connessione in uscita. | Sia il cliente che server creare socket; servers associa/ascolta; i client si connettono. |
| Indirizzamento | Prende di mira un indirizzo remoto (IP:porta, percorso) per raggiungere un servizio. | Si collega a un indirizzo locale (IP:porta, percorso) in modo che il sistema operativo possa distribuire il traffico. |
| direzionalità | Iniziatore; si “collega” a un servizio remoto. | Endpoint; può essere passivo (in ascolto) o attivo (connesso). |
| Focus sul ciclo di vita | Connetti → scambia dati → chiudi. | Associa → ascolta/accetta (server) o connetti (client) → scambia dati → chiudi. |
| Prospettiva API | Spesso descritto informalmente nella documentazione dell'app come connettore. | Primitive formali del sistema operativo: socket(), bind(), listen(), accept(), connect(), send()/recv(). |
| OSI/astrazione | Concetto applicativo (metafora informale). | Astrazione di rete a livello di sistema (limite trasporto/sessione). |
| Esempi | Un browser che si “collega” a example.com:443; un client che chiama un DB. | A serversocket di ascolto su 0.0.0.0:443; un socket di dominio Unix su /run/app.sock. |
| Confusione comune | "Plug" non è un tipo POSIX/WinSock formale; è un'abbreviazione di "initiator". | "Socket" è il termine canonico; entrambe le estremità, una volta collegate, diventano prese. |
I socket sono hardware o software?
I socket sono software. In ambito networking, un socket è un'astrazione software nel sistema operativo che rappresenta un'estremità di un canale di comunicazione (ad esempio, un endpoint TCP o UDP). I programmi utilizzano l'API del socket per inviare e ricevere dati; il kernel gestisce buffer, stato e dettagli del protocollo in background.
La parola "presa" può anche riferirsi a hardware in altri contesti, come un CPU presa su una scheda madre o una presa elettrica, ma non sono correlate; una presa di rete non è un connettore fisico.
Cosa succede se la comunicazione socket fallisce?
Gli errori dei socket interrompono lo scambio di dati e possono lasciare le applicazioni in uno stato parziale o sconosciuto. I sintomi includono timeout (nessuna risposta), connessione rifiutata (nessun listener), reimpostazione della connessione (RST midstream), host irraggiungibile, errori TLS/handshake o dati troncati/duplicati. Le cause più comuni sono interruzioni di rete, problemi DNS, firewall/regole NAT. server sovraccarico, arresti anomali dei processi, limiti del buffer, incongruenze di protocollo e client difettosi/servers.
Per un ripristino sicuro, le app dovrebbero utilizzare timeout chiari, riprovare con backoff esponenziale, implementare richieste idempotenti, rilevare connessioni semiaperte con keepalive/heartbeat, applicare interruttori automatici per distribuire il carico ed eseguire il failover su endpoint alternativi. Un solido sistema di log e metriche (latenza, codici di errore, reset, ritrasmissioni) aiutano a individuare la causa principale e a prevenire il ripetersi degli errori.