Compression et expansion IPv6

Abrégez une adresse IPv6 en son unique forme canonique ou étendez-la à ses 32 chiffres, et voyez quels zéros disparaissent, pourquoi une suite est devenue :: et quelle règle de la RFC 5952 votre saisie enfreignait. Les listes fonctionnent aussi.

Texte canonique RFC 5952 · analyse RFC 4291, fins IPv4 mixtes comprises · fonctionne dans votre navigateur

Lu comme IPv6

Les 8 groupes, et ce que la compression retireCaractères : 39 → 17 · 22 caractères en moins
conservézéro de tête, retiréla suite qui devient ::autres zéros, conservés
Essayez

Une adresse, ou une liste avec une adresse par ligne (100 au maximum). Conversion dans votre navigateur ; rien n'est envoyé.

3 règles appliquéesRFC 5952

2001:db8::1:0:0:1

Deux suites de 2 groupes nuls : la première est devenue ::

RFC 5952, règle par règle

Zéros de tête retirés§4.1Corrigée0DB8 → db8, 0001 → 1, 0000 → 0, 0000 → 0
:: aussi long que possible§4.2.1Corrigée0000:0000 écrit en entier → ::
Pas de :: pour un seul groupe§4.2.2Respectée
Suite la plus longue, la première en cas d'égalité§4.2.3RespectéeDeux suites de 2 groupes nuls : la première est devenue ::
Minuscules§4.3Corrigée0DB8 → db8
Compressée (RFC 5952)
Étendue (complète)
Dans une URL
En nombre
Décimal · hexa · binaire
Nom DNS inverse

Comment compresser une adresse IPv6 ?

Mettez-la en minuscules, retirez les zéros de tête de chaque groupe, puis remplacez par :: la plus longue suite de deux groupes nuls ou plus, la première si deux sont aussi longues.

Vous obtenez ainsi l'unique forme canonique que la RFC 5952 demande aux logiciels d'afficher. Les programmes doivent toujours accepter en entrée toute autre écriture valide : compresser ne change donc jamais l'adresse, seulement sa façon de l'écrire.

2001:0DB8:0000:0000:0000:FF00:0042:8329 abrégée en 2001:db8::ff00:42:8329, étape par étape.
Outil de compression IPv6 montrant les zéros que la RFC 5952 retire et la suite qui devient ::Outil de compression IPv6 montrant les zéros que la RFC 5952 retire et la suite qui devient ::Ce que vous avez saisiMajuscules, zéros de tête et tout le reste : toute écriture valide est lue.Zéros retirésLes zéros de tête barrés, groupe par groupe.La suite qui devient ::La plus longue suite de groupes nuls ; en cas d'égalité, la première.Les suites qui restentLes autres suites de zéros gardent leurs 0, avec la raison.Règle par règleCombien de règles de la RFC 5952 la saisie enfreignait ; la liste en dessous nomme chacune et ce qui a changé.
Deux suites de zéros égales : la RFC 5952 compresse la première, et la liste de contrôle nomme chaque règle enfreinte par la saisie.

Quelles sont les règles de compression IPv6 ?

