Compressão e expansão de IPv6

Abrevie um endereço IPv6 para a sua única forma canônica ou expanda-o para os 32 dígitos, e veja quais zeros saem, por que uma sequência virou :: e qual regra da RFC 5952 a sua digitação quebrou. Listas também funcionam.

Texto canônico da RFC 5952 · leitura pela RFC 4291, com finais IPv4 mistos · roda no seu navegador

Lido como IPv6

Os 8 grupos e o que a compressão removeCaracteres: 39 → 17 · 22 caracteres a menos
mantidozero à esquerda, removidoa sequência que vira ::outros zeros, mantidos
Experimente

Um endereço, ou uma lista com um por linha (até 100). A conversão é feita no seu navegador; nada é enviado.

3 regras aplicadasRFC 5952

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

Duas sequências de 2 grupos de zeros: a primeira virou ::

RFC 5952, regra por regra

Zeros à esquerda removidos§4.1Corrigida0DB8 → db8, 0001 → 1, 0000 → 0, 0000 → 0
:: o mais longo possível§4.2.1Corrigida0000:0000 escrito por extenso → ::
Sem :: para um só grupo§4.2.2Cumprida
A sequência mais longa; a primeira no empate§4.2.3CumpridaDuas sequências de 2 grupos de zeros: a primeira virou ::
Minúsculas§4.3Corrigida0DB8 → db8
Comprimido (RFC 5952)
Expandido (completo)
Numa URL
Como número
Decimal · hex · binário
Nome de DNS reverso

Como comprimir um endereço IPv6?

Passe-o para minúsculas, remova os zeros à esquerda de cada grupo e depois troque por :: a sequência mais longa de dois ou mais grupos só de zeros, ou a primeira, se duas tiverem o mesmo tamanho.

Isso dá a única forma canônica que a RFC 5952 pede que o software imprima. Os programas ainda precisam aceitar qualquer outra grafia válida como entrada, então comprimir nunca muda o endereço, só a forma de escrevê-lo.

2001:0DB8:0000:0000:0000:FF00:0042:8329 abreviado para 2001:db8::ff00:42:8329, passo a passo.
Ferramenta de compressão IPv6 mostrando os zeros que a RFC 5952 remove e a sequência que vira ::Ferramenta de compressão IPv6 mostrando os zeros que a RFC 5952 remove e a sequência que vira ::O que você digitouMaiúsculas, zeros à esquerda e tudo mais: qualquer grafia válida é lida.Zeros removidosZeros à esquerda riscados, grupo por grupo.A sequência que vira ::A sequência mais longa de grupos de zeros; no empate, a primeira.Sequências que ficamAs outras sequências de zeros mantêm os seus 0, com o motivo.Regra por regraQuantas regras da RFC 5952 a digitação quebrou; a lista abaixo aponta cada uma e o que mudou.
Duas sequências de zeros iguais: a RFC 5952 comprime a primeira, e a lista de verificação aponta cada regra que a digitação quebrou.

Quais são as regras de compressão do IPv6?

A RFC 5952 define cinco regras: remover os zeros à esquerda, fazer o :: o mais longo possível, nunca usar :: para um único grupo de zeros, comprimir a sequência mais longa (a primeira no empate) e escrever as letras hex em minúsculas.

Uma sexta recomendação trata dos endereços que carregam IPv4: depois de um prefixo como ::ffff:, escreva os últimos 32 bits como um endereço IPv4 com pontos. A ferramenta confere cada regra com o que você digitou e aponta as que corrigiu.

1Zeros à esquerda removidos§4.1

Certo: 2001:db8::1

Errado: 2001:0db8::0001

2:: o mais longo possível§4.2.1

Certo: 2001:db8::2:1

Errado: 2001:db8:0:0:0:0:2:1

3Sem :: para um só grupo§4.2.2

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

Errado: 2001:db8::1:1:1:1:1

4A sequência mais longa; a primeira no empate§4.2.3

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

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

5Minúsculas§4.3

Certo: 2001:db8::a

