Empfangen von Paketen in UDP
-
06-07-2019 - |
Frage
Lassen Sie uns sagen, dass mein Programm sendet eine 1000 Bytes über das Netzwerk (UDP). Ist garantiert es, dass der Empfänger die 1000 Bytes in einem „Batch“ erhalten? Oder vielleicht muß er ausführen sevral „liest“, bis er die gesamte Nachricht empfangen wird? wenn die später wahr ist, wie kann ich sicherstellen, dass die Reihenfolge der Pakete für die gleiche Nachricht nicht „gemischt“ erhalten (in dieser Reihenfolge), oder vielleicht das Protokoll garantiert das?
Bearbeiten : Das heißt, es möglich, dass meine Botschaft an sevral Pakete aufgeteilt werden? (Was ist, wenn ich versuche, eine 10000MB Nachricht zu senden, was passiert dann?)
Lösung
Sie werden es alles oder nichts.
Aber es gibt keine besondere Garantie, dass Sie Pakete genau einmal in der Reihenfolge empfangen werden sie übertragen wurden; Paketverlust, Nachbestellung und (seltener) Vervielfältigung ist möglich.
Es gibt eine maximale Rahmengröße (von 65.507 Bytes), send () ing Paketen von größeren Größen einen Fehler zurück.
Sie müssen genügend Puffer bieten den gesamten Rahmen in einem Aufruf zu erhalten.
UDP-Pakete können in mehr IP-Fragment fragmentiert werden, aber das O wird ein unvollständiges Paket fallen. Dies ist daher für die Anwendung transparent.
Andere Tipps
Der Empfänger wird das gesamte Paket in einem Anruf erhalten. Die Paketlänge ist begrenzt, auch in Theorie :
Länge Ein 16-Bit-Feld, das die Länge in Bytes der gesamten angibt Datagramm: Header und Daten. Das Minimum Länge beträgt 8 Byte, da das ist die Länge des Headers. Die Feldgröße legt eine theoretische Grenze von 65.535 Bytes (8-Byte-header + 65527 Bytes Daten) für einen UDP-Datagramm. Das praktische Grenze für die Datenlänge die durch die darunter liegende auferlegt IPv4-Protokoll ist 65.507 Byte.
Doch die wirkliche Grenze ist viel viel niedriger, in der Regel ist sicher 512 Bytes zu übernehmen. Siehe Was auf die größte Sicher UDP-Paketgröße ist das Internet .
Daten gesendet unter Verwendung von UDP ist gruppiert in Pakete , wenn Sie also x schicken Bytemenge dann, wenn der Empfänger das Paket empfängt wird er x Menge an Bytes empfangen.
Allerdings Ihre Pakete könnten nicht einmal ankommen, oder sie können außerhalb der Reihenfolge ankommen.
UDP, im Gegensatz zu TCP, ist kein zuverlässiges Protokoll. Es bietet keinen Mechanismus eingebaut, um sicherzustellen, dass die Pakete in der richtigen Reihenfolge ankommen, oder sogar überhaupt ankommen. Das heißt, Sie Ihre Sende- / recv Routinen in einem Schloss Schritt Mode schreiben können, wo jedes Mal, wenn ein Paket gesendet wird, muss der Sender wartet einen ACK zu empfangen, bevor erneut zu senden. Wenn ein ACK nicht nach einer gewissen spezifizierten Timeout empfangen wird, muss das Paket erneut gesendet. So stellen Sie sicher, dass Pakete in der richtigen Reihenfolge empfangen werden. (Weitere Informationen finden Sie im RFC für das TFTP Protokoll rel="nofollow, die diese Strategie verwendet ).
Schließlich, wenn möglich, können Sie stattdessen mit TCP betrachten.
Mit UDP Lite teilweise beschädigte Pakete empfangen anfordern können. Dies kann für Video und VoIP-Dienste nützlich sein.