Was ist die größte sichere UDP-Paketgröße im Internet?

201

Ich habe eine Reihe von Artikeln über UDP-Paketgrößen gelesen, konnte jedoch keine Schlussfolgerung darüber ziehen, was richtig ist.

Eine Reihe von Diensten beschränkt das größte UDP-Paket auf 512 Byte (wie DNS).

Bei einer minimalen MTU im Internet von 576 beträgt die Größe des IPv4-Headers 20 Byte und des UDP-Headers 8 Byte. Damit stehen 548 Bytes für Benutzerdaten zur Verfügung

Wäre ich in der Lage, Pakete bis zur Größe von 548 ohne Paketfragmentierung zu verwenden? Oder gibt es etwas, von dem die Entwickler von DNS wussten, und deshalb haben sie es auf 512 Bytes beschränkt?

Könnte ich sogar sicher höher als 548 Bytes gehen?

KM
quelle
2
Duplizieren, siehe stackoverflow.com/questions/900697/…
ChrisW
10
Es ist eine etwas andere Frage. Ich frage, was das größte Paket ist, das ich über das Internet senden kann (ohne Kenntnis der anderen Netzwerke oder Prüfung), das keine Fragmentierung aufweisen wird. Im Wesentlichen die maximale sichere Größe, die für alles funktioniert, ohne sich um die Prüfung der Verbindung kümmern zu müssen.
KM
2
Sie können die Möglichkeit einer Fragmentierung nicht ausschließen, aber dies macht die Dinge nicht weniger sicher. Wenn ein Fragment verworfen wird, ist es dasselbe, als ob das gesamte Paket verworfen wurde, was bei UDP sowieso passiert. Unsicher wäre, wenn ein Paket die Mindestgröße überschreitet, die Router unterstützen müssen, und daher nicht garantiert werden kann (im Gegensatz zu garantiert geliefert werden). Hier kommt die 512-Byte-Zahl ins
Spiel

Antworten:

129

Es ist wahr, dass ein typischer IPv4-Header 20 Bytes und der UDP-Header 8 Bytes umfasst. Es ist jedoch möglich, IP-Optionen einzuschließen, mit denen die Größe des IP-Headers auf bis zu 60 Byte erhöht werden kann. Außerdem ist es manchmal erforderlich, dass Zwischenknoten Datagramme in einem anderen Protokoll wie IPSec (für VPNs und dergleichen verwendet) kapseln, um das Paket an sein Ziel weiterzuleiten. Wenn Sie die MTU auf Ihrem bestimmten Netzwerkpfad nicht kennen , lassen Sie am besten einen angemessenen Spielraum für andere Header-Informationen, die Sie möglicherweise nicht erwartet haben. Eine 512-Byte-UDP-Nutzlast wird im Allgemeinen als solche angesehen, obwohl selbst das nicht genügend Platz für einen IP-Header mit maximaler Größe lässt.

mark4o
quelle
36
Um ganz klar zu sein: Eine geringe Größe zur Vermeidung von Fragmentierung macht die Zustellung des Pakets nicht "sicher". Es gibt immer noch unendlich viele Möglichkeiten, die Zustellung unzuverlässig zu machen, z. B. Hund hat mein Netzwerkkabel gefressen. Das gesagt; Weniger Fragmente machen die Zustellung "sicherer", denn wenn es mehr als eines gab und eines davon es nie geschafft hat, wird das gesamte Paket (Datagramm) von UDP verworfen.
Markmnl
3
Für die Zwecke einer Frage würde man annehmen, die Plakatdefinition von "sicher" zu verwenden, nicht irgendeine Definition in einem Standardbuch, die sie nie gesehen haben.
Astara
Ist bekannt, dass reale Router UDP-Pakete verwerfen, anstatt sie zu fragmentieren?
user253751
60

Die theoretische Grenze (unter Windows) für die maximale Größe eines UDP-Pakets beträgt 65507 Byte. Dies ist hier dokumentiert :

