IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Fragmentation et concaténation de messages UDP


Sujet :

Réseau C

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut Fragmentation et concaténation de messages UDP
    Bonjour,

    Je me pose deux questions à propos du protocole UDP :

    1) Est ce que un message envoyé en une fois (ie avec un seul sendto) peut être reçu en plusieurs fois (ie qu'il faille au moins 2 recvfrom pour recevoir le message) ?
    2) Est ce que deux messages (envoyés avec deux sendto successifs) peuvent être reçus en une seule fois (avec un seul recvfrom) ?

    C'est surement des questions basiques mais je n'arrive pas à trouver la réponse sur le net (et je ne suis pas sur non plus après avoir lu les man de send, recv et udp).

    Edit: Est-ce que le fonctionnement est le même avec l'utilisation de select et des sockets non bloquantes ?

    D'autre part, j'ai vu que si un message UDP reçu avec recvfrom ne peut pas être entièrement contenu dans le buffer passé au recvfrom (parce que ce dernier est trop petit), le reste du message est perdu. Y-a t'il un moyen d'éviter ça, autrement qu'en utilisant un buffer suffisament grand (64K) ?

    Merci d'avance
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est une bonne question.

    Mon expérience personnelle : à 1 sendto() correspond 1 et 1 seul recvfrom() mais je n'ai rien trouvé non plus qui le dise (ni son contraire).

    Lu ici : recvfrom()
    Citation Envoyé par MSDN
    For message-oriented sockets, data is extracted from the first enqueued message, up to the size of the buffer specified. If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost. For UDP if the packet received contains no data (empty), the return value from the recvfrom function function is zero.
    Ce qui semble vouloir dire que tu dois lire le paquet en une seule fois avec recvfrom() sinon, c'est perdu.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est une bonne question.

    Mon expérience personnelle : à 1 sendto() correspond 1 et 1 seul recvfrom() mais je n'ai rien trouvé non plus qui le dise (ni son contraire).
    Moi aussi

    Cependant, voici ce que dit le manuel linux (man 7 udp) :
    All receive operations return only one packet. When the packet is smaller than the passed buffer only that much data is returned, when it is bigger the packet is truncated and the MSG_TRUNC flag is set. MSG_WAITALL is not supported.
    Ce qui pour moi répond à la deuxième question : il n'y a pas (jamais) de concaténation de paquet à la réception. Par contre pour la fragmentation, la question reste ouverte.

    Quant aux buffers trop petits à la réception, je crois qu'il faut soit mettre un buffer de taille 64K (taille supérieure à la taille max d'un paquet UDP), soit se mettre d'accord avec l'envoyeur au préalable. En effet il est peu sur d'envoyer des paquets de 64K sur internet, trop de risque de perte etc.

    Je suis toujours très intéressé par une réponse pour la première question

    Bonne journée
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Lu ici : recvfrom()
    Citation Envoyé par Le Mérovingien Voir le message
    Cependant, voici ce que dit le manuel linux (man 7 udp) :
    Cela semble dire la même chose, si tu reçois un paquet UDP de 10Ko et que tu fais un recvfrom() avec 1 buffer de 1Ko, le reste du paquet (9Ko) est définitivement perdu (mais tu as un flag qui t'en informe : MSG_TRUNC ou WSAEMSGSIZE suivant les OS).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Points : 128
    Points
    128
    Par défaut
    Citation Envoyé par Le Mérovingien Voir le message
    1) Est ce que un message envoyé en une fois (ie avec un seul sendto) peut être reçu en plusieurs fois (ie qu'il faille au moins 2 recvfrom pour recevoir le message) ?
    J'ai pas réellement d'expérience au niveau des sockets mais d'après ce que j'ai compris des protocoles UDP et IP, j'aurais tendance à répondre que non.
    Tu devrais recevoir ton datagramme en seule une fois à ton niveau : ce datagramme peut avoir été fragmenté en paquets au niveau IP si sa taille est supérieure au MTU du réseau mais c'est transparent.

    Citation Envoyé par Le Mérovingien Voir le message
    2) Est ce que deux messages (envoyés avec deux sendto successifs) peuvent être reçus en une seule fois (avec un seul recvfrom) ?
    Là, je saurais pas répondre. Juste dire que s'ils sont reçus séparément, ça peut être dans un ordre différent de l'envoi.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Merci pour vos réponses, je vais faire un petit résumé de la situation et clore le sujet.

    D'après ce que j'ai compris et expérimenté, le protocole UDP est un protocole orienté *messages*, c'est pourquoi un "sendto" envoie *un* message, et un "recvfrom" reçoit *un* message. Au niveau UDP les messages sont envoyés et reçus atomiquement. Les différents manuels indiquent bien qu'un revcfrom ne renvoie à l'utilisateur qu'un seul message, et à mon sens un message ne peut pas être segmenté à la réception. Bien sur au niveau IP le message UDP peut être segmenté (j'ai testé avec un message UDP plus gros que le max autorisé par IP, le message est transmis dans plusieurs paquets IP mais est reconstruit par le protocole UDP avant sa réception par un "recvfrom").

    Quant à la taille des messages UDP, si elle est supérieure à la taille du buffer de réception, le "surplus" est perdu, et on y peut rien. Il faut soit utiliser un buffer suffisamment grand (la taille max d'un message UDP est 64K entêtes comprises), soit se mettre d'accord au préalable avec l'envoyeur.

    Merci encore pour les réponses.

    @+
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transmettre des messages udp via une page web
    Par DrMaboul dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 02/04/2008, 21h33
  2. probleme de reception de message udp apres envoi
    Par zarbiman dans le forum Développement
    Réponses: 2
    Dernier message: 12/12/2007, 23h21
  3. Réponses: 2
    Dernier message: 28/10/2007, 02h38
  4. [tcp/udp] Gestion des message
    Par Mathieu.J dans le forum Développement
    Réponses: 1
    Dernier message: 06/08/2007, 22h01
  5. [Sockets UDP] Quelle est la taille max d'un message UDP en unicast?
    Par jlassiramzy dans le forum Entrée/Sortie
    Réponses: 30
    Dernier message: 27/02/2007, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo