ipv6
Table des matières
Retour à l'index
NOM
ipv6 - Implémentation Linux du protocole IPv6
SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
tcp6_socket = socket(AF_INET6, SOCK_STREAM, 0);
raw6_socket = socket(AF_INET6, SOCK_RAW, protocole);
udp6_socket = socket(AF_INET6, SOCK_DGRAM, protocole);
DESCRIPTION
Linux 2.2 implémente en option le protocole internet version 6 (IPv6). Cette
page de manuel contient la description de l'API IPv6 de base, telle
qu'implémentée dans le noyau Linux et la glibc 2.1 L'interface est basée sur
l'interface des sockets BSD. Consultez socket(7).
L'API IPv6 est conçue pour être essentiellement compatible avec l'API IPv4
(consultez ip(7)). Seules les différences sont décrites dans cette page
de manuel.
Pour attacher un socket AF_INET6, l'adresse locale doit être copiée dans
une variable in6addr_any qui a le type in6_addr. Dans les
initialisations statiques, IN6ADDR_ANY_INIT peut servir aussi et se
développe en une expression constante. Toutes les valeurs sont dans l'ordre
des octets du réseau.
L'adresse de boucle IPv6 (::1) est disponible dans la variable globale
in6addr_loopback. Pour les initialisations, on doit utiliser
IN6ADDR_LOOPBACK_INIT.
Les connexions IPv4 peuvent être traitées avec l'API v6 en utilisant le type
d'adresse v4-projeté-dans-v6. Ainsi un programme n'a qu'un seul type d'API à
utiliser pour prendre en charge les deux protocoles. C’est géré de manière
transparente par les fonctions d'adressage de la bibliothèque C.
IPv4 et IPv6 partagent l'espace des ports locaux. Lorsqu'une connexion ou un
paquet IPv4 est obtenu sur un socket IPv6, son adresse source sera projetée
en v6.
Formats d'adresse
struct sockaddr_in6 {
sa_family_t sin6_family; /* AF_INET6 */
in_port_t sin6_port; /* numéro de port */
uint32_t sin6_flowinfo; /* information de flux IPv6 */
struct in6_addr sin6_addr; /* adresse IPv6 */
uint32_t sin6_scope_id; /* Scope ID (nouveau dans Linux 2.4) */
};
struct in6_addr {
unsigned char s6_addr[16]; /* adresse IPv6 */
};
sin6_family est toujours rempli avec AF_INET6 ; sin6_port est le
port du protocole (consultez sin_port dans ip(7)) ; sin6_flowinfo
est l'identificateur de flux IPv6, sin6_addr est l'adresse IPv6 sur
128 bits. sin6_scope_id est un identificateur qui dépend de la portée de
l'adresse. C'est une nouveauté Linux 2.4. Linux ne le prend en charge que
pour les adresses locales lien, dans ce cas sin6_scope_id contient le
numéro d'interface (consultez netdevice(7)).
IPv6 prend en charge plusieurs types d'adresses : unicast pour représenter
un hôte unique, multicast pour un groupe d'hôtes, anycast pour indiquer le
membre le plus proche d'un groupe d'hôtes (non implémenté sous Linux),
IPv4-on-IPv6 pour un hôte IPv4 et d'autres types d'adresse réservés.
La notation d'adresse pour l'IPv6 est un groupe de 8 nombres hexadécimaux
sur 4 chiffres, séparés par un deux-points « : ». Un « :: » représente
une chaîne de bits 0. Les adresses spéciales sont ::1 pour le bouclage
loopback et ::FFFF:<adresse IPv4> pour les projections d'adresses
IPv4 sur l'IPv6.
L'espace des ports de l'IPv6 est partagé avec l'IPv4.
Options de socket
IPv6 accepte quelques options des sockets spécifiques du protocole, qui
peuvent être définies avec setsockopt(2) et consultées avec
getsockopt(2). Le niveau d'option de socket pour l'IPv6 est
IPPROTO_IPV6. Un entier booléen est faux quand il est nul et vrai sinon.
- IPV6_ADDRFORM
-
Transformer un socket AF_INET6 en un socket d'une famille d'adresse
différente. Seul AF_INET est actuellement pris en charge pour cela. Cela
n'est autorisé que pour les sockets IPv6 connectés et attachés à une adresse
v4-sur-v6. L'argument est un pointeur sur un entier contenant
AF_INET. Cela est utile pour passer des sockets projetés en v4 comme
descripteurs à des programmes ne sachant pas manipuler l'API IPv6.
- IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP
-
Déterminer l'appartenance aux groupes multicast. L'argument est un pointeur
sur une structure struct ipv6_mreq.
- IPV6_MTU
-
getsockopt() : récupérer la MTU du chemin actuellement déterminée pour le
socket. Valable seulement quand le socket a été connecté. Renvoie un entier.
-
setsockopt() : définir le MTU à utiliser pour le socket. Le MTU est
limité par celui du périphérique ou celui du chemin lorsque la recherche du
MTU par chemin est activée. L'argument est un pointeur sur un entier.
- IPV6_MTU_DISCOVER
-
Commander la recherche du MTU du chemin sur le socket. Consultez l'option
IP_MTU_DISCOVER dans ip(7) pour plus de précisions.
- IPV6_MULTICAST_HOPS
-
Définir la limite du nombre de sauts (hops) multicast du socket. L'argument
est un pointeur sur un entier. La valeur -1 correspond à la valeur par
défaut de routage, sinon il doit s'agir d'un entier entre 0 et 255.
- IPV6_MULTICAST_IF
-
Définir le périphérique pour les paquets multicast sortants du socket. Ce
n'est permis que pour les sockets SOCK_DGRAM et SOCK_RAW. L'argument
est un pointeur sur un numéro d'interface (consultez netdevice(7)) dans
un entier.
- IPV6_MULTICAST_LOOP
-
Déterminer si le socket voit les paquets multicast qu'il a lui-même
émis. L'argument est un pointeur sur une valeur booléenne.
- IPV6_RECVPKTINFO (depuis Linux 2.6.14)
-
Définir la distribution des messages de contrôle IPV6_PKTINFO des
datagrammes entrants. Ce type de messages de contrôle contient une struct in6_pktinfo, conformément à la RFC 3542. Uniquement autorisé pour les
sockets SOCK_DGRAM ou SOCK_RAW. L'argument est un pointeur sur une
valeur booléenne dans un entier.
- IPV6_RTHDR, IPV6_AUTHHDR, IPV6_DSTOPTS, IPV6_HOPOPTS, IPV6_FLOWINFO, IPV6_HOPLIMIT
-
Définir la distribution des messages de contrôle des datagrammes entrants
contenant les en-têtes d'extensions du paquet reçu. IPV6_RTHDR délivre
l'en-tête de routage, IPV6_AUTHHDR délivre l'en-tête d'authentification,
IPV6_DSTOPTS délivre les options de destination, IPV6_HOPOPTS délivre
les options de saut, IPV6_FLOWINFO délivre un entier contenant
l'identificateur de flux, IPV6_HOPLIMIT délivre un entier contenant le
nombre de sauts du paquet. Les messages de contrôle ont le même type que
l'option de socket. Toutes ces options d'en-tête peuvent aussi être définies
pour les paquets sortants en mettant le message de contrôle approprié dans
le tampon de contrôle de sendmsg(2). Uniquement autorisé pour les sockets
SOCK_DGRAM ou SOCK_RAW. L'argument est un pointeur sur une valeur
booléenne.
- IPV6_RECVERR
-
Commander la réception des erreurs asynchrones. Consultez IP_RECVERR dans
ip(7) pour plus de précisions. L'argument est un pointeur sur un booléen.
- IPV6_ROUTER_ALERT
-
Passer sur ce socket tous les paquets redirigés (forwarded) contenant une
option « hop-by-hop » d'alerte du routeur. Uniquement autorisé pour les
sockets SOCK_RAW. Les paquets exploités ne sont pas redirigés par le
noyau, il est de la responsabilité de l'utilisateur de les
renvoyer. L'argument est un pointeur vers un entier. Un entier positif
indique une valeur option d'alerte du routeur à intercepter. Les paquets
portant une option d'alerte du routeur avec un champ de valeur contenant cet
entier sera délivré au socket. Un entier négatif désactive la délivrance de
packets avec des options d'alerte du routeur à ce socket.
- IPV6_UNICAST_HOPS
-
Définir la limite du nombre de sauts (hops) unicast pour le
socket. L'argument est un pointeur sur un entier. La valeur -1 correspond à
la valeur par défaut de routage, sinon il doit s'agir d'un entier entre 0 et
255.
- IPV6_V6ONLY (depuis Linux 2.4.21 et 2.6)
-
Quand cet attribut est positionné (différent de zéro), alors le socket est
limité à l'émission et la réception de paquets IPv6. Dans ce cas, une
application IPv4 et IPv6 peuvent s'associer à un même port en même temps.
-
Si cet attribut n'est pas positionné (zéro), alors le socket peut être
utilisé pour émettre ou recevoir des paquets depuis et vers une adresse IPv6
ou une projections d'adresse IPv4 sur IPv6.
-
Le paramètre est un pointeur vers un booléen dans un entier.
-
La valeur par défaut de cet attribut est défini par le contenu du fichier
/proc/sys/net/ipv6/bindv6only. La valeur par défaut de ce fichier est 0
(désactivé).
ERREURS
- ENODEV
-
L'utilisateur a essayé de lier avec bind(2) sur une adresse locale lien
IPv6, mais le sin6_scope_id de la structure sockaddr_in6 fournie n'est
pas un numéro d'interface valable.
VERSIONS
Linux 2.4 rompt la compatibilité binaire pour la structure sockaddr_in6
des hôtes sur 64 bits, en modifiant l'alignement de in6_addr et en
ajoutant un champ sin6_scope_id supplémentaire. Les interfaces du noyau
restent compatible, mais un programme contenant des sockaddr_in6 ou des
in6_addr dans d'autres structures ne l'est peut être pas. Ce n'est pas un
problème pour les hôtes sur 32 bits comme les i386.
Le champ sin6_flowinfo est une nouveauté Linux 2.4. Il est écrit/lu de
manière transparente par le noyau quand la longueur de l'adresse passée le
contient. Certains programmes qui passent un tampon d'adresse plus long et
vérifient ensuite la longueur de l'adresse renvoyée peuvent échouer.
NOTES
La structure sockaddr_in6 est plus grande que la structure sockaddr
générique. Les programmes qui supposent que tous les types d'adresses
peuvent être stockés dans une struct sockaddr doivent être modifiés pour
utiliser struct sockaddr_storage à la place.
SOL_IP, SOL_IPV6, SOL_ICMPV6 et d'autres options de socket SOL_*
sont des variantes non portables de IPPROTO_*. Voir aussi ip(7).
BOGUES
L'API IPv6 étendue, telle que dans la RFC 2292, n'est encore que
partiellement implémentée. Bien que les noyaux 2.2 ont une prise en charge
pratiquement complète des options de réception, les macros déclarant les
options IPv6 manquent dans la glibc 2.1.
La prise en charge IPSec pour les en-têtes EH et AH manque.
La gestion des étiquettes de flux n'est pas complète, ni documentée ici.
Cette page de manuel n'est pas complète.
VOIR AUSSI
cmsg(3), ip(7)
RFC 2553 : API IPv6 de base, avec laquelle Linux essaye d'être
compatible. RFC 2460 : spécifications d'IPv6.
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-Pierre Giraud <jean-pierregiraud@neuf.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
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 à
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- Formats d'adresse
-
- Options de socket
-
- ERREURS
-
- VERSIONS
-
- NOTES
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:37 GMT, September 19, 2025