Die korrekte maximale UDP-Nachrichtengröße beträgt 65507, wie durch die folgende Formel bestimmt: 0xffff - (Größe von (IP-Header) + Größe von (UDP-Header)) = 65535- (20 + 8) = 65507

Abgesehen davon beschränken sich die meisten Protokolle auf eine viel kleinere Größe - normalerweise entweder 512 oder gelegentlich 8192. Wenn Sie sich in einem zuverlässigen Netzwerk befinden, können Sie häufig sicher höher als 548 gehen - aber wenn Sie über das Internet insgesamt senden, ist die Größe umso größer Je weiter Sie gehen, desto wahrscheinlicher werden Sie auf Probleme und Verluste bei der Paketübertragung stoßen.

Reed Copsey
quelle
39
Ein Microsoft-Link ist keine normative Referenz. Die RFCs sind die normative Referenz; und was Sie zitiert haben, gilt nur für IPv4.
Marquis von Lorne
2
Nur weil MS dies zulässt, bedeutet dies nicht, dass es immer eine gute Idee ist, da Zwischenrouter usw. möglicherweise gezwungen sind, größere Pakete zu fragmentieren (wie Sie erwähnt haben).
Rogerdpack
1
@EJP Sie erklären es nicht klar auf dem Microsoft-Link, aber es scheint eine notwendige Konsequenz von IPv4 zu sein: Das IPv4-Gesamtlängenfeld beträgt 16 Bit, und dieser Wert muss die Länge des IP-Headers und die Länge des IPv4-Headers enthalten UDP-Header.
jtpereyda
@jtpereyda Ich bin mir dessen voll bewusst. Mein Punkt ist genau das, was ich bereits gesagt habe: Sie sollten normative Referenzen zitieren, wo sie existieren.
Marquis von Lorne
Ich glaube nicht, dass die maximale UDP-Paketgröße jemals 65.507 Bytes betragen würde, da meine WLAN-Karte (IEEE 802.3) nur 1500 MTU kann und Jumbo-Frames nur 9 KByte groß sind.
Christian Stewart
52

Die maximale sichere UDP-Nutzlast beträgt 508 Byte. Dies ist eine Paketgröße von 576 abzüglich des maximalen 60-Byte-IP-Headers und des 8-Byte-UDP-Headers. Jede UDP-Nutzlast dieser Größe oder kleiner kann garantiert über IP geliefert werden (obwohl nicht garantiert wird). Alles, was größer ist, darf von jedem Router aus irgendeinem Grund sofort fallen gelassen werden. Außer auf einer Nur-IPv6-Route, bei der die maximale Nutzlast 1.212 Byte beträgt. Wie bereits erwähnt, können unter bestimmten Umständen zusätzliche Protokollheader hinzugefügt werden. Stattdessen kann ein konservativerer Wert von etwa 300 bis 400 Bytes bevorzugt werden.

Jedes UDP-Paket kann fragmentiert sein. Dies ist jedoch nicht allzu wichtig, da der Verlust eines Fragments den gleichen Effekt hat wie der Verlust eines unfragmentierten Pakets: Das gesamte Paket wird verworfen. Mit UDP wird dies so oder so geschehen.

Interessanterweise beträgt die maximale theoretische Paketgröße etwa 30 MB (1.500 Ethernet MTU - 60 IP-Header x 65.536 maximale Anzahl von Fragmenten), obwohl die Wahrscheinlichkeit, dass sie durchkommt, infinitesimal wäre.

Quellen: RFC 791, RFC 2460

