Salta al contenuto
Note per Studenti Protocollo UDP

Protocollo UDP

In questa pagina 5
In questa pagina 3

UDP (User Datagram Protocol) è il protocollo di base per scambiare dati impacchettati al livello di trasporto. È un protocollo senza connessione (connectionless) e non affidabile: non aggiunge niente ai servizi di IP (Datagramma IP e frammentazioneIPv4 è un servizio senza connessione, non affidabile, best effort: i pacchetti (datagrammi) possono essere persi, corrotti, riordinati o ritardati. L'intestazione ha 20-60 byte (HLen conta parole da 4 byte, da 5 a 15); il campo Total Length (16 bit) dà la lunghezza totale fino a 65 535 byte; TTL limita i salti, Protocol identifica il protocollo trasportato (1 ICMP, 6 TCP, 17 UDP), il checksum copre solo l'intestazione. Se un datagramma è più grande dell'MTU del collegamento viene frammentato: solo il payload si divide, ogni frammento ha un'intestazione propria; l'Offset (13 bit) è in unità di 8 byte, MF=1 in tutti i frammenti tranne l'ultimo, e il riassemblaggio avviene solo a destinazione.Datagramma IP e frammentazione →) tranne la comunicazione da processo a processo invece che da host a host, cioè i numeri di porta (Livello di trasporto - porte e multiplexingIl livello di trasporto (transport layer) offre la comunicazione logica end-to-end tra processi applicativi di host diversi, ed è realizzato solo negli host finali, non nei router. Il livello di rete consegna al computer giusto (indirizzo IP), il trasporto consegna al processo giusto (numero di porta di 16 bit, 0-65535). Una porta più un indirizzo IP formano un socket; la quaterna (IP sorgente, porta sorgente, IP destinazione, porta destinazione) identifica una connessione. I servizi sono: comunicazione processo-processo, indirizzamento, incapsulamento/decapsulamento, multiplexing/demultiplexing e, se il protocollo è affidabile, controllo di errore, di flusso e di congestione. I protocolli sono UDP (senza connessione, inaffidabile), TCP (con connessione, affidabile) e SCTP (combina i due).Livello di trasporto - porte e multiplexing →). I segmenti UDP possono quindi andare persi o arrivare fuori ordine all'applicazione.

Se è così "debole", perché usarlo?

Un processo che vuole inviare un breve messaggio e non si cura molto dell'affidabilità ci mette molto meno con UDP che con TCP, perché c'è molta meno interazione tra mittente e destinatario:

  • niente instaurazione della connessione, che aggiungerebbe ritardo: la "connessione" si considera aperta quando arriva il primo datagramma;
  • niente controllo di congestione: UDP può inviare alla velocità che l'applicazione vuole;
  • semplice: nessuno stato di connessione né al mittente né al destinatario (stateless);
  • intestazione piccola: 8 byte contro i 20 (almeno) di TCP, quindi meno overhead e ritardo minimo;
  • permette il multicast (un pacchetto IP verso molti destinatari).

Formato del pacchetto

I pacchetti UDP (user datagram) hanno un'intestazione di 8 byte, divisa in quattro campi da 16 bit:

bit 0–15 bit 16–31
porta sorgente porta destinazione
lunghezza UDP checksum (facoltativo)
dati
  • Porta sorgente e porta destinazione (16 bit ciascuna): i numeri di porta dei processi.
  • Lunghezza (16 bit): lunghezza totale, intestazione più dati, in byte. Con 16 bitcon k bit si rappresentano i numeri da 0 a 2^k − 1Sistemi di numerazione posizionali → il valore massimo sarebbe 216−1=65 5352^{16}-1=65\,535; poiché il datagramma UDP viaggia dentro un datagramma IP, che ha almeno 20 byte di intestazione ed è lungo al massimo 65 53565\,535 byte, i dati UDP sono al massimo 65 535−20−8=65 50765\,535-20-8=65\,507 byte (dal totale IP si tolgono i 2020 byte dell'intestazione IP e gli 88 di UDP). Il valore minimo è 8 (nessun dato).
  • Checksum (16 bit): controllo d'errore, facoltativo.

Formula (dati utili in un datagramma UDP). dati=lunghezza UDP−8\text{dati}=\text{lunghezza UDP}-8.

Esempio. Un datagramma con lunghezza 1212 trasporta 12−8=412-8=4 byte di dati. Un messaggio più grande di 65 50765\,507 byte non si può inviare con un solo UDP: UDP non spezza un flusso in datagrammi correlati, quindi può essere usato solo da processi che inviano messaggi brevi.

I servizi di UDP

Il checksum e la pseudo-intestazione

Il checksum UDP si calcola su tre parti: una pseudo-intestazione, l'intestazione UDP e i dati dell'applicazione. La pseudo-intestazione è un pezzo dell'intestazione del pacchetto IP in cui il datagramma UDP verrà incapsulato, con alcuni campi riempiti con zeri; non viene trasmessa, serve solo per il calcolo:

parola contenuto
1–2 indirizzo IP sorgente (32 bit)
3–4 indirizzo IP destinazione (32 bit)
5 88 zeri + protocollo (8 bit, vale 1717 per UDP)
6 lunghezza UDP (16 bit)

Perché la pseudo-intestazione? Mettere nel controllo anche le informazioni di IP è una protezione in più: un datagramma consegnato all'host sbagliato (indirizzo corrotto) o al protocollo sbagliato viene rivelato. Però viola il principio dei livelli: UDP deve conoscere informazioni di IP che in teoria non dovrebbe vedere (per esempio il numero di protocollo, che il livello IP del ricevente deve passargli). È un caso in cui la stratificazione rigida è stata sacrificata alla praticità.

Formula (checksum UDP). Si sommano tutte le parole da 16 bit di pseudo-intestazione, intestazione (con il campo checksum posto a 00) e dati (se i byte sono dispari si aggiunge un byte di zeri in fondo); i riporti oltre il sedicesimo bit si sommano al risultato (aritmetica a complemento a uno); il checksum è il complemento a uno (NOT bit a bit) della somma. Il ricevente somma tutte le parole, checksum compreso: se non ci sono errori ottiene FFFF\texttt{FFFF}.

Perché funziona: se SS è la somma (a 16 bit, con il riporto riportato in coda, vedi Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →) e il checksum è S‾\overline S (NOT bit a bit, Algebra di Boole e porte logicheVariabili booleane, operatori AND, OR, NOT e derivati (NAND, NOR, XOR, XNOR) con tabelle di verità; assiomi e teoremi dell'algebra di Boole, De Morgan; porte logiche e completezza di NAND e NOR; semplificazione algebrica con esempio.Algebra di Boole e porte logiche →), allora in ogni posizione di bit uno dei due vale 11 e l'altro 00: S+S‾S+\overline S ha tutti i bit a 11, cioè FFFF\texttt{FFFF}. Se durante il viaggio un bit cambia, la somma cambia e il risultato del ricevente non è più FFFF\texttt{FFFF}. Il riporto oltre il sedicesimo bit si riaggiunge perché l'addizione è fatta modulo 216−12^{16}-1 (complemento a uno), non modulo 2162^{16}.

Esempio completo. Un host 192.168.0.1192.168.0.1 invia dalla porta 50005000 alla porta 5353 dell'host 192.168.0.199192.168.0.199 i quattro byte Ciao (in esadecimale 43 69 61 6F43\,69\,61\,6F). Lunghezza UDP =8+4=12=000C=8+4=12=\texttt{000C}. Conversioni in esadecimale (Basi di numerazione e conversioni - binario, ottale ed esadecimaleUn numero in base $r$ vale $\sum a_i r^i$ (cifre $a_i\in{0,\dots,r-1}$). Conversioni: base $r\to$ decimale con la somma pesata; decimale $\to$ base $r$ per divisioni successive (parte intera, resti letti dal basso) e moltiplicazioni successive (parte frazionaria, parti intere lette dall'alto); binario $\leftrightarrow$ ottale/esadecimale a gruppi di 3/4 bit. Somma, differenza e prodotto binari seguono le regole decimali con cifre 0 e 1; la differenza ha prestiti, il prodotto somma prodotti parziali traslati.Basi di numerazione e conversioni - binario, ottale ed esadecimale →): ogni byte dell'IP si scrive con due cifre, 192=12⋅16+0=C0192=12\cdot16+0=\texttt{C0}, 168=10⋅16+8=A8168=10\cdot16+8=\texttt{A8}, 199=12⋅16+7=C7199=12\cdot16+7=\texttt{C7}; le porte: 5000=1⋅4096+3⋅256+8⋅16+8=13885000=1\cdot4096+3\cdot256+8\cdot16+8=\texttt{1388}, 53=3⋅16+5=003553=3\cdot16+5=\texttt{0035}; i caratteri sono in ASCII (Codici binari - BCD, ASCII, Unicode, parità e GrayUn codice binario a $n$ bit distingue $2^n$ elementi. BCD: una cifra decimale ogni 4 bit (1010–1111 non usati; 10 richiede 8 bit, non è il binario del numero). ASCII: 7 bit per 128 caratteri, la cifra ASCII è 011 seguito dal BCD. Unicode/UTF-8: da 1 a 4 byte, compatibile con ASCII. Bit di parità: rileva errori su un numero dispari di bit. Distanza di Hamming = numero di bit diversi. Codice Gray: numeri consecutivi differiscono di un solo bit (sensori di posizione); si costruisce per riflessione o con $g_i=b_i\oplus b_{i+1}$.Codici binari - BCD, ASCII, Unicode, parità e Gray →): C=43=\texttt{43}, i=69=\texttt{69}, a=61=\texttt{61}, o=6F=\texttt{6F}. Parole:

