Question

Supposons que mon programme envoie 1000 octets sur le réseau (UDP). Est-ce que cela garantit que le destinataire recevra les 1000 octets en un "lot"? Ou peut-être devra-t-il effectuer plusieurs lectures & lectures " jusqu'à ce qu'il reçoive le message entier? si ce dernier est vrai, comment puis-je m'assurer que l'ordre des paquets pour le même message ne soit pas "mélangé"? (dans l’ordre), ou peut-être que le protocole le garantit?
Modifier : en d'autres termes, est-il possible que mon message soit fractionné en plusieurs paquets? (Et si j'essaie d'envoyer un message 10000mb, que se passe-t-il ensuite?)

Était-ce utile?

La solution

Vous aurez tout ou rien.

Cependant, rien ne garantit que vous recevrez les paquets exactement une fois dans l'ordre dans lequel ils ont été transmis. perte de paquets, réorganisation et (moins souvent) duplication sont toutes possibles.

Il y a une taille de trame maximale (65 507 octets), les paquets envoyés de taille plus grande renverront une erreur.

Vous devez fournir suffisamment de mémoire tampon pour recevoir toute la trame en un seul appel.

Les paquets UDP PEUVENT être fragmentés en plusieurs fragments IP, mais le système d'exploitation laissera tomber un paquet incomplet. Ceci est donc transparent pour l'application.

Autres conseils

Le destinataire recevra le paquet entier en un seul appel. La longueur du paquet est limitée, même dans la théorie :

  

longueur       Un champ de 16 bits qui spécifie la longueur en octets de la totalité   datagramme: en-tête et données. Le minimum   la longueur est de 8 octets puisque c'est la   longueur de l'en-tête. La taille du champ   fixe une limite théorique de 65 535   octets (en-tête de 8 octets + 65 527 octets de   data) pour un datagramme UDP. le   limite pratique pour la longueur des données   qui est imposé par le sous-jacent   Le protocole IPv4 est de 65 507 octets.

Cependant, la limite réelle est beaucoup plus basse, il est généralement prudent de supposer 512 octets. Voir Quelle est la plus grande taille de paquet Safe UDP sur Internet .

Les données envoyées à l'aide du protocole UDP sont regroupées dans des paquets , donc si vous envoyez x nombre d'octets, alors SI le destinataire reçoit le paquet, il recevra x nombre d'octets.

Cependant, il est possible que vos paquets n'arrivent pas ou qu'ils arrivent en panne.

UDP, contrairement à TCP, n’est pas un protocole fiable. Il ne fournit aucun mécanisme intégré garantissant que les paquets arrivent dans le bon ordre, voire même qu'ils arrivent du tout. Cela dit, vous pouvez écrire vos routines send / recv de manière verrouillée, chaque fois qu’un paquet est envoyé, l’expéditeur doit attendre de recevoir un accusé de réception avant de le renvoyer. Si un accusé de réception n'est pas reçu après un certain délai, le paquet doit être renvoyé. De cette façon, vous vous assurez que les paquets sont reçus dans le bon ordre. (Pour plus d'informations, consultez la RFC pour le protocole TFTP , qui utilise cette stratégie. .)

Enfin, si possible, envisagez d'utiliser plutôt le protocole TCP.

Avec UDP Lite , vous pouvez demander à recevoir des paquets partiellement corrompus. Cela peut être utile pour les services vidéo et VoIP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top