Führen Sie die Pfad-MTU-Erkennung durch, ohne sich auf ICMP-Fehler verlassen zu müssen, die häufig nicht übermittelt werden.
Dieses Programm führt die MTU-Erkennung des Paketisierungsschichtpfads wie in RFC 4821 beschrieben durch. Dies ist eine zuverlässigere Methode zur Erkennung der MTU-Größe bei Vorhandensein von ICMP-Schwarzen Löchern.
Während TCP-Verbindungen die MTU-Größe im Laufe der Zeit abhängig von verschiedenen Indikatoren (Netzwerkleistung, Paketverlust, ICMP-Fehlermeldungen usw.) automatisch anpassen, ist dies bei verbindungslosen Protokollen nicht der Fall.
Wenn es auf die Leistung ankommt, sind Durchsatz , Paketfragmentierung und Routenzuverlässigkeit drei Schlüsselindikatoren, die analysiert werden müssen, um die Stream-Leistung zu optimieren. Da die Routenzuverlässigkeit nicht immer von uns abhängt, sollten wir uns bemühen, den Durchsatz zu maximieren und KEINE Paketfragmentierung durchzuführen , die die Leistung erheblich beeinträchtigen kann [1] .
Der ursprüngliche Vorschlag für die Pfad-MTU-Erkennung basierte auf ICMP Fragmentation Needed
Pakete zugestellt werden, wenn ein IPv4-Paket mit dem Feld „Nicht fragmentieren“ zu groß für die Weitergabe war. Leider erzeugen einige Router diese Art von Fehlern nicht, sondern ignorieren stattdessen große Pakete stillschweigend. Ein Client hat keine Möglichkeit, die Ursache des Paketverlusts zu ermitteln.
Da alle Hosts verpflichtet sind, ICMP_ECHO-Abfragen zu unterstützen, können wir die Tatsache ausnutzen, dass ICMP-Nachrichten eine beliebige Datenmenge akzeptieren und Pakete unterschiedlicher Größe an unseren Server senden. Wenn wir das Feld „Nicht fragmentieren“ im IPv4-Paket aktivieren und auf eine Antwort warten, warten wir de facto auf eine Bestätigung (in Form eines ICMP_ECHOREPLY-Pakets), die bestätigt, dass diese MTU-Größe gültig ist.
Jetzt müssen wir nur noch eine binäre Suche nach der Größe der Pakete durchführen, um die maximale MTU-Größe zu finden, die von dieser Route unterstützt wird.
Im ICMP-Modus werden einige ICMP_ECHO- Anfragen unterschiedlicher Größe generiert.
ICMP Fragmentation Needed
), wird diese MTU-Größe für ungültig erklärt und der Schwellenwert gesenkt.Die einzige Voraussetzung für den ICMP-Modus besteht darin, dass der Host in der Lage sein muss, auf Ping-Nachrichten zu antworten.
Der gleiche Algorithmus gilt für UDP-Pakete, Sie müssen jedoch einen Server ( udp_server.py ) auf Ihrem empfangenden Host ausführen, um Bestätigungsnachrichten zurückzusenden.
Dieses Programm sollte auf den meisten Linux-Distributionen und OSX einwandfrei laufen.
gcc -Wall -Wextra mtu_discovery.c mtu.c -o plpmtu
Es sollten keine Warnungen/Fehler gemeldet werden. Wenn dies der Fall ist, öffnen Sie bitte ein Problem.
Wenn Sie im ICMP-Modus ausführen möchten, geben Sie Folgendes ein:
sudo ./plpmtu -p icmp -s <server-ipaddr>
Wenn Sie stattdessen den UDP-Modus ausführen möchten:
sudo ./plpmtu -p udp -s <server-ipaddr:port>
Für die Nutzung von Raw-Sockets sind Admin-Rechte erforderlich.
Spezifizierer | Beschreibung |
---|---|
-p {icmp/udp} | Wählen Sie aus, in welchem Modus gearbeitet werden soll. |
-s <addr[:port]> | Geben Sie die Adresse des Servers an. Wenn Sie im UDP-Modus arbeiten, müssen Sie auch den Zielport angeben, indem Sie „:port“ anhängen (z. B. -s 8.8.8.8:12345 ). |
-l <Adresse:Port> | Optional. Wählen Sie aus, an welche Adresse gebunden werden soll(); wird im UDP-Modus verwendet; könnte entfernt werden. |
-t <Timeout> | Optional. Wählen Sie die maximale Zeit aus, die auf eine Antwort vom Server gewartet werden soll. Der Standardwert ist 1 Sekunde. Die Zeit wird in Millisekunden ausgedrückt. |
-r <max-reqs> | Optional. Wählen Sie die maximale Anzahl fehlgeschlagener Versuche aus, die erforderlich sind, um eine MTU-Größe für ungültig zu erklären. Der Standardwert ist 3 Versuche. |
sudo ./plpmtu -p icmp -s 184.12.26.131
Führen Sie die MTU-Erkennung (ICMP-Modus) mit 184.12.26.131 durch.
sudo ./plpmtu -p udp -s 184.12.26.131:24000 -t 1500 -r 5
Führen Sie die MTU-Erkennung (UDP-Modus) mit 184.12.26.131 auf Port 24000 durch. Wenn innerhalb von 1,5 Sekunden fünfmal hintereinander keine Antwort empfangen wird, reduzieren Sie den MTU-Schwellenwert.