# User Datagram Protocol

Lo User Datagram Protocol (UDP), nelle telecomunicazioni, è uno dei principali protocolli di rete della suite di protocolli Internet. È un protocollo di livello di trasporto a pacchetto, usato di solito in combinazione con il protocollo di livello di rete IP.

## Funzionamento

A differenza del TCP, l'UDP è un protocollo di tipo connectionless, inoltre non gestisce il riordinamento dei pacchetti né la ritrasmissione di quelli persi, ed è perciò generalmente considerato di minore affidabilità. In compenso è molto rapido (non c'è latenza per riordino e ritrasmissione) ed efficiente per le applicazioni "leggere" o time-sensitive. In genere è utilizzato per le applicazioni per le quali un pacchetto in ritardo ha validità nulla, per esempio la trasmissione audio-video in tempo reale (streaming o VoIP sono gli usi più comuni), oppure la trasmissione di altre informazioni sullo stato di un sistema, per esempio i giochi multiplayer online.
L'UDP fornisce soltanto i servizi basilari del livello di trasporto, ovvero:
* multiplazione delle connessioni, ottenuta attraverso il meccanismo di assegnazione delle porte;
* verifica degli errori (integrità dei dati) mediante una checksum, inserita in un campo dell'intestazione (header) del pacchetto, mentre TCP garantisce anche il trasferimento affidabile dei dati, il controllo di flusso e il controllo della congestione.
L'UDP è un protocollo stateless, ovvero non tiene nota dello stato della connessione dunque ha, rispetto al TCP, meno informazioni da memorizzare: un server dedicato ad una particolare applicazione che scelga UDP come protocollo di trasporto può supportare quindi molti più client attivi.

## Struttura di un datagramma UDP

Un datagramma o pacchetto (anche se la seconda terminologia è preferibile utilizzarla quando ci riferiamo al livello di rete) UDP è così strutturato:
| + | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 |
| 0 | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port |
| 32 | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) |
| 64+ | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data |
* Header:
** Source port [16 bit] - identifica il numero di porta sull'host del mittente del datagramma;
** Destination port [16 bit] - identifica il numero di porta sull'host del destinatario del datagramma;
** Length [16 bit] - contiene la lunghezza totale in bytes del datagramma UDP (header+dati);
** Checksum [16 bit] - contiene il codice di controllo del datagramma (header+dati+pseudo-header, quest'ultimo comprendente gli indirizzi IP di sorgente e destinazione). L'algoritmo di calcolo è definito nell'RFC del protocollo;
* Payload:
** Data - contiene i dati del messaggio

## Applicazioni che utilizzano UDP

Le applicazioni di rete che hanno la necessità di un trasferimento affidabile dei loro dati non si affidano a UDP, mentre le applicazioni più elastiche riguardo alla perdita dei dati e strettamente dipendenti dal tempo si affidano invece a UDP. Inoltre si utilizza UDP per comunicazioni in broadcast (invio a tutti i terminali in una rete locale) e multicast (invio a tutti i terminali iscritti ad un servizio).
Di seguito è proposto un elenco dei principali servizi Internet e dei protocolli che essi adottano:
| Applicazione | Protocollo strato applicazione | Protocollo strato trasporto |
| Posta elettronica | SMTP | TCP |
| Accesso a terminale remoto | telnet | TCP |
| Trasferimento file | FTP | TCP |
| Web | HTTP | TCP |
| Streaming Audio/Video | RTSP/RTP | TCP (comandi) + UDP (flusso) |
| Server di file remoto | NFS | tipicamente UDP |
| Telefonia su internet (VoIP) | SIP, H.323, altri | tipicamente UDP |
| Gestione della rete | SNMP | tipicamente UDP |
| Protocollo di routing | RIP | tipicamente UDP |
| Risoluzione dei nomi | DNS | tipicamente UDP |