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?)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top