MTU steht für Maximum Transmission Unit, dh. die Größenbeschränkung für IP-Datagramme (in Byte). Die für Ethernet zulässige Standard- und Maximal-MTU beträgt 1500.
Stellen wir uns vor, wir haben ein Netzwerk wie das unten. C ist ein Kunde; S ist ein Server; X und Y sind Router.
___ ___ ___ ___ | C | | X | | Y | | S | |___|========|___|--------|___|========|___|
Es gibt vier Netzwerke zwischen C und S. Drei von ihnen haben eine maximale MTU von 1500 und eines hat eine niedrigere MTU von 1200 (nur ein Beispiel). Das Netzwerk mit niedriger MTU ist mit Strichen gekennzeichnet.
C versucht Path MTU Discovery auf dem Pfad zu S. Es sendet ein IP-Datagramm mit 20 B-Header und 1480 B-Nutzdaten, insgesamt 1500 B. Das Flag " Nicht fragmentieren (DF)" wird im IP-Header festgelegt.
Das Datagramm erreicht X. X versucht, es weiter an Y zu übergeben, aber Y antwortet mit einer ICMP-Nachricht, die zur Fragmentierung benötigt wird, da seine MTU zu niedrig ist und das DF-Flag gesetzt ist. C empfängt diese Nachricht und erfährt, dass der Pfad MTU niedriger als 1500 ist. Dann versucht er es erneut mit geringerer Nutzlast, wobei jedes Mal Fragmentierung erforderlich ist, bis die Nutzlastgröße 1180 B erreicht. 1180 + 20 = 1200, so erreicht das Datagramm erfolgreich S und Pfad MTU wird entdeckt.
PMTUD funktioniert nur, wenn Y mit Fragmentierung ICMP-Nachrichten antwortet . Andernfalls weiß C nicht, dass das Datagramm gelöscht wurde.
Ihr Router sendet korrekte ICMP-Nachrichten. Alles funktioniert wie beabsichtigt. Es gibt keinen Grund, warum das Internet wegen niedrigerer MTU nicht funktioniert.
Was passiert, wenn PMTUD nicht funktioniert? (zB weil ICMP in beide Richtungen gesperrt ist)
Kein Ende der Verbindung muss tatsächlich den Pfad MTU kennen. Das IP-Protokoll kann damit umgehen. Es ist zwar nicht optimal, aber es funktioniert.
IP ist in der Lage, eine beliebige Nutzlast zu übertragen, unabhängig davon, auf welchem Pfad sich die MTU befindet. Diese Eigenschaft wird durch das OSI-Modell erzwungen : IP funktioniert in Schicht 3. Schicht 4 sollte sich nicht um das zugrunde liegende Protokoll kümmern müssen, sodass für die Nutzlast keine Größenbeschränkung festgelegt werden kann.
Der grundlegende IP-Header ist 20 Byte lang. In diesem Header sind zwei interessante Flags enthalten: Nicht fragmentieren (DF) und Weitere Fragmente (MF) sowie das Fragmentversatzfeld (FO). Ich habe bereits 20 B Headergröße und das DF-Flag erwähnt. (Ich spreche von IPv4-Header, IPv6 ist anders)
IP kann eine große Nutzlast in Fragmente aufteilen und am Zielort wieder zusammenfügen.
Angenommen, wir möchten eine 5000 B-Nutzlast von C nach D übertragen, die sich beide im selben Netzwerk befinden (dh über einen Switch oder Hub verbunden sind). Die MTU der NICs von C und D beträgt 1500. Die Kopfzeile jedes Fragments ist 20 B lang, daher beträgt die maximale Datengröße für ein einzelnes Datagramm 1480 B (1500 - 20). Die Nutzlast wird in 4 Datagrammen gesendet: (MF - Weitere Fragmente, FO - Fragmentversatz )
- Bytes 1-1480, MF: 1, FO: 0
- Bytes 1481-2560, MF: 1, FO: 1480
- Bytes 2561–4440, MF: 1, FO: 2560
- Bytes 4441-5000, MF: 0, FO: 4440
Die DF-Flagge spielt in diesem Fall keine Rolle. MF ist 0 für das letzte Fragment, andernfalls 1. FO ist der Offset des ersten Bytes in einem Fragment (Offsets werden beginnend mit 0 indiziert). Diese Datagramme werden auf der Ziel-NIC automatisch neu zusammengesetzt.
Jetzt möchte C eine 5000 B-Nutzlast an S senden. Nehmen wir an, er kennt den Pfad MTU magisch (oder die NIC von C ist mit MTU = 1200 konfiguriert, daher sendet C 1200 B-Datagramme). Es wird die Nutzlast wie folgt fragmentieren:
- Bytes 1-1180, MF: 1, FO: 0
- Bytes 1181-2360, MF: 1, FO: 1180
- Bytes 2361-3540, MF: 1, FO: 2360
- Bytes 3541-4720, MF: 1, FO: 3540
- Bytes 4721-5000, MF: 0, FO: 4720
Dies ist die optimalste Fragmentierung der Nutzlast.
Wenn C die Pfad-MTU nicht kennt und nicht ermitteln kann, muss sie sich auf Zwischenknoten stützen, um die Nutzdaten korrekt zu fragmentieren. C hat eine MTU = 1500 und sendet daher 4 Datagramme, wie im obigen C → D-Beispiel gezeigt. Diese Datagramme müssen jedoch erneut fragmentiert werden, um über die XY-Verbindung übertragen zu werden. Jedes der von Y empfangenen Datagramme muss höchstens 1200 B lang sein, daher werden 1500 B-lange Datagramme in zwei Teile aufgeteilt: 1200 B und 320 B (20 B zusätzlich für den zweiten Header). Diese Fragmentierung führt dazu, dass 7 Datagramme (und damit 7 Header) von X nach S anstelle von Optimal 5 übertragen werden:
- Bytes 1-1180, MF: 1, FO: 0
- Bytes 1181-1480, MF: 1, FO: 1180
- Bytes 1481-2260, MF: 1, FO: 1480
- Bytes 2261-2560, MF: 1, FO: 2260
- Bytes 2561–4140, MF: 1, FO: 2560
- Bytes 4141–4440, MF: 1, FO: 4140
- Bytes 4441-5000, MF: 0, FO: 4440
Beachten Sie, dass diese Zeitfragmente nicht gleich sind. Datagramme werden in Zwischenknoten nicht optimal neu kombiniert und fragmentiert, es wird nur die Fragmentierung durchgeführt.
In der Praxis können Zwischenrouter so konfiguriert sein, dass sie die Durchführung der Fragmentierung selbst verweigern und Übertragungsendpunkte benötigen, um die optimale MTU zu verwenden, sodass die Fragmentierung der Zwischenknoten nicht verlässlich sein sollte. PMTUD ist bevorzugt.