Beejor
quelle
2
Jedes UDP-Paket wird standardmäßig als "_U_nreliable" betrachtet. Die einzige sichere UDP-Paketgröße, die Sie erwarten können, ist 1 unfragmentiertes Paket. Wenn Sie "sichere" Pakete wünschen, verwenden Sie ein Paketprotokoll über TCP.
Astara
26
@Astara Stimmt, von Natur aus ist UDP unzuverlässig. Die Frage ist jedoch, ob ein Paket einer bestimmten Größe garantiert zugestellt werden kann oder nicht. Pakete über einer bestimmten Größe können (und werden) von jedem Router aus irgendeinem Grund verworfen werden, während kleinere Pakete gemäß den Industriestandards von allen Routern bestmöglich verarbeitet werden müssen . "Sicher" bedeutet in diesem Fall "Wird mein Auto unter die Brücke passen" und nicht "Wird mein Auto im Verkehr stecken bleiben".
Beejor
1
Ich empfehle, nicht mehr zu wiederholen, was ein zufälliger Typ gesagt hat, und die Fakten zu überprüfen, da UDP eigentlich ziemlich zuverlässig ist. Übrigens habe ich sichere Pakete über UDP ohne den unnötigen Overhead von TCP. openmymind.net/How-Unreliable-Is-UDP
Pablo Ariel
5
UDP ist nicht "unzuverlässig" wegen der Menge der verworfenen Pakete, sondern weil Pakete verworfen werden können (und werden). Sie können sich nicht auf eine bestimmte Paketankunft, -bestellung oder -bestätigung "verlassen". Daten sind fragil und es ist so, als ob man sagt, dass eine Fahrzeuglenkung, die 99% der Zeit und 89% in die richtige Richtung funktioniert, zuverlässig ist. Nicht, dass UDP für viele Dinge nicht großartig ist, nur, dass Sie im Grunde genommen Ihre eigene Version von "TCP" darauf schreiben müssen. Hier ist ein faszinierender Fall aus der realen Welt in der Welt der Spieleentwickler (wenn auch etwas veraltet): gamasutra.com/view/feature/131781
Beejor
@Beejor Sie waren auf dem richtigen Weg, aber "es erfordert, dass Sie im Grunde Ihre eigene Version von" TCP "darauf schreiben" ist offensichtlich falsch. UDP eignet sich hervorragend zum Senden und zum schnellen Senden von "unkritischen" Daten. (In Bezug auf Spiele) Sie können (LAN-) Server / Dienste mithilfe von UDP erkennen und UDP verwenden, um Spielerstandorte schnell zu senden. Wenn ein Paket verworfen wird; Es ist Ihnen egal, da das nächste Paket einen aktuelleren Standort der anderen Spieler enthält. TCP kann Pakete außerhalb der Reihenfolge haben, hat Overhead und stellt keine Eins-zu-Viele-Verbindungen her. In einigen Fällen kann UDP besser anwendbar sein.
Paul
46

576 ist die minimale maximale Größe des Wiederzusammensetzungspuffers , dh jede Implementierung muss in der Lage sein, Pakete mit mindestens dieser Größe wieder zusammenzusetzen. Siehe IETF RFC 1122 für Details.

user607811
quelle
2
Wenn und nur wenn Sie ein Netzwerk haben, das kein IPv6 überträgt. Wenn IPv6 übertragen wird, verwenden Sie die maximale Paketgröße von IPv6-Headern und subtrahieren Sie dann die Kapselungsheader für IPv4 über IPv6. ;-)
Astara
@Astara In IPv6 wird die Fragmentierung vom Absender durchgeführt, sodass bei zweifelhaften, nicht konformen Zwischenroutern kein Problem besteht. Und wenn der Empfänger keine speicherbeschränkte eingebettete Größe hat, kann er wahrscheinlich Pakete mit mindestens 64 KB wieder zusammensetzen.
user253751
@ user253751 Es sind nicht nur nicht konforme Router, die fragmentieren können. Es gibt Path MTU Discovery, aber selbst das reicht nicht aus, um die Fragmentierung vollständig zu beseitigen.
Dstromberg
@dstromberg In welchen Situationen dürfen IPv6-Router Datagramme fragmentieren?
user253751
@ user253751 Ich habe noch nicht viel IPv6, aber hier ein Beispiel: Stellen Sie sich ein IPv6-Netzwerk vor, das Jumbogramme (> 65536 Byte) an ein anderes IPv6-Netzwerk sendet, das auch Jumbogramme unterstützt. Angenommen, Path MTU Discovery besagt, dass diese Jumbogramme ohne Fragmentierung unterstützt werden sollten. Dann wird ein Router aus- und wieder eingeschaltet, und ein Teil des Netzwerkpfads wird durch Geräte ersetzt, die nicht für Jumbogramme konfiguriert sind.
Dstromberg
14

