ip – Implémentation Linux du protocole IPv4
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* Surensemble des précédents */
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocole);
Linux implémente le protocole Internet (IP)
version 4 décrit dans les RFC 791 et RFC 1122.
ip contient une implémentation de la diffusion multiple
niveau 2 conforme à la RFC 1112. Cette
implémentation inclut un routeur IP comprenant un filtre de
paquets.
L'interface de programmation est compatible avec les sockets BSD.
Pour plus d'informations sur les sockets, consultez socket(7).
Un socket IP est créé en utilisant
socket(2) :
socket(AF_INET, socket_type, protocol);
Les sockets autorisés incluent SOCK_STREAM pour
ouvrir un socket flux, SOCK_DGRAM pour ouvrir un socket datagramme et
SOCK_RAW pour ouvrir un socket raw(7) pour accéder
directement au protocole IP.
protocole est le protocole IP dans les en-têtes IP
reçus ou envoyés. Les valeurs autorisées pour
protocole incluent :
- •
- 0 et IPPROTO_TCP pour les sockets flux tcp(7) ;
- •
- 0 et IPPROTO_UDP pour les sockets datagramme
udp(7) ;
- •
- IPPROTO_SCTP pour les sockets flux sctp(7) ;
- •
- IPPROTO_UDPLITE pour les sockets datagramme udplite(7).
Pour SOCK_RAW un protocole IP IANA autorisé,
défini dans les numéros assignés de la RFC 1700,
peut être indiqué.
Lorsqu'un processus veut recevoir de nouveaux paquets entrants ou
des connexions, il doit attacher un socket à une adresse d'interface
locale en utilisant bind(2). Un seul socket IP peut être
attaché à une paire (adresse, port) locale donnée.
Lorsque INADDR_ANY est indiqué au moment de l'attachement, le
socket sera affecté à toutes les interfaces locales. Si
listen(2) est appelée sur un socket non affecté,
celui-ci est automatiquement attaché à un port libre
aléatoire, avec l'adresse locale définie à
INADDR_ANY. Si connect(2) est appelée sur un socket non
affecté, celui-ci est automatiquement attaché à un port
libre aléatoire ou un port partagé utilisable avec l'adresse
locale définie à INADDR_ANY.
L'adresse locale d'un socket TCP qui a été
attaché est indisponible pendant quelques instants après sa
fermeture, à moins que l'attribut SO_REUSEADDR ait
été activé. Il faut être prudent en utilisant
cet attribut, car il rend le protocole TCP moins fiable.
Une adresse de socket IP est définie comme la combinaison
d'une adresse IP d'interface et d'un numéro de port de
16 bits. Le protocole IP de base ne fournit pas de numéros de
port, ils sont implémentés par les protocoles de plus haut
niveau comme udp(7) et tcp(7). Sur les sockets raw, le champ
sin_port contient le protocole IP.
struct sockaddr_in {
sa_family_t sin_family; /* Famille d'adresses : AF_INET */
in_port_t sin_port; /* Port dans l'ordre des
octets réseau */
struct in_addr sin_addr; /* Adresse Internet */
};
/* Adresse Internet */
struct in_addr {
uint32_t s_addr; /* Adresse dans l'ordre des
octets réseau */
};
sin_family est toujours défini à
AF_INET. C'est indispensable : sous Linux 2.2, la
plupart des fonctions réseau renvoient EINVAL lorsque cette
définition est absente. sin_port contient le numéro de
port, dans l'ordre des octets du réseau. Les numéros de ports
inférieurs à 1024 sont dits privilégiés
(ou parfois réservés). Seuls les processus
privilégiés (sur Linux, ceux qui ont la capacité
CAP_NET_BIND_SERVICE dans l’espace de noms utilisateur
gouvernant son espace de noms réseau) peuvent appeler bind(2)
pour ces sockets. Le protocole IPv4 brut en tant que tel n'a pas le concept
de ports, ceux-ci étant seulement implémentés par des
protocoles de plus haut niveau comme tcp(7) et udp(7).
sin_addr est l'adresse IP de l'hôte. Le membre
s_addr de la structure in_addr contient l'adresse de
l'interface de l'hôte, dans l'ordre des octets du réseau.
in_addr devrait recevoir l'une des valeurs INADDR_*
(par exemple, INADDR_LOOPBACK) en utilisant htonl(3) ou
être défini à l’aide des fonctions de
bibliothèque inet_aton(3), inet_addr(3),
inet_makeaddr(3) ou directement par le système de
résolution des noms (consultez gethostbyname(3)).
Les adresses IPv4 sont divisées en adresses de diffusion
individuelle (unicast), de diffusion générale (broadcast) et
de diffusion multiple (multicast). Les adresses de diffusion individuelle
décrivent une interface unique d'un hôte, les adresses de
diffusion générale correspondent à tous les
hôtes d'un réseau et les adresses de diffusion multiple
représentent tous les hôtes d'un groupe de diffusion multiple.
Les datagrammes vers des adresses de diffusion générale ne
peuvent être émis et reçus que si l'attribut de socket
SO_BROADCAST est activé. Dans l'implémentation
actuelle, les sockets orientés connexion ne sont autorisés que
sur des adresses de diffusion individuelle.
Remarquez que l'adresse et le port sont toujours stockés
dans l'ordre des octets du réseau. Cela signifie en particulier qu'il
faut invoquer htons(3) sur le numéro attribué à
un port. Toutes les fonctions de manipulation d'adresses et de ports de la
bibliothèque standard fonctionnent dans l'ordre des octets du
réseau.
Il existe plusieurs adresses particulières :
INADDR_LOOPBACK (127.0.0.1) correspond toujours à
l'hôte local à l’aide du périphérique de
rebouclage (loopback), INADDR_ANY (0.0.0.0) signifie un attachement
à n'importe quelle adresse et INADDR_BROADCAST
(255.255.255.255) signifie n'importe quel hôte et a le même
effet sur l'attachement que INADDR_ANY pour des raisons
historiques.
IP gère quelques options de sockets spécifiques au
protocole qui peuvent être définies avec setsockopt(2)
et consultées avec getsockopt(2). Le niveau d'option de
sockets pour IP est IPPROTO_IP. Un attribut entier booléen est
faux quand il vaut zéro et vrai sinon.
Quand une option non autorisée de socket est
spécifiée, getsockopt(2) et setsockopt(2)
échouent avec l’erreur ENOPROTOOPT.
- IP_ADD_MEMBERSHIP
(depuis Linux 1.2)
- Rejoindre un groupe de diffusion multiple. L'argument est une structure
ip_mreqn.
struct ip_mreqn {
struct in_addr imr_multiaddr; /* Adresse IP du groupe
de diffusion multiple */
struct in_addr imr_address; /* Adresse IP de
l'interface locale */
int imr_ifindex; /* Numéro d'interface */
};
imr_multiaddr contient l'adresse du groupe de diffusion
multiple que l'application veut rejoindre ou quitter. Il doit s'agir d'une
adresse de diffusion multiple valable (sinon setsockopt(2)
échoue avec l'erreur EINVAL). imr_address est l'adresse
de l'interface locale avec laquelle le système doit joindre le groupe
de diffusion multiple. Si elle est égale à INADDR_ANY,
une interface appropriée est choisie par le système.
imr_ifindex est le numéro de l'interface qui doit rejoindre ou
quitter le groupe imr_multiaddr, ou zéro pour indiquer
n'importe quelle interface.
- La structure ip_mreqn n'est disponible que depuis Linux 2.2.
Pour la compatibilité, l'ancienne structure ip_mreq
(présente depuis Linux 1.2) est encore gérée.
Elle ne diffère de ip_mreqn que par l'absence du champ
imr_ifindex. Le noyau détermine quelle structure est
passée en se basant sur la taille passée à
optlen.
- IP_ADD_MEMBERSHIP est autorisé seulement pour
setsockopt(2).
- IP_ADD_SOURCE_MEMBERSHIP
(since Linux 2.4.22 / Linux 2.5.68)
- Rejoindre un groupe de diffusion multiple et autoriser la réception
de données uniquement depuis une source indiquée. L'argument
est une structure ip_mreq_source.
struct ip_mreq_source {
struct in_addr imr_multiaddr; /* Adresse IP du groupe
de diffusion multiple */
struct in_addr imr_interface; /* Adresse IP de
l'interface locale */
struct in_addr imr_sourceaddr; /* Adresse IP de la source
de diffusion multiple */
};
La structure ip_mreq_source est similaire à
ip_mreqn décrite sous IP_ADD_MEMBERSIP. Le champ
imr_multiaddr contient l'adresse du groupe de diffusion multiple que
l'application veut rejoindre ou quitter. Le champ imr_interface est
l'adresse de l'interface locale avec laquelle le système doit
rejoindre le groupe de diffusion multiple. Le champ imr_sourceaddr
contient l'adresse de la source depuis laquelle l'application veut recevoir
des données.
- Cette option peut être utilisée plusieurs fois pour
autoriser la réception depuis plusieurs sources.
- IP_BIND_ADDRESS_NO_PORT
(depuis Linux 4.2)
- Informer le noyau de ne pas réserver un port
éphémère lors de l’utilisation de
bind(2) avec un numéro de port égal à
zéro. Le port sera choisi plus tard automatiquement au moment de
connect(2) de façon à permettre de partager un port
source aussi longtemps que le quadruplet est unique.
- IP_BLOCK_SOURCE
(depuis Linux 2.4.22 et 2.5.68)
- Bloquer la réception de données en diffusion multiple depuis
une source spécifique pour un groupe donné. Cela n'est
possible qu'après que l'application s'est abonnée au groupe
de diffusion multiple en utilisant IP_ADD_MEMBERSHIP ou
IP_ADD_SOURCE_MEMBERSHIP.
- L'argument est une structure ip_mreq_source comme décrite
pour IP_ADD_SOURCE_MEMBERSHIP.
- IP_DROP_MEMBERSHIP
(depuis Linux 1.2)
- Quitter un groupe de diffusion multiple. L'argument est une structure
ip_mreqn ou ip_mreq similaire à
IP_ADD_MEMBERSHIP.
- IP_DROP_SOURCE_MEMBERSHIP
(since Linux 2.4.22 et 2.5.68)
- Leave a source-specific group—that is, stop receiving data from a
given multicast group that come from a given source. If the application
has subscribed to multiple sources within the same group, data from the
remaining sources will still be delivered. To stop receiving data from all
sources at once, use IP_DROP_MEMBERSHIP.
- L'argument est une structure ip_mreq_source comme décrite
pour IP_ADD_SOURCE_MEMBERSHIP.
- IP_FREEBIND
(depuis Linux 2.4)
- Si cette option est activée, cet attribut booléen permet
l'attachement à une adresse IP non locale ou qui n'existe pas
(encore). Cela permet d'écouter sur un socket, sans que l'interface
réseau sous-jacente ou l'adresse IP dynamique indiquée ne
soit opérationnelle au moment où l'application essaie de s'y
attacher. Cette option est l'équivalent spécifique au socket
de l'interface ip_nonlocal_bind de /proc décrite plus
bas.
- IP_HDRINCL
(depuis Linux 2.0)
- Si cette option est activée, l'utilisateur fournit un
en-tête IP avant les données utilisateur. Cette option n'est
valable que pour les sockets SOCK_RAW. Consultez raw(7) pour
plus de détails. Lorsque cet attribut est activé, les
valeurs définies pour IP_OPTIONS, IP_TTL et
IP_TOS sont ignorées.
- IP_MSFILTER
(depuis Linux 2.4.22 et 2.5.68)
- Cette option permet d'accéder à l'API de filtrage
d’états avancée. L'argument est une structure
ip_msfilter.
struct ip_msfilter {
struct in_addr imsf_multiaddr; /* Adresse IP du groupe
de diffusion multiple */
struct in_addr imsf_interface; /* Adresse IP de
l'interface locale */
uint32_t imsf_fmode; /* Mode de filtrage */
};
uint32_t imsf_numsrc; /* Nombre de sources dans
le tableau qui suit */
struct in_addr imsf_slist[1]; /* Tableau des adresses
sources */
};
Les deux macros MCAST_INCLUDE et MCAST_EXCLUDE
permettent d'identifier le mode de filtrage. De plus, la macro
IP_MSFILTER_SIZE(n) permet de déterminer la quantité de
mémoire nécessaire pour stocker une structure
ip_msfilter contenant n sources.
- Pour une description complète du filtrage des sources de diffusion
multiple, consultez la RFC 3376.
- IP_MTU (depuis
Linux 2.2)
- Récupérer la MTU du chemin actuellement
déterminée pour le socket. Renvoi d’un entier.
- IP_MTU est valable seulement pour getsockopt(2) et peut
être seulement employé quand le socket est
connecté.
- IP_MTU_DISCOVER
(depuis Linux 2.2)
- Définir ou récupérer la définition de
découverte de MTU de chemin (Path MTU discovery
— PMTUd) pour un socket. Lorsqu'elle est activée,
Linux effectuera la découverte de la MTU d'un chemin
conformément à la RFC 1191 sur les sockets
SOCK_STREAM. Pour les sockets autres que SOCK_STREAM,
IP_PMTUDISC_DO force l'activation de l'attribut interdisant la
fragmentation sur tous les paquets sortants (bit DF — Don't
Fragment). L'utilisateur est responsable de l'empaquetage des
données dans des blocs inférieurs à la MTU et doit
assurer la retransmission si besoin. Le noyau rejettera (avec l'erreur
EMSGSIZE) les datagrammes qui sont plus gros que la MTU du chemin
déterminée. IP_PMTUDISC_WANT fragmentera un
datagramme si nécessaire d'après la MTU du chemin, ou sinon
activera l'attribut interdisant la fragmentation.
- Les valeurs par défaut du système peuvent être
basculées entre IP_PMTUDISC_WANT et IP_PMTUDISC_DONT
en écrivant (respectivement la valeur zéro et une valeur
différente de zéro) dans le fichier
/proc/sys/net/ipv4/ip_no_pmtu_disc.
Valeur de découverte de MTU de
chemin |
Signification |
IP_PMTUDISC_WANT |
Utiliser une configuration par route |
IP_PMTUDISC_DONT |
Aucune découverte de MTU de chemin |
IP_PMTUDISC_DO |
Toujours découvrir la MTU de chemin |
IP_PMTUDISC_PROBE |
Activer DF mais ignorer la MTU de chemin |
Lorsque la découverte de la MTU de chemin est
activée, le noyau garde automatiquement une trace des MTU de
chemin par hôte de destination. Lorsqu'il est connecté
à un correspondant spécifique avec connect(2), la
MTU du chemin actuel déterminée peut être
consultée en utilisant l'option IP_MTU du socket (par
exemple, si une erreur EMSGSIZE se produit). La MTU de chemin
peut changer au cours du temps. Pour les sockets sans connexion avec
plusieurs destinations, la nouvelle MTU pour une destination
donnée peut également être obtenue en utilisant la
file d'erreurs (consultez IP_RECVERR). Une nouvelle erreur sera
mise en file d'attente pour chaque mise à jour de la MTU.
- Durant la recherche de la MTU, les paquets initiaux des sockets datagramme
peuvent être perdus. Les applications utilisant UDP doivent en
être informées et ne pas en tenir compte dans leur
stratégie de retransmission de paquet.
- Pour démarrer le processus de recherche de la MTU du chemin sur les
sockets non connectés, il est possible de démarrer avec une
grande taille de datagramme (jusqu'à 64 ko d'en-tête)
et la diminuer au fur et à mesure des mises à jours de la
MTU du chemin.
- Afin d'obtenir une estimation initiale de la MTU du chemin, il faut
connecter un socket datagramme à l'adresse de destination en
utilisant connect(2) et consulter la MTU en appelant
getsockopt(2) avec l'option IP_MTU.
- Il est possible d'implémenter la RFC 4821 pour les
recherches de MTU avec des sockets SOCK_DGRAM ou SOCK_RAW en
utilisant la valeur IP_PMTUDISC_PROBE (disponible depuis
Linux 2.6.22). C'est aussi particulièrement utile pour les
outils de diagnostic comme tracepath(8) qui veulent
délibérément envoyer des paquets sonde plus larges
que la MTU observée du chemin.
- IP_MULTICAST_ALL
(depuis Linux 2.6.31)
- Définir la politique de distribution des messages de diffusion
multiple aux sockets attachés à l'adresse joker
INADDR_ANY. Ce paramètre est un booléen (par
défaut à 1). Configuré à 1, le
socket recevra les messages destinés à tous les groupes
auxquels tout le système est abonné. Sinon, seuls seront
distribués les messages destinés à des groupes
auxquels le socket s'est explicitement abonné (par exemple en
utilisant l'option IP_ADD_MEMBERSHIP).
- IP_MULTICAST_IF
(depuis Linux 1.2)
- Régler le périphérique local pour un socket de
diffusion multiple. L’argument pour setsockopt(2) est une
structure ip_mreqn ou (depuis Linux 3.5) ip_mreq
similaire à IP_ADD_MEMBERSHIP, ou une structure
in_addr. Le noyau détermine quelle structure est
passée en se basant sur la taille passée dans optlen.
Pour getsockopt(2), l’argument est une structure
in_addr.
- IP_MULTICAST_LOOP
(depuis Linux 1.2)
- Définir ou lire un entier booléen indiquant si les paquets
de diffusion multiple doivent être renvoyés aux sockets
locaux.
- IP_MULTICAST_TTL
(depuis Linux 1.2)
- Définir ou lire la valeur du champ Time-to-Live des paquets de
diffusion multiple sortants sur ce socket. Il est très important
pour les paquets de diffusion multiple de définir ce champ le plus
petit possible. La valeur par défaut est 1, ce qui signifie
que les paquets de diffusion multiple ne quittent pas le réseau
local à moins que le programme de l'utilisateur ne le
réclame explicitement. L'argument est un entier.
- IP_NODEFRAG
(depuis Linux 2.6.36)
- Si activé (argument différent de zéro), le
réassemblage des paquets sortants est désactivé dans
la couche netfilter. L'argument est un entier.
- Cette option est valable seulement pour les sockets SOCK_RAW.
- IP_OPTIONS
(depuis Linux 2.0)
- Définir ou lire les options IP à envoyer avec chaque paquet
de ce socket. Les arguments sont un pointeur sur un tampon mémoire
contenant les options et la longueur des options. L'appel à
setsockopt(2) définit les options IP associées
à un socket. La taille maximale des options pour IPv4 vaut
40 octets. Consultez la RFC 791 pour les options
autorisées. Lorsque le paquet de requête de connexion
initiale d'un socket SOCK_STREAM contient des options IP, celles-ci
seront automatiquement réglées aux options du paquet initial
avec les en-têtes de routage inversés. Les paquets entrants
ne peuvent pas modifier les options après que la connexion a
été établie. Le traitement des options de routage des
paquets entrants est désactivé par défaut et peut
être activé en utilisant l'interface
accept_source_route de /proc. Les autres options, comme les
horodatages, sont toujours traitées. Pour les sockets datagramme,
les options IP ne peuvent être définies que par
l'utilisateur local. L'appel de getsockopt(2) avec
IP_OPTIONS remplit le tampon fourni avec les options IP
actuelles.
- IP_PASSSEC
(depuis Linux 2.6.17)
- Si Labeled IPsec ou si NetLabel est configuré sur les hôtes
émetteur et récepteur, cette option autorise la
réception du contexte de sécurité du socket pair dans
un message de service de type SCM_SECURITY
récupéré en utilisant recvmsg(2). Cette option
est uniquement gérée pour les sockets UDP. Pour les sockets
TCP ou SCTP, consultez la description de l’option SO_PEERSEC
ci-dessous.
- La valeur donnée comme argument pour setsockopt(2) et
renvoyée comme résultat de getsockopt(2) est un
indicateur booléen entier.
- Le contexte de sécurité renvoyé dans le message de
service SCM_SECURITY est du même format que celui
décrit dans l’option SO_PEERSEC ci-dessous.
- Remarque : la réutilisation du type SCM_SECURITY de
message pour l’option de socket IP_PASSSEC était
probablement une erreur, puisque d’autres messages de
contrôle IP utilisent leur propre schéma de
numérotation dans l’espace de noms IP et utilisent la valeur
d’option de socket comme type de message. Il n’y a pas de
conflit actuellement puisque l’option IP avec la même valeur
que SCM_SECURITY est IP_HDRINCL et cela n’est jamais
utilisé pour un type de message de contrôle.
- IP_PKTINFO
(depuis Linux 2.2)
- Fournir un message IP_PKTINFO de service qui contient une structure
pktinfo fournissant quelques informations sur le paquet entrant.
Cela ne fonctionne que pour les sockets orientés datagramme.
L'argument est un attribut indiquant au socket si le message
IP_PKTINFO doit être passé ou non. Le message
lui-même ne peut être écrit ou lu que comme message
de contrôle avec un paquet en utilisant recvmsg(2) ou
sendmsg(2).
-
struct in_pktinfo {
unsigned int ipi_ifindex; /* Numéro d'interface */
struct in_addr ipi_spec_dst; /* Adresse locale */
struct in_addr ipi_addr; /* Adresse de destination
dans l’en-tête*/
};
- ipi_ifindex est le numéro unique de l'interface sur laquelle
le paquet a été reçu. ipi_spec_dst est
l'adresse locale du paquet et ipi_addr est l'adresse de destination
dans l'en-tête du paquet. Si IP_PKTINFO est passé
à sendmsg(2) et ipi_spec_dst est différent de
zéro, alors il sera utilisé comme adresse source pour la
recherche dans la table de routage et pour définir les options de
routage IP. Si ipi_ifindex est différent de zéro,
l'adresse locale principale de l'interface indiquée par ce
numéro remplace ipi_spec_dst pour la recherche dans la table
de routage.
- IP_RECVERR
(depuis Linux 2.2)
- Activer le passage amélioré des messages d'erreur. Lorsque
cette option est activée pour un socket datagramme, toutes les
erreurs générées seront envoyées dans une file
d'erreurs propre au socket. Quand l'utilisateur détecte une erreur
d'opération sur le socket, celle-ci peut être
examinée en invoquant recvmsg(2) avec l'attribut
MSG_ERRQUEUE défini. La structure sock_extended_err
décrivant l'erreur sera passée comme message de service
ayant le type IP_RECVERR et le niveau IPPROTO_IP. Cela
permet une gestion d'erreur fiable sur les sockets non connectés.
La partie comprenant les données reçues de la file d'erreurs
contient le paquet ayant rencontré un problème.
- Le message de contrôle IP_RECVERR contient une structure
sock_extended_err :
-
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
struct sock_extended_err {
uint32_t ee_errno; /* Numéro d'erreur */
uint8_t ee_origin; /* Origine de l'erreur */
uint8_t ee_type; /* Type */
uint8_t ee_code; /* Code */
uint8_t ee_pad;
uint32_t ee_info; /* Données supplémentaires */
uint32_t ee_data; /* Autres données */
/* Des données supplémentaires peuvent suivre */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
- ee_errno contient le numéro de l'erreur errno mise en
file d'attente. ee_origin est le code de l'origine de l'erreur. Les
autres champs sont spécifiques au protocole. La macro
SO_EE_OFFENDER renvoie un pointeur sur l'adresse d'un objet
réseau d'où l'erreur provient en prenant en argument un
pointeur sur le message de service. Si cette adresse n'est pas connue, le
membre sa_family de la structure sockaddr contient
AF_UNSPEC et les autres champs de sockaddr ne sont pas
définis.
- IP utilise la structure sock_extended_err comme suit :
ee_origin contient SO_EE_ORIGIN_ICMP pour les erreurs
reçues sous forme de paquet ICMP ou SO_EE_ORIGIN_LOCAL pour
les erreurs locales. Les valeurs inconnues doivent être
ignorées. ee_type et ee_code sont définis
à partir des champs type et code de l'en-tête ICMP.
ee_info contient la MTU déterminée pour les erreurs
EMSGSIZE. Le message contient aussi l'adresse sockaddr_in du
nœud ayant causé l'erreur, qui peut être obtenu avec
la macro SO_EE_OFFENDER. Le champ sin_family de l'adresse
fournie par SO_EE_OFFENDER vaut AF_UNSPEC si la source
était inconnue. Lorsque les erreurs proviennent du réseau,
toutes les options IP (IP_OPTIONS, IP_TTL, etc.)
valables pour le socket et contenues dans le paquet d'erreur sont
transmises comme messages de contrôle. La charge utile du paquet
causant l'erreur est renvoyée comme charge normale. TCP n'a pas de
file d'erreurs et MSG_ERRQUEUE n'est pas permis sur les sockets
SOCK_STREAM. IP_RECVERR est valable pour TCP, mais toutes
les erreurs sont renvoyées par des fonctions de socket ou seulement
SO_ERROR.
- Pour les sockets raw, IP_RECVERR active le passage de toutes les
erreurs ICMP reçues à l'application, sinon les erreurs sont
seulement renvoyées sur les sockets connectés.
- Il définit ou récupère un attribut booléen
entier. IP_RECVERR est désactivée par
défaut.
- IP_RECVOPTS
(depuis Linux 2.2)
- Passer à l'utilisateur toutes les options IP entrantes dans un
message de contrôle IP_OPTIONS. L'en-tête de routage
et les autres options sont déjà remplies pour l'hôte
local. Cela n'est pas géré pour les sockets
SOCK_STREAM.
- IP_RECVORIGDSTADDR
(depuis Linux 2.6.29)
- Cet attribut booléen active le message IP_ORIGDSTADDR de
service dans recvmsg(2), dans lequel le noyau renvoie l'adresse de
destination originelle du datagramme en train d'être reçu.
Le message de service contient une structure sockaddr_in.
- IP_RECVTOS
(depuis Linux 2.2)
- Le message de service IP_TOS est passé avec les paquets
entrants si cette option est activée. Il contient un octet qui
décrit le champ Type-Of-Service/Precedence de l'en-tête du
paquet. Il s'agit d'un attribut entier booléen.
- IP_RECVTTL
(depuis Linux 2.2)
- Lorsque cet attribut est défini, passer un message de
contrôle IP_TTL avec le champ Time-to-Live du paquet
reçu, sous forme d’entier 32 bits. Cela n'est pas
géré pour les sockets SOCK_STREAM.
- IP_RETOPTS
(depuis Linux 2.2)
- Identique à IP_RECVOPTS, mais renvoyer les options raw non
traitées, avec les options d'enregistrement des horodatages et du
routage non remplies pour ce pas (hop).
- IP_ROUTER_ALERT
(depuis Linux 2.2)
- Passer tous les paquets à transférer avec l'option IP Router
Alert activée sur ce socket. Ce n'est valable que pour les sockets
raw et sert par exemple pour les démons RSVP de l'espace
utilisateur. Les paquets enregistrés ne sont pas redirigés
par le noyau, l'utilisateur est responsable de leur réacheminement.
La liaison du socket est ignorée et de tels paquets ne sont
filtrés que par le protocole. L’attribut est un entier.
- IP_TOS (depuis
Linux 1.0)
- Définir ou récupérer le champ Type-Of-Service (TOS)
envoyé avec chaque paquet IP sortant de ce socket. Cela sert
à gérer sur le réseau les priorités entre
paquets. TOS est un octet. Quelques attributs TOS standards sont
définis : IPTOS_LOWDELAY pour minimiser les
délais pour le trafic interactif, IPTOS_THROUGHPUT pour
optimiser le débit, IPTOS_RELIABILITY pour optimiser la
fiabilité, IPTOS_MINCOST qui doit être utilisé
pour les données de remplissage où la lenteur de
transmission importe peu. Une au maximum de ces valeurs TOS peut
être indiquée. Les autres bits ne sont pas valables et
doivent être effacés. Linux envoie d'abord des datagrammes
IPTOS_LOWDELAY par défaut, mais le comportement exact
dépend de la politique configurée pour la file d'attente.
Quelques niveaux de haute priorité peuvent réclamer les
privilèges du superutilisateur (la capacité
CAP_NET_ADMIN).
- IP_TRANSPARENT
(depuis Linux 2.6.24)
- Cet attribut booléen active le mandataire transparent sur ce
socket. Cette option de socket permet à l'application appelante de
s'attacher à une adresse IP non locale et de fonctionner à
la fois comme un client et un serveur avec l'adresse extérieure
comme point de terminaison local. Remarque : le routage doit
être configuré pour que les paquets envoyés vers
l'adresse extérieure soient routés à travers la
boîte TProxy (c'est-à-dire le système
hébergeant l'application utilisant l'option de socket
IP_TRANSPARENT). Les privilèges du superutilisateur sont
nécessaires pour l'activation de cette option de socket (la
capacité CAP_NET_ADMIN).
- Cette option doit également être configurée sur le
socket redirigé pour la redirection TProxy avec la cible iptables
TPROXY.
- IP_TTL (depuis
Linux 1.0)
- Définir ou récupérer le contenu actuel du champ
Time-to-Live utilisé avec chaque paquet envoyé depuis ce
socket.
- IP_UNBLOCK_SOURCE
(depuis Linux 2.4.22 et 2.5.68)
- Débloquer une source de diffusion multiple
précédemment bloquée. Renvoi de EADDRNOTAVAIL
si la source indiquée n'était pas bloquée.
- L'argument est une structure ip_mreq_source comme décrite
pour IP_ADD_SOURCE_MEMBERSHIP.
- SO_PEERSEC
(depuis Linux 2.6.17)
- Si Labeled IPsec ou si NetLabel est configuré sur les hôtes
émetteur et récepteur, cette option de socket en lecture
seule autorise la réception du contexte de sécurité
du socket pair connecté à ce socket. Par défaut, cela
sera le même contexte que celui du processus qui a
créé le socket pair à moins qu’il soit
outrepassé par la politique ou par un processus ayant les
permissions requises.
- L’argument de getsockopt(2) est un pointeur vers un tampon
de la longueur indiquée en octets dans lequel la chaîne de
contexte de sécurité sera copiée. Si la taille du
tampon est inférieure à celle de la chaîne du
contexte de sécurité, alors getsockopt(2)
renvoie -1, définit errno à
ERANGE et renvoie la taille requise à l’aide de
optlen. L’appelant doit allouer initialement au moins
NAME_MAX octets pour le tampon, bien que cela ne soit pas garanti
d'être suffisant. Redimensionner le tampon à la taille
renvoyée et réessayer peuvent être
nécessaires.
- La chaîne de contexte de sécurité peut inclure un
octet NULL final dans la taille renvoyée, mais il n’est pas
garanti que ce soit fait : un contexte de sécurité
« abc » peut être
représenté soit par {'a','b','c'} de taille 3, ou
{'a','b','c','\0'} de taille 4, qui sont considérés
comme interchangeables. La chaîne peut être affichée,
mais ne contient pas d’octet NULL final, et elle est dans un
encodage non précisé (en particulier, il n’est pas
garanti que ce soit ASCII ou UTF-8).
- L’utilisation de cette option pour les sockets de la famille
d’adresses AF_INET est prise en charge depuis
Linux 2.6.17 pour les sockets TCP et depuis Linux 4.17 pour
les sockets SCTP.
- Pour SELinux, NetLabel transmet uniquement la portion MLS du contexte de
sécurité du pair sur le réseau, laissant par
défaut le reste du contexte de sécurité aux valeurs
définies dans la politique pour l’identifiant de
sécurité initial netmsg (SID). Cependant, NetLabel peut
être configuré pour passer les contextes de
sécurité en entier sur la boucle locale. Labeled IPSEC passe
toujours les contextes de sécurité comme partie de
l’association de sécurité (security association
— SA) et les recherche en se basant sur l’association
de chaque paquet.
Le protocole IP prend en charge une série d'interfaces
/proc pour configurer certaines options globales. Les
paramètres peuvent être accédés en lisant ou
écrivant dans les fichiers du répertoire
/proc/sys/net/ipv4/. Les interfaces décrites comme des
booléens prennent une valeur entière. Celle-ci signifie que
l'option correspondante est activée si elle est différente de
zéro (« true ») et
désactivée si elle vaut zéro
(« false »).
- ip_always_defrag
(booléen ; depuis Linux 2.2.13)
- [New with Linux 2.2.13; in earlier kernel versions this feature was
controlled at compile time by the CONFIG_IP_ALWAYS_DEFRAG option;
this option is not present in Linux 2.4.x and later]
- Lorsque cet attribut booléen est activé (différent de
zéro), les fragments entrants (morceaux de paquets IP obtenus quand
un hôte entre l'origine et la destination a décidé
que les paquets étaient trop grands et les a coupés en
morceaux) seront réassemblés (défragmentés)
avant d'être traités, même s'ils doivent être
transférés.
- Cette option n'est à utiliser que pour un pare-feu qui est le seul
lien d'entrée du réseau ou pour un mandataire transparent.
Il ne faut jamais l'utiliser pour un routeur ou un hôte normal.
Sinon, les communications fragmentées peuvent être
perturbées si les fragments circulent dans des liaisons
différentes. La défragmentation a également un
coût mémoire et processeur important.
- C’est automatiquement activé lorsque le camouflage des
connexions (masquerading) ou le mandataire transparent sont
configurés.
- ip_autoconfig
(since Linux 2.2 to Linux 2.6.17)
- Non documenté.
- ip_default_ttl
(entier ; défaut : 64 ; depuis
Linux 2.2)
- Définir la valeur par défaut du champ Time-to-Live des
paquets sortants. Cela peut être modifié individuellement
pour chaque socket avec l'option IP_TTL.
- ip_dynaddr
(booléen ; désactivé par défaut ;
depuis Linux 2.0.31)
- Activer la réécriture dynamique des adresses de socket et du
masquerading lors du changement d'adresse d'interface. Cela sert pour les
liaisons téléphoniques avec des adresses IP changeantes.
0 signifie aucune réécriture, 1 les autorise
et 2 demande un mode bavard.
- ip_forward
(booléen ; désactivé par défaut) ;
depuis Linux 1.2
- Activer le transfert d'IP avec un attribut booléen. Le transfert
d'IP peut aussi être configuré interface par interface.
- ip_local_port_range
(depuis Linux 2.2)
- This file contains two integers that define the default local port range
allocated to sockets that are not explicitly bound to a port
number—that is, the range used for ephemeral ports. An
ephemeral port is allocated to a socket in the following
circumstances:
- •
- le numéro de port dans une adresse de socket est défini
à 0 en appelant bind(2) ;
- •
- listen(2) est appelé sur un socket de flux qui
n’était pas attaché auparavant ;
- •
- connect(2) a été appelée sur un socket qui
n’était pas attaché auparavant ;
- •
- sendto(2) est appelée sur un socket datagramme qui
n’était pas attaché auparavant.
- L’allocation de ports éphémères commence avec
le premier numéro de ip_local_port_range et se termine avec
le second. Si l’intervalle de ports éphémères
est épuisé, alors l’appel système
associé renvoie une erreur (mais consultez BOGUES).
- Remarquez que l’intervalle de ports dans ip_local_port_range
ne devrait pas entrer en conflit avec les ports utilisés pour le
masquerading (bien que cela soit traité). De même, des choix
arbitraires peuvent poser des problèmes avec certains filtrages de
pare-feu qui font des suppositions sur les ports locaux utilisés.
Le premier nombre doit être au moins supérieur à 1024
et, de préférence, à 4096 pour éviter les
collisions avec les ports officiels et minimiser les problèmes de
pare-feu.
- ip_no_pmtu_disc
(booléen ; désactivé par défaut) ;
depuis Linux 2.2
- Si activé, supprimer la découverte par défaut des MTU
des chemins pour les sockets TCP. La découverte de la MTU d'un
chemin peut échouer avec des pare-feu mal configurés (qui
rejettent tous les paquets ICMP) ou des interfaces mal configurées
(par exemple, une liaison point-à-point où les deux
extrémités n'ont pas la même MTU). Il vaut mieux
corriger le routeur défectueux que supprimer globalement la
découverte des MTU des chemins, car cette dernière option
entraîne un coût élevé pour le
réseau.
- ip_nonlocal_bind
(booléen ; désactivé par défaut ;
depuis Linux 2.4)
- Si défini, permettre aux processus de s'attacher avec
bind(2) à des adresses IP non locales, ce qui peut
être utile mais peut faire planter certaines applications.
- ip6frag_time
(entier ; défaut : 30)
- Définir le temps en secondes de conservation d'un fragment IPv6 en
mémoire.
- ip6frag_secret_interval
(entier ; défaut : 600)
- Définir l'intervalle de régénération (en
secondes) du secret de hachage (ou sa durée de vie) pour les
fragments IPv6.
- ipfrag_high_thresh
(entier), ipfrag_low_thresh (entier)
- Si le nombre de fragments IP en attente atteint ipfrag_high_thresh,
la file est restreinte à ipfrag_low_thresh. Contient un
entier avec le nombre d'octets.
- neigh/*
- Consultez arp(7).
Tous les ioctls décrits dans socket(7) s'appliquent
à ip.
Les ioctls pour configurer les paramètres
génériques des périphériques sont décrits
dans netdevice(7).
- EACCES
- L'utilisateur a essayé de réaliser une opération sans
avoir les permissions nécessaires. Cela inclut : l'envoi
d'un paquet vers une adresse de diffusion générale sans
avoir activé l'attribut SO_BROADCAST, l'envoi d'un paquet
par une route interdite, la modification du paramétrage du
pare-feu sans les privilèges du superutilisateur (la
capacité CAP_NET_ADMIN) et l'attachement à un port
privilégié sans les privilèges du superutilisateur
(la capacité CAP_NET_BIND_SERVICE).
- EADDRINUSE
- Tentative d'attachement à une adresse déjà
utilisée.
- EADDRNOTAVAIL
- Une interface inexistante a été demandée ou l'adresse
d'émission demandée n'était pas locale.
- EAGAIN
- L'opération sur un socket non bloquant devrait bloquer.
- EALREADY
- Une connexion est déjà en cours sur un socket non
bloquant.
- ECONNABORTED
- Une connexion a été fermée durant un appel à
accept(2).
- EHOSTUNREACH
- Aucune table de routage valable ne correspond à l'adresse de
destination. Cette erreur peut être due à un message ICMP
d'un routeur distant ou dans la table de routage interne.
- EINVAL
- Un argument non valable a été fourni. Pour les
opérations d'envoi, cela peut être causé par un envoi
vers une route trou noir.
- EISCONN
- connect(2) a été appelée sur un socket
déjà connecté.
- EMSGSIZE
- Un datagramme est plus grand qu’une MTU sur le chemin et ne peut
pas être fragmenté.
- ENOBUFS,
ENOMEM
- La mémoire libre est insuffisante. Cela signifie souvent que
l'allocation mémoire est contrainte par les limites du tampon de
socket, pas par la mémoire du système, mais ce n'est pas
toujours le cas.
- ENOENT
- SIOCGSTAMP a été appelé sur un socket qu'aucun
paquet n'a atteint.
- ENOPKG
- Un sous-système du noyau n'est pas configuré.
- ENOPROTOOPT
et EOPNOTSUPP
- Passage d'une option de socket non valable.
- ENOTCONN
- L'opération n'est définie que pour un socket
connecté, mais ce socket n'était pas connecté.
- EPERM
- L'utilisateur n'a pas la permission de définir une priorité
haute, de changer la configuration ou d'envoyer des signaux au groupe ou
au processus demandé.
- EPIPE
- La connexion a été fermée prématurément
ou volontairement par l'autre extrémité.
- ESOCKTNOSUPPORT
- Le socket n'est pas configuré ou un type de socket inconnu a
été demandé.
D'autres erreurs peuvent être déclenchées par
les protocoles des couches supérieures. Consultez tcp(7),
raw(7), udp(7) et socket(7).
IP_FREEBIND, IP_MSFILTER, IP_MTU,
IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PASSSEC,
IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT et
IP_TRANSPARENT sont spécifiques à Linux.
Soyez très prudents avec l'option SO_BROADCAST, elle
n'est pas privilégiée sous Linux. Il est facile de surcharger
un réseau avec des diffusions générales sans
précaution. Pour les nouveaux protocoles applicatifs, il vaut mieux
utiliser un groupe de diffusion multiple plutôt que la diffusion
générale. Cette dernière est
déconseillée.
Certaines autres implémentations des sockets BSD
fournissent les options de socket IP_RCVDSTADDR et IP_RECVIF
pour obtenir l'adresse de destination et l'interface des datagrammes
reçus. Linux propose l'option IP_PKTINFO plus
générale pour effectuer ce travail.
Certaines implémentations BSD des sockets fournissent
également l'option IP_RECVTTL, mais un message de service
ayant le type IP_RECVTTL est fourni avec le paquet entrant. C'est
différent de l'option IP_TTL utilisée sous Linux.
L'utilisation du niveau des options de socket SOL_IP n'est
pas portable, les piles basées sur BSD utilisent le niveau
IPPROTO_IP.
INADDR_ANY (0.0.0.0) and INADDR_BROADCAST
(255.255.255.255) are byte-order-neutral. This means htonl(3) has no
effect on them.
Pour la compatibilité avec Linux 2.0, la syntaxe
obsolète socket(AF_INET, SOCK_PACKET, protocole)
est encore gérée pour ouvrir un socket packet(7). Cela
est déconseillé et doit être remplacé par
socket(AF_PACKET, SOCK_RAW, protocole). La principale
différence est la nouvelle structure d'adresse sockaddr_ll
pour les informations génériques de la couche de liaison
à la place de l'ancienne sockaddr_pkt.
Il y a trop de valeurs d'erreurs
hétérogènes.
L’erreur utilisée pour diagnostiquer
l’épuisement de l’intervalle de ports
éphémères varie suivant les appels systèmes
(connect(2), bind(2), listen(2), sendto(2)) qui
peuvent assigner des ports éphémères.
Les ioctls pour configurer les options d'interface
spécifiques à IP et les tables ARP ne sont pas
décrites.
Receiving the original destination address with
MSG_ERRQUEUE in msg_name by recvmsg(2) does not work in
some Linux 2.2 kernels.
recvmsg(2), sendmsg(2), byteorder(3),
capabilities(7), icmp(7), ipv6(7), netdevice(7),
netlink(7), raw(7), socket(7), tcp(7),
udp(7), ip(8)
Le fichier source du noyau
Documentation/networking/ip-sysctl.txt.
RFC 791 pour les spécifications IP d'origine.
RFC 1122 pour les exigences IPv4 des hôtes. RFC 1812
pour les exigences IPv4 des routeurs.
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>, David Prévot <david@tilapin.org> et
Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
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.