Beyond URL and URN

Привет, Хабровчане! Рыская по интернетам, зашел на страницу про URI и спустя несколько часов осознал, как мало я знал об этом монстре. Признаюсь, до этого я думал, что URI это либо URL, либо URN, и мои познания ограничивались этой схемой:

Источник: https://danielmiessler.com/study/difference-between-uri-url/Источник: https://danielmiessler.com/study/difference-between-uri-url/

Каково же было мое удивление, что в этой теме еще очень много нового. Начнем по порядку.

URI

URI (Uniform Resource Identifier) — унифицированный идентификатор ресурса. В кратце, он позволяет идентифицировать какой-либо ресурс: физический (https://assets.habr.com/habr-web/img/favicons/favicon-16.png — файл на сервере) или абстрактный (https://vk.com/settings — его не существует).

Сам по себе URI ничего нам не дает, это всего лишь «интерфейс» (выражаясь на ООП). Самое интересное нам дают его подтипы.

Его «интерфейс»:

URI = [ схема ":" ] иерархическая-часть [ "?" запрос ] [ "#" фрагмент ]

URN

URN (Uniform Resource Name) — единообразное название ресурса. Может по одному только названию дать вам ресурс (также абстрактный или физический).

 ::= "urn:"  ":" 

 — namespace identifier — идентификатор пространства.

 — namespace specific string — название ресурса в этом пространстве

Пример: urn: isbn:540609601X — идентификатор конкретной книги, так как ISBN — уникальный

URL

URL (Uniform Resource Locator) — унифицированный локатор ресурса. Говорит, где нам нужно найти ресурс. Наверное, в представлении не нуждается. Все мы используем его повседневно.

Теперь мы переходим к самым глубинам…

PURL

PURL (Persistent Uniform Resource Locator) — постоянный единообразный определитель ресурса.

Вспомним, что URL — говорит нам «куда идти, чтобы получить ресурс», но что делать если его: удалили, переместили, переименовали и т.д. Одним из решений может стать использование URN, но до этого пока далеко. Здесь нам на помощь и приходит PURL.

Его основная идея заключается в том, чтобы создать базу данных адресов PURL, которая будет отображать PURL на активный URL и перенаправлять на этот URL (Http Redirect, например).

 ::=  "://"  "/" 

Как видно структура не особо отличается от старого доброго URL. Отличия в том, что HOST — сервер базы данных PURL, а URL — адрес ресурса, к которому хотим получить доступ.

Пример

Зарегистрированный адрес PURL

http://purl.russian-books.com/WarAndPeace/

Отображается на

http://your.web.server/your/web/root/

В результате, пришедший на адрес запрос

http://purl.russian-books.com/WarAndPeace/chapter12.html

Перенаправится на 

http://your.web.server/your/web/root/chapter12.html

IRI

IRI (Internationalized Resource Identifier) — интернационализированный идентификатор ресурса. Позволяет записать адрес ресурса на любом языке мира.

Замечили ли вы, что русские буквы, пробелы и многие другие символы в URL кодируются странными символами на подобие: %D0%B7%D0%B0%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BE.

Это все из-за ограничений URL. Допустимые символы (RFC 3986):

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=

Чтобы обойти это ограничение создали IRI. В таком типе адресов используется Unicode вместо US-ASCII.

Таким образом, адрес

https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82

Превращается в 

https://ru.wikipedia.org/wiki/Программист

XRI

XRI (Extensible Resource Identifier) — расширяемый идентификатор ресурса. Этот протокол создается OASIS. Этот протокол иммет глобальные цели, не умещающиеся в рамках 1 поста. Потому опишу его вкратце

XRI не только совместим с IRI и URI, но также является возможной заменой всей системы DNS и IP адресации! В протоколе фигурируют 2 слоя идентификаторов:

  • I-Number — постоянный адрес (этим схож с IP). Регистрируется на определенный ресурс и больше никогда не перерегистрируются (в отличие от разных IP для одного и того же сервера)

  • I-Name — удобочитаемый для человека адрес (этим схож с DNS). I-Name разрешается в I-Number.

В отличие от DNS адресация:

  • Неиерархическая одноранговая

  • Может иметь взаимные ссылки (cross-references) — один XRI вложен в другой и один логический ресурс может идентифицироваться в различных контекстах

  • Имеет глобальные реестры контекстов

    • = — частные лица

    • @ — организации

    • + — общие понятия

Примеры

I-Names:

  • =Ivan.Petrov

  • @Yandex/(+programmer.id)

  • +phone.number

I-Numbers:

  • !43534! A8C3/! D90F.88

  • !1002! A7C5

Технический комитет по разработке был закрыт 8.07.2015, а сам протокол больше не находится в разработке.

Десерт

Вы наверное знаете, что существуют доменные имена на кириллице. Например, https://стопкоронавирус.рф.

Загвоздка в том, что для хранения доменного имени могут использоваться только цифры, символы латинского алфавита и »-» (всего 37 символов). Но как тогда используются домены .рф? Они используют другую систему DNS? Нет. Здесь используется алгоритм кодирования Punycode. Этот алгоритм преобразовывает Unicode последовательность в ACE последовательность, которую понимают DNS.

Алгоритм состоит из 2 шагов:

  • Перенести все исходные ASCII символы в результирующую строку (их не трогать)

  • Если есть не ASCII символы, то

Алгоритм описан в RFC 3492 и также на Википедии

Итог

Надеюсь вы узнали для себя, что-то новое и статья оказалась полезной. Как минимум теперь вы не будете утверждать, что «У URI есть только 2 союзника — URL и URN».

© Habrahabr.ru