60 Stimmen

Wie finde ich das größte UDP-Paket, das ich ohne Fragmentierung senden kann?

Ich muss wissen, wie groß das größte UDP-Paket ist, das ich ohne Fragmentierung an einen anderen Computer senden kann.

Diese Größe wird gemeinhin als MTU (Maximum Transmission Unit) bezeichnet. Vermutlich gibt es zwischen 2 Computern viele Router und Modems, die unterschiedliche MTUs haben können.

Ich habe gelesen, dass die TCP-Implementierung in Windows automatisch die maximale MTU in einem Pfad ermittelt.

Ich habe auch experimentiert und herausgefunden, dass die maximale MTU von meinem Computer zu einem Server 57712 Bytes+Header beträgt. Alles, was darüber lag, wurde verworfen. Mein Computer befindet sich in einem LAN. Sollte die MTU nicht bei 1500 Bytes liegen?

29voto

ChrisW Punkte 53239

Das Folgende beantwortet Ihre Frage nicht direkt, aber vielleicht ist es für Sie interessant; es besagt, dass IP-Pakete zerlegt/neu zusammengesetzt werden können und daher größer sind als das Limit des zugrunde liegenden Mediums (z. B. 1500-Byte-Ethernet): Behebung von IP-Fragmentierungs-, MTU-, MSS- und PMTUD-Problemen mit GRE und IPSEC


Mehr zu diesem Thema:

Ich weiß nicht, ob es möglich ist, ICMP über eine API unter Windows zu generieren: Einst wurde eine solche API vorgeschlagen und war umstritten, weil die Leute argumentierten, dass es dadurch einfach wäre, Software zu schreiben, die eine Denial-of-Service-Funktionalität implementiert, indem sie eine Flut von ICMP-Nachrichten erzeugt.

Nein, es sieht so aus ist umgesetzt: siehe zum Beispiel Winsock Programmer's FAQ Beispiele: Ping: Raw Sockets Methode .

Um also die MTU zu ermitteln, erzeugen Sie Ping-Pakete mit dem Flag "nicht fragmentieren".

Vielleicht gibt es eine einfachere API als diese, ich weiß es nicht; aber ich hoffe, ich habe Ihnen das zugrunde liegende Protokoll näher gebracht.

15voto

Nikolai Fetissov Punkte 79627

Zusätzlich zu all den vorangegangenen Antworten ist das Zitieren der klassisch :

IPv4 und IPv6 definieren Mindestgröße des Wiederzusammensetzungspuffers die minimale Datagrammgröße, die garantiert von jeder Implementierung unterstützt werden muss. Bei IPv4 sind dies 576 Byte. Bei IPv6 erhöht sich dieser Wert auf 1.280 Byte.

Das bedeutet, dass Sie die Größe Ihrer Datagramme auf unter 576 begrenzen sollten, wenn Sie über das öffentliche Internet arbeiten und nur eine Seite des Austauschs kontrollieren - das ist es, was die meisten UDP-basierten Standardprotokolle tun.

Beachten Sie auch, dass PMTU eine dynamische Eigenschaft des Pfades ist. Dies ist eine der Aufgaben, die TCP für Sie übernimmt. Wenn Sie nicht bereit sind, eine Menge an Sequenzierungs-, Timing- und Wiederübertragungslogik neu zu implementieren, sollten Sie TCP für alle kritischen Netzwerke verwenden. Benchmark, Test, Profil, d.h. beweisen dass TCP Ihr Engpass ist, sollten Sie erst dann UDP in Betracht ziehen.

3voto

Alexp Punkte 510

Das ist ein interessantes Thema für mich. Vielleicht sind einige praktische Ergebnisse von Interesse, wenn es darum geht, umfangreiche UDP-Daten über UDP in der realen Welt des Internets zu übertragen. Bei einer Übertragungsrate von 1 Paket pro Sekunde werden die Daten bis zu etwa 2K mit minimalem Paketverlust übertragen. Darüber hinaus gibt es Probleme, aber wir haben regelmäßig 1600+ Byte Pakete ohne Probleme übertragen - sowohl über GPRS-Mobilfunknetze als auch über WAN weltweit. Bei ~1K, unter der Annahme, dass das Signal stabil ist (was nicht der Fall ist!), kommt es zu geringen Paketverlusten.

Interessanterweise handelt es sich dabei nicht um ein einzelnes Paket, sondern oft um ein Bündel von Paketen für ein paar Sekunden - was vermutlich der Grund dafür ist, dass VoIP-Anrufe gelegentlich einfach zusammenbrechen.

2voto

Jherico Punkte 27127

Ihre eigene MTU ist im Bereich Registrierung aber in der Praxis wird die MTU die kleinste MTU auf dem Weg zwischen Ihrem Rechner und dem Ziel sein. Sie ist variabel und kann nur empirisch bestimmt werden. Es gibt eine Reihe von RFCs und zeigt, wie man sie bestimmt.

LANs können intern sehr große MTU-Werte haben, da die Netzwerkhardware in der Regel homogen ist oder zumindest zentral verwaltet wird.

0voto

bockmabe Punkte 350

Bei UDP-Anwendungen müssen Sie die Ende-zu-Ende-MTU selbst verwalten, wenn Sie eine IP-Fragmentierung oder verworfene Pakete vermeiden wollen. Der empfohlene Ansatz für jede Anwendung ist, PMTU zu verwenden, um das maximale Datagramm auszuwählen, oder Datagramme < minimale PMTU zu senden

https://www.rfc-editor.org/rfc/rfc5405#section-3.2

Unicast-UDP-Nutzungsrichtlinien für Anwendungsentwickler "SOLLTE KEINE Datagramme senden, die die PMTU überschreiten, SOLLTE PMTU ermitteln oder Datagramme < minimale PMTU senden

Windows zeigt die Einstellungen und den Zugriff auf die PMTU-Informationen über seine grundlegende Socket-Optionen-Schnittstelle an:

Über IP_MTU_DISCOVER können Sie sicherstellen, dass die PMTU-Erkennung eingeschaltet ist, und über IP_MTU können Sie die MTU auslesen.

https://docs.microsoft.com/en-us/Windows/desktop/winsock/ipproto-ip-socket-options

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X