Вопрос: Как отличить хост и порт от URL-адреса IPv6?


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 или номеру порта. Как мы можем это знать?


77
2017-11-24 22:48


Источник




Ответы:


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

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

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

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


107
2017-11-24 22:51



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