Loading

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, protocol);

       Linux  implémente le protocole internet (IP) version 4, décrit dans les
       RFC791 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, voyez socket(7).

       Une socket IP est créée en appelant la fonction socket(2) sous la forme
       socket(AF_INET, type_socket, protocole). Les types valables de  sockets
       sont  SOCK_STREAM pour ouvrir une socket tcp(7), SOCK_DGRAM pour ouvrir
       une socket udp(7), ou SOCK_RAW pour ouvrir une socket raw(7) permettant
       d’accéder  directement  au protocole IP. Le protocole indiqué est celui
       inscrit dans les en-têtes IP émis ou reçus. Les seules valeurs valables
       pour  le  protocole sont 0 et IPPROTO_TCP pour les sockets TCP, et 0 et
       IPPROTO_UDP pour les sockets UDP. Pour les sockets  SOCK_RAW,  on  peut
       indiquer  un  protocole  IP  IANA  valable dont la RFC 1700 précise les
       numéros assignés.

       Lorsqu’un processus veut recevoir de nouveaux paquets entrants  ou  des
       connexions,  il  doit  attacher  une  socket  à une adresse d’interface
       locale en utilisant bind(2). Une seule socket IP peut être  attachée  à
       une  paire  (adresse, port) locale donnée. Lorsqu’on indique INADDR_ANY
       lors de l’attachement, la socket sera affectée à toutes les  interfaces
       locales.  Si  listen(2)  ou connect(2) sont appelées sur une socket non
       affectée,  celle-ci  est  automatiquement  attachée  à  un  port  libre
       aléatoire, avec l’adresse locale définie à INADDR_ANY.

       L’adresse  locale  d’une socket TCP qui a été attachée 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 dadresse
       Une adresse de socket IP est définie comme la combinaison d’une adresse
       IP  d’interface  et  d’un  numéro  de  port. Le protocole IP de base ne
       fournit pas de numéro 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 configuration manque. 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 privilgis (ou parfois ports rservs). Seuls les  processus
       privilégiés  (à  savoir  ceux qui ont la capacité CAP_NET_BIND_SERVICE)
       peuvent appeler bind(2) pour ces sockets. Le protocole IPv4 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 doit  se  voir  assigner  l’une  des  valeurs
       INADDR_*  (par  exemple,  INADDR_ANY)  ou  être manipulé au travers 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  (voir
       gethostbyname(3)).

       Les adresses IPv4 sont divisées en adresses de diffusions individuelle,
       générale  et multiple. 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ées connexion
       ne sont autorisées 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.

       Il   existe   plusieurs   adresses   particulières :    INADDR_LOOPBACK
       (127.0.0.1)  correspond  toujours  à  l’hôte  local via le périphérique
       loopback ; INADDR_ANY (0.0.0.0) signifie  un  attachement  à  n’importe
       quelle  adresse;  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 sockets
       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.

       IP_ADD_MEMBERSHIP (depuis Linux 1.2)
              Rejoint 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 (ou 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.

              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 diffère de ip_mreqn  seulement
              par  l’absence  du  membre  imr_ifindex. Uniquement valable avec
              setsockopt(2).

       IP_DROP_MEMBERSHIP (depuis Linux 1.2)
              Quitte un groupe  de  diffusion  multiple.  L’argument  est  une
              structure ip_mreqn ou ip_mreq comme pour IP_ADD_MEMBERSHIP.

       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. Voyez 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_MTU (depuis Linux 2.2)
              Récupère  la  MTU  du  chemin  actuellement  déterminée  pour la
              socket. Valable seulement  quand  la  socket  a  été  connectée.
              Renvoie un entier. Valable uniquement avec getsockopt(2).

       IP_MTU_DISCOVER (depuis Linux 2.2)
              Définit  ou  récupère  la  définition  de  recherche des MTU des
              chemins  pour  une  socket.  Lorsqu’elle  est   activée,   Linux
              effectuera  la recherche de la MTU d’un chemin comme défini dans
              la RFC 1191. L’attribut interdisant la fragmentation  est  alors
              activé  sur  tous les datagrammes sortants. La valeur par défaut
              est   commandée   au   niveau    système    par    le    fichier
              /proc/sys/net/ipv4/ip_no_pmtu_disc pour les sockets SOCK_STREAM,
              et désactivée pour toutes les autres. Pour  les  sockets  autres
              que  SOCK_STREAM, l’utilisateur est responsable de l’empaquetage
              des données dans des blocs inférieurs à la MTU et doit s’assurer
              de  la  retransmission si besoin. Le noyau rejettera les paquets
              qui sont plus gros que  la  MTU  du  chemin  déterminée  si  cet
              attribut est activé (avec l’erreur EMSGSIZE).

              Attributs MTU des chemins   Signification
              IP_PMTUDISC_WANT            utiliser une configuration par route
              IP_PMTUDISC_DONT            ne pas rechercher la MTU des chemins
              IP_PMTUDISC_DO              toujours chercher la MTU des chemins
              IP_PMTUDISC_PROBE           Active DF (« Don’t Fragment », ne
                                          pas fragmenter), mais ignore les
                                          recherches de MTU des chemins

              Lorsque  la  recherche  de  la  PMTU est activée, le noyau garde
              automatiquement une trace  des  MTU  des  chemins  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 de la socket
              (par exemple si une erreur EMSGSIZE se  produit).  Cette  valeur
              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’erreur (voyez IP_RECVERR). Une nouvelle erreur sera  mise
              en file 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
              devraient  le  savoir,  et  les  éviter  dans  leur stratégie de
              retransmission.

              Pour démarrer le processus de recherche de la MTU du chemin  sur
              les sockets non connectées, 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,
              connecte  une  socket  datagramme  à l’adresse de destination en
              utilisant  connect(2)  et   consultez   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 le MTU observé du chemin.

       IP_MULTICAST_IF (depuis Linux 1.2)
              Définit le périphérique  local  pour  une  socket  de  diffusion
              multiple.  L’argument  est  une  structure  ip_mreqn ou ip_mreq,
              comme pour IP_ADD_MEMBERSHIP.

              Lorsqu’une option de socket non valable est fournie, ENOPROTOOPT
              est renvoyée.

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

       IP_MULTICAST_TTL (depuis Linux 1.2)
              Définit ou lit la valeur du champ Time-To-Live  des  paquets  de
              diffusion  multiple  sortants  sur  cette  socket.  Il  est très
              important pour les paquets de diffusion multiple de fixer le TTL
              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_OPTIONS (depuis Linux 2.0)
              Définit ou lit les options IP à envoyer avec chaque  paquet  sur
              cette  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 à une
              socket. La taille maximale des options pour IPv4 vaut 40 octets.
              Voyez  la RFC 791 pour les options autorisées. Lorsque le paquet
              de connexion initiale  d’une  socket  SOCK_STREAM  contient  des
              options  IP,  celles-ci  seront  automatiquement attribuées à la
              socket, 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
              validé 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 d’émission actuelles.

       IP_PKTINFO (since Linux 2.2)
              Fournit  un  message  IP_PKTINFO  de  service,  qui contient une
              structure  pktinfo  fournissant  quelques  informations  sur  le
              paquet   entrant.  Ceci  ne  fonctionne  que  pour  les  sockets
              orientées datagramme. L’argument est un attribut indiquant à  la
              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 */
                  };

              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 cet
              index remplace ipi_spec_dst pour la table de routage.

       IP_RECVERR (depuis Linux 2.2)
              Active le passage amélioré des messages d’erreur. Lorsque  cette
              option  est  activée  pour  une  socket  datagramme,  toutes les
              erreurs  générées  seront  envoyées  dans  une  file   d’erreurs
              particulière à la socket. Quand l’utilisateur détecte une erreur
              d’opération sur  la  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. Ceci permet une  gestion  d’erreur  fiable  sur  les
              sockets  non connectées. 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.
              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 disponible, 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 noeud 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 la socket et  contenues
              dans  le  paquet  d’erreur  sont  transmises  comme  messages de
              contrôle. La charge du  paquet  causant  l’erreur  est  renvoyée
              comme   charge   normale.   TCP  n’a  pas  de  file  d’erreurs ;
              MSG_ERRQUEUE n’est  pas  permis  sur  les  sockets  SOCK_STREAM.
              IP_RECVERR  est  valable  pour TCP, mais toutes les erreurs sont
              renvoyées au retour des fonctions de socket ou par 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ées.

              Il  s’agit  d’un  attribut  booléen   entier.   IP_RECVERR   est
              désactivée par défaut.

       IP_RECVOPTS (depuis Linux 2.2)
              Passe  à  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. Ceci n’est
              pas géré pour les sockets SOCK_STREAM.

       IP_RECVTOS (depuis Linux 2.2)
              Le message de service IP_TOS est passé avec les paquets entrants
              si  cette  option est activée. Elle 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, passe un message de contrôle
              IP_TTL avec le champ Time To Live du  paquet  reçu,  sous  forme
              d’octet. Ceci n’est pas géré pour les sockets SOCK_STREAM.

       IP_RETOPTS (depuis Linux 2.2)
              Identique  à  IP_RECVOPTS,  mais  renvoie les options brutes non
              traitées, avec les options d’enregistrement des  horodatages  et
              du routage non remplies pour ce saut.

       IP_ROUTER_ALERT (depuis Linux 2.2)
              Passe  tous  les  paquets  à  transférer avec l’option IP Router
              Alert activée sur cette socket. Ceci 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 leurs
              envois. L’attachement des sockets est ignoré, et de tels paquets
              ne  sont  filtrés  que par le protocole. Il s’agit d’un attribut
              entier.

       IP_TOS (depuis Linux 1.0)
              Définit ou récupère le champ Type-Of-Service (TOS)  envoyé  avec
              chaque  paquet IP sortant de cette 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 doit être utilisé pour les
              données de remplissage, quand la lenteur de transmission importe
              peu. Une de ces valeurs TOS au maximum 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).  La  priorité  peut  aussi  être  définie  d’une
              manière  indépendante  du  protocole  avec les options de socket
              (SOL_SOCKET, SO_PRIORITY) (voyez socket(7)).

       IP_TTL (depuis Linux 1.0)
              Définit ou récupère le  contenu  actuel  du  champ  Time-To-Live
              utilisé avec chaque paquet envoyé depuis cette socket.

   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  de  votre   réseau,   ou   un   mandataire
              transparent.  Il ne faut jamais l’utiliser pour un routeur ou un
              hôte normal. Sinon, les communications fragmentées peuvent  être
              interrompues si les fragments circulent par différents liens. La
              défragmentation  a  également  un  coût  mémoire  et  processeur
              important.

              Ceci  est  automagiquement  activé lorsque le 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éfinit la valeur par défaut du champ Time-To-Live  des  paquets
              sortants.  Ceci  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)
              Active la réécriture dynamique des  adresses  de  socket  et  du
              masquerading  lors  des  changements 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
              Active le transfert IP avec un attribut booléen. Le transfert IP
              peut aussi être configuré interface par interface.

       ip_local_port_range (depuis Linux 2.2)
              Contient  deux  entiers  qui définissent l’intervalle par défaut
              des ports locaux alloués aux sockets. L’allocation démarre  avec
              le premier numéro et se termine avec le second. Cela ne doit 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 pare-feu  de  filtrage
              par  paquet  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é, supprime la recherche par défaut des MTU des  chemins
              pour  les  sockets  TCP. La recherche 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, un
              lien point-à-point où les deux  extrémités  n’ont  pas  la  même
              MTU).  Il  vaut  mieux  corriger  le  routeur  défectueux que de
              supprimer globalement la recherche  des  MTU  des  chemins,  car
              cette dernière option augmente les coûts du réseau.

       ip_nonlocal_bind (booléen ; désactivé par défaut ; depuis Linux 2.4)
              Si défini, permet 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éfinit  le temps en secondes de conservation d’un fragment IPv6
              en mémoire.

       ip6frag_secret_interval (entier ; défaut : 600)
              Définit 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 file atteint ipfrag_high_thresh,
              la file est restreinte à ipfrag_low_thresh. Contient  un  entier
              avec le nombre d’octets.

       neigh/*
              Voyez 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 une socket non bloquante devrait bloquer.

       EALREADY
              Une opération de connexion est déjà en cours sur une socket  non
              bloquante.

       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 pour 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 une socket déjà connectée.

       EMSGSIZE
              Un datagramme est plus grand que la MTU du 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  une  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 sur  une  socket  connectée,  mais
              cette socket n’était pas connectée.

       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 à
              l’autre extrémité.

       ESOCKTNOSUPPORT
              La socket n’est pas configurée ou un type de  socket  inconnu  a
              été demandé.

       D’autres   erreurs   peuvent   être   déclenchées  par  les  protocoles
       supérieurs. Voyez tcp(7), raw(7), udp(7) et socket(7).

NOTES

       IP_MTU, IP_MTU_DISCOVER, IP_PKTINFO, IP_RECVERR et IP_ROUTER_ALERT sont
       spécifiques  à  Linux  et  ne  devraient  pas  être  utilisés  dans des
       programmes destinés à être portables. 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.  Ce
       dernier est déconseillé.

       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 empilages basés sur BSD utilisent le niveau IPPROTO_IP.

   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
       une socket packet(7). Ceci 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.

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

       Certaines  versions  de  la  glibc  oublient de déclarer in_pktinfo. Le
       contournement consiste à la recopier depuis cette page de  manuel  dans
       le programme.

       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),   ipfw(4),   capabilities(7),
       netlink(7), raw(7), socket(7), tcp(7), udp(7)

       RFC 791 pour les spécifications IP d’origine.
       RFC 1122 pour les nécessités IPv4 des hôtes.
       RFC 1812 pour les nécessités IPv4 des routeurs.

COLOPHON

       Cette page fait partie de  la  publication  3.23  du  projet  man-pages
       Linux.  Une description du projet et des instructions pour signaler des
       anomalies      peuvent      être       trouvées       à       l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette  page  de  manuel  a  été  traduite et mise à jour par Christophe
       Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis  par
       Alain  Portal  <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

       Veuillez  signaler  toute  erreur   de   traduction   en   écrivant   à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de  ce  document
       en utilisant la commande « man -L C <section> <page_de_man> ».