Dieser Artikel beschreibt die maximale Übertragungseinheit (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . Es heißt, dass IP-Hosts 576 Bytes für ein IP-Paket verarbeiten können müssen. Es wird jedoch darauf hingewiesen, dass das Minimum 68 beträgt. RFC 791: "Jedes Internetmodul muss in der Lage sein, ein Datagramm von 68 Oktetten ohne weitere Fragmentierung weiterzuleiten. Dies liegt daran, dass ein Internet-Header bis zu 60 Oktette umfassen kann und das minimale Fragment 8 Oktette beträgt . "

Daher ist eine sichere Paketgröße von 508 = 576 - 60 (IP-Header) - 8 (udp-Header) angemessen.

Wie von user607811 erwähnt, muss die Fragmentierung durch andere Netzwerkschichten wieder zusammengesetzt werden. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Zusammenbau Die IP-Schicht MUSS den Zusammenbau von IP-Datagrammen implementieren. Wir bezeichnen die größte Datagrammgröße, die von EMTU_R wieder zusammengesetzt werden kann ("Effektive MTU zum Empfangen"). Dies wird manchmal als "Größe des Zusammensetzungspuffers" bezeichnet. EMTU_R MUSS größer oder gleich 576 sein

edW
quelle
11

Die minimale IPv4- Puffergröße für den Zusammenbau beträgt 576, für IPv6 1500. Subtrahieren Sie die Header-Größen von hier. Siehe UNIX Network Programming von W. Richard Stevens :)

Nikolai Fetissov
quelle
1
Minimum natürlich. Danke, dass du es entdeckt hast. Habe keine Ahnung, wie niemand den Fehler über die Jahre bemerkt hat.
Nikolai Fetissov
1
Während IPv6 möglicherweise einen minimalen Wiederzusammensetzungspuffer von 1500 hat, dürfen IPv6-Pakete nicht fragmentiert werden, und die minimale IPv6-MTU beträgt 1280. Ein Endgerät sollte niemals ein fragmentiertes IPv6-Paket wieder zusammensetzen müssen.
Ron Maupin
1
@ RonMaupin IPv6-Pakete können nach Endpunkten fragmentiert werden. Nur nicht von den Routern dazwischen.
Navin
3
@Navin, nein, IPv6-Pakete werden nicht fragmentiert. Die Daten müssen fragmentiert werden, bevor sie in IPv6-Pakete gepackt werden. Die Pakete selbst sind jedoch nicht fragmentiert. Da ist ein Unterschied. Im Gegensatz zu IPv4-Paket-Headern, die Felder für die Fragmentierung enthalten, haben IPv6-Paket-Header nichts für die Fragmentierung. Der IPv6-Paket-Header ist viel einfacher als der IPv4-Paket-Header.
Ron Maupin
6

512 ist Ihre beste Wahl. Es wird woanders verwendet und ist eine schöne gerade Zahl (die Hälfte von 1024).

Justin Niessner
quelle
6

Angesichts der Größe von IPV6 von 1500 würde ich behaupten, dass Netzbetreiber keine getrennten Pfade für IPV4 und IPV6 bereitstellen würden (beide sind IP mit unterschiedlichen Typen), was sie zu Geräten für IPv4 zwingen würde, deren Wartung alt, redundant und kostspieliger wäre und weniger zuverlässig. Es würde keinen Sinn ergeben. Außerdem kann dies leicht in Betracht gezogen werden, um einen Teil des Verkehrs bevorzugt zu behandeln - ein Nein-Nein unter Regeln, die ihnen wahrscheinlich nicht viel ausmachen (es sei denn, sie werden erwischt).