Errado: 2001:DB8::A

+Final IPv4 com pontos§5

Certo: ::ffff:192.0.2.1

Errado: 0:0:0:0:0:ffff:192.0.2.1

Cada regra com os exemplos certos e errados da própria RFC 5952.

Como expandir um endereço IPv6?

Conte os grupos escritos, deixe o :: representar quantos grupos de zeros faltarem para chegar a oito e complete cada grupo até quatro dígitos: 2001:db8::1 tem três grupos, então o :: vale cinco.

A forma expandida é a que o DNS reverso usa, dígito por dígito, e a que muitos logs e planilhas precisam para ordenar como texto. O Python a chama de .exploded e o Go de StringExpanded.

2001:db8::1 expandido: 3 grupos escritos, 5 grupos de zeros no lugar de ::, cada grupo completado.

De quantas formas um endereço IPv6 pode ser escrito?

De muitas: zeros à esquerda, maiúsculas e minúsculas e a posição do :: podem mudar, então um endereço tem muitas grafias válidas, e a RFC 5952 lista oito para 2001:db8:0:0:1:0:0:1 antes de fixar uma forma canônica.

É por isso que comparar endereços como texto falha: duas grafias do mesmo endereço não coincidem. Compare-os como números de 128 bits, ou comprima os dois antes.

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:1canônica · RFC 5952
Oito grafias da RFC 5952, um só endereço.

Como escrever um endereço IPv6 numa URL, com porta ou zona?

Coloque o endereço entre colchetes, http://[2001:db8::1]:8443/, para que a porta não seja confundida com um grupo; uma zona como %eth0 não pode entrar numa URL do navegador.

A RFC 5952 manda pôr entre colchetes um endereço com porta e chama 2001:db8::1:8443 de não recomendado. Os colchetes não servem para mais nada numa URL. Os navegadores imprimem o endereço em hex mesmo depois de ::ffff:, então [::ffff:192.0.2.1] aparece como [::ffff:c000:201].

As zonas indicam uma interface numa única máquina, como em fe80::1%eth0. A RFC 9844 as tirou de novo das URLs em 2025 e os navegadores as recusam, embora os programas ainda devam deixar você digitar uma.

http://esquema[2001:db8::1]IPv6 entre colchetes:8443porta/statuscaminho

Uma zona (%eth0) · fe80::1%eth0

Digitada no campo de um programapermitida
Numa URL do navegadorrecusada
inet_pton()não consegue ler
Endereços globaisnunca têm
Uma URL com um endereço IPv6 desmontada, e onde uma zona pode ficar.

Como comprimir ou expandir IPv6 em código?

Leia o endereço e imprima-o: o .compressed do Python, o netip.Addr.String() do Go e o INET6_NTOA(INET6_ATON(…)) do MySQL dão o texto canônico, e .exploded e StringExpanded(), a forma completa.

No Python, str() também dá a forma comprimida, e o Python aceita um sufixo %zona. O MySQL imprime em minúsculas, com no máximo 39 caracteres, igual em todas as plataformas.

› 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

A forma canônica curta e a forma completa em Python, Go e MySQL.

Perguntas frequentes

Qual é a forma comprimida de 2001:0db8:0000:0000:0000:ff00:0042:8329?

É 2001:db8::ff00:42:8329. Passe as letras para minúsculas, remova os zeros à esquerda de cada grupo (0db8 vira db8, 0042 vira 42) e troque por :: a sequência de três grupos só de zeros. O resultado tem 22 caracteres em vez de 39, e é a única forma que a RFC 5952 chama de canônica. Expandi-lo de novo devolve exatamente os mesmos 32 dígitos hex.

Dá para usar :: duas vezes num endereço IPv6?

Não. O :: representa um ou mais grupos de zeros e só pode aparecer uma vez; com dois, ninguém saberia quantos grupos de zeros cada um representa, então 2001:db8::1::1 é inválido. Quando um endereço tem duas sequências de zeros, comprima a mais longa, ou a primeira se tiverem o mesmo tamanho, e escreva a outra como 0:0, como em 2001:db8::1:0:0:1.

