NOM
udp - Protocole UDP pour IPv4
SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
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-fiable, 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 un port local libre, hors de l’intervalle défini par
/proc/sys/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 pris en
charge.
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 paramètre /proc 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.
Par défaut, l’UDP sous Linux utilise la détection de MTU (« Maximum
Transmission Unit ») par chemin. Cela signifie que le noyau garde en
mémoire le MTU vers une adresse IP particulière, et renvoie EMSGSIZE
lorsqu’une écriture sur une socket UDP dépasse cette taille. Dans ce
cas, l’application doit réduire la taille du paquet. La détection de
MTU par chemin peut être désactivée avec l’option de socket
IP_MTU_DISCOVER ou le fichier /proc/sys/net/ipv4/ip_no_pmtu_disc ; voir
ip(7) pour plus de détails. Lorsque cette option est désactivée, UDP
fragmente les paquets sortants dont la taille dépasse le MTU de
l’interface. Ceci est cependant découragé, pour des raisons de
performance et de fiabilité.
Format d’adresse
UDP utilise le format d’adresse IPv4 sockaddr_in comme indiqué dans
ip(7).
Traitement des erreurs
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. Le comportement de Linux correspond à la RFC 1122.
Pour assurer la compatibilité avec du code ancien, on pouvait sous
Linux 2.0 et 2.2 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 gestion de cette option a été supprimée dans les noyaux plus
récents ; voir socket(7) pour plus d’informations.
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.
Interfaces /proc
La configuration des paramètres système pour UDP sont accessible par
les fichiers du répertoire /proc/sys/net/ipv4/.
udp_mem (depuis Linux 2.6.25)
C’est un vecteur de trois entiers qui contrôle le nombre de
pages permises pour la queue de toutes les sockets UDP.
min En dessous de ce nombre de pages, UDP ne se soucie pas
de son appétit en mémoire. Quand la quantité de
mémoire allouée par UDP dépasse cette valeur, UDP
commence à limiter son utilisation mémoire.
pressure Cette valeur a été introduite pour suivre le format de
tcp_mem (voir tcp(7)).
max Nombre de pages permises pour la queue de toutes les
sockets UDP.
Les valeurs par défaut pour ces trois éléments sont calculées au
démarrage à partir de la quantité de mémoire disponible.
udp_rmem_min (entier ; PAGE_SIZE par défaut ; depuis Linux 2.6.25)
Taille minimale, en octets, des tampons de réception utilisés
par les sockets UDP dans le mode de modération. Chaque socket
UDP peut utiliser cette taille pour recevoir des données, même
si le nombre total de pages pour les sockets UDP dépasse le
seuil udp_mem.
udp_wmem_min (entier ; PAGE_SIZE par défaut ; depuis Linux 2.6.25)
Taille minimale, en octets, du tampon d’émission utilisé par les
sockets UDP dans le mode de modération. Chaque socket UDP peut
utiliser cette taille pour envoyer des données, même si le
nombre total de pages pour les sockets UDP dépasse le seuil
udp_mem.
Options de sockets
Pour lire ou écrire une option de socket UDP, appeler getsockopt(2)
pour la lecture ou setsockopt(2) pour l’écriture, avec l’argument de
niveau d’option valant IPPROTO_UDP.
UDP_CORK (depuis Linux 2.5.44)
Si cette option est active, toutes les données en sortie sur
cette socket sont accumulées dans un unique datagramme qui est
émis dès que l’option est désactivée. Cette option ne doit pas
être utilisée dans des programmes destinés à être portables.
Ioctls
Ces ioctls sont accessibles à travers l’appel système ioctl(2). La
syntaxe correcte est :
int value;
error = ioctl(udp_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 pris en
charge.
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), udplite(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 du chemin.
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».