Привет, Хабровчане! Рыская по интернетам, зашел на страницу про 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> ::= "urn:" <NID> ":" <NSS>

<NID> - namespace identifier - идентификатор пространства.

<NSS> - 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, например).

<PURL> ::= <SCHEME> "://" <HOST> "/" <URL>

Как видно структура не особо отличается от старого доброго 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".

Комментарии (2)


  1. cadovvl
    23.05.2022 15:23

    Первый комментарий, просто чтобы без комментариев статью не оставлять.

    Спасибо за статью! Даже тем, кто все это знает, будет полезно добавить в закладки и отбрасываться ссылкой на вопросы тем, кто знает не все. Коротко, емко и со ссылками! Отличная обзорная статья!


  1. Caesare
    24.05.2022 10:57
    +4

    Вот ещё картинка в тему

    Пример URl
    Пример URl