Por que 2001:db8:0:1:1:1:1:1 não vira 2001:db8::1:1:1:1:1?

Porque a RFC 5952 proíbe usar :: para um único grupo de zeros. Esse encurtamento economizaria um caractere e deixaria o endereço mais difícil de ler, então a forma canônica mantém o grupo isolado como 0: 2001:db8:0:1:1:1:1:1. Os parsers ainda aceitam 2001:db8::1:1:1:1:1 como o mesmo endereço, mas o software nunca deveria imprimi-lo assim.

Endereços IPv6 devem ser escritos em maiúsculas ou minúsculas?

Em minúsculas. A RFC 5952 exige as letras hex de a a f em minúsculas na forma canônica, e os navegadores e a maioria das bibliotecas as imprimem assim. O software ainda precisa aceitar maiúsculas na entrada, então 2001:DB8::A e 2001:db8::a são o mesmo endereço; só a forma impressa muda. Maiúsculas são comuns em documentação antiga e nos arquivos de configuração de alguns fabricantes.

Como expandir o :: num endereço IPv6?

Conte os grupos escritos e deixe o :: representar quantos grupos de zeros faltarem para chegar a oito. Em 2001:db8::ff00:42:8329 há cinco grupos escritos, então o :: vale três grupos de 0000. Complete cada grupo até quatro dígitos e você terá 2001:0db8:0000:0000:0000:ff00:0042:8329, a forma expandida que o DNS reverso e muitas ferramentas de log usam.

Quantos caracteres tem o endereço IPv6 mais longo?

39 na forma hex completa: oito grupos de quatro dígitos e sete sinais de dois-pontos. A forma com final IPv4 com pontos pode ser mais longa, e é por isso que o tamanho de buffer INET6_ADDRSTRLEN da API de sockets é de 46 bytes, o suficiente para 0000:0000:0000:0000:0000:ffff:255.255.255.255 e o NUL final. Endereços comprimidos costumam ser bem mais curtos; o endereço :: tem só dois caracteres.

Por que ::ffff:c000:280 vira ::ffff:192.0.2.128?

Porque a RFC 5952 recomenda escrever os últimos 32 bits de um endereço IPv4 mapeado como um endereço IPv4 com pontos, já que é isso que esses bits significam. As duas grafias são o mesmo endereço e ambas são entradas válidas. Os navegadores são a exceção: o URL Standard sempre imprime a forma hex, então o mesmo endereço aparece como [::ffff:c000:280] na barra de endereços.

Como colocar um endereço IPv6 com porta numa URL?

Coloque o endereço entre colchetes e a porta depois deles: http://[2001:db8::1]:8443/. Sem colchetes, a porta pareceria mais um grupo, e é por isso que a RFC 5952 diz para não escrever 2001:db8::1:8443. Os colchetes só são usados para literais IPv6 em URLs. Uma zona como %eth0 não pode entrar numa URL do navegador; os navegadores a recusam.

Como comprimir um endereço IPv6 em Python?

Leia-o com o módulo ipaddress e use .compressed para a forma canônica curta ou .exploded para todos os 32 dígitos: ipaddress.ip_address('2001:0db8::0001').compressed dá '2001:db8::1', e str() retorna o mesmo. No Go, String() e StringExpanded() de netip.Addr fazem o mesmo trabalho, e o INET6_NTOA(INET6_ATON(…)) do MySQL imprime texto canônico em minúsculas.

Posso comprimir uma lista de endereços IPv6 de uma vez?

Sim. Cole até 100 endereços, um por linha, e a ferramenta passa a mostrar uma tabela com a forma comprimida e a expandida de cada linha e as regras da RFC 5952 que a grafia quebrou. Linhas que não são endereços são marcadas em vez de descartadas, então as linhas continuam batendo com a sua entrada. Copie qualquer uma das colunas ou baixe um CSV; nada sai do seu navegador.