udp - Protocole UDP pour IPv4
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.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 valable en argument. Lorsque
connect(2) est appelé sur une 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, 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 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
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 ; 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é.
UDP utilise le format d'adresse IPv4
sockaddr_in comme indiqué
dans
ip(7).
Toutes les erreurs fatales seront transmises à l'utilisateur comme un
retour d'erreur même lorsque la socket n'est pas connectée.
Ça comprend 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, 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 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 ; 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 de la socket et peuvent être lues
avec
recvmsg(2) en activant son option
MSG_ERRQUEUE.
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 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 file d’attente 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.
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.
Following is a list of UDP-specific socket options. For details of some other
socket options that are also applicable for UDP sockets, see
socket(7).
-
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.
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)
- Returns the number of data bytes in the local send queue.
Supported only with Linux 2.4 and above.
De plus, les ioctls documentés dans
ip(7) et
socket(7) sont
pris en charge.
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. Ça peut être
causé par l'émission antérieure d'un paquet sur la
socket.
IP_RECVERR est une nouveauté de Linux 2.2.
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.
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]> et David Prévot <
[email protected]>
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 à
[email protected]