Daher sollte 1472 für den externen Gebrauch sicher sein (obwohl dies nicht bedeutet, dass eine App wie DNS, die nichts über EDNS weiß, dies akzeptiert). Wenn Sie über interne Netze sprechen, können Sie in diesem Fall mit größerer Wahrscheinlichkeit Ihr Netzwerklayout kennen Jumbo-Paketgrößen gelten für nicht fragmentierte Pakete, also für 4096 - 4068 Bytes, und für Intel-Karten mit 9014-Byte-Puffern wäre eine Paketgröße von ... warte ... 8086 Bytes der maximale ... Zufall? kichern

****AKTUALISIEREN****

Verschiedene Antworten geben die von einem SW-Anbieter zugelassenen Maximalwerte oder verschiedene Antworten unter der Annahme der Kapselung an. Der Benutzer hat nicht nach dem niedrigstmöglichen Wert gefragt (wie "0" für eine sichere UDP-Größe), sondern nach der größten sicheren Paketgröße.

Kapselungswerte für verschiedene Schichten können mehrfach eingeschlossen werden. Seit Sie einen Stream gekapselt haben, gibt es nichts, was beispielsweise eine darunter liegende VPN-Schicht und eine vollständige Verdoppelung der darüber liegenden Kapselungsschichten verbietet.

Da es sich um maximale Sicherheitswerte handelte, gehe ich davon aus, dass es sich um den maximalen Sicherheitswert für ein UDP-Paket handelt, das empfangen werden kann. Da kein UDP-Paket garantiert ist, beträgt die größte sichere Größe 1 Paket über IPv4 oder 1472 Byte, wenn Sie ein UDP-Paket empfangen.

Hinweis - Wenn Sie IPv6 verwenden, beträgt die maximale Größe 1452 Byte, da die IPv6-Headergröße 40 Byte gegenüber der 20-Byte-Größe von IPv4 beträgt (und in beiden Fällen müssen für den UDP-Header noch 8 Byte zugelassen werden).

Astara
quelle
1
Wie rechnen Sie 1472? Ethernet hat eine MTU von 1500, ist es das, worauf Sie sich beziehen?
Rogerdpack
4
@rogerdpack Ich denke, er meint, da IPv4 und IPv6 wahrscheinlich viel Infrastruktur gemeinsam nutzen und IPv6 relativ populär wird, sollte es sicher sein, IPv6-Grenzwerte (also 1500) anzunehmen. Wie berechtigt diese Argumentation ist, kann ich jedoch nicht sagen.
Thomas
2
1500 muss von IPv6-kompatiblen Komponenten in der "Netzwerkkette" unterstützt werden. Wenn IPv4 verwendet wird, das über eine IPv6-unterstützende Kette übertragen werden kann (obwohl das Gegenteil nicht der Fall ist), beträgt die Headergröße von IPv4 20 Byte Die Headergröße von UDP beträgt 8 Byte, sodass 1500-20-8 = 1472 als maximale sichere Größe übrig bleibt (da IPv6 keine Fragmentierung zulässt). Hinweis - Wenn Benutzer genügend Kapselungsebenen hinzufügen, ist möglicherweise kein Platz für DATEN vorhanden. Da Sie nach dem MAX gefragt haben, wird davon ausgegangen, dass NICHT mehrere Ebenen des Kapselungsaufwands verwendet werden.
Astara
" 1500 muss von IPv6-kompatiblen Komponenten in der Netzwerkkette unterstützt werden. " Nein, die minimale IPv6-MTU beträgt 1280. Die Ethernet-MTU beträgt 1500.
Ron Maupin
@ RonMaupin - Original Q war die größte sichere UDP-Paketgröße, nicht die MTU. Siehe RFC2460. Neben einer MTU mit 1280 Oktetten heißt es: Knoten müssen in der Lage sein, ein fragmentiertes Paket zu akzeptieren, das beim Zusammenbau bis zu 1500 Oktette beträgt. Die Bearbeitung von Paketen größer als 1500 ist optional.
Astara
6

