UDP(7)

NOM
udp - Protocole UDP pour IPv4

SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
udp_socket = socket(PF_INET, SOCK_DGRAM, 0);

DESCRIPTION
Il s'agit d'une implémentation de l'User Datagram Protocol décrit dans la RFC 768. Elle implémente un service de paquets datagrammes non-fiables, sans connexion. Les paquets peuvent être réordonnés ou dupliqués avant leur arrivée. UDP crée et vérifie des sommes de contrôle pour détecter les erreurs de transmission. Lorsqu'une socket UDP est créée, ses adresses locales et distantes sont indéterminées. Les datagrammes peuvent être envoyés immédiatement en utilisant sendto(2) ou sendmsg(2) avec une adresse de destination valide en argument. Lorsque connect(2) est appelé sur une socket, l'adresse de destination par défaut est fixée, et les datagrammes pourront être envoyés avec send(2) ou write(2) sans spécifier d'adresse de destination. Il restera possible d'envoyer des données à d'autres destinations en passant l'adresse à sendto(2) ou sendmsg(2). Afin de recevoir les paquets, une socket doit être attachée à une adresse locale en utilisant bind(2). Sinon la couche socket affectera automatiquement une port local libre, hors de l'intervalle défini par net.ipv4.ip_local_port_range et attacher la socket à l'adresse INADDR_ANY. Les opérations de réception ne renvoient qu'un seul paquet à la fois. Si le paquet est plus petit que le tampon transmis, il n'y aura pas plus de données renvoyées. S'il est plus grand, le paquet sera tronqué et le drapeau MSG_TRUNC sera activé. MSG_WAITALL n'est pas supporté. Les options IP peuvent être fixées ou lues en utilisant les options des sockets décrites dans ip(7). Elles ne sont traitées par le noyau que lorsque le sysctl approprié est activé (mais sont quand même fournies à l'utilisateur quant il est inhibé). Voir ip(7). Quand l'attribut MSG_DONTROUTE est actif à l'émission, l'adresse de destination doit représenter une adresse d'interface locale, et le paquet n'est envoyé qu'à cette interface. UDP fragmente un paquet quand sa longueur totale excède le MTU de l'interface (Maximum Transmission Unit). Une alternative plus efficace pour le réseau est d'utiliser la recherche du MTU du chemin, comme indiqué dans la section IP_MTU_DISCOVER de ip(7). Par défaut, UDP Linux effectue la recherche MTU (Maximum Transmission Unit) des chemins. Cela signifie que le noyau conservera la trace du MTU d'une adresse IP cible spécifique et renverra EMSGSIZE lorsque l'écriture d'un paquet UDP excèdera cette valeur. Si cela se produit, l'application doit diminuer la taille du paquet. La recherche MTU des chemins peut être désactivée en utilisant l'option de socket IP_MTU_DISCOVER ou la requête sysctl ip_no_pmtu_disc, voir ip(7) pour plus de détails. Lorsqu'elle est désactivée, UDP fragmentera les paquets sortants dont la longueur totale dépasse le MTU de l'interface. Toutefois, il n'est pas conseillé de la désactiver pour des raisons de performances et de fiabilité. .

  Format d'adresse
UDP utilise le format d'adresse IPv4 sockaddr_in comme indiqué dans ip(7).

  Gestion d'erreur
Toutes les erreurs fatales seront transmises à l'utilisateur comme un retour d'erreur même lorsque la socket n'est pas connectée. Ceci inclut les erreurs asynchrones reçues du réseau. Vous pouvez ainsi recevoir une erreur due à un paquet précédemment envoyé sur la même socket. Ce comportement diffère de celui de nombreuses autres implémentations des sockets BSD, qui ne transmettent pas d'erreur si la socket n'est pas connectée. Les comportements de Linux correspondent à la RFC 1122. Pour assurer la compatibilité avec du code ancien dans Linux 2.0 et 2.2, on peut fixer l'option SOL_SOCKET SO_BSDCOMPAT pour ne recevoir les erreurs distantes que si la socket a été connectée (sauf pour EPROTO et EMSGSIZE). Les erreurs locales sont toujours transmises. La prise en charge de cette option de socket a été retirée dans les derniers noyaux ; voir socket(7) pour plus d'information. Lorsque l'option IP_RECVERR est active, toutes les erreurs sont stockées dans la file d'erreur de la socket et peuvent être lues avec recvmsg(2) en activant son option MSG_ERRQUEUE.

  Options de socket
Pour positionner ou lire une option de socket, appelez getsockopt(2) pour lire ou setsockopt(2) pour écrire l'option avec l'argument niveau d'option configurer à IPPROTO_UDP.

UDP_CORK (depuis Linux 2.5.44)
    Si cette option est activée, toute la sortie donnée de cette socket est accumulé dans un seul datagramme qui sera transmis lorsque l'option sera désactivée. Cette option ne doit pas être utilisée dans du code conçu pour être portable.

  Ioctls
Les ioctls sont accessibles avec l'appel système ioctl(2). La syntaxe correcte est :

    int value;
    error = ioctl(ucp_socket, ioctl_type, &value);

FIONREAD (SIOCINQ)
    Prend en argument un pointeur sur un entier. Y écrit la taille en octets du prochain datagramme en attente, ou 0 si aucun datagramme n'est disponible.

TIOCOUTQ (SIOCOUTQ)
    Renvoie le nombre d'octets de données dans la file d'émission locale. Seulement sur Linux 2.4 et ultérieurs.

De plus, les ioctls documentés dans ip(7) et socket(7) sont supportés.

ERREURS
Toutes les erreurs documentées pour socket(7) ou ip(7) peuvent être renvoyées lors d'une émission ou d'une réception sur une socket UDP. ECONNREFUSED Aucun correspondant sur l'adresse destination associée à la socket. Ceci peut être causé par l'émission antérieure d'un paquet sur la socket.

VERSIONS
IP_RECVERR est une nouveauté de Linux 2.2.

VOIR AUSSI
ip(7), raw(7), socket(7) RFC 768 pour le protocole UDP.
RFC 1122 pour les nécessités de l'hôte.
RFC 1191 pour une description de la recherche du MTU par chemin.

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 8 juin 2001 et révisée le 17 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 7 udp ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.