campo parole (esadecimale)
IP sorgente 192.168.0.1192.168.0.1 C0A8 0001\texttt{C0A8}\ \texttt{0001}
IP destinazione 192.168.0.199192.168.0.199 C0A8 00C7\texttt{C0A8}\ \texttt{00C7}
zeri + protocollo 17 0011\texttt{0011}
lunghezza UDP 000C\texttt{000C}
porta sorgente 50005000 1388\texttt{1388}
porta destinazione 5353 0035\texttt{0035}
lunghezza UDP 000C\texttt{000C}
checksum (posto a 0) 0000\texttt{0000}
dati Ci, ao 4369 616F\texttt{4369}\ \texttt{616F}

Somma della pseudo-intestazione, passo per passo: C0A8+0001=C0A9\texttt{C0A8}+\texttt{0001}=\texttt{C0A9}; +C0A8=18151+\texttt{C0A8}=\texttt{18151}; +00C7=18218+\texttt{00C7}=\texttt{18218}; +0011=18229+\texttt{0011}=\texttt{18229}; +000C=18235+\texttt{000C}=\texttt{18235}. Somma di intestazione e dati: 1388+0035=13BD\texttt{1388}+\texttt{0035}=\texttt{13BD}; +000C=13C9+\texttt{000C}=\texttt{13C9}; +0000+\texttt{0000} resta 13C9\texttt{13C9}; +4369=5732+\texttt{4369}=\texttt{5732}; +616F=B8A1+\texttt{616F}=\texttt{B8A1}. Totale: 18235+B8A1=23AD6\texttt{18235}+\texttt{B8A1}=\texttt{23AD6} (cinque cifre: il riporto è la cifra più a sinistra). Il riporto oltre i 16 bit (il "2") si somma al resto: 3AD6+2=3AD8\texttt{3AD6}+2=\texttt{3AD8}. Complemento: FFFF−3AD8=C527\texttt{FFFF}-\texttt{3AD8}=\texttt{C527} (sottrarre da FFFF\texttt{FFFF} equivale a negare ogni bit), che è il checksum da scrivere nell'intestazione. Controllo del ricevente: 3AD8+C527=FFFF\texttt{3AD8}+\texttt{C527}=\texttt{FFFF} ✓.

Checksum facoltativo e valori speciali

Il checksum UDP è facoltativo: se non lo si vuole, il campo si pone tutto a 00. Questo crea un'ambiguità: se il mittente lo calcola e il risultato è proprio 00000000, si trasmette FFFF\texttt{FFFF} al suo posto (nel complemento a uno 00 e FFFF\texttt{FFFF} sono la stessa quantità, "zero con segno").

