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?
Antworten:
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.
quelle
Die theoretische Grenze (unter Windows) für die maximale Größe eines UDP-Pakets beträgt 65507 Byte. Dies ist hier dokumentiert :
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.
quelle
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
quelle
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.
quelle
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
quelle
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 :)
quelle
512 ist Ihre beste Wahl. Es wird woanders verwendet und ist eine schöne gerade Zahl (die Hälfte von 1024).
quelle
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).
quelle
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.
quelle
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 ))
quelle