UDP (User Datagram Protocol) è un protocollo di trasmissione dati senza connessione che opera su IP e fornisce una latenza minima durante l'invio di datagrammi. A differenza di TCP, UDP non garantisce la consegna, l'ordine dei pacchetti o la protezione dalla duplicazione. Secondo IETF RFC 768 (2024), UDP gestisce oltre il 40% del traffico Internet globale grazie a videochiamate, streaming e query DNS.
Punti chiave
UDP (User Datagram Protocol) è uno dei protocolli chiave del livello di trasporto del modello TCP/IP, progettato da David Reed nel 1980. Fornisce un meccanismo minimo di trasmissione dati: l'applicazione invia un datagramma e il protocollo non tiene traccia se è arrivato al destinatario.
L'intestazione UDP è composta da soli quattro campi: porta di origine, porta di destinazione, lunghezza e checksum. Ogni campo occupa 2 byte, quindi la dimensione totale dell'intestazione è di 8 byte. Per confronto, un'intestazione TCP senza opzioni è di 20 byte, e con opzioni — fino a 60 byte.
Il protocollo non supporta la frammentazione al proprio livello — se un datagramma supera l'MTU (Maximum Transmission Unit), viene frammentato a livello IP. Se un frammento viene perso, l'intero datagramma viene scartato, poiché UDP non può richiedere la ritrasmissione di singoli frammenti. Gli sviluppatori devono controllare la dimensione del datagramma — per le reti mobili, l'MTU è spesso di 1400 byte, quindi la dimensione massima non deve superare questo valore.
Un'applicazione che utilizza UDP crea un socket di tipo SOCK_DGRAM, specifica la porta e l'indirizzo IP di destinazione e invia un datagramma. Il protocollo aggiunge un'intestazione minima e passa il pacchetto al livello IP. Il ricevente ascolta sulla propria porta ed estrae i dati dai datagrammi in arrivo.
UDP non esegue il controllo della congestione — l'applicazione può inviare datagrammi alla velocità massima supportata dalla rete. Ciò può portare a congestione del canale, ma negli scenari in tempo reale tale aggressività è giustificata: per una videochiamata, un flusso di dati con possibili perdite è più importante dell'interruzione della trasmissione.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
In questo esempio, viene creato un socket SOCK_DGRAM per UDP. Il metodo sendto invia un datagramma senza stabilire una connessione — è sufficiente conoscere l'IP e la porta del destinatario. Il metodo recvfrom lato server restituisce sia i dati che l'indirizzo del mittente per la risposta. I socket UDP sulle piattaforme mobili sono configurati in modo simile ma richiedono permessi aggiuntivi: su iOS, è necessario aggiungere NSAppTransportSecurity per connessioni UDP non crittografate, e su Android, il permesso INTERNET nel manifesto.
Scegliere UDP è giustificato negli scenari in cui la velocità è più critica dell'affidabilità. Il protocollo non perde tempo in configurazione della connessione, conferme e ritrasmissioni — questo offre una latenza minima, ma richiede che lo sviluppatore gestisca le perdite in modo indipendente.
| Vantaggi | Svantaggi |
|---|---|
| Bassa latenza — nessun handshake | Nessuna garanzia di consegna |
| Intestazione più piccola — 8 byte | Nessun controllo della congestione |
| Supporto broadcast e multicast | Possibili duplicati di pacchetti |
| Indipendenza dei datagrammi — nessuna coda | Dimensione del datagramma limitata dall'MTU |
Nelle applicazioni mobili, UDP viene utilizzato tramite framework come WebRTC, che aggiungono controllo delle perdite, bitrate adattivo e jitter buffer sopra UDP. Ciò offre i vantaggi di velocità senza gli svantaggi del protocollo nudo.
Un altro aspetto importante di UDP è l'assenza di controllo della congestione. In TCP, gli algoritmi Slow Start e Congestion Avoidance riducono la velocità di trasmissione in caso di perdita di pacchetti per evitare il sovraccarico della rete. UDP non dispone di tali meccanismi, quindi gli sviluppatori devono implementare le proprie strategie di controllo della velocità — ad esempio, bitrate adattivo nelle videochiamate o rate limiting nei server di gioco per prevenire un'eccessiva congestione della rete.
UDP è indispensabile negli scenari in cui la tolleranza alla latenza è più importante della tolleranza alla perdita di pacchetti. Esploriamo le principali aree di applicazione del protocollo nello sviluppo mobile e web.
I protocolli RTP e RTSP, che operano su UDP, vengono utilizzati per trasmettere flussi audio e video in tempo reale. WebRTC — lo standard per le videochiamate nei browser e nelle applicazioni mobili — utilizza UDP come trasporto principale per i dati multimediali e TCP per la segnalazione. La perdita di un pacchetto in un video a 30 fps è impercettibile per l'utente, a differenza del ritardo di ritrasmissione che causa un notevole blocco dell'immagine.
Gli sparatutto multiplayer e i MOBA richiedono una latenza inferiore a 50 ms per una corretta sincronizzazione. UDP trasmette le posizioni dei giocatori, i colpi e gli eventi più velocemente di TCP, e la perdita di pacchetti viene semplicemente ignorata — il prossimo aggiornamento arriverà in 16–33 ms. I motori di gioco più diffusi, tra cui Unity e Unreal Engine, utilizzano UDP attraverso i propri livelli di trasporto con affidabilità aggiuntiva per eventi critici tramite conferme a livello applicativo.
Le query DNS utilizzano UDP sulla porta 53 perché ogni query è un singolo datagramma piccolo (di solito fino a 512 byte). Se non arriva alcuna risposta, il client ripete semplicemente la query dopo un timeout, che è più veloce di stabilire una connessione TCP con il suo handshake a tre vie. DHCP funziona anche su UDP, poiché il client non ha ancora un indirizzo IP e non può stabilire una connessione TCP, mentre i pacchetti UDP di broadcast consentono di trovare un server DHCP sulla rete locale.
La scelta tra UDP e TCP è un compromesso tra velocità e affidabilità. Ogni protocollo è ottimale per la sua classe di attività e comprendere le loro differenze aiuta a prendere le giuste decisioni architetturali durante la progettazione della comunicazione di rete nelle applicazioni mobili.
| Criterio | UDP | TCP |
|---|---|---|
| Configurazione connessione | Non necessaria | Handshake a tre vie |
| Intestazione | 8 byte | 20–60 byte |
| Garanzia di consegna | No | Sì, con conferma |
| Ordinamento | No | Sì |
| Controllo congestione | No | Sì (AIMD, Slow Start) |
| Casi d'uso | Streaming, giochi, DNS | Web, email, file, API |
I progetti mobili spesso utilizzano un approccio ibrido: TCP per richieste affidabili (autenticazione, caricamento dati) e UDP per flussi multimediali. QUIC — un protocollo moderno di Google che opera su UDP — combina la velocità di UDP con l'affidabilità di TCP ed è già utilizzato in HTTP/3.
Diamo un'occhiata a un semplice server UDP in Python che riceve messaggi dai client e invia una risposta. Il server ascolta sulla porta 8888 ed elabora i datagrammi in arrivo in un ciclo infinito.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('Server UDP avviato sulla porta 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'Ricevuto da {addr}: {data.decode()}')
server.sendto(b'OK', addr)
Il server crea un socket UDP, si lega alla porta 8888 e attende i datagrammi in arrivo. recvfrom restituisce i dati e l'indirizzo del client, consentendo di rispondere tramite sendto. A differenza di TCP, il server non mantiene lo stato della connessione — ogni datagramma viene elaborato indipendentemente. Ciò rende i server UDP scalabili: un singolo server può gestire milioni di client senza allocare memoria per ogni singola connessione, il che è importante per i server DNS e i sistemi di matchmaking dei giochi.
Nello sviluppo mobile, UDP viene spesso utilizzato tramite librerie di alto livello. Ad esempio, CocoaAsyncSocket per iOS fornisce socket UDP con delegati e GCD per la gestione asincrona degli eventi. Su Android, la classe DatagramSocket fa parte della libreria standard java.net e non richiede dipendenze aggiuntive. Per Flutter, esiste il pacchetto udp che fornisce un'interfaccia semplice per inviare e ricevere datagrammi senza configurare socket nativi.
È importante notare che molte reti mobili e firewall aziendali bloccano il traffico UDP, specialmente sulle porte superiori a 1024. Se la tua applicazione utilizza UDP, devi fornire un fallback a TCP o verificare la disponibilità del protocollo tramite server STUN, come fa WebRTC. Su iOS, il framework di sistema Network.framework con NWConnection supporta sia TCP che UDP, scegliendo automaticamente il protocollo ottimale in base alla disponibilità. Per le applicazioni in tempo reale, si consiglia inoltre di implementare il bitrate adattivo, che riduce la qualità del flusso in caso di perdita di pacchetti, garantendo una riproduzione continua anche su canali instabili con alti tassi di errore.
Domande frequenti
UDP non stabilisce una connessione e non garantisce la consegna dei pacchetti, rendendolo più veloce di TCP. L'intestazione UDP è di 8 byte contro i 20–60 byte di TCP. UDP è adatto per streaming e giochi, mentre TCP è per richieste web e trasferimenti di file.
Un datagramma è un pacchetto di dati indipendente con un'intestazione UDP (porta di origine, porta di destinazione, lunghezza, checksum). Ogni datagramma viene elaborato indipendentemente, senza relazione con i precedenti. La dimensione del datagramma è limitata dall'MTU della rete e per specifica — fino a 65507 byte.
UDP non fornisce affidabilità a livello di trasporto — viene implementata dall'applicazione. Gli sviluppatori aggiungono numeri di sequenza, checksum, richieste di ritrasmissione e correzione degli errori. FEC (Forward Error Correction) consente di recuperare i pacchetti persi senza ritrasmissione.
UDP non è adatto per scenari in cui l'integrità dei dati è critica: trasferimenti di file, transazioni bancarie, REST API. In questi casi, TCP garantisce che ogni byte arrivi nell'ordine corretto. UDP è inoltre sconsigliato su canali instabili con alti tassi di perdita.
QUIC è un protocollo di trasporto che opera su UDP, sviluppato da Google e standardizzato da IETF come RFC 9000. Combina la velocità di UDP con l'affidabilità di TCP, supporta il multiplexing senza blocco di testa di linea e dispone di crittografia integrata. HTTP/3 utilizza QUIC come livello di trasporto.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche