Я просматриваю некоторые RFC, связанные с IPv6. Некоторые утверждают, что префикс должен быть написан вне квадратных скобок, в то время как другие прикрепляют его непосредственно к адресу.
В частности, RFC4291в разделе 2.3 это выглядит так:
For example, the following are legal representations of the 60-bit
prefix 20010DB80000CD3 (hexadecimal):
2001:0DB8:0000:CD30:0000:0000:0000:0000/60
2001:0DB8::CD30:0:0:0:0/60
2001:0DB8:0:CD30::/60
Но потом RFC4038, раздел 5.1:
Therefore, the IP address parsers that take the port number separated
with a colon should distinguish IPv6 addresses somehow. One way is
to enclose the address in brackets, as is done with Uniform Resource
Locators (URLs) [RFC2732]; for example, http://[2001:db8::1]:80.
Some applications also need to specify IPv6 prefixes and lengths:
The prefix length should be inserted outside of the square brackets,
if used; for example, [2001:db8::]/64 or 2001:db8::/64 and not
[2001:db8::/64]. Note that prefix/length notation is syntactically
indistinguishable from a legal URI; therefore, the prefix/length
notation must not be used when it isn't clear from the context that
it's used to specify the prefix and length and not, for example, a
URI.
Они обе право?
Должен ли синтаксический анализ IPv6-адреса поддерживать дополнительную сложность префикса, который находится либо непосредственно в адресе, либо за пределами квадратных скобок, которые используются для встраивания URL-адресов?
Требование RFC4038 5.1 выглядит интеллектуальной оплошностью. Почему бы косая черта не оставаться с адресом, а вместо этого выходить за пределы красиво заключенных, устраняющих неоднозначность квадратных скобок, где она затем создает неоднозначность из-за того, что этот символ является разделителем компонентов пути в URL-адресах?
Разве это не тот случай, когда проблема описана заключительными предложениями выше:
[T]herefore, the prefix/length
notation must not be used when it isn't clear from the context that
it's used to specify the prefix and length and not, for example, a
URI.
решается поставить косую черту внутрь, как в RFC4291?
Во-первых, RFC 4038 не является нормативным, поэтому вы можете игнорировать все в нем, если хотите.
Во-вторых, RFC 4291 содержит обновление, RFC 5952, который определяет, как представлять адреса IPv6 в тексте. Очень тихо об использовании скобок, за исключением этого краткого упоминания в разделе 6:
... [контекст опущен] ... Стиль [], как указано в RFC3986 СЛЕДУЕТ использовать, и это значение по умолчанию, если не указано иное.
В частности, это рассматривается в разделе 3.2.2, где указывается, что литерал IP-адреса должен появляться в квадратных скобках в URL-адресе. Грамматика для указания адреса IPv6 в скобках, однако, не включает идентификатор области, который предполагает, что он должен отображаться вне скобки. Однако в то время идентификаторы областей не входили в спецификацию IPv6, поэтому этот RFC ничего о них не включает.
RFC 6874, обновление RFC 3986, устраняет это упущение. В нем указано, что идентификатор области должен находиться внутри скобок, а в случае URL-адреса знак процента должен быть закодирован в процентах. Интересно, что все основные веб-браузеры отказались реализовать RFC 6874 для различные сомнительные причины. Но вы должны обнаружить, что другие приложения, которые анализируют адреса IPv6, поддерживают его.
(Обратите внимание, что по соображениям безопасности идентификаторы области в настоящее время должны использоваться только с локальными адресами ссылки. RFC объясняет, что их соблюдение для других типов адресов может привести к нежелательному поведению, например, к выходу трафика через нежелательный интерфейс.)