Ich habe hier einige gute Antworten gelesen. Es gibt jedoch einige kleinere Fehler. Einige haben geantwortet, dass das Feld Nachrichtenlänge im UDP-Header maximal 65535 (0xFFFF) beträgt. das ist technisch wahr. Einige haben geantwortet, dass das tatsächliche Maximum (65535 - IPHL - UDPHL = 65507) ist. Der Fehler besteht darin, dass das Feld Nachrichtenlänge im UDP-Header alle Nutzdaten (Ebenen 5-7) sowie die Länge des UDP-Headers (8 Byte) enthält. Dies bedeutet, dass bei einem Nachrichtenlängenfeld von 200 Byte (0x00C8) die Nutzlast tatsächlich 192 Byte (0x00C0) beträgt.

Was hart und schnell ist, ist, dass die maximale Größe eines IP-Datagramms 65535 Bytes beträgt. Diese Zahl ergibt sich aus der Gesamtsumme der L3- und L4-Header zuzüglich der Nutzdaten der Ebenen 5-7. IP-Header + UDP-Header + Ebenen 5-7 = 65535 (max.).

Die richtigste Antwort für die maximale Größe eines UDP-Datamam ist 65515 Byte (0xFFEB), da ein UDP-Datagramm den UDP-Header enthält. Die richtigste Antwort für die maximale Größe einer UDP-Nutzlast ist 65507 Byte, da eine UDP-Nutzlast den UDP-Header nicht enthält.

Schwein
quelle
1
Du hast die Frage nicht beantwortet. Der Fragesteller wollte wissen, welche Größe die größte ist, die er verwenden kann, um die Paketfragmentierung zu vermeiden.
Astara
0

Ich befürchte, dass ich verärgerte Reaktionen bekomme, aber trotzdem, um für mich zu klären, ob ich falsch liege oder wer diese Frage sieht und an einer Antwort interessiert ist:

Mein Verständnis von https://tools.ietf.org/html/rfc1122, dessen Status "eine offizielle Spezifikation" ist und als solches die Referenz für die in dieser Frage verwendete Terminologie ist und die weder von einem anderen RFC abgelöst wird noch Errata widerspricht, die dem widersprechen Folgendes:

theoretisch dh. Basierend auf der schriftlichen Spezifikation hat UDP, wie von https://tools.ietf.org/html/rfc1122#section-4 angegeben, keine "Paketgröße". Die Antwort könnte also "unbestimmt" sein.

In der Praxis, nach der diese Fragen wahrscheinlich gesucht haben (und die für die aktuelle Technologie in Aktion aktualisiert werden könnten), könnte dies anders sein, und ich weiß es nicht.

Ich entschuldige mich, wenn ich Ärger verursacht habe. https://tools.ietf.org/html/rfc1122#page-8 Die "Internet Protocol Suite" und "Architectural Assumptions" machen mir nicht klar, auf welcher "Annahme" ich mich befand, basierend auf dem, was ich gehört habe Die Schichten sind getrennt . Dh. Die Schicht, in der sich UDP befindet, muss sich nicht mit der Schicht befassen, in der sich IP befindet (und die IP-Schicht enthält Dinge wie Zusammenbau, EMTU_R, Fragmentierung und MMS_R ( https://tools.ietf.org/html/rfc1122#page-) 56 ))

user5588495
quelle
1
Der UDP-Header hat ein Datagrammlängenfeld von 16 Bit, was bedeutet, dass das größte theoretische UDP-Datagramm 65.535 ist. Dies kann jedoch nie erreicht werden, da UDP in einem IP-Paket eingekapselt ist, das eine theoretische maximale Gesamtlänge von 65.535 (the dasselbe), aber Sie müssen die IP- und UDP-Header von dieser Größe subtrahieren, um die theoretische maximale Datengröße zu ermitteln.
Ron Maupin
Ich habe das vor langer Zeit gefragt, aber es wurde nach einer pragmatischen Antwort gesucht (was im wirklichen Leben funktioniert) und nicht nach dem, was in den Spezifikationen / oder in der Theorie steht. Ich wollte Pakete von a nach b ohne Fragmentierung bekommen, es war für ein Echtzeit-Spiele-Netzwerkproblem - ich denke, es gibt viele Lösungen, die jetzt von klügeren Leuten entwickelt wurden :)
KM