02 - Representação de Endereços
video: https://youtu.be/... no frontmatter da nota.Representação de Endereços IPv6
Diferente do IPv4, que usa decimal separado por pontos (ex: 192.168.1.1), o IPv6 é representado em hexadecimal separado por dois-pontos (:). A notação foi definida na RFC 4291 e refinada para padronização canônica pela RFC 5952 (A Recommendation for IPv6 Address Text Representation), que elimina ambiguidades na escrita.
1. Estrutura Básica
Um endereço IPv6 completo tem 32 caracteres hexadecimais, divididos em 8 grupos de 4 dígitos (conhecidos como hextetos ou quartets). Cada dígito hexa representa 4 bits, então: $8 \times 4 \times 4 = 128$ bits.
Exemplo de formato completo:
2001:0db8:0000:0000:0008:0800:200c:417a
Cada hexteto corresponde a 16 bits. Os primeiros 64 bits normalmente identificam o prefixo de rede (rota), enquanto os últimos 64 bits compõem o Interface ID.
2. Regras de Simplificação (RFC 5952)
Para facilitar a leitura e escrita humana, a RFC 5952 define duas regras obrigatórias de compressão, que devem ser aplicadas sempre que possível.
Regra 1: Omissão de Zeros à Esquerda (Leading Zeros)
Dentro de cada grupo de 4 dígitos, os zeros à esquerda podem (e devem, na forma canônica) ser omitidos. Cada hexteto é representado com pelo menos 1 dígito.
| Forma expandida | Forma comprimida |
|---|---|
:0db8: |
:db8: |
:0000: |
:0: |
:0800: |
:800: |
:0042: |
:42: |
:0001: |
:1: |
Aplicando a Regra 1 ao endereço exemplo:
2001:db8:0:0:8:800:200c:417a
Regra 2: Compressão de Zeros (:: - Double Colon)
Uma sequência contínua de um ou mais grupos compostos apenas por zeros pode ser substituída por dois pontos duplos (::).
IMPORTANTE: Esta regra só pode ser aplicada uma única vez por endereço. Se houver duas ou mais sequências de zeros, deve-se comprimir a maior delas; em caso de empate, comprime-se a primeira (esquerda). A regra garante que o número de grupos omitidos seja computável: $8 - \text{grupos visíveis} = \text{grupos omitidos}$.
Aplicando as Regras 1 e 2 ao exemplo:
2001:db8::8:800:200c:417a
Exemplos de Compressão Passo a Passo
| Endereço expandido | Após Regra 1 | Forma canônica (RFC 5952) |
|---|---|---|
2001:0db8:0000:0000:0000:0000:0000:0001 |
2001:db8:0:0:0:0:0:1 |
2001:db8::1 |
fe80:0000:0000:0000:021a:2bff:fe3c:4d5e |
fe80:0:0:0:21a:2bff:fe3c:4d5e |
fe80::21a:2bff:fe3c:4d5e |
0000:0000:0000:0000:0000:0000:0000:0000 |
0:0:0:0:0:0:0:0 |
:: |
0000:0000:0000:0000:0000:0000:0000:0001 |
0:0:0:0:0:0:0:1 |
::1 |
2001:0db8:abcd:0012:0000:0000:0000:0000 |
2001:db8:abcd:12:0:0:0:0 |
2001:db8:abcd:12:: |
Resolução Inversa: Expandindo ::
Para expandir um endereço comprimido de volta à forma completa, conta-se o número de hextetos visíveis e completa-se com 0000 até atingir 8 grupos.
Exemplo: 2001:db8::1 tem 3 hextetos visíveis (2001, db8, 1). Logo, $8 - 3 = 5$ hextetos de zeros a inserir entre db8 e 1:
2001:0db8:0000:0000:0000:0000:0000:0001
3. Endereços Especiais
Loopback (Localhost)
- Completo:
0000:0000:0000:0000:0000:0000:0000:0001 - Comprimido:
::1
Equivalente ao 127.0.0.1 do IPv4. Usado para testes locais da pilha TCP/IP.
Não Especificado (Unspecified Address)
- Completo:
0000:0000:0000:0000:0000:0000:0000:0000 - Comprimido:
::
Equivalente ao 0.0.0.0 do IPv4. Usado por um host antes de obter seu próprio endereço (ex: pacote DHCPv6 SOLICIT de origem).
4. Representação de Rede (Prefixo CIDR)
No IPv6, não existem máscaras de sub-rede no formato decimal (255.255.255.0). Usa-se exclusivamente a notação CIDR para indicar o tamanho do prefixo.
Exemplo:
2001:db8:abcd:12::/64
- O
/64indica que os primeiros 64 bits identificam a rede e os 64 bits restantes identificam a interface (Interface ID).
Padrões Comuns de Prefixo
| Prefixo | Significado | RFC |
|---|---|---|
/128 |
Host único | — |
/127 |
Ponto-a-ponto entre roteadores (RFC 6164) | RFC 6164 |
/64 |
Sub-rede padrão (exigido para SLAAC) | RFC 4291 |
/56 |
Atribuição típica para clientes residenciais | RIPE/RIRs |
/48 |
Atribuição típica para sites/empresas | RFC 4291 |
/32 |
Alocação a ISPs (LIR) | políticas RIR |
/12 |
Alocação a TIER-1 / IANA | IANA |
5. IPv6 em URLs (RFC 3986)
Como o IPv6 usa : como separador, isso entra em conflito com a sintaxe de URL (http://host:porta/caminho). A solução definida pela RFC 3986 é envolver o endereço IPv6 em colchetes [ ].
| Sintaxe | Exemplo |
|---|---|
| HTTP com porta | http://[2001:db8::1]:8080/index.html |
| HTTPS | https://[2001:db8::1]/ |
| SSH | ssh user@[2001:db8::1] |
| Ping | ping 2001:db8::1 (sem colchetes, pois não há porta) |
| Curl | curl -v "http://[2001:db8::1]:8080/" |
Os colchetes nunca fazem parte do endereço em si — servem apenas como delimitador na URL. Ferramentas de DNS (registro AAAA), ping, traceroute, ip não usam colchetes.
6. Identificadores de Zona (Zone ID)
Em hosts multihoming (várias interfaces) e quando se usa Link-Local (fe80::/10), o mesmo endereço fe80::1 pode existir em múltiplas interfaces do mesmo host. Para desambiguar, usa-se o Zone ID (RFC 4007), separado por %:
fe80::1%eth0
fe80::1%eth1
fe80::1%2 (Windows: ID numérico da interface)
O Zone ID é local ao host e nunca trafega pela rede.
7. Comparação Visual: IPv4 vs IPv6
| Aspecto | IPv4 | IPv6 |
|---|---|---|
| Base numérica | Decimal | Hexadecimal |
| Separador | Ponto (.) |
Dois-pontos (:) |
| Comprimento típico | 7–15 caracteres | 15–39 caracteres |
| Campos | 4 octetos (8 bits cada) | 8 hextetos (16 bits cada) |
| Loopback | 127.0.0.1 |
::1 |
| Não especificado | 0.0.0.0 |
:: |
| Máscara | 255.255.255.0 (decimal) |
/24 (CIDR) — sempre CIDR |
Apesar de mais longo, o IPv6 é mais legível para máquinas: o hexadecimal mapeia diretamente para bits (4 bits por dígito), enquanto o decimal exige conversão para binário a cada octeto.
8. Boas Práticas e Armadilhas Comuns
- Sempre use a forma canônica RFC 5952 em configurações e logs: minúsculas, sem zeros à esquerda, com
::aplicado uma única vez na maior sequência de zeros. - Nunca use
::mais de uma vez:2001:db8::1::5é inválido. - Em scripts de validação, use
ipcalc,python ipaddressousipcalcpara normalizar entradas. - Em firewalls e ACLs, normalize antes de comparar —
2001:0DB8::1e2001:db8::1devem ser tratados como o mesmo endereço. - Em documentação, use sempre o prefixo reservado para exemplos:
2001:db8::/32(RFC 3849). Nunca use endereços reais em exemplos.
Exemplo Python (normalização canônica)
import ipaddress
addr = ipaddress.IPv6Address('2001:0DB8:0000::1')
print(addr.compressed) # 2001:db8::1
print(addr.exploded) # 2001:0db8:0000:0000:0000:0000:0000:0001
9. Conclusão
A representação de endereços IPv6 pode parecer intimidadora à primeira vista, mas é estruturada e regular. As duas regras de compressão (RFC 5952) reduzem endereços longos a formas compactas legíveis. A padronização da forma canônica garante interoperabilidade entre sistemas operacionais, ferramentas de rede e logs. Dominar a leitura, escrita e expansão de endereços IPv6 é pré-requisito para qualquer engenheiro que opere redes modernas, configure firewalls, depure tráfego ou planeje sub-redes na era pós-IPv4.