ip
Table des matières
Retour à l'index
NOM
ip – Implémentation Linux du protocole IPv4
SYNOPSIS
#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);
DESCRIPTION
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.
Formats d'adresse
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; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
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.
Special and reserved addresses
There are several special addresses:
- INADDR_LOOPBACK (127.0.0.1)
-
always refers to the local host via the loopback device;
- INADDR_ANY (0.0.0.0)
-
means any address for socket binding;
- INADDR_BROADCAST (255.255.255.255)
-
has the same effect on bind(2) as INADDR_ANY for historical reasons.
A packet addressed to INADDR_BROADCAST through a socket which has
SO_BROADCAST set will be broadcast to all hosts on the local network
segment, as long as the link is broadcast-capable.
- Highest-numbered address
-
Lowest-numbered address
On any locally-attached non-point-to-point IP subnet with a link type that
supports broadcasts, the highest-numbered address (e.g., the .255 address on
a subnet with netmask 255.255.255.0) is designated as a broadcast address.
It cannot usefully be assigned to an individual interface, and can only be
addressed with a socket on which the SO_BROADCAST option has been set.
Internet standards have historically also reserved the lowest-numbered
address (e.g., the .0 address on a subnet with netmask 255.255.255.0) for
broadcast, though they call it "obsolete" for this purpose. (Some sources
also refer to this as the "network address.") Since Linux 5.14, it is
treated as an ordinary unicast address and can be assigned to an interface.
Internet standards have traditionally also reserved various addresses for
particular uses, though Linux no longer treats some of these specially.
- [0.0.0.1, 0.255.255.255]
-
[240.0.0.0, 255.255.255.254]
Addresses in these ranges (0/8 and 240/4) are reserved globally. Since
Linux 5.3 and Linux 2.6.25, respectively, the 0/8 and 240/4 addresses, other
than INADDR_ANY and INADDR_BROADCAST, are treated as ordinary unicast
addresses. Systems that follow the traditional behaviors may not
interoperate with these historically reserved addresses.
- [127.0.0.1, 127.255.255.254]
-
Addresses in this range (127/8) are treated as loopback addresses akin to
the standardized local loopback address INADDR_LOOPBACK (127.0.0.1);
- [224.0.0.0, 239.255.255.255]
-
Addresses in this range (224/4) are dedicated to multicast use.
Options de socket
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_LOCAL_PORT_RANGE (since Linux 6.3)
-
Set or get the per-socket default local port range. This option can be used
to clamp down the global local port range, defined by the
ip_local_port_range /proc interface described below, for a given
socket.
-
The option takes an uint32_t value with the high 16 bits set to the upper
range bound, and the low 16 bits set to the lower range bound. Range bounds
are inclusive. The 16-bit values should be in host byte order.
-
The lower bound has to be less than the upper bound when both bounds are not
zero. Otherwise, setting the option fails with EINVAL.
-
If either bound is outside of the global local port range, or is zero, then
that bound has no effect.
-
To reset the setting, pass zero as both the upper and the lower bound.
- 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; /* IP multicast group
address */
struct in_addr imsf_interface; /* IP address of local
interface */
uint32_t imsf_fmode; /* Filter-mode */
uint32_t imsf_numsrc; /* Number of sources in
the following array */
struct in_addr imsf_slist[1]; /* Array of source
addresses */
};
-
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)
-
This option can be used to modify the delivery policy of multicast
messages. The argument is a boolean integer (defaults to 1). If set to 1,
the socket will receive messages from all the groups that have been joined
globally on the whole system. Otherwise, it will deliver messages only from
the groups that have been explicitly joined (for example via the
IP_ADD_MEMBERSHIP option) on this particular socket.
- 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.
-
Not supported for SOCK_STREAM sockets.
- 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; /* error number */
uint8_t ee_origin; /* where the error originated */
uint8_t ee_type; /* type */
uint8_t ee_code; /* code */
uint8_t ee_pad;
uint32_t ee_info; /* additional information */
uint32_t ee_data; /* other data */
/* More data may follow */
};
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)
-
This boolean option enables the IP_ORIGDSTADDR ancillary message in
recvmsg(2), in which the kernel returns the original destination address
of the datagram being received. The ancillary message contains a struct sockaddr_in. Not supported for SOCK_STREAM sockets.
- IP_RECVTOS (depuis Linux 2.2)
-
If enabled, the IP_TOS ancillary message is passed with incoming
packets. It contains a byte which specifies the Type of Service/Precedence
field of the packet header. Expects a boolean integer flag. Not supported
for SOCK_STREAM sockets.
- 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)
-
Identical to IP_RECVOPTS, but returns raw unprocessed options with
timestamp and route record options not filled in for this hop. Not
supported for SOCK_STREAM sockets.
- 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.
/proc interfaces
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 (integer)
-
ipfrag_low_thresh (integer)
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).
Ioctls
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).
ERREURS
- 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).
NOTES
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.
Be very careful with the SO_BROADCAST option - it is not privileged in
Linux. It is easy to overload the network with careless broadcasts. For
new application protocols it is better to use a multicast group instead of
broadcasting. Broadcasting is discouraged. See RFC 6762 for an example of
a protocol (mDNS) using the more modern multicast approach to communicating
with an open-ended group of hosts on the local network.
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.
Compatibilité
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.
BOGUES
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.
VOIR AUSSI
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.
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>,
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 à
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- Formats d'adresse
-
- Special and reserved addresses
-
- Options de socket
-
- /proc interfaces
-
- Ioctls
-
- ERREURS
-
- NOTES
-
- Compatibilité
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:37 GMT, September 19, 2025