udp(7) Miscellaneous Information Manual udp(7) NOM udp - Protocole UDP pour IPv4 SYNOPSIS #include #include #include udp_socket = socket(AF_INET, SOCK_DGRAM, 0); DESCRIPTION Il s'agit d'une implementation de l'User Datagram Protocol decrit dans la RFC 768. Elle implemente un service de paquets datagrammes non fiable, sans connexion. Les paquets peuvent etre reordonnes ou dupliques avant leur arrivee. UDP cree et verifie des sommes de controle pour detecter les erreurs de transmission. Lorsqu'un socket UDP est cree, ses adresses locales et distantes sont indeterminees. Les datagrammes peuvent etre envoyes immediatement en utilisant sendto(2) ou sendmsg(2) avec une adresse de destination valable en argument. Lorsque connect(2) est appele sur un socket, l'adresse de destination par defaut est definie, et les datagrammes pourront etre envoyes avec send(2) ou write(2) sans indiquer d'adresse de destination. Il restera possible d'envoyer des donnees a d'autres destinations en passant l'adresse a sendto(2) ou sendmsg(2). Afin de recevoir les paquets, un socket doit etre attache a une adresse locale en utilisant bind(2). Sinon, la couche socket affectera automatiquement un port local libre, hors de l'intervalle defini par /proc/sys/net/ipv4/ip_local_port_range et attacher le socket a l'adresse INADDR_ANY. Les operations de reception ne renvoient qu'un seul paquet a la fois. Si le paquet est plus petit que le tampon transmis, il n'y aura pas plus de donnees renvoyees. S'il est plus grand, le paquet sera tronque et le drapeau MSG_TRUNC sera active. MSG_WAITALL n'est pas pris en charge. Les options IP peuvent etre envoyees ou lues en utilisant les options des sockets decrites dans ip(7). Elles ne sont traitees par le noyau que lorsque le parametre /proc approprie est active (mais sont quand meme fournies a l'utilisateur quant il est inhibe). Consultez ip(7). Quand l'attribut MSG_DONTROUTE est actif a l'emission, l'adresse de destination doit representer une adresse d'interface locale, et le paquet n'est envoye qu'a cette interface. Par defaut, l'UDP sous Linux utilise la detection de MTU (<< Maximum Transmission Unit >>) par chemin. Cela signifie que le noyau garde en memoire le MTU vers une adresse IP particuliere, et renvoie EMSGSIZE lorsqu'une ecriture sur un socket UDP depasse cette taille. Dans ce cas, l'application doit reduire la taille du paquet. La detection de MTU par chemin peut etre desactivee 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 details. Lorsque cette option est desactivee, UDP fragmente les paquets sortants dont la taille depasse le MTU de l'interface. C'est cependant decourage, pour des raisons de performance et de fiabilite. Formats d'adresse UDP utilise le format d'adresse IPv4 sockaddr_in comme indique dans ip(7). Traitement des erreurs Toutes les erreurs fatales seront transmises a l'utilisateur comme un retour d'erreur meme lorsque le socket n'est pas connecte. Ca comprend les erreurs asynchrones recues du reseau. Vous pouvez ainsi recevoir une erreur due a un paquet precedemment envoye sur le meme socket. Ce comportement differe de celui de nombreuses autres implementations des sockets BSD, qui ne transmettent pas d'erreur si le socket n'est pas connecte. Le comportement de Linux correspond a la RFC 1122. Pour assurer la compatibilite avec du code ancien, sous Linux 2.0 et 2.2, l'option SOL_SOCKET SO_BSDCOMPAT pouvait etre definie pour ne recevoir les erreurs distantes que si le socket a ete connecte (sauf pour EPROTO et EMSGSIZE). Les erreurs locales sont toujours transmises. La gestion de cette option a ete supprimee dans les noyaux plus recents ; consultez socket(7) pour plus d'informations. Lorsque l'option IP_RECVERR est active, toutes les erreurs sont stockees dans la file d'erreur du socket et peuvent etre lues avec recvmsg(2) en activant son option MSG_ERRQUEUE. /proc interfaces La configuration des parametres systeme pour UDP est accessible par les fichiers du repertoire /proc/sys/net/ipv4/. udp_mem (depuis Linux 2.6.25) C'est un vecteur de trois entiers qui controle 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 appetit en memoire. Quand la quantite de memoire allouee par UDP depasse cette valeur, UDP commence a limiter son utilisation memoire. pressure Cette valeur a ete 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 defaut pour ces trois elements sont calculees au demarrage a partir de la quantite de memoire disponible. udp_rmem_min (entier ; PAGE_SIZE par defaut ; depuis Linux 2.6.25) Taille minimale, en octets, des tampons de reception utilises par les sockets UDP dans le mode de moderation. Chaque socket UDP peut utiliser cette taille pour recevoir des donnees, meme si le nombre total de pages pour les sockets UDP depasse le seuil udp_mem. udp_wmem_min (entier ; PAGE_SIZE par defaut ; depuis Linux 2.6.25) Taille minimale, en octets, du tampon d'emission utilise par les sockets UDP dans le mode de moderation. Chaque socket UDP peut utiliser cette taille pour envoyer des donnees, meme si le nombre total de pages pour les sockets UDP depasse le seuil udp_mem. Options de socket Pour lire ou ecrire une option de socket UDP, appeler getsockopt(2) pour la lecture ou setsockopt(2) pour l'ecriture, avec l'argument de niveau d'option valant IPPROTO_UDP. Sauf mention contraire, optval est un pointeur vers un int. Voila une liste des options specifiques a UDP. Pour des details 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 donnees en sortie sur ce socket sont accumulees dans un unique datagramme qui est emis des que l'option est desactivee. Cette option ne doit pas etre utilisee dans des programmes destines a etre 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 a travers l'appel systeme 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 ecrit 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 ou aucun datagramme n'est en attente du cas ou le prochain datagramme en attente contient 0 octet de donnees. Il est preferable d'utiliser select(2), poll(2), ou epoll(7) pour differencier ces cas. TIOCOUTQ (SIOCOUTQ) Renvoie le nombre d'octets de donnees dans la file d'emission locale. Seulement sur Linux 2.4 et ulterieurs. De plus, les ioctls documentes dans ip(7) et socket(7) sont pris en charge. ERREURS Toutes les erreurs documentees pour socket(7) ou ip(7) peuvent etre renvoyees lors d'une emission ou d'une reception sur un socket UDP. ECONNREFUSED Aucun correspondant sur l'adresse destination associee au socket. Ca peut etre cause par l'emission anterieure d'un paquet sur le socket. VERSIONS IP_RECVERR est une nouveaute 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 necessites de l'hote. RFC 1191 pour une description de la recherche du MTU du chemin. TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier et David Prevot Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 udp(7)