dwww Home | Manual pages | Find package

ip(7)                  Miscellaneous Information Manual                  ip(7)

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 lo-
       cales. Si listen(2) est appelée sur un socket non affecté, celui-ci est
       automatiquement  attaché  à un port libre aléatoire, avec l'adresse lo-
       cale 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  à  IN-
       ADDR_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 at-
       tribut, car il rend le protocole TCP moins fiable.

   Format 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; /* 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 privi-
       lé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  im-
       plé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  in-
       terface  unique  d'un  hôte, les adresses de diffusion générale corres-
       pondent à tous les hôtes d'un réseau et les adresses de diffusion  mul-
       tiple  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 auto-
       risé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 ma-
       nipulation d'adresses et de ports de  la  bibliothèque  standard  fonc-
       tionnent 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) signi-
       fie  n'importe  quel  hôte et a le même effet sur l'attachement que IN-
       ADDR_ANY pour des raisons historiques.

   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 getso-
       ckopt(2). Le niveau d'option de sockets pour IP est IPPROTO_IP. Un  at-
       tribut 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  sys-
       tè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écep-
              tion  de  données uniquement depuis une source indiquée. L'argu-
              ment 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'appli-
       cation 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_MEMBER-
              SHIP.

              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'atta-
              chement à une adresse IP non locale ou  qui  n'existe  pas  (en-
              core). 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 atta-
              cher. 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 avan-
              cé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 diffu-
              sion multiple, consultez la RFC 3376.

       IP_MTU (depuis Linux 2.2)
              Récupérer la MTU du chemin actuellement déterminée pour  le  so-
              cket. 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  che-
              min (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'activa-
              tion de l'attribut interdisant la fragmentation sur tous les pa-
              quets sortants (bit DF — Don't Fragment). L'utilisateur est res-
              ponsable  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  fragmen-
              tera  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éci-
              fique 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  destina-
              tion  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  di-
              minuer 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 getso-
              ckopt(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 va-
              leur 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 so-
              cket 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  expli-
              citement  abonné  (par exemple en utilisant l'option IP_ADD_MEM-
              BERSHIP).

       IP_MULTICAST_IF (depuis Linux 1.2)
              Régler le périphérique local pour un socket  de  diffusion  mul-
              tiple.  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  get-
              sockopt(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  pa-
              quets  sortants  est désactivé dans la couche netfilter. L'argu-
              ment 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 à set-
              sockopt(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 re-
              quê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 pa-
              quets  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 ac-
              tivé 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 ac-
              tuelles.

       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 op-
              tion 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  en-
              tier.

              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 struc-
              ture pktinfo fournissant quelques informations sur le paquet en-
              trant. Cela ne fonctionne que pour les  sockets  orientés  data-
              gramme.  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  pa-
              quet.  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 nu-
              mé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 so-
              cket. 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 compre-
              nant 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'at-
              tente.  ee_origin  est  le  code  de  l'origine de l'erreur. Les
              autres champs sont spécifiques au protocole. La macro  SO_EE_OF-
              FENDER  renvoie un pointeur sur l'adresse d'un objet réseau d'où
              l'erreur provient en prenant en argument un pointeur sur le mes-
              sage  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  pro-
              viennent   du   réseau,   toutes  les  options  IP  (IP_OPTIONS,
              IP_TTL, etc.) valables pour le socket et contenues dans  le  pa-
              quet  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 va-
              lable  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 des-
              tination originelle du datagramme en train d'être reçu. Le  mes-
              sage 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 trai-
              té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  so-
              ckets  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 fil-
              tré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 mini-
              miser  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 com-
              portement 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 so-
              cket. 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éces-
              saires  pour l'activation de cette option de socket (la capacité
              CAP_NET_ADMIN).

              Cette option doit également être configurée sur le socket  redi-
              rigé 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 blo-
              qué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  per-
              missions 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 fi-
              nal 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 re-
              cherche en se basant sur l’association de chaque paquet.

   Interfaces /proc
       Le protocole IP prend en  charge  une  série  d'interfaces  /proc  pour
       configurer  certaines options globales. Les paramètres peuvent être ac-
       cé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  correspon-
       dante est activée si elle est différente de zéro (« true ») et désacti-
       vé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éassem-
              blé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  impor-
              tant.

              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 chan-
              geantes. 0 signifie aucune réécriture, 1 les autorise  et  2 de-
              mande 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 circum-
              stances:

              •  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  atta-
                 ché 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’inter-
              valle de ports éphémères est épuisé, alors l’appel système asso-
              cié 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 ar-
              bitraires peuvent poser des problèmes avec certains filtrages de
              pare-feu  qui  font des suppositions sur les ports locaux utili-
              sé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  che-
              mins  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  ip-
              frag_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'en-
              voi, 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  tou-
              jours le cas.

       ENOENT SIOCGSTAMP  a  été  appelé sur un socket qu'aucun paquet n'a at-
              teint.

       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.

       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 diffu-
       sions générales sans précaution. Pour les nouveaux protocoles  applica-
       tifs, 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  op-
       tions  de  socket  IP_RCVDSTADDR et IP_RECVIF pour obtenir l'adresse de
       destination et l'interface des datagrammes reçus. Linux  propose  l'op-
       tion IP_PKTINFO plus générale pour effectuer ce travail.

       Certaines  implémentations  BSD des sockets fournissent également l'op-
       tion 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  por-
       table, 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   so-
       cket(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  so-
       cket(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 exi-
       gences 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  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.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.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.

Pages du manuel de Linux 6.03   5 février 2023                           ip(7)

Generated by dwww version 1.15 on Sat Jun 29 01:49:50 CEST 2024.