Provided by: manpages-fr_4.18.1-1_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, socket_type, protocol);

       Les sockets autorisés incluent SOCK_STREAM pour ouvrir un  socket  flux,  SOCK_DGRAM  pour
       ouvrir  un  socket  datagramme  et  SOCK_RAW  pour  ouvrir  un  socket raw(7) pour accéder
       directement au protocole IP.

       protocole est le protocole  IP  dans  les  en-têtes  IP  reçus  ou  envoyés.  Les  valeurs
       autorisées pour protocole incluent :

       •  0 et IPPROTO_TCP pour les sockets flux tcp(7) ;

       •  0 et IPPROTO_UDP pour les sockets datagramme udp(7) ;

       •  IPPROTO_SCTP pour les sockets flux sctp(7) ;

       •  IPPROTO_UDPLITE pour les sockets datagramme udplite(7).

       Pour  SOCK_RAW  un  protocole  IP  IANA  autorisé,  défini dans les numéros assignés de la
       RFC 1700, peut être indiqué.

       Lorsqu'un processus veut recevoir de nouveaux paquets entrants ou des connexions, il  doit
       attacher  un  socket à une adresse d'interface locale en utilisant bind(2). Un seul socket
       IP peut être attaché à une paire (adresse, port) locale  donnée.  Lorsque  INADDR_ANY  est
       indiqué  au  moment  de  l'attachement,  le  socket  sera  affecté à toutes les interfaces
       locales. Si listen(2) est appelée sur un socket non affecté, celui-ci est  automatiquement
       attaché  à  un  port  libre  aléatoire,  avec  l'adresse  locale  définie à INADDR_ANY. Si
       connect(2) est appelée sur un socket non affecté, celui-ci est automatiquement  attaché  à
       un  port  libre  aléatoire  ou  un port partagé utilisable avec l'adresse locale définie à
       INADDR_ANY.

       L'adresse locale d'un socket TCP qui a  été  attaché  est  indisponible  pendant  quelques
       instants  après  sa fermeture, à moins que l'attribut SO_REUSEADDR ait été activé. Il faut
       être prudent en utilisant cet attribut, car il rend le protocole TCP moins fiable.

   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 (since Linux 2.4.22 / Linux 2.5.68)
              Rejoindre  un  groupe  de  diffusion  multiple et autoriser la réception de données
              uniquement depuis une source indiquée. L'argument est une structure ip_mreq_source.

           struct ip_mreq_source {
               struct in_addr imr_multiaddr;  /* Adresse IP du groupe
                                                 de diffusion multiple */
               struct in_addr imr_interface;  /* Adresse IP de
                                                 l'interface locale */
               struct in_addr imr_sourceaddr; /* Adresse IP de la source
                                                 de diffusion multiple */
           };

       La structure ip_mreq_source est similaire à ip_mreqn  décrite  sous  IP_ADD_MEMBERSIP.  Le
       champ  imr_multiaddr  contient l'adresse du groupe de diffusion multiple que l'application
       veut rejoindre ou quitter. Le champ imr_interface est l'adresse de l'interface locale avec
       laquelle   le   système   doit  rejoindre  le  groupe  de  diffusion  multiple.  Le  champ
       imr_sourceaddr contient l'adresse de la source depuis laquelle l'application veut recevoir
       des données.

              Cette  option  peut être utilisée plusieurs fois pour autoriser la réception depuis
              plusieurs sources.

       IP_BIND_ADDRESS_NO_PORT (depuis Linux 4.2)
              Informer le noyau de ne pas réserver un port  éphémère  lors  de  l’utilisation  de
              bind(2)  avec  un  numéro  de  port  égal  à  zéro.  Le  port sera choisi plus tard
              automatiquement au moment de connect(2) de façon à permettre de  partager  un  port
              source aussi longtemps que le quadruplet est unique.

       IP_BLOCK_SOURCE (depuis Linux 2.4.22 et 2.5.68)
              Bloquer  la réception de données en diffusion multiple depuis une source spécifique
              pour un groupe donné. Cela n'est possible qu'après que l'application s'est  abonnée
              au    groupe    de   diffusion   multiple   en   utilisant   IP_ADD_MEMBERSHIP   ou
              IP_ADD_SOURCE_MEMBERSHIP.

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

       IP_DROP_MEMBERSHIP (depuis Linux 1.2)
              Quitter  un  groupe de diffusion multiple. L'argument est une structure ip_mreqn ou
              ip_mreq similaire à IP_ADD_MEMBERSHIP.

       IP_DROP_SOURCE_MEMBERSHIP (since Linux 2.4.22 et 2.5.68)
              Leave a source-specific group—that is, stop receiving data from a  given  multicast
              group  that come from a given source. If the application has subscribed to multiple
              sources within the same group, data  from  the  remaining  sources  will  still  be
              delivered. To stop receiving data from all sources at once, use IP_DROP_MEMBERSHIP.

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

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

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

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

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

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

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

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

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

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

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

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

              Valeur de découverte de MTU de chemin   Signification
              IP_PMTUDISC_WANT                        Utiliser une configuration par route

              IP_PMTUDISC_DONT                        Aucune découverte de MTU de chemin
              IP_PMTUDISC_DO                          Toujours découvrir la MTU de chemin
              IP_PMTUDISC_PROBE                       Activer DF mais ignorer la MTU de chemin

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

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

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

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

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

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

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

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

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

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

              Cette option est valable seulement pour les sockets SOCK_RAW.

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

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

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

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

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

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

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

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

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

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

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

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

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   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)
              [New  with  Linux 2.2.13; in earlier kernel versions this feature was controlled at
              compile time by the CONFIG_IP_ALWAYS_DEFRAG option; this option is not  present  in
              Linux 2.4.x and later]

              Lorsque cet attribut booléen est activé (différent de zéro), les fragments entrants
              (morceaux de paquets IP obtenus quand un hôte entre l'origine et la  destination  a
              décidé  que  les  paquets  étaient  trop grands et les a coupés en morceaux) seront
              réassemblés  (défragmentés)  avant  d'être  traités,  même   s'ils   doivent   être
              transférés.

              Cette option n'est à utiliser que pour un pare-feu qui est le seul lien d'entrée du
              réseau ou pour un mandataire transparent. Il ne  faut  jamais  l'utiliser  pour  un
              routeur  ou  un  hôte  normal.  Sinon,  les communications fragmentées peuvent être
              perturbées  si  les  fragments  circulent  dans  des   liaisons   différentes.   La
              défragmentation a également un coût mémoire et processeur important.

              C’est automatiquement activé lorsque le camouflage des connexions (masquerading) ou
              le mandataire transparent sont configurés.

       ip_autoconfig (since Linux 2.2 to Linux 2.6.17)
              Non documenté.

       ip_default_ttl (entier ; défaut : 64 ; depuis Linux 2.2)
              Définir la valeur par défaut du champ Time-to-Live des paquets sortants. Cela  peut
              être modifié individuellement pour chaque socket avec l'option IP_TTL.

       ip_dynaddr (booléen ; désactivé par défaut ; depuis Linux 2.0.31)
              Activer  la  réécriture dynamique des adresses de socket et du masquerading lors du
              changement d'adresse d'interface. Cela sert pour les  liaisons  téléphoniques  avec
              des  adresses  IP  changeantes.  0 signifie  aucune  réécriture,  1 les autorise et
              2 demande un mode bavard.

       ip_forward (booléen ; désactivé par défaut) ; depuis Linux 1.2
              Activer le transfert d'IP avec un attribut booléen. Le transfert  d'IP  peut  aussi
              être configuré interface par interface.

       ip_local_port_range (depuis Linux 2.2)
              This  file contains two integers that define the default local port range allocated
              to sockets that are not explicitly bound to a port number—that is, the  range  used
              for  ephemeral  ports.  An ephemeral port is allocated to a socket in the following
              circumstances:

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

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

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

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

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

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

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

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

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

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

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

       neigh/*
              Consultez arp(7).

   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) and INADDR_BROADCAST (255.255.255.255) are  byte-order-neutral.  This
       means htonl(3)  has no effect on them.

   Compatibilité
       Pour  la  compatibilité  avec  Linux 2.0, la syntaxe obsolète socket(AF_INET, SOCK_PACKET,
       protocole) est encore gérée pour ouvrir un socket packet(7). Cela est déconseillé et  doit
       être  remplacé par socket(AF_PACKET, SOCK_RAW, protocole). La principale différence est la
       nouvelle structure d'adresse sockaddr_ll pour les informations génériques de la couche  de
       liaison à la place de l'ancienne sockaddr_pkt.

BOGUES

       Il y a trop de valeurs d'erreurs hétérogènes.

       L’erreur utilisée pour diagnostiquer l’épuisement de l’intervalle de ports éphémères varie
       suivant les appels  systèmes  (connect(2),  bind(2),  listen(2),  sendto(2))  qui  peuvent
       assigner des ports éphémères.

       Les  ioctls  pour configurer les options d'interface spécifiques à IP et les tables ARP ne
       sont pas décrites.

       Receiving the original destination address with MSG_ERRQUEUE  in  msg_name  by  recvmsg(2)
       does not work in some Linux 2.2 kernels.

VOIR AUSSI

       recvmsg(2),  sendmsg(2),  byteorder(3),  capabilities(7),  icmp(7), ipv6(7), netdevice(7),
       netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8)

       Le fichier source du noyau Documentation/networking/ip-sysctl.txt.

       RFC 791 pour les spécifications IP d'origine. RFC 1122 pour les exigences IPv4 des  hôtes.
       RFC 1812 pour les exigences IPv4 des routeurs.

TRADUCTION

       La  traduction  française  de  cette  page  de  manuel  a  été créée par Christophe Blaess
       <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <stephan.rafin@laposte.net>,  Thierry
       Vignaud  <tvignaud@mandriva.com>,  François Micaux, Alain Portal <aportal@univ-montp2.fr>,
       Jean-Philippe   Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)    <jean-
       luc.coulon@wanadoo.fr>,    Julien    Cristau    <jcristau@debian.org>,    Thomas   Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau  <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis
       Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>  et  Jean-Paul  Guillonneau
       <guillonneau.jeanpaul@free.fr>

       Cette  traduction  est  une  documentation libre ; veuillez vous reporter à la GNU General
       Public  License  version 3  ⟨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⟩.