table of contents
udp(7) | Miscellaneous Information Manual | udp(7) |
NOM¶
udp - Protocole UDP pour IPv4
SYNOPSIS¶
#include <sys/socket.h> #include <netinet/in.h> #include <netinet/udp.h>
udp_socket = socket(AF_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 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'un socket UDP est créé, 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 valable en argument. Lorsque connect(2) est appelé sur un socket, l'adresse de destination par défaut est définie, et les datagrammes pourront être envoyés avec send(2) ou write(2) sans indiquer 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, un socket doit être attaché à 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 le 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 envoyé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é). Consultez 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 un 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 ; consultez 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. C’est cependant découragé, pour des raisons de performance et de fiabilité.
Formats 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 le socket n'est pas connecté. Ça comprend les erreurs asynchrones reçues du réseau. Vous pouvez ainsi recevoir une erreur due à un paquet précédemment envoyé sur le même socket. Ce comportement diffère de celui de nombreuses autres implémentations des sockets BSD, qui ne transmettent pas d'erreur si le socket n'est pas connecté. Le comportement de Linux correspond à la RFC 1122.
Pour assurer la compatibilité avec du code ancien, sous Linux 2.0 et 2.2, l'option SOL_SOCKET SO_BSDCOMPAT pouvait être définie pour ne recevoir les erreurs distantes que si le socket a été connecté (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 ; consultez socket(7) pour plus d'informations.
Lorsque l'option IP_RECVERR est active, toutes les erreurs sont stockées dans la file d'erreur du socket et peuvent être lues avec recvmsg(2) en activant son option MSG_ERRQUEUE.
/proc interfaces¶
La configuration des paramètres système pour UDP est 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 file d’attente de tous 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 file d’attente de tous 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 socket¶
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. Sauf mention contraire, optval est un pointeur vers un int.
Voilà une liste des options spécifiques à UDP. Pour des détails sur certaines autres options de socket qui sont aussi applicables sur les sockets UDP, voir socket(7).
- UDP_CORK (depuis Linux 2.5.44)
- Si cette option est active, toutes les données en sortie sur ce 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.
- UDP_SEGMENT (depuis Linux 4.18)
- Enables UDP segmentation offload. Segmentation offload reduces send(2) cost by transferring multiple datagrams worth of data as a single large packet through the kernel transmit path, even when that exceeds MTU. As late as possible, the large packet is split by segment size into a series of datagrams. This segmentation offload step is deferred to hardware if supported, else performed in software. This option takes a value in the range [0, USHRT_MAX] that sets the segment size: the size of datagram payload, excluding the UDP header. The segment size must be chosen such that at most 64 datagrams are sent in a single call and that the datagrams after segmentation meet the same MTU rules that apply to datagrams sent without this option. Segmentation offload depends on checksum offload, as datagram checksums are computed after segmentation. The option may also be set for individual sendmsg(2) calls by passing it as a cmsg(3). A value of zero disables the feature. This option should not be used in code intended to be portable.
- UDP_GRO (depuis Linux 5.0)
- Enables UDP receive offload. If enabled, the socket may receive multiple datagrams worth of data as a single large buffer, together with a cmsg(3) that holds the segment size. This option is the inverse of segmentation offload. It reduces receive cost by handling multiple datagrams worth of data as a single large packet in the kernel receive path, even when that exceeds MTU. This option should not be used in code intended to be portable.
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. Attention : en utilisant FIONREAD, il est impossible de distinguer le cas où aucun datagramme n'est en attente du cas où le prochain datagramme en attente contient 0 octet de données. Il est préférable d'utiliser select(2), poll(2), ou epoll(7) pour différencier ces cas.
- 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 un socket UDP.
- ECONNREFUSED
- Aucun correspondant sur l'adresse destination associée au socket. Ça peut être causé par l'émission antérieure d'un paquet sur le socket.
VERSIONS¶
IP_RECVERR est une nouveauté de Linux 2.2.
VOIR AUSSI¶
ip(7), raw(7), socket(7), udplite(7)
Le fichier source du noyau Documentation/networking/ip-sysctl.txt.
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.
TRADUCTION¶
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org> et David Prévot <david@tilapin.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
2 mai 2024 | Pages du manuel de Linux (non publiées) |