Как можно отличить хост и порт в URL-адресе IPv6?

87

URL всегда имеют такой формат:

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

Проблема заключается в том, что IPv6 использует двоеточия, как разделитель порта и хоста, например:

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

Но что, если это хост, и я хочу подключиться к нему по HTTP через порт 100?

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

Проблема в последнем двоеточии. Так как нули пропускаются с двойными двоеточиями (между 1f70 и 999), неизвестно, принадлежит ли «: 100» IP или номеру порта. Как мы можем знать это?

rightfold
источник

Ответы:

118

В этом случае обозначение заключается в кодировании IP-номера IPv6 в квадратных скобках:

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

Это RFC 3986 , раздел 3.2.2: Хост

Хост, идентифицируемый литеральным адресом Интернет-протокола версии 6 [RFC3513] или новее, различается заключением литерала IP в квадратные скобки («[» и «]»). Это единственное место, где разрешены символы в квадратных скобках в синтаксисе URI. В ожидании будущих пока еще не определенных форматов буквенных IP-адресов реализация может использовать необязательный флаг версии, чтобы явно указывать такой формат, а не полагаться на эвристическое определение.

sysadmin1138
источник
38
Стоит отметить, что скобки не являются обязательными. Это единственный недвусмысленный механизм, с помощью которого браузер может идентифицировать числовой адрес IPv6.
Tylerl
Разве порт не должен быть внутри скобок?
Джаярджо
2
@jayarjo Нет, поскольку скобки служат для устранения неоднозначности между IP-адресом, который содержит двоеточия, и портом, который отделен от IP-адреса двоеточием.
sysadmin1138