Esempio. Se i dati fossero 4369 2697\texttt{4369}\ \texttt{2697} invece di 4369 616F\texttt{4369}\ \texttt{616F}, la somma totale diventerebbe FFFF\texttt{FFFF} dopo il riporto; il complemento è 0000\texttt{0000} e al suo posto si invia FFFF\texttt{FFFF}. Il caso opposto, risultato FFFF\texttt{FFFF}, non può capitare: richiederebbe una somma uguale a 00, ma la pseudo-intestazione contiene 0011≠0\texttt{0011}\neq0.

Il checksum rivela errori ma non li corregge, e si limita a scartare il datagramma: l'applicazione non viene avvisata.

Applicazioni tipiche di UDP

UDP è adatto a:

Esempio (overhead). Un pacchetto di voce con 160160 byte di audio ha 88 byte di UDP e 2020 di IP: l'efficienza al livello di trasporto e rete, cioè byte utili diviso byte totali, è η=LL+H=160/(160+8+20)=85,1%\eta=\frac{L}{L+H}=160/(160+8+20)=85{,}1\%. Con TCP (intestazione 2020 byte) sarebbe 160/(160+20+20)=160/200=80%160/(160+20+20)=160/200=80\%, ma con in più l'attesa dell'handshake e gli ACK. Il grafico mostra come η=L/(L+28)\eta=L/(L+28) per UDP e L/(L+40)L/(L+40) per TCP (intestazioni di trasporto e rete) cresce con il payload LL: i pacchetti piccoli, tipici della voce, pagano di più l'intestazione.

Grafico interattivo: Efficienza η = L/(L + H) in funzione del payload L: UDP + IP (H = 28 byte) e TCP + IP (H = 40 byte); per L = 160 byte: 85,1% e 80%

Versione ripasso

Formato e servizi

Checksum e pseudo-intestazione

  • Pseudo-intestazione (non trasmessa): IP sorgente, IP destinazione, 88 zeri + protocollo 1717, lunghezza UDP. Rivela un datagramma consegnato all'host o al protocollo sbagliato, ma viola la stratificazione.
  • Calcolo: somma delle parole da 16 bit di pseudo-intestazione, intestazione (checksum =0=0) e dati; i riporti oltre il 16° bit si risommano (complemento a uno); checksum == NOT della somma. Il ricevente somma tutto, checksum compreso: senza errori ottiene FFFF\texttt{FFFF}.
  • Esempio. Da 192.168.0.1192.168.0.1 porta 50005000 a 192.168.0.199192.168.0.199 porta 5353, dati Ciao =4369 616F=\texttt{4369}\ \texttt{616F}, lunghezza 12=000C12=\texttt{000C}.
    • Pseudo-intestazione: C0A8+0001+C0A8+00C7+0011+000C=18235\texttt{C0A8}+\texttt{0001}+\texttt{C0A8}+\texttt{00C7}+\texttt{0011}+\texttt{000C}=\texttt{18235}.
    • Intestazione e dati: 1388+0035+000C+0000+4369+616F=B8A1\texttt{1388}+\texttt{0035}+\texttt{000C}+\texttt{0000}+\texttt{4369}+\texttt{616F}=\texttt{B8A1}.
    • Totale 23AD6\texttt{23AD6}, riporto 3AD6+2=3AD8\texttt{3AD6}+2=\texttt{3AD8}, checksum FFFF−3AD8=C527\texttt{FFFF}-\texttt{3AD8}=\texttt{C527}; controllo 3AD8+C527=FFFF\texttt{3AD8}+\texttt{C527}=\texttt{FFFF}.
  • Campo a 00 = checksum non calcolato; se il calcolo dà 0000\texttt{0000} si trasmette FFFF\texttt{FFFF}. Il risultato FFFF\texttt{FFFF} non può capitare (la pseudo-intestazione contiene 0011≠0\texttt{0011}\neq0).

Applicazioni

