Como distinguir o host e a porta em um URL IPv6?

87

Os URLs sempre têm este formato:

<protocol>://<host>[:<port>]/[<path>][#<hash>]

O problema é que o IPv6 usa dois pontos, assim como o separador de porta e host, por exemplo:

2001:db8:1f70::999:de8:7648:6e8

Mas e se esse for o host, e eu quiser conectar-me a ele com HTTP na porta 100?

http://2001:db8:1f70::999:de8:7648:6e8:100/

O problema é o último cólon. Como os zeros são omitidos com dois pontos (entre 1f70 e 999), não se sabe se ': 100' pertence ao IP ou ao número da porta. Como podemos saber disso?

destro
fonte

Respostas:

118

A notação nesse caso é codificar o número IP IPv6 entre colchetes:

http://[2001:db8:1f70::999:de8:7648:6e8]:100/

Esse é o RFC 3986 , seção 3.2.2: Host

Um host identificado por um endereço literal do Protocolo da Internet, versão 6 [RFC3513] ou posterior, distingue-se colocando o literal IP entre colchetes ("[" e "]"). Este é o único local em que caracteres entre colchetes são permitidos na sintaxe do URI. Antecipando os formatos de endereços literais IP ainda não definidos, uma implementação pode usar um sinalizador de versão opcional para indicar explicitamente esse formato, em vez de confiar na determinação heurística.

sysadmin1138
fonte
38
Vale ressaltar que os colchetes não são opcionais. É o único mecanismo inequívoco pelo qual o navegador pode identificar um endereço IPv6 numérico.
tylerl
A porta não deveria estar dentro dos colchetes?
Jayarjo 20/12
2
@jayarjo Não, como os colchetes existem para fornecer desambiguação entre o endereço IP, que contém dois pontos, e a porta, que é separada do endereço IP por dois pontos.
sysadmin1138