UDP non sa nulla di MTU. I pacchetti UDP possono avere qualsiasi dimensione compresa tra 8 e 65535 byte. I livelli di protocollo sotto UDP possono inviare un pacchetto di dimensioni specifiche o rifiutano di inviare quel pacchetto con un errore se troppo grande.
Il livello sotto UDP è in genere IP, IPv4 o IPv6. E il pacchetto IP può avere qualsiasi dimensione da 20 (IPv4) / 40 (IPv6) a 65535 byte, che è lo stesso massimo di UDP. Tuttavia, IP supporta un meccanismo chiamato frammentazione . Se un pacchetto IP ha dimensioni maggiori di quelle che il livello sottostante può trasportare, l'IP può dividere un singolo pacchetto in più pacchetti chiamati frammenti. Ogni frammento è in realtà un pacchetto IP a sé stante (ha una propria intestazione IP) e viene anche inviato da solo alla destinazione; è quindi compito della destinazione raccogliere tutti i frammenti e ricostruirne il pacchetto completo prima di passare i dati ricevuti sul livello superiore successivo (ad es. UDP).
Il protocollo Ethernet può trasportare solo frame con un payload tra 46 e 1500 byte (ci sono eccezioni, ma questo va oltre lo scopo di questa risposta). Se i dati del payload sono inferiori a 46 byte, vengono riempiti per essere esattamente 46 byte. Se i dati del payload superano i 1500 byte, l'interfaccia rifiuterà di accettarli. Se ciò accade, spetta ora al livello IP decidere di frammentare il pacchetto, in modo che nessun frammento sia più grande di 1500 byte o segnalare un errore al livello superiore successivo se la frammentazione è stata disabilitata o vietata per questa particolare connessione.
La frammentazione è generalmente da evitare, come
- spreca risorse dal lato del mittente.
- spreca risorse sul lato ricevente.
- aumenta l'overhead del protocollo per la stessa quantità di dati del payload.
- se si perde un singolo frammento, si perde l'intero pacchetto.
- se un singolo frammento è danneggiato, l'intero pacchetto è danneggiato.
- in caso di rinvio, tutti i frammenti devono essere reinviati.
Ecco perché TCP adotta in modo intelligente le dimensioni dei frame in modo che i pacchetti non richiedano mai l'IP per frammentarli. Questo può essere fatto vietando all'IP di frammentare i pacchetti e se l'IP segnala che un pacchetto è troppo grande per essere inviato, TCP riduce la dimensione del frame e riprova, fino a quando non viene più segnalato alcun errore.
Per UDP, tuttavia, questo sarebbe il compito dell'applicazione stessa, poiché UDP è un protocollo "stupido", non ha una logica di gestione propria, il che lo rende molto flessibile, veloce e semplice.
L'unica dimensione UDP su cui puoi contare per essere sempre trasportabile è 576 meno 8 byte di intestazione UDP e meno 20 (v4) / 40 (v6) byte di intestazione IP, poiché lo standard IP richiede che ogni host IP sia in grado di ricevere pacchetti IP con una dimensione totale di 576 byte. L'implementazione del protocollo non sarebbe conforme allo standard se non può accettare pacchetti di almeno quella dimensione. Si noti, tuttavia, che lo standard non dice 576 senza frammentazione, quindi anche un pacchetto IP da 576 byte può essere frammentato tra due host.
L'unica dimensione del pacchetto su cui contare per essere trasportabile senza frammentazione è di 24 byte per IPv4 e 56 byte IPv6, poiché le intestazioni IP più piccole per un frammento sono 20/48 byte (v4 / v6) e un frammento deve avere almeno 4/8 byte (v4 / v6) dati del payload. Pertanto, un sistema di trasporto al di sotto del livello IP che non può trasportare almeno pacchetti di queste dimensioni, non può essere utilizzato per trasportare il traffico IP.
E prima che qualcuno commentasse che un'intestazione IPv6 ha solo 40 byte: questo è corretto ma, a differenza di un'intestazione IPv4, un'intestazione IPv6 standard non ha campi di intestazione per la frammentazione. Se un pacchetto deve essere frammentato, è necessario aggiungere un'intestazione di estensione di frammentazione sotto l'intestazione di base IPv6 e questa estensione di estensione è lunga 8 byte. Inoltre a differenza di IPv4, gli offset di frammentazione in IPv6 sono conteggiati in 8 byte e non in unità di 4 byte, quindi un frammento può trasportare solo un payload che è un multiplo di 8 byte in caso di IPv6.