Les URL ont toujours ce format:
<protocol>://<Host>[:<port>]/[<path>][#<hash>]
Le problème est que IPv6 utilise des deux-points, tout comme le séparateur de port et d'hôte, par exemple:
2001:db8:1f70::999:de8:7648:6e8
Mais que se passe-t-il s'il s'agit de l'hôte et que je souhaite me connecter avec HTTP sur le port 100?
http://2001:db8:1f70::999:de8:7648:6e8:100/
Le problème est le dernier colon. Étant donné que les zéros sont omis avec les deux-points (entre 1f70 et 999), on ne sait pas si ": 100" appartient à l'IP ou au numéro de port. Comment pouvons-nous savoir cela?
La notation dans ce cas consiste à coder le numéro IP IPv6 entre crochets:
http://[2001:db8:1f70::999:de8:7648:6e8]:100/
C'est RFC 3986 , section 3.2.2: Hôte
Un hôte identifié par une adresse littérale de protocole Internet, version 6 [RFC3513] ou ultérieure, se distingue en mettant le littéral IP entre crochets ("[" et "]"). C'est le seul endroit où les caractères entre crochets sont autorisés dans la syntaxe URI. En prévision de futurs formats d'adresse IP littérale non encore définis, une implémentation peut utiliser un indicateur de version facultatif pour indiquer explicitement un tel format plutôt que de s'appuyer sur une détermination heuristique.