MTU auslesen und setzen in Windows, Linux und OSX

Inhaltsverzeichnis

Nachdem ich die Tage schon den MTU Optimizer, ein kleines Tool zur Ermittlung der optimalen MTU, vorgestellt habe, wollen wir uns heute einmal anschauen, wie man die optimale MTU von Hand ermitteln kann, wie man die aktuell gesetzte MTU auslesen kann und wie man einen neuen MTU-Wert setzen kann. Das ganze natürlich für die drei großen Betriebssysteme: Windows, OSX und Linux.

Bevor wir uns die Umsetzung innerhalb der einzelnen Betriebssysteme anschauen, klären wir vorher noch einmal ganz kurz, was die MTU ist und wie man in der Theorie den idealen MTU-Wert festlegt.

Theorie – Ideale MTU ermitteln

Die MTU (Maximum Transfer Unit) beschreibt die maximale Paketgröße eines Protokolls. Sie gibt also an wie groß ein Datenpaket maximal sein darf, damit es über ein Protokoll übermittelt werden kann. Ist ein Datenpaket größer, wird es fragmentiert – d.h. auf mehrere Pakete aufgeteilt.

Nehmen wir als Beispiel einmal an, wir (=PC) würden Zucker-Päckchen herstellen und unsere Packungsgröße (=gesetzter MTU) wäre 1,5kg. Nun hat die Bäckerei 5 Pakete (5×1,5 kg) Zucker bestellt, jedoch kann unser Postbote (=Netzwerkinterface) nur Pakete mit maximal 1kg übertragen (=Protokollbegrenzung). Was tut er also? Er fragmentiert unsere Zuckerpakete und teilt diese in 1kg und 0,5kg Packungen auf. Für den Versand eines Zuckerpakets sind nun zwei Übertragungspakete notwendig. Zusätzlich entsteht dem Postboten noch Arbeit, weil er markieren muss, welche Pakete zusammengehören. Diese Mehr-Pakete (=Overhead) verlangsamen den Versand der Pakete (=Datenübertragungsgeschwindigkeit).

Um das Problem nun zu lösen und den Versand zu beschleunigen, müssten wir unsere Verpackungsgröße (=MTU) so dimensionieren, dass der Paketbote nicht mehr umpacken (=fragmentieren) muss. Die ideale MTU beträgt in unserem Fall also 1kg. Um diesen Wert zu ermitteln, müssten wir im Beispiel den Postboten fragen, ab welcher Größe er ein zweites Paket hinzunimmt. Und genauso funktioniert es in der IT auch.

In der IT schicken wir per Ping ein Datenpaket los und geben dabei die Größe des Pakets an sowie die Info, dass dieses Paket auf keinen Fall fragmentiert werden soll. Ist die Paketgröße zu groß, sagt uns Ping, dass das Paket nicht ok ist, weil es fragmentiert werden würde.

> ping -f -l 1550 www.google.de

Ping wird ausgeführt für www.google.de [216.58.213.195] mit 1550 Bytes Daten:
Paket müsste fragmentiert werden, DF-Flag ist jedoch gesetzt.

Nun verringern wir die Paketgröße solange, bis die Fehlermeldung der Fragmentierung entfällt. Damit haben wir die optimale Paketgröße. Da die MTU jedoch auch noch Protokollinformationen mit einberechnet, müssen wir auf die optimale Paketgröße noch 28 Byte (20 Bytes = IPv4 Header und 8 Bytes = ICMP) aufschlagen, um den MTU-Wert zu erhalten.

MTU in Windows

Aktuelle MTU in Windows auslesen

Um die MTU per Konsole anzuzeigen, eignet sich folgender Befehl, der in die CMD (Win + R Taste drücken, “CMD” eingeben, “Ok” Drücken) eingegeben werden muss:

netsh interface ipv4 show interfaces

Dieser Befehl generiert eine Liste, die so (oder so ähnlich) aussieht:

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
 10          25        1528  connected     Ethernet
  5          55        1528  disconnected  WiFi
 15          55        1528  disconnected  Ethernet 2

In der Spalte “MTU” lässt sich die derzeit gesetzte MTU ablesen. Zudem ist die Spalte “Idx” interessant, da wir die Id aus dieser Spalte später noch benötigen, um einen neuen MTU-Wert zu setzen.

Optimale MTU in Windows ermitteln

Um die optimale MTU in Windows zu ermitteln nutzen wir den Ping-Befehl in der Konsole. Mittels “l”-Parameter legen wir die Paketgröße fest (diese sollte vorerst größer als die erwartete MTU sein) und mittels “f”-Parameter geben wir an, dass das Paket nicht fragmentiert werden soll.

ping -f -l 1550 www.google.de

Nun wiederholen wir den Aufruf, wobei wir bei jedem Aufruf die Buffergröße (im Beispiel 1550) etwas verringern. Wenn der Ping ausgeführt werden konnte und nicht mehr “Paket müsste fragmentiert werden, DF-Flag ist jedoch gesetzt” anzeigt, merken wir uns die Buffergröße. Zur gemerkten Buffergröße addieren wir 28 hinzu und erhalten die ideale MTU.

MTU-Wert in Windows setzen

Um die MTU für ein Netzwerk-Interface zu setzen benötigen wir den gewünschten MTU-Wert sowie die Id der Netzwerk-Schnittstelle. Die Id können wir aus der Schnittstellen-Liste aus dem Absatz “Aktuelle MTU in Windows auslesen” dieses Artikels entnehmen. Die MTU haben wir im letzten Absatz ermittelt. Mit den beiden Werten können wir in der CMD nun mit folgendem Befehl die MTU setzen.

netsh interface ipv4 set subinterface {id}  mtu={mtu} store=persistent

Die Platzhalter {id} sowie {mtu} müssen noch die beiden Werte ausgetauscht werden. Sollte der Befehl nicht funktionieren, startet die CMD bitte noch einmal per “Rechtsklick –> Als Administrator ausführen” neu.

MTU in OSX

Aktuelle MTU in OSX auslesen

Um die aktuell gesetzte MTU auszulesen kann entweder der Netzwerkeinstellungsdialog oder ein kurzer Terminal-Befehl genutzt werden. Soll die MTU über die Einstellungsdialoge ausgelesen werden, so findet sich diese in “Systemeinstellungen –> Netzwerk –> Weitere Optionen –> Hardware”. Auf der Hardware-Seite die Konfiguration auf “manuell” und die MTU auf “eigene” zu stellen. Daraufhin kann die MTU ausgelesen werden. (Wichtig: Soll die MTU weiterhin vom System gesetzt werden, ist der Hardware-Dialog mit “Abbrechen” zu schließen!)

MTU in OSX  MTU in OSX Hardware

Soll die MTU per Terminal ausgelesen werden, kann dies über folgenden Shell-Befehle getan werden:

networksetup -getMTU {iface}

Der Wert {iface} muss noch durch den Namen des Interfaces ersetzt werden, dass ausgelesen werden soll. Eine Liste aller Interfaces und derer Namen kann mittels des Befehls ifconfig angezeigt werden.

Optimale MTU in OSX ermitteln

Die Ermittlung der besten MTU funktioniert wie in Windows und Linux auch mittels des ping-Befehls. Hierzu müssen die Paramter “D” und “s” gesetzt werden. Der “D”-Parameter steht für “Don’t fragment” und gibt an, dass das Paket nicht fragmentiert werden soll. Der “s”-Parameter gibt die Größe des Datenpakets an. Diese ist zu Beginn wieder absichtlich zu groß zu wählen.

ping -D -s 1550 example.com

Nun ist der Befehl solange auszuführen, bis der Ping erfolgreich war. Dabei ist der “s”-Paramter bei jeder Ausführung zu verringern. Ist der Ping erfolgreich addiert man auf den “s”-Paramter-Wert noch 28 und erhält die MTU.

MTU-Wert in OSX setzen

Um die MTU in OSX zu setzen kann entweder der Hardware-Dialog in den Netzwerkeinstellungen genutzt werden (siehe Absatz “MTU auslesen in OSX”) oder ein Befehl im Terminal abgesetzt werden.

networksetup -setMTU {iface} {mtu}

Der Wert {iface} muss hierbei durch den Namen des Interface und der Wert {mtu} durch den MTU-Wert ersetzt werden. Gegebenenfalls muss der Wert per “sudo” ausgeführt werden.

MTU in Linux

Aktuelle MTU in Linux auslesen

Um die aktuell gesetzten MTUs für Netzwerkschnittstellen in Linux anzeigen zu lassen eignet sich der folgende Befehl. (Dieser muss in die jeweilige Shell/den Terminal eingegeben werden.):

ifconfig| grep mtu

Als Ergebnis solltet ihr eine Liste an Schnittstellen bekommen sowie deren MTU-Werte. Am Anfang der Zeile steht der jeweilige Idenifiert, am Ende der Zeile der MTU-Wert.

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1384
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
vmnet1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
vmnet8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

Sollte der Befehl einmal nicht klappen, bleibt alternativ noch folgender Befehl, der eine ähnliche Liste erzeugt:

ip ad | grep mtu

MTU in KubuntuWer sich lieber durch Dialoge klickt statt Konsole-Befehle zu schreiben, der findet die MTU in den meisten Linux-Distributionen auch über die grafische Oberfläche. In Kubuntu kann die MTU, wie in neben stehendem Screenshot gezeigt, auch über den Verbindungseditor ausgelesen werden. In anderen Distributionen gibt es ähnliche Wege.

Optimale MTU in Linux ermitteln

Um den optimalen MTU-Wert in Linux zu ermitteln, eignet sich – wie auch unter Windows und OSX – der ping-Befehl. Jedoch weichen die einzelnen Parameter unter Linux etwas ab. Der “c”-Parameter gibt an wie viele Pings abgesetzt werden sollen. Der “M”-Parameter mit dem Wert “do” gibt an, dass die Pakete in keinem Fall fragmentiert werden sollen und der Parameter “s” gibt an, wie groß das Paket sein soll.

ping -c 2 -M do -s 1550 www.google.de

Auch hier startet man am besten mit einem offensichtlich zu großen Datenpaket und verringert den Wert nach und nach, bis der Ping erfolgreich ist. (Den Erfolg erkennt man daran, dass der Ping ausgeführt werden konnte. Ist das Paket noch zu groß, erscheint folgende (oder ähnliche) Fehlermeldung: “ping: local error: Message too long”.)

Ist die ideale Paketgröße gefunden, müssen noch 28 Bytes hinzuaddiert werden (20 Byte TCP-Header, 8 Byte ICMP (Ping) Header), um den MTU-Wert zu erhalten.

MTU-Wert in Linux setzen

Um die MTU in Linux zu setzen, kann entweder der Weg über die GUI gegangen werden oder in der Shell gearbeitet werden. Wenn die MTU über die grafische Oberfläche gesetzt werden soll, kann der gleiche Dialog genutzt werden, den wir zwei Absätze weiter oben auch zum Auslesen der MTU genutzt haben.

Wenn die MTU über die Konsole gesetzt werden soll, kann dies bei Debian/Ubuntu Systemen über die Netzwerk-Interface Configdatei getan werden.

nano /etc/network/interfaces

Innerhalb der Datei befinden sich die einzelnen Interface-Konfigurationen. Am Ende der jeweiligen Interface-Konfiguration kann mit

mtu {mtu}

die MTU gesetzt werden. Der Wert {mtu} ist natürlich noch durch den gewünschten MTU-Wert ersetzt werden. Nachdem die Konfigurationsdatei gespeichert und geschlossen wurde, sollten die Interfaces noch einmal neu gestartet werden.

/etc/init.d/networking restart

Raffi

Seit 2011 blogge ich hier über Programmierung, meine Software, schreibe Tutorials und versuche mein Wissen, so gut es geht, mit meinen Lesern zu teilen.

7 Kommentare

  1. Between me and my husband we’ve owned more MP3 players over the years than I can count, including Sansas, iRivers, iPods (classic & touch), the Ibiza Rhapsody, etc. But, the last few years I’ve settled down to one line of players. Why? Because I was happy to discover how well-designed and fun to use the underappreciated (and widely mocked) Zunes are.

  2. Between me and my husband we’ve owned more MP3 players over the years than I can count, including Sansas, iRivers, iPods (classic & touch), the Ibiza Rhapsody, etc. But, the last few years I’ve settled down to one line of players. Why? Because I was happy to discover how well-designed and fun to use the underappreciated (and widely mocked) Zunes are.

  3. Hallo Raffael
    Toller Artikel nun ich hab den MTU ausgelesen und rumprobiert und rumprobiert und nicht den richtigen Wert gefunden Ich bekomme den Wert 1492 gleicher wert steh im Router trotzdem verliere ich die Pakete?

  4. Matthiassays:

    Hi,
    Danke für den guten Artikel!
    Ich arbeite unter Windows:
    > ping -f -l 1472 http://www.google.de
    Eine Packetsize von 1472 lässt die Meldung mit “df…” erstmalig verschwinden, d.h. optimal MTU wäre 1500.

    Gerade den MTUOptimizer entdeckt, der setzt mir die MTU auf 1528. Woher kommt die Diskrepanz?

    Viele Grüße!

  5. Andrewsays:

    Great article, thanks. Note: English version does not work anymore.

  6. Christiansays:

    Hallo Raffael,
    super Blog.Ich bin kein IT’ler und habe von daher nur ganz begrenztes Wissen aber bei
    mir hat das mit der MTU Umstellung auf Anhieb funktioniert,echt klasse erklärt!!
    Mein Problem war oder ist das ich das Gefühl habe Verzögerungen beim Online Gaming zu haben.
    Ich habe durch diesen Blog auch entdecken können das ich ein sogenanntes Loopback Pseudo Interface habe und noch so einen Teredo Tunneling für IPV 6??
    Können solche Verzögerungen durch die MTU verursacht werden?
    Vorab vielen Dank
    Christian

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.