DNS (Livello applicazione - DNSIl DNS (Domain Name System) traduce i nomi (www.amazon.com) negli indirizzi IP, perché le persone preferiscono i nomi e i protocolli TCP/IP usano gli indirizzi. È un database distribuito e gerarchico: albero rovesciato con radice, domini di primo livello e sottodomini (al più 128 livelli); le informazioni sono su tanti server (13 server radice) e i nuovi domini si registrano presso un registrar accreditato ICANN. Ogni ISP ha un DNS locale, il cui indirizzo l'host riceve con DHCP: l'host (resolver) gli manda la richiesta, di solito su UDP, e il DNS locale interroga radice, dominio di primo livello e server dell'organizzazione. Ogni server che impara un'associazione la tiene in cache, marcando la risposta non autoritativa, e la scarta dopo il TTL. Record (nome, tipo, valore, classe, TTL). Con il NAT il DNS deve restituire l'indirizzo pubblico. Quattro attacchi: macchina compromessa, risposta falsa all'host, avvelenamento della cache del DNS locale, server DNS malevolo.Livello applicazione - DNS →), TFTP, multicast, SNMP, RIP porta 520520 (Protocolli di instradamento - RIP, OSPF e BGPIn Internet l'instradamento non si può fare con un solo protocollo, per scalabilità (tabelle troppo grandi) e per autonomia amministrativa: ogni ISP è un sistema autonomo (AS) con il proprio algoritmo. All'interno di un AS si usano i protocolli IGP: RIP (distance vector, numero di salti, massimo 15, aggiornamenti ogni circa 30 s, su UDP porta 520) e OSPF (link state con Dijkstra, aree collegate all'area 0, cinque tipi di LSA, messaggi direttamente in IP). Tra AS si usa BGP4 (path vector, su TCP porta 179, eBGP tra AS e iBGP dentro l'AS, scelta del percorso per politica: preferenza locale, AS-PATH più corto, origine; i cicli si evitano scartando i cammini che contengono già il proprio AS; quattro messaggi: Open, Keepalive, Notification, Update).Protocolli di instradamento - RIP, OSPF e BGP →), DHCP porte 6767 e 6868 (il client non ha ancora un IP: Protocollo DHCPDopo che a un'organizzazione è stato assegnato un blocco di indirizzi, configurare a mano IP e netmask di ogni host non è efficiente. BOOTP (obsoleto) associa in modo statico un indirizzo MAC a un indirizzo IP; DHCP (Dynamic Host Configuration Protocol) assegna gli indirizzi in modo dinamico, a prestito (lease) per un tempo limitato, anche a sistema operativo già avviato. Il dialogo client-server è su UDP (porta 67 server, 68 client) e usa quattro messaggi: DHCPDISCOVER, DHCPOFFER, DHCPREQUEST, DHCPACK (più DHCPRELEASE a fine uso). Nell'ACK arrivano IP, netmask, default gateway e server DNS.Protocollo DHCP →), tempo reale, traceroute (porta inesistente per provocare errori ICMP: Protocollo ICMPIPv4 non ha meccanismi per segnalare o correggere gli errori né per interrogare host e router: li fornisce l'ICMP (Internet Control Message Protocol), un protocollo di rete i cui messaggi viaggiano dentro datagrammi IP con campo Protocol $=1$. I messaggi sono di errore (destination unreachable, tipo 3; time exceeded, tipo 11; redirect, tipo 5; parameter problem, tipo 12), sempre inviati alla sorgente originale e con l'intestazione IP più i primi 8 byte del datagramma che ha causato l'errore, oppure di interrogazione (echo request 8 e reply 0, timestamp 13-14). ICMP segnala ma non corregge. Con l'echo si fanno ping (RTT) e scoperta dell'MTU (bit D, codice 4, payload massimo $1500-20-8=1472$ byte); con time exceeded e port unreachable si fa traceroute ($n+1$ messaggi con TTL crescente). Attacchi: smurf e redirect.Protocollo ICMP →). Voce con 160160 byte: 160/(160+8+20)=85,1%160/(160+8+20)=85{,}1\% con UDP, 80%80\% con TCP.

Errori tipici: dimenticare che la pseudo-intestazione non viaggia ma entra nel checksum; dire che UDP rivela le perdite (solo errori nei bit); usare 65 53565\,535 invece di 65 50765\,507 come massimo di dati.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata