¿Cómo se puede distinguir el host y el puerto en una URL IPv6?

87

Las URL siempre tienen este formato:

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

El problema es que IPv6 usa dos puntos, al igual que el separador de puerto y host, por ejemplo:

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

Pero, ¿qué pasa si este es el host y quiero conectarme a él con HTTP en el puerto 100?

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

El problema es el último colon. Dado que los cero se omiten con dos puntos dobles (entre 1f70 y 999), se desconoce si ': 100' pertenece a la IP o al número de puerto. ¿Cómo podemos saber esto?

pliegue derecho
fuente

Respuestas:

118

La notación en ese caso es codificar el número IPvv6 entre corchetes:

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

Eso es RFC 3986 , sección 3.2.2: Host

Un host identificado por una dirección literal de Protocolo de Internet, versión 6 [RFC3513] o posterior, se distingue al encerrar el literal IP entre corchetes ("[" y "]"). Este es el único lugar donde se permiten caracteres de corchetes en la sintaxis de URI. En previsión de futuros formatos de dirección literal de IP aún no definidos, una implementación puede usar un indicador de versión opcional para indicar dicho formato explícitamente en lugar de confiar en la determinación heurística.

sysadmin1138
fuente
38
Vale la pena señalar que los corchetes no son opcionales. Es el único mecanismo inequívoco por el cual el navegador puede identificar una dirección IPv6 numérica.
tylerl
¿No debería estar el puerto dentro de los corchetes?
jayarjo
2
@jayarjo No, ya que los corchetes están allí para proporcionar desambiguación entre la dirección IP, que contiene dos puntos, y el puerto, que está separado de la dirección IP por dos puntos.
sysadmin1138