In Diskussionen, die sich aus anderen Fragen auf dieser Website ergeben haben , habe ich festgestellt, dass ich nicht genau weiß, wann Path MTU Discovery (PMTUD) ausgeführt wird.
Ich weiß, was es tut - finde die niedrigste MTU auf einem Pfad von Client zu Server).
Ich weiß, wie es funktioniert - senden Sie progressiv größere Pakete mit gesetztem Bit "Don't Fragment" und sehen Sie, wie groß ein Paket sein kann, ohne den Fehler "ICMP Need to Fragment" zu erhalten.
Meine Frage lautet dann konkret: Wann wird ein Host PMTUD durchführen?
Ich suche nach bestimmten Fällen. Nicht nur so etwas wie "Wenn ein Host den Pfad MTU entdecken will". Bonuspunkte, wenn Sie eine Paketerfassung eines Hosts bereitstellen oder Anweisungen zum Generieren einer solchen Paketerfassung bereitstellen können.
Außerdem beziehe ich mich speziell auf IPv4. Ich weiß, dass transiente IPv6-Router nicht für die Fragmentierung verantwortlich sind, und kann mir vorstellen, dass PMTUD viel häufiger vorkommt. Im Moment suche ich nach konkreten Beispielen für PMTUD in IPv4. (obwohl, wenn die einzige Paketerfassung, die Sie von PMTUD zusammenstellen können, in IPv6 ist, würde ich es immer noch gerne sehen)
Antworten:
Die Antwort ist einfach: wann immer der Gastgeber will. Ja wirklich. So einfach ist das.
In der folgenden Erläuterung wird eine reine IPv4-Umgebung vorausgesetzt, da IPv6 die Fragmentierung in den Routern beseitigt (und der Host gezwungen ist, sich immer mit Fragmentierung und MTU-Erkennung zu befassen).
Es gibt keine strikte Regel, die regelt, wann (oder sogar wenn) ein Host die Pfad-MTU-Ermittlung durchführt. Der Grund, warum PMTUD aufgetaucht ist, ist, dass Fragmentierung aus verschiedenen Gründen als schädlich angesehen wird . Um eine Paketfragmentierung zu vermeiden, wurde das Konzept von PMTUD als Workaround ins Leben gerufen. Natürlich, ein schönes Betriebssystem sollte PMTUD verwenden Fragmentierung zu minimieren.
Daher hängt die genaue Semantik der Verwendung von PMTUD natürlich vom Betriebssystem des Absenders ab - insbesondere von der Socket-Implementierung. Ich kann nur für den speziellen Fall von Linux sprechen, aber andere UNIX-Varianten sind wahrscheinlich nicht sehr unterschiedlich.
Unter Linux wird PMTUD über die
IP_MTU_DISCOVER
Socket-Option gesteuert . Sie können den aktuellen Status mit abrufen,getsockopt(2)
indem Sie die StufeIPPROTO_IP
und dieIP_MTU_DISCOVER
Option angeben. Diese Option istSOCK_STREAM
nur für Sockets gültig (einSOCK_STREAM
Socket ist ein bidirektionaler, verbindungsorientierter, zuverlässiger Socket; in der Praxis ist es ein TCP-Socket, obwohl andere Protokolle möglich sind). Wenn diese Option festgelegt ist , führt Linux PMTUD genau so aus, wie in RFC definiert 1191.Beachten Sie, dass PMTUD in der Praxis ein kontinuierlicher Prozess ist. Pakete werden mit gesetztem DF-Bit gesendet, einschließlich der 3-Wege-Handshake-Pakete. Sie können sich dies als Verbindungseigenschaft vorstellen (obwohl eine Implementierung möglicherweise bereit ist, irgendwann einen bestimmten Fragmentierungsgrad zu akzeptieren und das Senden von Paketen mit dem DF zu beenden Bit gesetzt). Somit ist PMTUD nur eine Folge der Tatsache, dass alles auf dieser Verbindung mit DF gesendet wird.
Was ist, wenn Sie nicht einstellen
IP_MTU_DISCOVER
?Es gibt einen Standardwert. Standardmäßig
IP_MTU_DISCOVER
ist fürSOCK_STREAM
Sockets aktiviert . Dies kann durch Lesen gelesen oder geändert werden/proc/sys/net/ipv4/ip_no_pmtu_disc
. Ein Nullwert bedeutet, dassIP_MTU_DISCOVER
in neuen Sockets standardmäßig aktiviert ist. ein ungleich Null bedeutet das Gegenteil.Was ist mit verbindungslosen Steckdosen?
Dies ist schwierig, da verbindungslose, unzuverlässige Sockets verlorene Segmente nicht erneut übertragen. Es liegt in der Verantwortung des Benutzers, die Daten in MTU-großen Blöcken zu paketieren. Es wird auch erwartet, dass der Benutzer die erforderlichen Neuübertragungen im Falle eines zu großen Nachrichtenfehlers vornimmt. Daher muss der Benutzercode PMTUD im Wesentlichen neu implementieren. Wenn Sie für die Herausforderung bereit sind, können Sie das DF-Bit erzwingen, indem Sie das
IP_PMTUDISC_DO
Flag an übergebensetsockopt(2)
.Die Quintessenz
quelle
In der Regel erfolgt die Ermittlung der maximalen Pfadübertragungseinheit (PMTUD) immer dann, wenn ein Host denkt, dass ein Paket verworfen wurde, weil es zu groß ist.
Dies kann eine Reaktion auf die ICMP-Fragmentierung sein, die erforderlich ist (Typ 3, Code 4) und die explizit angibt, dass das Paket verworfen wurde. In der typischen Praxis werden alle IPv4-Pakete mit dem gesetzten DF-Flag (Don't Fragment) gesetzt, sodass jedes Paket, das die MTU überschreitet, eine solche Antwort hervorruft. IPv6 unterstützt überhaupt keine Fragmentierung.
Einige Router oder Host-Firewalls lassen ICMP häufig fallen, da ein naiver Administrator ICMP als Sicherheitsrisiko ansieht . Einige Linkaggregationsschemata können die ICMP-Übermittlung beeinträchtigen . In RFC4821 wird ein alternativer Mechanismus zum Erkennen der MTU vorgeschlagen, der nicht auf ICMP basiert .
tracepath
ist mein Lieblings-Linux-Tool zum Testen von MTU. Hier ist ein Beispiel von einem Host mit einer 9001-MTU im LAN, der jedoch ein IPsec-VPN durchlaufen muss, um 10.33.32.157 zu erreichen:Die ICMP-Fehler können beobachtet werden bei
tcpdump
:MTU-Entdeckungen werden zwischengespeichert. In Linux kann dies beobachtet und mit gelöscht werden
ip
(Vorsicht vor Änderungen seit Linux 3.6 ):Bei TCP kann das Überschreiten der MTU im Rahmen des Verbindungsaufbaus vermieden werden. In der von jedem Ende gesendeten SYN ist eine maximale Segmentgröße (MSS) enthalten. Der TCP-Header (20 Byte ohne Optionen ) und der IP-Header (20 Byte) bedeuten, dass MSS und MTU um 40 Byte voneinander abweichen.
Hier ist ein Beispiel für einen Verbindungsaufbau zwischen diesen beiden Hosts beim Übertragen einer großen Datei mit
scp
:Im ersten Paket schlägt der lokale Host einen MSS von 8961 vor. Dies ist die konfigurierte 9001-MTU, abzüglich 40 Bytes. Das zurückgegebene SYN / ACK hat eine MSS von 1379, was eine MTU von 1419 bedeutet. Ich weiß, dass in diesem Netzwerk der Remote-Host ebenfalls 8961 gesendet hat, aber der Wert wurde von einem Router geändert, da er weiß, dass der Pfad einen Internetpfad enthält ( MTU 1500) ein Overhead von einem IPsec-Tunnel. Dieser Router hat auch unser gesendetes MSS von 8961 so geändert, dass es auf dem anderen Host als 1419 angezeigt wird. Dies wird als MSS-Klemmung bezeichnet .
In gewissem Sinne passiert PMTUD die ganze Zeit. In der Praxis kann es tatsächlich niemals vorkommen, wenn MSS-Clamping vorhanden ist und der gesamte Datenverkehr über TCP erfolgt oder keiner der Router eine MTU aufweist, die kleiner ist als die auf den Endpunkten konfigurierten Werte. Auch ohne MSS-Clamping kann es nur selten vorkommen, dass der Cache abläuft.
quelle
Mit PMTUD wird die beste MSS für TCP-Sitzungen berechnet. Ein Beispiel ist die BGP-Implementierung auf Cisco- oder Juniper-Routern.
http://www.juniper.net/techpubs/en_US/junos12.1/topics/usage-guidelines/routing-configuring-mtu-discovery-for-bgp-sessions.html
Vielen Dank.
quelle