ip(7)

NOM
ip – Implémentation Linux du protocole IPv4

SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>  /* superset of previous */

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.

  Formats d'adresse
An IP socket address is defined as a combination of an IP interface address and a 16-bit port number. The basic IP protocol does not supply port numbers, they are implemented by higher level protocols like udp(7) and tcp(7). On raw sockets .sin_port is set to the IP protocol.

See sockaddr_in(3type).

.sin_family is always set to AF_INET. This is required; in Linux 2.2 most networking functions return EINVAL when this setting is missing. .sin_port contains the port in network byte order. The port numbers below 1024 are called privileged ports (or sometimes: reserved ports). Only a privileged process (on Linux: a process that has the CAP_NET_BIND_SERVICE capability in the user namespace governing its network namespace) may bind(2) to these sockets. Note that the raw IPv4 protocol as such has no concept of a port, they are implemented only by higher protocols like tcp(7) and udp(7).

.sin_addr is the IP host address. The .s_addr member of the in_addr(3type) structure contains the host interface address in network byte order. in_addr(3type) should be assigned one of the INADDR_* values (e.g., INADDR_LOOPBACK) using htonl(3) or set using the inet_aton(3), inet_addr(3), inet_makeaddr(3) library functions or directly with the name resolver (see 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.

  Adresses spéciales et réservées
Il y a plusieurs adresses spéciales :

INADDR_LOOPBACK (127.0.0.1)
    fait toujours référence à l'hôte local à l’aide du périphérique de rebouclage (loopback) ;

INADDR_ANY (0.0.0.0)
    signifie n'importe quelle adresse pour l’attachement de socket ;

INADDR_BROADCAST (255.255.255.255)
    A packet addressed to INADDR_BROADCAST through a socket which has SO_BROADCAST set will be broadcast to all hosts on the local network segment, as long as the link is broadcast-capable.

Numéro d'adresse le plus haut
Numéro d'adresse le plus bas
    Sur tout sous-réseau IP non point-à-point localement attaché avec une liaison du type qui gère la diffusion générale (broadcast), l'adresse avec la numérotation la plus élevée (par exemple, l'adresse 255 sur un sous-réseau avec un masque de réseau 255.255.255.0) est désignée comme adresse de broadcast. Elle ne peut pas être assignée de manière utile à une interface individuelle et ne peut être adressée qu'avec un socket avec l'option SO_BROADCAST définie. Les normes d’Internet ont aussi historiquement réservé l'adresse avec le numéro le plus bas (par exemple, l'adresse 0 d'un sous-réseau avec un masque réseau 255.255.255.0) pour le broadcast, bien qu’elles la qualifient d’« obsolète » pour cette fonction (quelques sources l'appellent aussi « adresse réseau »). Depuis Linux 5.14, elle est considérée comme une adresse ordinaire de diffusion unique (unicast) et peut être assignée à une interface.

Les normes d’Internet ont traditionnellement réservé aussi diverses adresses pour des usages particuliers, bien que Linux ne traite plus certaines d’entre elles spécialement.

[0.0.0.1, 0.255.255.255]
[240.0.0.0, 255.255.255.254]
    Les adresses dans ces plages (0/8 et 240/4) sont réservées globalement. Depuis Linux 5.3 et Linux 2.6.25, respectivement, les adresses 0/8 et 240/4, autres que INADDR_ANY et INADDR_BROADCAST sont traitées comme des adresses unicast ordinaires. Les systèmes qui suivent le comportement traditionnel n'interagiront pas avec ces adresses historiquement réservées.

[127.0.0.1, 127.255.255.254]
    Les adresses dans cette plage (127/8) sont traitées comme des adresses de rebouclage (loopback) semblables à l'adresse standardisée de rebouclage locale INADDR_LOOPBACK (127.0.0.1) ;

[224.0.0.0, 239.255.255.255]
    Les adresses dans cette plage (224/4) sont dédiées à un usage de diffusion multiple (multicast).

  Options de socket
See IPPROTO_IP(2const).

  /proc interfaces
See proc_sys_net_ipv4(5).

  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
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
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. Voir la RFC 6762 pour un exemple de protocole (mDNS) utilisant l'approche plus moderne de diffusion multiple pour communiquer avec un groupe illimité d'hôtes sur le réseau local.

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épendantes de l’ordre des octets. Cela signifie que htonl(3) n’a aucun effet sur elles.

  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 Linux 2.2.

VOIR AUSSI
IPPROTO_IP(2const), 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.rst.

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>, Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr> et bubu <bubub@no-log.org>

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.