UDP weiß nichts über MTU. UDP-Pakete können eine beliebige Größe von 0 bis 65535 Byte haben. Die Protokollschichten unter UDP können entweder ein Paket einer bestimmten Größe senden oder lehnen es ab, dieses Paket mit einem Fehler zu senden, wenn es zu groß ist.
Die Schicht unter UDP ist normalerweise IP, entweder IPv4 oder IPv6. Und IP-Pakete können genau wie UDP eine beliebige Größe von 0 bis 65535 Byte haben. IP unterstützt jedoch einen Mechanismus namens Fragmentierung . Wenn ein IP-Paket größer ist als das, was die darunter liegende Schicht transportieren kann, kann IP ein einzelnes Paket in mehrere Pakete aufteilen, die als Fragmente bezeichnet werden. Jedes Fragment ist in der Tat ein eigenes IP-Paket (hat einen eigenen IP-Header) und wird auch einzeln an das Ziel gesendet. Es ist dann die Aufgabe des Ziels, alle Fragmente zu sammeln und das vollständige Paket daraus neu zu erstellen, bevor die empfangenen Daten an die nächsthöhere Schicht (z. B. UDP) übergeben werden.
Das Ethernet-Protokoll kann nur Frames mit einer Nutzlast zwischen 46 und 1500 Byte transportieren (es gibt Ausnahmen, die jedoch den Rahmen dieser Antwort sprengen). Wenn die Nutzdaten weniger als 46 Byte betragen, werden sie mit genau 46 Byte aufgefüllt. Wenn die Nutzdaten über 1500 Byte liegen, lehnt die Schnittstelle die Annahme ab. In diesem Fall hat sich die Schnittstelle geweigert, dies zu akzeptieren, da die Daten zu groß waren. Es liegt nun an der IP-Schicht, entweder das Paket zu fragmentieren, sodass kein Fragment größer als 1500 Byte ist, oder einen Fehler an den nächsten zu melden höhere Ebene, wenn die Fragmentierung für diese bestimmte Verbindung deaktiviert oder verboten wurde.
Fragmentierung ist generell zu vermeiden, da
- verschwendet Ressourcen auf der Absenderseite.
- Es verschwendet Ressourcen auf der Empfängerseite.
- Es erhöht den Protokoll-Overhead für die gleiche Menge an Nutzdaten.
- Wenn ein einzelnes Fragment verloren geht, geht das gesamte Paket verloren.
- Wenn ein einzelnes Fragment beschädigt ist, ist das gesamte Paket beschädigt.
- Im Falle eines erneuten Sendens müssen alle Fragmente erneut gesendet werden.
Aus diesem Grund nimmt TCP seine Frame-Größe intelligent an, sodass die Pakete niemals IP benötigen, um sie zu fragmentieren. Dies kann erreicht werden, indem IP verboten wird, Pakete zu fragmentieren. Wenn IP meldet, dass ein Paket zu groß zum Senden ist, reduziert TCP die Frame-Größe und versucht es erneut, bis kein Fehler mehr gemeldet wird.
Für UDP wäre dies jedoch die Aufgabe der Anwendung selbst, da UDP ein "dummes" Protokoll ist und keine eigene Verwaltungslogik hat, was es sehr flexibel, schnell und einfach macht.
Die einzige UDP-Größe, auf die Sie sich verlassen können, um immer transportierbar zu sein, ist 576 minus 8 Byte UDP-Header und minus 20 (v4) oder 48 (v6) Byte IP-Header, da der IP-Standard erfordert, dass jeder IP-Host IP-Pakete mit empfangen kann eine Gesamtgröße von 576 Bytes. Ihre Protokollimplementierung wäre nicht standardkonform, wenn sie keine Pakete mit mindestens dieser Größe akzeptieren könnte. Beachten Sie jedoch, dass der Standard nicht 576 ohne Fragmentierung sagt, sodass sogar ein 576-Byte-IP-Paket zwischen zwei Hosts fragmentiert werden kann.
Die einzige Paketgröße, auf die Sie sich verlassen können, um ohne Fragmentierung transportiert zu werden, beträgt 24 Byte für IPv4 und 56 Byte für IPv6, da die kleinsten IP-Header für ein Fragment 20/48 Byte (v4 / v6) sind und ein Fragment mindestens 4/8 haben muss Nutzdaten für Bytes (v4 / v6). Daher kann ein Transportsystem unterhalb der IP-Schicht, das nicht mindestens Pakete dieser Größe transportieren kann, nicht zum Transport von IP-Verkehr verwendet werden.
Und bevor jemand kommentiert, dass ein IPv6-Header nur 40 Bytes hat: Das ist richtig, aber im Gegensatz zu einem IPv4-Header hat ein Standard-IPv6-Header keine Headerfelder für die Fragmentierung. Wenn ein Paket fragmentiert werden muss, muss unterhalb des IPv6-Basisheaders ein Fragmentierungserweiterungsheader hinzugefügt werden, und dieser Erweiterungsheader ist 8 Byte lang. Im Gegensatz zu IPv4 werden Fragmentierungs-Offsets in IPv6 in 8 Byte und nicht in 4-Byte-Einheiten gezählt, sodass ein Fragment nur eine Nutzlast tragen kann, die im Fall von IPv6 ein Vielfaches von 8 Byte ist.