Provided by: manpages-fr_4.13-4_all bug

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, type_socket, protocole);

       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.

   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
       privilégiés  (sur  Linux,  ceux  qui ont la capacité CAP_NET_BIND_SERVICE dans l’espace de
       noms utilisateur gouvernant son espace de noms réseau) peuvent appeler  bind(2)  pour  ces
       sockets. Le protocole IPv4 brut en tant que tel n'a pas le concept de ports, ceux-ci étant
       seulement implémentés par des protocoles de plus haut niveau comme tcp(7) et udp(7).

       sin_addr est l'adresse IP de l'hôte. Le membre s_addr de  la  structure  in_addr  contient
       l'adresse  de  l'interface  de  l'hôte, dans l'ordre des octets du réseau. in_addr devrait
       recevoir l'une des valeurs INADDR_* (par exemple, INADDR_LOOPBACK) en  utilisant  htonl(3)
       ou  être  défini  à  l’aide  des  fonctions  de  bibliothèque  inet_aton(3), inet_addr(3),
       inet_makeaddr(3)  ou  directement  par  le  système  de  résolution  des  noms  (consultez
       gethostbyname(3)).

       Les  adresses  IPv4  sont  divisées  en  adresses  de diffusion individuelle (unicast), de
       diffusion générale (broadcast) et de  diffusion  multiple  (multicast).  Les  adresses  de
       diffusion individuelle décrivent une interface unique d'un hôte, les adresses de diffusion
       générale correspondent à tous les hôtes d'un réseau et les adresses de diffusion  multiple
       représentent  tous  les  hôtes d'un groupe de diffusion multiple. Les datagrammes vers des
       adresses de diffusion générale ne peuvent être émis et reçus que si l'attribut  de  socket
       SO_BROADCAST est activé. Dans l'implémentation actuelle, les sockets orientés connexion ne
       sont autorisés que sur des adresses de diffusion individuelle.

       Remarquez que l'adresse et le port sont  toujours  stockés  dans  l'ordre  des  octets  du
       réseau. Cela signifie en particulier qu'il faut invoquer htons(3) sur le numéro attribué à
       un port. Toutes les fonctions de manipulation d'adresses et de ports  de  la  bibliothèque
       standard fonctionnent dans l'ordre des octets du réseau.

       Il  existe  plusieurs  adresses  particulières :  INADDR_LOOPBACK  (127.0.0.1)  correspond
       toujours à l'hôte local à l’aide du  périphérique  de  rebouclage  (loopback),  INADDR_ANY
       (0.0.0.0)   signifie  un  attachement  à  n'importe  quelle  adresse  et  INADDR_BROADCAST
       (255.255.255.255) signifie n'importe quel hôte et a le même effet  sur  l'attachement  que
       INADDR_ANY pour des raisons historiques.

   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 (depuis Linux 2.4.22 et 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)
              Quitter un groupe spécifique à une source, c'est-à-dire  arrêter  de  recevoir  des
              données   depuis   une  source  donnée  pour  un  groupe  de  diffusion  donné.  Si
              l'application est abonnée à d'autres  sources  du  même  groupe,  les  données  des
              sources  restantes  seront  toujours  transmises.  Pour  couper la réception depuis
              toutes les sources, utilisez IP_DROP_MEMBERSHIP.

              L'argument    est    une    structure    ip_mreq_source    comme    décrite    pour
              IP_ADD_SOURCE_MEMBERSHIP.

       IP_FREEBIND (depuis Linux 2.4)
              Si  cette  option  est  activée,  cet  attribut  booléen permet l'attachement à une
              adresse IP non locale ou qui n'existe pas (encore). Cela permet  d'écouter  sur  un
              socket, sans que l'interface réseau sous-jacente ou l'adresse IP dynamique indiquée
              ne soit opérationnelle au moment où l'application essaie  de  s'y  attacher.  Cette
              option  est  l'équivalent  spécifique  au socket de l'interface ip_nonlocal_bind de
              /proc décrite plus bas.

       IP_HDRINCL (depuis Linux 2.0)
              Si cette option est activée, l'utilisateur fournit un en-tête IP avant les  données
              utilisateur.  Cette  option  n'est valable que pour les sockets SOCK_RAW. Consultez
              raw(7) pour plus de détails. Lorsque cet attribut est activé, les valeurs  définies
              pour IP_OPTIONS, IP_TTL et IP_TOS sont ignorées.

       IP_MSFILTER (depuis Linux 2.4.22 et 2.5.68)
              Cette  option  permet d'accéder à l'API de filtrage d’états avancée. L'argument est
              une structure ip_msfilter.

           struct ip_msfilter {
               struct in_addr imsf_multiaddr; /* Adresse IP du groupe
                                                 de diffusion multiple */
               struct in_addr imsf_interface; /* Adresse IP de
                                                 l'interface locale */
               uint32_t       imsf_fmode;     /* Mode de filtrage */
           };

               uint32_t       imsf_numsrc;    /* Nombre de sources dans
                                                 le tableau qui suit */
               struct in_addr imsf_slist[1];  /* Tableau des adresses
                                                 sources */
           };

       Les deux  macros  MCAST_INCLUDE  et  MCAST_EXCLUDE  permettent  d'identifier  le  mode  de
       filtrage.  De  plus,  la  macro  IP_MSFILTER_SIZE(n)  permet  de déterminer la quantité de
       mémoire nécessaire pour stocker une structure ip_msfilter contenant n sources.

              Pour une description complète  du  filtrage  des  sources  de  diffusion  multiple,
              consultez la RFC 3376.

       IP_MTU (depuis Linux 2.2)
              Récupérer  la  MTU  du  chemin  actuellement déterminée pour le socket. Renvoi d’un
              entier.

              IP_MTU est valable seulement pour getsockopt(2)  et  peut  être  seulement  employé
              quand le socket est connecté.

       IP_MTU_DISCOVER (depuis Linux 2.2)
              Définir  ou  récupérer  la  définition  de  découverte  de  MTU de chemin (Path MTU
              discovery — PMTUd) pour un socket. Lorsqu'elle est  activée,  Linux  effectuera  la
              découverte  de  la  MTU  d'un  chemin  conformément  à  la RFC 1191 sur les sockets
              SOCK_STREAM.  Pour  les  sockets  autres  que  SOCK_STREAM,  IP_PMTUDISC_DO   force
              l'activation  de  l'attribut  interdisant  la  fragmentation  sur  tous les paquets
              sortants (bit DF — Don't Fragment). L'utilisateur est responsable de  l'empaquetage
              des données dans des blocs inférieurs à la MTU et doit assurer la retransmission si
              besoin. Le noyau rejettera (avec l'erreur EMSGSIZE) les datagrammes qui  sont  plus
              gros que la MTU du chemin déterminée. IP_PMTUDISC_WANT fragmentera un datagramme si
              nécessaire d'après la MTU du chemin, ou sinon activera  l'attribut  interdisant  la
              fragmentation.

              Les  valeurs par défaut du système peuvent être basculées entre IP_PMTUDISC_WANT et
              IP_PMTUDISC_DONT  en  écrivant  (respectivement  la  valeur  zéro  et  une   valeur
              différente de zéro) dans le fichier /proc/sys/net/ipv4/ip_no_pmtu_disc.

              Valeur de découverte de MTU de chemin   Signification
              IP_PMTUDISC_WANT                        Utiliser une configuration par route
              IP_PMTUDISC_DONT                        Aucune découverte de MTU de chemin
              IP_PMTUDISC_DO                          Toujours découvrir la MTU de chemin
              IP_PMTUDISC_PROBE                       Activer DF mais ignorer la MTU de chemin

              Lorsque   la   découverte  de  la  MTU  de  chemin  est  activée,  le  noyau  garde
              automatiquement une trace des MTU de chemin par hôte de destination. Lorsqu'il  est
              connecté  à  un  correspondant  spécifique avec connect(2), la MTU du chemin actuel
              déterminée peut être consultée en utilisant l'option IP_MTU du socket (par exemple,
              si  une  erreur  EMSGSIZE  se  produit).  La MTU de chemin peut changer au cours du
              temps. Pour les sockets sans connexion avec plusieurs destinations, la nouvelle MTU
              pour  une  destination  donnée  peut  également  être  obtenue en utilisant la file
              d'erreurs (consultez IP_RECVERR). Une nouvelle erreur sera mise en  file  d'attente
              pour chaque mise à jour de la MTU.

              Durant  la recherche de la MTU, les paquets initiaux des sockets datagramme peuvent
              être perdus. Les applications utilisant UDP doivent en être informées et ne pas  en
              tenir compte dans leur stratégie de retransmission de paquet.

              Pour  démarrer  le  processus  de recherche de la MTU du chemin sur les sockets non
              connectés, il est possible  de  démarrer  avec  une  grande  taille  de  datagramme
              (jusqu'à 64 ko d'en-tête) et la diminuer au fur et à mesure des mises à jours de la
              MTU du chemin.

              Afin d'obtenir une estimation initiale de la MTU du chemin, il  faut  connecter  un
              socket  datagramme  à l'adresse de destination en utilisant connect(2) et consulter
              la MTU en appelant getsockopt(2) avec l'option IP_MTU.

              Il est possible d'implémenter la RFC 4821 pour  les  recherches  de  MTU  avec  des
              sockets SOCK_DGRAM ou SOCK_RAW en utilisant la valeur IP_PMTUDISC_PROBE (disponible
              depuis Linux 2.6.22).  C'est  aussi  particulièrement  utile  pour  les  outils  de
              diagnostic  comme  tracepath(8)  qui veulent délibérément envoyer des paquets sonde
              plus larges que la MTU observée du chemin.

       IP_MULTICAST_ALL (depuis Linux 2.6.31)
              Définir la politique de distribution des messages de diffusion multiple aux sockets
              attachés  à  l'adresse  joker  INADDR_ANY.  Ce paramètre est un booléen (par défaut
              à 1). Configuré à 1, le socket recevra les messages destinés  à  tous  les  groupes
              auxquels  tout  le  système est abonné. Sinon, seuls seront distribués les messages
              destinés à des groupes auxquels le socket s'est explicitement abonné  (par  exemple
              en utilisant l'option IP_ADD_MEMBERSHIP).

       IP_MULTICAST_IF (depuis Linux 1.2)
              Régler  le périphérique local pour un socket de diffusion multiple. L’argument pour
              setsockopt(2) est une structure ip_mreqn ou (depuis Linux 3.5) ip_mreq similaire  à
              IP_ADD_MEMBERSHIP,  ou  une  structure in_addr. Le noyau détermine quelle structure
              est passée en se basant sur la  taille  passée  dans  optlen.  Pour  getsockopt(2),
              l’argument est une structure in_addr.

       IP_MULTICAST_LOOP (depuis Linux 1.2)
              Définir  ou  lire  un entier booléen indiquant si les paquets de diffusion multiple
              doivent être renvoyés aux sockets locaux.

       IP_MULTICAST_TTL (depuis Linux 1.2)
              Définir ou lire la valeur du champ Time-to-Live des paquets de  diffusion  multiple
              sortants  sur  ce  socket.  Il  est  très  important  pour les paquets de diffusion
              multiple de définir ce champ le plus petit possible. La valeur par défaut est 1, ce
              qui  signifie que les paquets de diffusion multiple ne quittent pas le réseau local
              à moins que le programme de l'utilisateur ne le réclame  explicitement.  L'argument
              est un entier.

       IP_NODEFRAG (depuis Linux 2.6.36)
              Si  activé  (argument  différent de zéro), le réassemblage des paquets sortants est
              désactivé dans la couche netfilter. L'argument est un entier.

              Cette option est valable seulement pour les sockets SOCK_RAW.

       IP_OPTIONS (depuis Linux 2.0)
              Définir ou lire les options IP à envoyer avec  chaque  paquet  de  ce  socket.  Les
              arguments  sont  un  pointeur  sur  un  tampon  mémoire contenant les options et la
              longueur des options. L'appel à setsockopt(2) définit les options IP associées à un
              socket.  La  taille  maximale  des  options  pour IPv4 vaut 40 octets. Consultez la
              RFC 791 pour les options autorisées. Lorsque le  paquet  de  requête  de  connexion
              initiale  d'un  socket  SOCK_STREAM  contient  des  options  IP,  celles-ci  seront
              automatiquement réglées aux options du paquet initial avec les en-têtes de  routage
              inversés.  Les  paquets  entrants  ne peuvent pas modifier les options après que la
              connexion a été établie. Le traitement des options de routage des paquets  entrants
              est   désactivé   par   défaut   et  peut  être  activé  en  utilisant  l'interface
              accept_source_route de /proc. Les  autres  options,  comme  les  horodatages,  sont
              toujours  traitées.  Pour  les  sockets  datagramme, les options IP ne peuvent être
              définies que par l'utilisateur local.  L'appel  de  getsockopt(2)  avec  IP_OPTIONS
              remplit le tampon fourni avec les options IP actuelles.

       IP_PASSSEC (depuis Linux 2.6.17)
              Si  Labeled IPsec ou si NetLabel est configuré sur les hôtes émetteur et récepteur,
              cette option autorise la réception du contexte de sécurité du socket pair  dans  un
              message  de  service  de  type SCM_SECURITY récupéré en utilisant recvmsg(2). Cette
              option est uniquement gérée pour les sockets UDP. Pour les  sockets  TCP  ou  SCTP,
              consultez la description de l’option SO_PEERSEC ci-dessous.

              La  valeur  donnée  comme argument pour setsockopt(2) et renvoyée comme résultat de
              getsockopt(2) est un indicateur booléen entier.

              Le contexte de sécurité renvoyé dans le message de service SCM_SECURITY est du même
              format que celui décrit dans l’option SO_PEERSEC ci-dessous.

              Remarque : la réutilisation du type SCM_SECURITY de message pour l’option de socket
              IP_PASSSEC était probablement une erreur, puisque d’autres messages de contrôle  IP
              utilisent  leur propre schéma de numérotation dans l’espace de noms IP et utilisent
              la valeur d’option de socket comme type  de  message.  Il  n’y  a  pas  de  conflit
              actuellement  puisque  l’option  IP  avec  la  même  valeur  que  SCM_SECURITY  est
              IP_HDRINCL et cela n’est jamais utilisé pour un type de message de contrôle.

       IP_PKTINFO (depuis Linux 2.2)
              Fournir un message  IP_PKTINFO  de  service  qui  contient  une  structure  pktinfo
              fournissant  quelques  informations  sur  le paquet entrant. Cela ne fonctionne que
              pour les sockets orientés datagramme.  L'argument  est  un  attribut  indiquant  au
              socket si le message IP_PKTINFO doit être passé ou non. Le message lui-même ne peut
              être écrit ou lu que  comme  message  de  contrôle  avec  un  paquet  en  utilisant
              recvmsg(2) ou sendmsg(2).

                  struct in_pktinfo {
                      unsigned int   ipi_ifindex;   /* Numéro d'interface     */
                      struct in_addr ipi_spec_dst;  /* Adresse locale         */
                      struct in_addr ipi_addr;      /* Adresse de destination
                                                       dans l’en-tête*/
                  };

              ipi_ifindex  est le numéro unique de l'interface sur laquelle le paquet a été reçu.
              ipi_spec_dst  est  l'adresse  locale  du  paquet  et  ipi_addr  est  l'adresse   de
              destination  dans  l'en-tête  du  paquet.  Si  IP_PKTINFO est passé à sendmsg(2) et
              ipi_spec_dst est différent de zéro, alors il sera utilisé comme adresse source pour
              la recherche dans la table de routage et pour définir les options de routage IP. Si
              ipi_ifindex est différent de  zéro,  l'adresse  locale  principale  de  l'interface
              indiquée  par  ce  numéro  remplace ipi_spec_dst pour la recherche dans la table de
              routage.

       IP_RECVERR (depuis Linux 2.2)
              Activer le passage amélioré des messages d'erreur. Lorsque cette option est activée
              pour  un  socket  datagramme,  toutes les erreurs générées seront envoyées dans une
              file d'erreurs propre au socket. Quand l'utilisateur détecte une erreur d'opération
              sur  le socket, celle-ci peut être examinée en invoquant recvmsg(2) avec l'attribut
              MSG_ERRQUEUE défini. La structure sock_extended_err décrivant l'erreur sera  passée
              comme  message  de  service  ayant le type IP_RECVERR et le niveau IPPROTO_IP. Cela
              permet une gestion d'erreur  fiable  sur  les  sockets  non  connectés.  La  partie
              comprenant  les  données  reçues  de  la  file  d'erreurs  contient le paquet ayant
              rencontré un problème.

              Le message de contrôle IP_RECVERR contient une structure sock_extended_err :

                  #define SO_EE_ORIGIN_NONE    0
                  #define SO_EE_ORIGIN_LOCAL   1
                  #define SO_EE_ORIGIN_ICMP    2
                  #define SO_EE_ORIGIN_ICMP6   3

                  struct sock_extended_err {
                      uint32_t ee_errno;   /* Numéro d'erreur */
                      uint8_t  ee_origin;  /* Origine de l'erreur */
                      uint8_t  ee_type;    /* Type */
                      uint8_t  ee_code;    /* Code */
                      uint8_t  ee_pad;
                      uint32_t ee_info;    /* Données supplémentaires */
                      uint32_t ee_data;    /* Autres données */
                      /* Des données supplémentaires peuvent suivre */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              ee_errno contient le numéro de l'erreur errno mise en file d'attente. ee_origin est
              le  code de l'origine de l'erreur. Les autres champs sont spécifiques au protocole.
              La macro SO_EE_OFFENDER renvoie un pointeur sur l'adresse d'un  objet  réseau  d'où
              l'erreur  provient en prenant en argument un pointeur sur le message de service. Si
              cette adresse n'est pas connue,  le  membre  sa_family  de  la  structure  sockaddr
              contient AF_UNSPEC et les autres champs de sockaddr ne sont pas définis.

              IP   utilise   la  structure  sock_extended_err  comme  suit :  ee_origin  contient
              SO_EE_ORIGIN_ICMP  pour  les  erreurs  reçues  sous  forme  de   paquet   ICMP   ou
              SO_EE_ORIGIN_LOCAL  pour  les  erreurs  locales. Les valeurs inconnues doivent être
              ignorées. ee_type et ee_code sont définis à partir  des  champs  type  et  code  de
              l'en-tête  ICMP.  ee_info  contient la MTU déterminée pour les erreurs EMSGSIZE. Le
              message contient aussi l'adresse sockaddr_in du nœud ayant causé l'erreur, qui peut
              être  obtenu avec la macro SO_EE_OFFENDER. Le champ sin_family de l'adresse fournie
              par SO_EE_OFFENDER vaut AF_UNSPEC si la source était inconnue. Lorsque les  erreurs
              proviennent  du  réseau,  toutes les options IP (IP_OPTIONS, IP_TTL, etc.) valables
              pour le socket et contenues dans le paquet d'erreur sont transmises comme  messages
              de  contrôle.  La charge utile du paquet causant l'erreur est renvoyée comme charge
              normale. TCP n'a pas de file d'erreurs et MSG_ERRQUEUE n'est  pas  permis  sur  les
              sockets  SOCK_STREAM. IP_RECVERR est valable pour TCP, mais toutes les erreurs sont
              renvoyées par des fonctions de socket ou seulement SO_ERROR.

              Pour les sockets raw, IP_RECVERR active le  passage  de  toutes  les  erreurs  ICMP
              reçues  à l'application, sinon les erreurs sont seulement renvoyées sur les sockets
              connectés.

              Il définit ou récupère un attribut booléen entier. IP_RECVERR  est  désactivée  par
              défaut.

       IP_RECVOPTS (depuis Linux 2.2)
              Passer  à l'utilisateur toutes les options IP entrantes dans un message de contrôle
              IP_OPTIONS. L'en-tête de routage et les autres  options  sont  déjà  remplies  pour
              l'hôte local. Cela n'est pas géré pour les sockets SOCK_STREAM.

       IP_RECVORIGDSTADDR (depuis Linux 2.6.29)
              Cet  attribut  booléen active le message IP_ORIGDSTADDR de service dans recvmsg(2),
              dans lequel le noyau renvoie l'adresse de destination originelle du  datagramme  en
              train d'être reçu. Le message de service contient une structure sockaddr_in.

       IP_RECVTOS (depuis Linux 2.2)
              Le  message  de  service IP_TOS est passé avec les paquets entrants si cette option
              est activée. Il contient un octet qui décrit le champ Type-Of-Service/Precedence de
              l'en-tête du paquet. Il s'agit d'un attribut entier booléen.

       IP_RECVTTL (depuis Linux 2.2)
              Lorsque cet attribut est défini, passer un message de contrôle IP_TTL avec le champ
              Time-to-Live du paquet reçu, sous forme d’entier 32 bits. Cela n'est pas géré  pour
              les sockets SOCK_STREAM.

       IP_RETOPTS (depuis Linux 2.2)
              Identique  à  IP_RECVOPTS,  mais  renvoyer  les  options raw non traitées, avec les
              options d'enregistrement des horodatages et du routage non  remplies  pour  ce  pas
              (hop).

       IP_ROUTER_ALERT (depuis Linux 2.2)
              Passer  tous  les paquets à transférer avec l'option IP Router Alert activée sur ce
              socket. Ce n'est valable que pour les sockets raw et  sert  par  exemple  pour  les
              démons  RSVP de l'espace utilisateur. Les paquets enregistrés ne sont pas redirigés
              par le noyau, l'utilisateur est responsable de leur réacheminement. La  liaison  du
              socket  est  ignorée  et  de  tels  paquets  ne  sont filtrés que par le protocole.
              L’attribut est un entier.

       IP_TOS (depuis Linux 1.0)
              Définir ou récupérer le champ Type-Of-Service (TOS) envoyé avec  chaque  paquet  IP
              sortant  de ce socket. Cela sert à gérer sur le réseau les priorités entre paquets.
              TOS est un octet. Quelques attributs TOS standards  sont  définis :  IPTOS_LOWDELAY
              pour  minimiser  les  délais  pour  le  trafic  interactif,  IPTOS_THROUGHPUT  pour
              optimiser le débit, IPTOS_RELIABILITY pour optimiser  la  fiabilité,  IPTOS_MINCOST
              qui doit être utilisé pour les données de remplissage où la lenteur de transmission
              importe peu. Une au maximum de ces valeurs TOS peut être indiquée. Les autres  bits
              ne  sont pas valables et doivent être effacés. Linux envoie d'abord des datagrammes
              IPTOS_LOWDELAY par défaut, mais  le  comportement  exact  dépend  de  la  politique
              configurée  pour  la  file  d'attente.  Quelques  niveaux de haute priorité peuvent
              réclamer les privilèges du superutilisateur (la capacité CAP_NET_ADMIN).

       IP_TRANSPARENT (depuis Linux 2.6.24)
              Cet attribut booléen active le mandataire transparent sur ce socket.  Cette  option
              de  socket  permet  à  l'application  appelante  de s'attacher à une adresse IP non
              locale et de fonctionner à la fois comme un client et  un  serveur  avec  l'adresse
              extérieure  comme  point  de  terminaison  local.  Remarque :  le routage doit être
              configuré pour que les paquets envoyés vers l'adresse extérieure  soient  routés  à
              travers la boîte TProxy (c'est-à-dire le système hébergeant l'application utilisant
              l'option  de  socket  IP_TRANSPARENT).  Les  privilèges  du  superutilisateur  sont
              nécessaires   pour   l'activation   de   cette   option   de  socket  (la  capacité
              CAP_NET_ADMIN).

              Cette option doit  également  être  configurée  sur  le  socket  redirigé  pour  la
              redirection TProxy avec la cible iptables TPROXY.

       IP_TTL (depuis Linux 1.0)
              Définir  ou  récupérer  le contenu actuel du champ Time-to-Live utilisé avec chaque
              paquet envoyé depuis ce socket.

       IP_UNBLOCK_SOURCE (depuis Linux 2.4.22 et 2.5.68)
              Débloquer  une  source  de  diffusion  multiple  précédemment  bloquée.  Renvoi  de
              EADDRNOTAVAIL si la source indiquée n'était pas bloquée.

              L'argument    est    une    structure    ip_mreq_source    comme    décrite    pour
              IP_ADD_SOURCE_MEMBERSHIP.

       SO_PEERSEC (depuis Linux 2.6.17)
              Si Labeled IPsec ou si NetLabel est configuré sur les hôtes émetteur et  récepteur,
              cette  option  de  socket  en  lecture  seule  autorise la réception du contexte de
              sécurité du socket pair connecté à  ce  socket.  Par  défaut,  cela  sera  le  même
              contexte  que  celui  du  processus  qui  a  créé le socket pair à moins qu’il soit
              outrepassé par la politique ou par un processus ayant les permissions requises.

              L’argument de getsockopt(2) est un pointeur vers un tampon de la longueur  indiquée
              en  octets  dans lequel la chaîne de contexte de sécurité sera copiée. Si la taille
              du tampon est inférieure à celle de  la  chaîne  du  contexte  de  sécurité,  alors
              getsockopt(2)  renvoie -1,  définit  errno  à ERANGE et renvoie la taille requise à
              l’aide de optlen. L’appelant doit allouer initialement  au  moins  NAME_MAX  octets
              pour  le tampon, bien que cela ne soit pas garanti d'être suffisant. Redimensionner
              le tampon à la taille renvoyée et réessayer peuvent être nécessaires.

              La chaîne de contexte de sécurité peut inclure un octet NULL final dans  la  taille
              renvoyée,  mais  il  n’est  pas  garanti que ce soit fait : un contexte de sécurité
              « abc »  peut  être   représenté   soit   par   {'a','b','c'}   de   taille 3,   ou
              {'a','b','c','\0'}  de  taille 4,  qui  sont  considérés comme interchangeables. La
              chaîne peut être affichée, mais ne contient pas d’octet NULL  final,  et  elle  est
              dans  un  encodage  non  précisé  (en particulier, il n’est pas garanti que ce soit
              ASCII ou UTF-8).

              L’utilisation de cette option pour les sockets de la famille d’adresses AF_INET est
              prise  en charge depuis Linux 2.6.17 pour les sockets TCP et depuis Linux 4.17 pour
              les sockets SCTP.

              Pour SELinux, NetLabel transmet uniquement la portion MLS du contexte  de  sécurité
              du  pair  sur  le  réseau, laissant par défaut le reste du contexte de sécurité aux
              valeurs définies dans la politique pour l’identifiant de  sécurité  initial  netmsg
              (SID).  Cependant,  NetLabel  peut  être  configuré  pour  passer  les contextes de
              sécurité en entier sur la boucle locale. Labeled IPSEC passe toujours les contextes
              de  sécurité  comme partie de l’association de sécurité (security association — SA)
              et les recherche en se basant sur l’association de chaque paquet.

   Interfaces /proc
       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)
              Nouveauté des noyaux 2.2.13, dans les noyaux précédents, cette fonctionnalité était
              contrôlée  lors  de  la  compilation  avec  l'option CONFIG_IP_ALWAYS_DEFRAG. Cette
              option n'est plus présente dans les versions 2.4.x et suivantes.

              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 (depuis Linux 2.2 à 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)
              Ce fichier contient deux entiers  qui  définissent  l’intervalle  de  ports  locaux
              alloués  aux  sockets  qui  ne  sont pas explicitement attachés à un numéro de port
              – c’est-à-dire l’intervalle utilisé pour les ports éphémères. Un port éphémère  est
              alloué à un socket dans les circonstances suivantes :

              –  le  numéro  de  port  dans  une  adresse  de  socket  est défini à 0 en appelant
                 bind(2) ;

              –  listen(2) est appelé sur un socket de flux qui n’était pas attaché auparavant ;

              –  connect(2) a été appelée sur un socket qui n’était pas attaché auparavant ;

              –  sendto(2)  est  appelée  sur  un  socket  datagramme  qui  n’était  pas  attaché
                 auparavant.

              L’allocation   de   ports   éphémères   commence   avec   le   premier   numéro  de
              ip_local_port_range et  se  termine  avec  le  second.  Si  l’intervalle  de  ports
              éphémères  est  épuisé,  alors  l’appel  système  associé  renvoie une erreur (mais
              consultez BOGUES).

              Remarquez que l’intervalle de ports dans ip_local_port_range ne devrait pas  entrer
              en  conflit  avec  les  ports  utilisés  pour  le  masquerading (bien que cela soit
              traité). De même, des choix arbitraires peuvent poser des problèmes  avec  certains
              filtrages  de  pare-feu qui font des suppositions sur les ports locaux utilisés. Le
              premier nombre doit être au moins supérieur à 1024 et, de préférence, à  4096  pour
              éviter  les  collisions  avec  les  ports  officiels  et minimiser les problèmes de
              pare-feu.

       ip_no_pmtu_disc (booléen ; désactivé par défaut) ; depuis Linux 2.2
              Si activé, supprimer la découverte par défaut des MTU des chemins pour les  sockets
              TCP.  La  découverte  de  la  MTU  d'un  chemin  peut échouer avec des pare-feu mal
              configurés (qui rejettent tous les paquets ICMP) ou des interfaces mal  configurées
              (par  exemple,  une  liaison point-à-point où les deux extrémités n'ont pas la même
              MTU). Il vaut mieux corriger le routeur défectueux  que  supprimer  globalement  la
              découverte  des  MTU  des chemins, car cette dernière option entraîne un coût élevé
              pour le réseau.

       ip_nonlocal_bind (booléen ; désactivé par défaut ; depuis Linux 2.4)
              Si défini, permettre aux processus de s'attacher avec bind(2) à des adresses IP non
              locales, ce qui peut être utile mais peut faire planter certaines applications.

       ip6frag_time (entier ; défaut : 30)
              Définir le temps en secondes de conservation d'un fragment IPv6 en mémoire.

       ip6frag_secret_interval (entier ; défaut : 600)
              Définir  l'intervalle  de  régénération  (en  secondes) du secret de hachage (ou sa
              durée de vie) pour les fragments IPv6.

       ipfrag_high_thresh (entier), ipfrag_low_thresh (entier)
              Si le nombre de fragments IP en attente atteint  ipfrag_high_thresh,  la  file  est
              restreinte à ipfrag_low_thresh. Contient un entier avec le nombre d'octets.

       neigh/*
              Consultez arp(7).

   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.

       Soyez très prudents avec l'option SO_BROADCAST, elle n'est pas privilégiée sous Linux.  Il
       est facile de surcharger un réseau avec des diffusions générales sans précaution. Pour les
       nouveaux protocoles applicatifs, il vaut mieux utiliser un groupe  de  diffusion  multiple
       plutôt que la diffusion générale. Cette dernière est déconseillée.

       Certaines  autres  implémentations  des  sockets  BSD  fournissent  les  options de socket
       IP_RCVDSTADDR et IP_RECVIF pour  obtenir  l'adresse  de  destination  et  l'interface  des
       datagrammes  reçus.  Linux  propose  l'option  IP_PKTINFO  plus générale pour effectuer ce
       travail.

       Certaines implémentations BSD des sockets fournissent également l'option IP_RECVTTL,  mais
       un  message  de  service ayant le type IP_RECVTTL est fourni avec le paquet entrant. C'est
       différent de l'option IP_TTL utilisée sous Linux.

       L'utilisation du niveau des options de socket SOL_IP n'est pas portable, les piles  basées
       sur BSD utilisent le niveau IPPROTO_IP.

       INADDR_ANY  (0.0.0.0)  et  INADDR_BROADCAST (255.255.255.255) sont indépendants de l’ordre
       des octets. Cela signifie que htonl(3) n’a aucun effet sur eux.

   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.

       La  réception  de  l'adresse  de destination originale avec MSG_ERRQUEUE dans msg_name par
       recvmsg(2) ne fonctionne pas dans certains noyaux 2.2.

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.

COLOPHON

       Cette page fait partie de la publication 5.10 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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  ⟨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 ⟨⟩.