La RFC 5952 fixe cinq règles : retirer les zéros de tête, rendre :: aussi long que possible, ne jamais utiliser :: pour un seul groupe nul, compresser la plus longue suite (la première en cas d'égalité) et écrire les lettres hexa en minuscules.

Une sixième recommandation concerne les adresses qui portent une IPv4 : après un préfixe comme ::ffff:, écrivez les 32 derniers bits sous forme d'adresse IPv4 pointée. L'outil vérifie chaque règle sur votre saisie et nomme celles qu'il a corrigées.

1Zéros de tête retirés§4.1

Correct: 2001:db8::1

Incorrect: 2001:0db8::0001

2:: aussi long que possible§4.2.1

Correct: 2001:db8::2:1

Incorrect: 2001:db8:0:0:0:0:2:1

3Pas de :: pour un seul groupe§4.2.2

Correct: 2001:db8:0:1:1:1:1:1

Incorrect: 2001:db8::1:1:1:1:1

4Suite la plus longue, la première en cas d'égalité§4.2.3

Correct: 2001:db8::1:0:0:1

Incorrect: 2001:db8:0:0:1::1

5Minuscules§4.3

Correct: 2001:db8::a

Incorrect: 2001:DB8::A

+Fin IPv4 pointée§5

Correct: ::ffff:192.0.2.1

Incorrect: 0:0:0:0:0:ffff:192.0.2.1

Chaque règle avec les bons et les mauvais exemples de la RFC 5952 elle-même.

Comment étendre une adresse IPv6 ?

Comptez les groupes écrits, faites remplacer par :: autant de groupes nuls qu'il en faut pour arriver à huit, et complétez chaque groupe à quatre chiffres : 2001:db8::1 a trois groupes, donc :: en vaut cinq.

La forme étendue est celle qu'utilise le DNS inverse, quartet par quartet, et celle dont beaucoup de journaux et de tableurs ont besoin pour trier en texte. Python l'appelle .exploded, Go StringExpanded.

2001:db8::1 étendue : 3 groupes écrits, 5 groupes nuls pour ::, chaque groupe complété.

De combien de façons peut-on écrire une adresse IPv6 ?

De nombreuses : les zéros de tête, la casse des lettres et la place de :: peuvent varier, donc une adresse a de nombreuses écritures valides, et la RFC 5952 en liste huit pour 2001:db8:0:0:1:0:0:1 avant de fixer une forme canonique.

C'est pourquoi comparer des adresses comme du texte échoue : deux écritures de la même adresse ne correspondent pas. Comparez-les plutôt comme des nombres de 128 bits, ou compressez les deux d'abord.

2001:db8:0:0:1:0:0:12001:0db8:0:0:1:0:0:12001:db8::1:0:0:12001:db8::0:1:0:0:12001:0db8::1:0:0:12001:db8:0:0:1::12001:db8:0000:0:1::12001:DB8:0:0:1::1
2001:db8::1:0:0:1canonique · RFC 5952
Huit écritures tirées de la RFC 5952, une seule adresse.

Comment écrire une adresse IPv6 dans une URL, avec un port ou une zone ?

Mettez l'adresse entre crochets, http://[2001:db8::1]:8443/, pour que le port ne soit pas pris pour un groupe ; une zone comme %eth0 ne peut pas du tout figurer dans une URL de navigateur.

La RFC 5952 demande de mettre entre crochets une adresse suivie d'un port et qualifie 2001:db8::1:8443 de non recommandé. Les crochets ne servent à rien d'autre dans une URL. Les navigateurs affichent l'adresse en hexa même après ::ffff:, donc [::ffff:192.0.2.1] apparaît comme [::ffff:c000:201].

Les zones désignent une interface sur une machine, comme dans fe80::1%eth0. La RFC 9844 les a retirées des URL en 2025 et les navigateurs les refusent, mais les programmes devraient toujours vous laisser en saisir une.

http://schéma[2001:db8::1]IPv6 entre crochets:8443port/statuschemin

Une zone (%eth0) · fe80::1%eth0

Saisie dans le champ d'un programmeautorisée
Dans une URL de navigateurrefusée
inet_pton()ne sait pas la lire
Adresses globalesn'en ont jamais
Une URL contenant une adresse IPv6, décomposée, et où une zone peut figurer.

Comment compresser ou étendre une adresse IPv6 dans le code ?

Analysez l'adresse puis affichez-la : .compressed en Python, netip.Addr.String() en Go et INET6_NTOA(INET6_ATON(…)) dans MySQL donnent le texte canonique, et .exploded et StringExpanded() la forme complète.

En Python, str() donne aussi la forme compressée, et Python accepte un suffixe %zone. MySQL affiche en minuscules, 39 caractères au plus, de la même façon sur toutes les plateformes.

› import ipaddress
a = ipaddress.ip_address('2001:0DB8::0001')
a.compressed, a.exploded
('2001:db8::1', '2001:0db8:0000:0000:0000:0000:0000:0001')

Python ipaddress

› a := netip.MustParseAddr("2001:0DB8::0001")
fmt.Println(a.String(), a.StringExpanded())
2001:db8::1 2001:0db8:0000:0000:0000:0000:0000:0001

Go net/netip

› SELECT INET6_NTOA(INET6_ATON('2001:0DB8::0001'));
2001:db8::1

MySQL 8.4

La forme courte canonique et la forme complète depuis Python, Go et MySQL.

Questions fréquentes

Quelle est la forme compressée de 2001:0db8:0000:0000:0000:ff00:0042:8329 ?

C'est 2001:db8::ff00:42:8329. Mettez les lettres en minuscules, retirez les zéros de tête de chaque groupe (0db8 devient db8, 0042 devient 42), puis remplacez la suite de trois groupes nuls par ::. Le résultat fait 22 caractères au lieu de 39, et c'est la seule forme que la RFC 5952 dit canonique. En l'étendant de nouveau, on retrouve exactement les mêmes 32 chiffres hexa.

Peut-on utiliser :: deux fois dans une adresse IPv6 ?

Non. :: remplace un ou plusieurs groupes de zéros et ne peut apparaître qu'une fois ; avec deux, personne ne saurait combien de groupes nuls chacun représente, donc 2001:db8::1::1 est invalide. Quand une adresse a deux suites de zéros, compressez la plus longue, ou la première si elles sont aussi longues, et écrivez l'autre 0:0, comme dans 2001:db8::1:0:0:1.

Pourquoi 2001:db8:0:1:1:1:1:1 ne se compresse-t-elle pas en 2001:db8::1:1:1:1:1 ?

Parce que la RFC 5952 interdit d'utiliser :: pour un seul groupe nul. Le raccourci ferait gagner un caractère et rendrait l'adresse plus difficile à lire, donc la forme canonique garde le groupe isolé sous la forme 0 : 2001:db8:0:1:1:1:1:1. Les analyseurs acceptent quand même 2001:db8::1:1:1:1:1 comme la même adresse, mais les logiciels ne devraient jamais l'afficher ainsi.

Les adresses IPv6 s'écrivent-elles en majuscules ou en minuscules ?

En minuscules. La RFC 5952 exige les lettres hexa a à f en minuscules pour la forme canonique, et les navigateurs comme la plupart des bibliothèques les affichent ainsi. Les logiciels doivent tout de même accepter les majuscules en entrée, donc 2001:DB8::A et 2001:db8::a sont la même adresse ; seule la forme affichée change. Les majuscules sont courantes dans la documentation ancienne et dans les fichiers de configuration de certains constructeurs.

Comment étendre :: dans une adresse IPv6 ?

Comptez les groupes écrits, puis faites remplacer par :: autant de groupes nuls qu'il en faut pour arriver à huit. Dans 2001:db8::ff00:42:8329, cinq groupes sont écrits, donc :: vaut trois groupes 0000. Complétez chaque groupe à quatre chiffres et vous obtenez 2001:0db8:0000:0000:0000:ff00:0042:8329, la forme étendue qu'utilisent le DNS inverse et de nombreux outils de journalisation.

Combien de caractères compte la plus longue adresse IPv6 ?

39 pour la forme hexa complète : huit groupes de quatre chiffres et sept deux-points. La forme avec une fin IPv4 pointée peut être plus longue, c'est pourquoi la taille de tampon INET6_ADDRSTRLEN de l'API socket est de 46 octets, assez pour 0000:0000:0000:0000:0000:ffff:255.255.255.255 et le NUL final. Les adresses compressées sont en général bien plus courtes ; l'adresse :: ne fait que deux caractères.

Pourquoi ::ffff:c000:280 devient-elle ::ffff:192.0.2.128 ?

Parce que la RFC 5952 recommande d'écrire les 32 derniers bits d'une adresse IPv4 mappée sous forme d'adresse IPv4 pointée, puisque c'est ce que ces bits signifient. Les deux écritures sont la même adresse et toutes deux sont des entrées valides. Les navigateurs font exception : le standard URL affiche toujours la forme hexa, donc la même adresse apparaît comme [::ffff:c000:280] dans la barre d'adresse.

Comment mettre une adresse IPv6 avec un port dans une URL ?

Mettez l'adresse entre crochets et le port après : http://[2001:db8::1]:8443/. Sans crochets, le port ressemblerait à un groupe de plus, c'est pourquoi la RFC 5952 déconseille d'écrire 2001:db8::1:8443. Dans les URL, les crochets ne servent qu'aux littéraux IPv6. Une zone comme %eth0 ne peut pas du tout figurer dans une URL de navigateur ; les navigateurs la refusent.

Comment compresser une adresse IPv6 en Python ?

Analysez-la avec le module ipaddress et lisez .compressed pour la forme courte canonique ou .exploded pour les 32 chiffres : ipaddress.ip_address('2001:0db8::0001').compressed donne '2001:db8::1', et str() renvoie la même chose. En Go, String() et StringExpanded() de netip.Addr font le même travail, et INET6_NTOA(INET6_ATON(…)) de MySQL affiche le texte canonique en minuscules.

Peut-on compresser une liste d'adresses IPv6 d'un coup ?

Oui. Collez jusqu'à 100 adresses, une par ligne, et l'outil passe à un tableau avec la forme compressée et la forme étendue de chaque ligne, et les règles de la RFC 5952 que son écriture enfreignait. Les lignes qui ne sont pas des adresses sont signalées plutôt que supprimées, pour que les lignes correspondent toujours à votre saisie. Copiez l'une ou l'autre colonne ou téléchargez un CSV ; rien ne quitte votre navigateur.