RFC 9900 Updates to NETCONF Transport Port Numbers

Internet Engineering Task Force (IETF)                      M. Boucadair
Request for Comments: 9900                                        Orange
Category: Standards Track                                  December 2025
ISSN: 2070-1721

Updates to NETCONF Transport Port Numbers

Обновление номеров транспортных портов NETCONF

PDF

Аннотация

Этот документ освобождает выделенные IANA номера портов для служб, связанных с протокол конфигурации сетей (Network Configuration Protocol или NETCONF), которые не использовались в работающих сетях.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительные сведения о документах Internet Standard приведены в разделе 2 RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9900.

Авторские права

Авторские права (Copyright (c) 2025) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с пересмотренной лицензией BSD (Revised BSD License), как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Введение

В реестр Service Name and Transport Protocol Port Number Registry [IANA-SERVICE] внесено несколько назначений портов имен служб, связанных с NETCONF, таких как порт 830 для работы NETCONF по протоколу SSH (Secure Shell) [RFC6242], 831 для NETCONF по протоколу BEEP (Blocks Extensible Exchange Protocol) [RFC4744], 832 для NETCONF по протоколу SOAP (Simple Object Access Protocol) [RFC4743], 4334 для NETCONF по протоколу Call Home [RFC8071] и 6513 для NETCONF по протоколу TLS (Transport Layer Security) [RFC7589] [NETCONF-over-TLS]. Однако три из этих назначений (831, 832, 833) относятся к протоколам, которые не были внедрены, а соответствующие RFC ([RFC4743] и [RFC4744]) признаны устаревшими (Historic). Таким образом, эти назначения стали ненужными.

Данный документ отменяет назначение неиспользуемых номеров портов. В соответствии с параграфом 8.2 в [RFC6335] документ не отменяет имена служб.

2. Эксплуатационные вопросы

Не известно реализаций и внедрений протоколов, которые полагаются на освобождаемые этим документом номера портов. Существующие конфигурации (при наличии), связывающие освобождаемые номера портов со службами netconf-beep или netconfsoaphttp, нужно пересмотреть и обновить в соответствии с разделом 4. Других требований, связанных с эксплуатацией или управляемостью, данный документ не содержит.

3. Вопросы безопасности

Этот документ не описывает какой-либо протокол, поэтому не может открывать какие-либо уязвимости в безопасности.

4. Взаимодействие с IANA

В соответствии с этим документом агентство IANA обновило реестр Service Name and Transport Protocol Port Number Registry [IANA-SERVICE], как указано в последующих параграфах. Отменённые назначения помечены в соответствии с параграфом 8.2 в [RFC6335]. Далее эти действия не повторяются.

4.1. NETCONF на основе BEEP

Таблица . Прежние назначения.

 

Имя службы

Номер порта

Транспортный протокол

Описание

Документ

netconf-beep

831

tcp

NETCONF over BEEP

[RFC4744]

netconf-beep

831

udp

NETCONF over BEEP

[RFC4744]

 

Таблица . Новое назначение.

 

Имя службы

Номер порта

Транспортный протокол

Описание

Документ

netconf-beep

NETCONF over BEEP

[RFC4744] RFC 9900

 

К номеру 831 добавлено примечание, указывающее, что номер был выделен для NETCONF over BEEP, но освобождён RFC 9900.

4.2. NETCONF на основе SOAP

Таблица . Прежние назначения.

 

Имя службы

Номер порта

Транспортный протокол

Описание

Документ

netconfsoaphttp

832

tcp

NETCONF for SOAP over HTTPS

[RFC4743]

netconfsoaphttp

832

udp

NETCONF for SOAP over HTTPS

[RFC4743]

netconfsoapbeep

833

tcp

NETCONF for SOAP over BEEP

[RFC4743]

netconfsoapbeep

833

udp

NETCONF for SOAP over BEEP

[RFC4743]

 

Таблица . Новые назначения.

 

Имя службы

Номер порта

Транспортный протокол

Описание

Документ

netconfsoaphttp

NETCONF for SOAP over HTTPS

[RFC4743] RFC 9900

netconfsoapbeep

NETCONF for SOAP over BEEP

[RFC4743] RFC 9900

К номерам 832 и 833 добавлены примечания, указывающие, что номер был выделен для NETCONF over SOAP, но освобождён RFC 9900.

5. Литература

5.1. Нормативный документ

[RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. Cheshire, «Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry», BCP 165, RFC 6335, DOI 10.17487/RFC6335, August 2011, <https://www.rfc-editor.org/info/rfc6335>.

5.2. Дополнительная литература

[IANA-SERVICE] IANA, «Service Name and Transport Protocol Port Number Registry», <https://www.iana.org/assignments/service-names-port-numbers>.

[NETCONF-over-TLS] Turner, S. and R. Housley, «Updates to Using the NETCONF Protocol over Transport Layer Security (TLS) with Mutual X.509 Authentication», Work in Progress, Internet-Draft, draft-ietf-netconf-over-tls13-04, 18 January 2024, <https://datatracker.ietf.org/doc/html/draft-ietf-netconf-over-tls13-04>.

[RFC4743] Goddard, T., «Using NETCONF over the Simple Object Access Protocol (SOAP)», RFC 4743, DOI 10.17487/RFC4743, December 2006, <https://www.rfc-editor.org/info/rfc4743>.

[RFC4744] Lear, E. and K. Crozier, «Using the NETCONF Protocol over the Blocks Extensible Exchange Protocol (BEEP)», RFC 4744, DOI 10.17487/RFC4744, December 2006, <https://www.rfc-editor.org/info/rfc4744>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC7589] Badra, M., Luchuk, A., and J. Schoenwaelder, «Using the NETCONF Protocol over Transport Layer Security (TLS) with Mutual X.509 Authentication», RFC 7589, DOI 10.17487/RFC7589, June 2015, <https://www.rfc-editor.org/info/rfc7589>.

[RFC8071] Watsen, K., «NETCONF Call Home and RESTCONF Call Home», RFC 8071, DOI 10.17487/RFC8071, February 2017, <https://www.rfc-editor.org/info/rfc8071>.

Благодарности

Спасибо Amanda Baber и Zahed Sarker за руководство, Tom Petch — за комментарии.

Спасибо Kent Watsen за рецензию Shepherd, Mahesh Jethanandani за рецензию AD, Bernie Volz за рецензию INTDIR, Roni Even за рецензию Gen-ART, Barry Leiba за рецензию ARTART, Dhruv Dhody за рецензию OPSDIR, Michael Tüxen за рецензию TSVART и Joe Touch на порт.

Спасибо Gorry Fairhurst за рецензию IESG.

Адрес автора

Mohamed Boucadair

Orange

Email: mohamed.boucadair@orange.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC | Оставить комментарий

RFC 9875 HTTP Cache Groups

Internet Engineering Task Force (IETF)                     M. Nottingham
Request for Comments: 9875                                    Cloudflare
Category: Standards Track                                   October 2025
ISSN: 2070-1721

HTTP Cache Groups

Группы кэша HTTP

PDF

Аннотация

Эта спецификация вводит понятия для описания связей между сохранёнными в кэшах HTTP откликами, группируя их путём сопоставления с одной или несколькими строками.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительные сведения о документах Internet Standard приведены в разделе 2 RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9875.

Авторские права

Авторские права (Copyright (c) 2025) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с пересмотренной лицензией BSD (Revised BSD License), как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Введение

Кэширование HTTP [HTTP-CACHING] работает на уровне одного ресурса и свежесть одного сохранённого отклика не влияет на свежесть других. Такая гранулярность может повысить эффективность кэширования, например, в случае включения в страницу нескольких ресурсов с разными требованиями к кэшированию.

Однако в некоторых случаях связи между сохранёнными откликами могут повышать эффективность кэширования. Например, часто возникает необходимость аннулировать (invalidate) набор связанных ресурсов. Это может быть связано с побочным влиянием запроса на изменение состояния на другие ресурсы или задано для удобства администрирования (например, аннулировать некую часть сайта). Группировка ресурсов обеспечивает способ выразить такие взаимосвязи вместо того, чтобы полагаться на такие вещи, как структура URL.

В дополнение в обобществлению событий аннулирования установленные при группировке связи могут использоваться кэшами для оптимизации работы (например, для информирования о работе алгоритмов вытеснения из кэша).

В разделе 2 представлены способы описания взаимосвязей между откликами, сохранёнными в кэшах HTTP, путём включения этих откликов в одну или несколько групп, отражающих эти взаимоотношения. Описано также использование этих связей кэшами для применения операций аннулирования к членам группы.

В разделе 3 представлен один новый источник таких событий — поле заголовка отклика HTTP, которое позволяет меняющему состояние отклику запустить аннулирование группы.

Эти механизмы работают в рамках одного кэша с сохранёнными откликами, связанными с одним сервером-источником (см. параграф 2.1). Они не решают задачу синхронизации состояний между разными кэшами (например, в иерархии или многосвязной сети) и не способствуют связыванию сохранённых откликов от разных источников.

1.1. Уровни требований и терминология

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

В спецификации применяются термины, определённые в [STRUCTURED-FIELDS]: List, String, Parameter.

2. Поле Cache-Groups в заголовке отклика

Поле Cache-Groups в заголовке отклика содержит список строк (List of Strings, параграфы 3.1 и 3.3.3 в [STRUCTURED-FIELDS]). Каждый элемент списка является значением, идентифицирующим группу, к которой отклик относится. Строки «непрозрачны» (opaque) и не имеют никакого смысла для создавшего их сервера, кэш не знает их структуру и содержимое, кроме однозначной идентификации группы.

   HTTP/1.1 200 OK
   Content-Type: application/javascript
   Cache-Control: max-age=3600
   Cache-Groups: "scripts"

Порядок элементов не имеет значения, нераспознанные параметры игнорируются.

Реализации должны поддерживать в значении поля не менее 32 групп, каждая из которых содержит не менее 32 символов. Отметим, что на размер полей могут влиять базовые ограничения HTTP.

2.1. Идентификация сгруппированных откликов

Два отклика, хранящиеся в одном кэше, считаются относящимися к одной группе при выполнении двух условий:

  1. оба отклика включают поле заголовка Cache-Groups с одинаковым значением (в любой позиции списка) при посимвольном сравнении с учётом регистра;

  2. в обоих откликах совпадают URI источника (параграф 4.3.1 в [HTTP]).

2.2. Поведение кэша

2.2.1. Аннулирование

Аннулирующий сохранённый отклик кэш может аннулировать любые сохранённые отклики той же группы (параграф 2.1. Отметим, что групповое аннулирование не вызывает группового аннулирования, т. е. механизм не каскадируется.

Расширения кэша могут усиливать это требование. Например, поле заголовка управления целевым кэшем [TARGETED] может указывать на то, что при обработке кэшей следует аннулировать такие отклики.

3. Поле Cache-Group-Invalidation в заголовке отклика

Поле Cache-Group-Invalidation в заголовке отклика является списком строк (параграфы 3.1 и 3.3.3 в [STRUCTURED-FIELDS]). Каждый элемент списка является значением, указывающим группу, отклики из которой аннулируются в соответствии с параграфом 2.2.1.

Например, приведённый ниже запрос POST оказывает воздействие на две группы кэша и соответствующий отклик может указывать, что связанные с одной или обеими группами отклики следует аннулировать

   HTTP/1.1 200 OK
   Content-Type: text/html
   Cache-Group-Invalidation: "eurovision-results", "australia"

Поле Cache-Group-Invalidation должно игнорироваться в откликах на запросы, использующие безопасный метод (например, GET, см. параграф 9.2.1 в [HTTP]).

Кэш, получивший отклик на небезопасный запрос с полем Cache-Group-Invalidation в заголовке, может аннулировать любые сохранённые отклики той же группы (параграф 2.1) для любой из указанных в списке групп.

Расширения кэша могут усиливать это требование. Например, поле заголовка управления целевым кэшем [TARGETED] может указывать, что обрабатывающие его кэши должны учитывать сигнал Cache-Group-Invalidation.

Порядок указания в списке не имеет значения. Нераспознанные параметры игнорируются.

Реализации должны поддерживать в значении поля не менее 32 групп, каждая из которых содержит не менее 32 символов. Отметим, что на размер полей могут влиять базовые ограничения HTTP.

4. Взаимодействие с IANA

Агентство IANA добавило в реестр Hypertext Transfer Protocol (HTTP) Field Name Registry приведённые ниже сведения.

   Field Name:  Cache-Groups
   Status:  permanent
   Reference:  RFC 9875

   Field Name:  Cache-Group-Invalidation
   Status:  permanent
   Reference:  RFC 9875

5. Вопросы безопасности

Описанный механизм позволяет ресурсам с одним источником аннулировать друг друга. По этой причине источники, представляющие несколько сторон (иногда это называют «общим хостингом»), могут позволить одной стороне группировать свои ресурсы с другими или передавать сигналы, которые будут иметь побочные эффекты для них.

Совместно используемые хосты могут смягчить эти риски путём контроля доступа к описанным здесь полям заголовков.

6. Литература

6.1. Нормативные документы

[HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., «HTTP Semantics», STD 97, RFC 9110, DOI 10.17487/RFC9110, June 2022, <https://www.rfc-editor.org/info/rfc9110>.

[HTTP-CACHING] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., «HTTP Caching», STD 98, RFC 9111, DOI 10.17487/RFC9111, June 2022, <https://www.rfc-editor.org/info/rfc9111>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[STRUCTURED-FIELDS] Nottingham, M. and P. Kamp, «Structured Field Values for HTTP», RFC 9651, DOI 10.17487/RFC9651, September 2024, <https://www.rfc-editor.org/info/rfc9651>.

6.2. Дополнительная литература

[TARGETED] Ludin, S., Nottingham, M., and Y. Wu, «Targeted HTTP Cache Control», RFC 9213, DOI 10.17487/RFC9213, June 2022, <https://www.rfc-editor.org/info/rfc9213>.

Благодарности

Спасибо Stephen Ludin за рецензию и предложения.

Адрес автора

Mark Nottingham

Cloudflare

Melbourne

Australia

Email: mnot@mnot.net

URI: https://www.mnot.net/


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC | Оставить комментарий

RFC 9651 Structured Field Values for HTTP

Internet Engineering Task Force (IETF)                     M. Nottingham
Request for Comments: 9651                                    Cloudflare
Obsoletes: 8941                                                P-H. Kamp
Category: Standards Track                      The Varnish Cache Project
ISSN: 2070-1721                                           September 2024

Structured Field Values for HTTP

Значения структурированных полей для HTTP

PDF

Аннотация

В этом документе описывается набор данных и связанных с ними алгоритмов, предназначенных для упрощения и повышения безопасности при задании и обработке полей заголовков и трейлеров HTTP, известных как структурированные (Structured Fields, Structured Headers, Structured Trailers). Документ предназначен для использования в спецификациях новых полей HTTP.

Документ заменяет собой RFC 8941.

Статус документа

Документ содержит проект стандарта Internet (Standards Track).

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9651.

Авторские права

Copyright (c) 2024. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К этому документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с пересмотренной лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Введение

Задание синтаксиса новых полей в заголовках и трейлерах HTTP является трудоёмкой задачей даже с учётом рекомендаций параграфа 16.3.2 в [HTTP], поскольку авторам придётся принять множество решений и столкнуться с подводными камнями.

Как только поле определено, часто возникает необходимость создания новых синтаксических анализаторов и средств сериализации (преобразования), поскольку обработка каждого значения несколько отличается от базового синтаксиса.

В этом документе вводится базовый набор структур данных для использования в определениях новых полей HTTP с учётом отмеченных проблем. В частности, определяется базовая абстрактная модель, а также конкретная сериализация для выражения этой модели в полях заголовков и трейлеров HTTP [HTTP].

Поле HTTP, заданное как Structured Header или Structured Trailer (или Structured Field, если оно может включаться и в заголовки и в трейлеры), использует заданные здесь типы для определения своего синтаксиса и базовых правил обработки, что упрощает как определение полей разработчиками спецификаций, так и их обработку в реализациях. Будущие версии HTTP могут задавать дополнительные варианты сериализации абстрактной модели этих структур, позволяя передавать использующие модель поля более эффективно без необходимости переопределять их.

Отметим, что переопределение синтаксиса имеющихся полей HTTP не является целью этого документа и описанные здесь механизмы предназначены лишь для полей, явно выбравших эти механизмы.

В разделе 2 указано, как задать структурированное поле, а в разделе 3 определены абстрактные типы данных для использования в структурированных полях. Эти абстрактные типы могут быть преобразованы в поля HTTP или извлечены из таких полей с использованием алгоритмов, описанных в разделе 4.

1.1. Преднамеренно строгая обработка

В спецификации намеренно задан строгий синтаксический анализ и сериализация с использованием пошаговых алгоритмов и единственным вариантом обработки ошибок является отказ всей операции целиком. Это предназначено для обеспечения точности реализации и функциональной совместимости. Реализация, пытающаяся быть полезной за счёт повышения толерантности к входным данным, ухудшит функциональную совместимость, поскольку будет создавать давление на другие реализации с целью поддержки аналогичных (вероятно, слегка отличающихся) путей обхода. Иными словами, строгость обработки является преднамеренным свойством данной спецификации, позволяющим обнаруживать и исправлять ошибки на входе для предотвращения проблем совместимости и безопасности, которые могли бы возникнуть.

Отметим, что в результате такой строгости ошибка одной стороны при вводе данных несколькими сторонами (например, посредниками или другими компонентами отправителя) скорей всего вызовет отказ при синтаксическом анализе значения поля.

1.2. Соглашения о нотации

Ключевые слова должно (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

В документе применяются правила VCHAR, SP, DIGIT, ALPHA и DQUOTE из [RFC5234] для задания чисел и соответствующих байтов ASCII, в зависимости от контекста. Для этого же служат правила tchar и OWS из [HTTP].

В документе используются алгоритмы, задающие поведение при синтаксическом анализе и сериализации. При анализе полей HTTP реализации должны обеспечивать поведение, не отличимое от заданного алгоритмами.

Для сериализации полей HTTP алгоритмы задают рекомендуемый способ выполнения. Реализации могут отклоняться от заданного поведения при условии, что результаты по-прежнему корректно обрабатываются алгоритмами синтаксического анализа, описанными в параграфе 4.2.

2. Определение новых структурированных полей

Для задания поля HTTP как структурированного (Structured Field) авторы должны:

  • указать нормативную ссылку на этот документ, которая будет вносить указанные здесь требования для создателей и получателей поля;

  • указать категорию поля Structured Header (может включаться только в заголовки — базовый вариант), Structured Trailer (только трейлеры) или Structured Field (оба варианта);

  • указать тип значения поля — List (параграф 3.1), Dictionary (параграф 3.2) или Item (параграф 3.3);

  • определить семантику значения поля;

  • задать дополнительные ограничения для значения поля, а также последствия их нарушения.

Обычно это будет означать указание в определении поля типа верхнего уровня (List, Dictionary, Item), а также определение допустимых типов и ограничения для них. Например, поле типа List может содержать лишь элементы типа Integer или сочетание типов, заголовок, заданный как Item, позволяет включать элементы String, причём лишь строки, начинающиеся с буквы Q, или строки в нижнем регистре. Аналогично, Inner List (параграф 3.1.1) действительны лишь в том случае, когда это явно разрешено определением поля. Для полей Display String рекомендуется чётко указывать разрешённые коды Unicode, например, использование профиля из [PRECIS].

В определениях полей эта спецификация может применяться для поля целиком, а не для отдельных его частей. Спецификации могут указывать имя поля как Structured Header name, Structured Trailer name или Structured Field name. Значения могут указываться как Structured Header value, Structured Trailer value или Structured Field value.

Эта спецификация задаёт минимальные размеры или число различных структур, поддерживаемых реализациями. Максимальные размеры обычно не задаются, но авторам следует понимать, что разные реализации HTTP могут вносить свои ограничения для размеров отдельных полей и/или полного размера заголовков или трейлеров.

2.1. Пример

Вымышленное поле заголовка Foo-Example можно задать, как показано ниже.

42. Поле заголовка Foo-Example

Поле Foo-Example в заголовке HTTP переносит сведения о количестве Foo в сообщении.

Foo-Example — это структурированное поле заголовка [RFC9651]. Его значением должно быть целое число (Integer, параграф 3.3.1 в [RFC9651]).

Значение поля указывает количество Foo в сообщении и должно относиться к диапазону от 0 до 10, включительно. При иных значениях поле заголовка должно игнорироваться целиком.

Определён указанный ниже параметр.

  • Параметр с ключом foourl и значением типа String (параграф 3.3.3 в [RFC9651]) передаёт Foo URL для сообщения. Требования к обработке указаны ниже.

    Параметр foourl содержит ссылку URI (параграф 4.1 в [RFC3986]). Если значение параметра не является действительной ссылкой URI, поле заголовка должно игнорироваться целиком. Значения, являющиеся относительными ссылками (параграф 4.2 в [RFC3986]), должны преобразовываться (resolve, раздел 5 в [RFC3986]) до использования.

Пример поля показан ниже.

          Foo-Example: 2; foourl="https://foo.example.com/"

2.2. Обработка ошибок

При сбое синтаксического анализа игнорируется поле целиком (параграф 4.2). Определения полей не могут переопределять это правило, поскольку это будет препятствовать обработке программами общего назначения. Разрешается лишь вводить дополнительные ограничения (например, численные значения Integer и Decimal, формат String и Token, типы, разрешённые в значениях Dictionary, число Item в List).

При нарушении ограничений, относящихся к конкретному полю, такое поле также игнорируется целиком, если определение не задаёт иное. Например, если поле заголовка задано как Item и должно иметь тип Integer, но получено значение String, поле следует игнорировать, если в определении поля явно не задано иное поведение.

2.3. Сохранение расширяемости

Структурированные поля спроектированы так, чтобы их можно было расширять, поскольку опыт показывает, что часто возникает необходимость изменения и дополнения допустимого синтаксиса, даже если это не предполагалось.

Типы Item и Inner List позволяют в качестве средства расширения использовать параметры. Это означает, что при необходимости значения могут быть расширены для добавления новой информации. Для совместимости с новыми версиями в спецификациях полей не рекомендуется считать ошибкой присутствие нераспознанного параметра.

Для сохранения расширяемости поля должны иметь тип Item, List или Dictionary. Поля, ошибочно заданные с иным типом (например, Integer), считаются полями типа Item (т. е., поддерживающими параметры).

Для гарантии расширяемости в будущем и стимулирования использования полных реализаций синтаксических анализаторов определение поля может указывать возможность добавления параметров отправителем. В спецификациях можно предусмотреть резервирование всех параметров, соответствующих определённому шаблону, которые затем могут включаться в ту или иную часть запроса. Это будет препятствовать созданию синтаксических анализаторов, не учитывающих параметры.

Спецификации, использующие Dictionary, могут обеспечивать совместимость с будущими версиями, требуя игнорировать неизвестные ключи, а также связанные с ними значения и типы. Это позволит будущим спецификациям добавлять ключи, устанавливая для них соответствующие разрешения.

Расширение структурированного поля может требовать от получателя полностью игнорировать понятное тому расширение, если в нем не соблюдаются заданные для значения ограничения.

2.4. Использование новых структурированных типов в расширениях

Поскольку определение поля должно ссылаться на конкретный RFC для Structured Field, типы, доступные в качестве значения поля, ограничены указанными в данном RFC. Например, поле, определение которого ссылается на этот документ, может использовать значение с типом Date (параграф 3.3.7), а поле, ссылающееся на RFC 8941, не может, поскольку оно будет считаться недействительным (и отбрасываться) реализациями этой спецификации. Это ограничение применимо и к будущим расширениям поля, например, поле, заданное со ссылкой на RFC 8941, не может использовать тип Date, поскольку некоторые получатели могут применять для его обработки анализатор, основанный на RFC 8941. Однако этот документ разработан с учётом совместимости с RFC 8941 и анализатор, реализующий представленные здесь требования, сможет разбирать действительные структурированные поля, определения которых ссылаются на RFC 8941.

Обновление реализации структурированных полей для поддержки нового выпуска спецификации (такого как этот документ) ведёт к тому, что некоторые значения полей, недействительные в соответствии с прежним RFC, могут стать действительными. Например, экземпляр поля может содержать синтаксически корректное значение Date (параграф 3.3.7), даже если определение этого поля не включает Date. Реализация на основе RFC 8941 будет отвергать такие экземпляры, поскольку они не заданы в спецификации, но если её обновить в соответствии с данной спецификацией, разбор поля будет успешным. В некоторых случаях результирующее значение Date будет отклонено логикой поля, но значения, которые в ином случае игнорировались бы (например, как значения параметров), могут быть не обнаружены и поле впоследствии может быть воспринято и обработано.

3. Структурированные типы данных

В этом разделе представлен обзор абстрактных типов, используемых в структурированных полях, а также краткое описание и примеры преобразования этих типов в текстовые поля HTTP. В разделе 4 подробно описан синтаксический анализ и преобразование в текстовые поля HTTP.

  • Имеется три типа верхнего уровня, которые могут быть определены как поля HTTP: List, Dictionary и Item.

  • List и Dictionary — это контейнеры, элементами которых могут быть Item или Inner List (массив Item).

  • Item и Inner List могут быть параметризованы парами ключ-значение.

3.1. List

Список — это массив (возможно, пустой) элементов, которыми могут быть Item (параграф 3.3) или Inner List (параграф 3.1.1), те и другие могут быть параметризованными (параграф 3.1.2). Пустой список указывается тем, что поле не преобразуется. Это означает, что поля, заданные как List по умолчанию имеют пустое значение. При преобразовании списка в текстовое поле HTTP элементы разделяются запятыми и (необязательными) пробелами. Например, поле, заданное как список (List) маркеров (Token), может иметь вид

   Example-List: sugar, tea, rum

Отметим, что элементы List можно разбивать на несколько строк одного заголовка или трейлера, как указано в параграфе 5.3 [HTTP]. Например, строка

   Example-List: sugar, tea, rum

эквивалентна строкам

   Example-List: sugar, tea
   Example-List: rum

Однако отдельные элементы списка нельзя безопасно разбить на несколько строк (см. параграф 4.2).

Синтаксические анализаторы должны поддерживать списки по меньшей мере до 1024 элементов. Спецификации полей могут ограничивать типы и число элементов в отдельных значениях List при необходимости.

3.1.1. Inner List

Inner List может содержать элементы Item (параграф 3.3) или быть пустым. Как отдельные Item, так и Inner List могут быть параметризованы (параграф 3.1.2).

При преобразовании в текстовое поле HTTP списки Inner List заключаются в круглые скобки, а их значения разделяются одним или несколькими пробелами. Поле, значение которого определено как список (List) из Inner List, состоящих из строк (String), может иметь вид

   Example-List: ("foo" "bar"), ("baz"), ("bat" "one"), ()

Отметим, что последним элементом в этом примере является пустой Inner List.

Поле заголовка, значение которого задано как список Inner List с параметрами (Parameters) на обоих уровнях, может иметь вид

   Example-List: ("foo"; a=1;b=2);lvl=5, ("bar" "baz");lvl=1

Синтаксические анализаторы должны поддерживать Inner List с 256 элементами по меньшей мере. Спецификации полей могут ограничивать типы и число отдельных элементов Inner List.

3.1.2. Параметры

Параметры — это упорядоченный набор пар ключ-значение, связанных с Item (параграф 3.3) или Inner List (параграф 3.1.1). Ключи в наборе уникальны, а значения являются простыми элементами (т. е. не могут быть параметризованы, см. параграф 3.3).

Реализации должны обеспечивать доступ к параметрам как по индексу, так и по ключу. В спецификациях можно использовать любой из этих методов доступа.

Отметим, что параметры являются упорядоченными, а ключи не могут содержать букв верхнего регистра.

При преобразовании в текстовое поле HTTP параметр отделяется от Item или Inner List и других параметров точкой с запятой (;), например,

   Example-List: abc;a=1;b=2; cde_456, (ghi;jk=4 l);q="9";r=w

В параметрах с логическим (Boolean, параграф 3.3.6) значением true это значение должно исключаться при преобразовании (сериализации). Например, при a = true и b = false запись будет иметь вид

   Example-Integer: 1; a; b=?0

Это требование относится лишь к преобразованию и анализаторы должны корректно обрабатывать значение true.

Синтаксические анализаторы должны поддерживать по меньшей мере до 256 параметров на Item или Inner List, а также поддерживать ключи параметров размером по меньшей мере до 64 символов. Спецификации полей могут ограничивать порядок отдельных параметров, а также типы их значений.

3.2. Dictionary

Словарь представляет собой упорядоченный набор пар ключ-значение, где ключ является короткой строкой текста, а значение имеет тип Item (параграф 3.3) или содержит массив Item (в обоих случаях могут применяться параметры, параграф 3.1.2). Словарь может быть пустым, а ключи уникальны в рамках конкретного словаря.

Реализации должны обеспечивать доступ к словарю как по индексу, так и по ключу. В спецификациях можно использовать любой из этих методов доступа.

Как и списки, пустой словарь представляет исключением всего поля. Это означает, что поля типа Dictionary по умолчанию имеют пустое значение.

Обычно спецификация поля задаёт семантику словарей, указывая разрешённые типы элементов по их ключам, а также обязательность или необязательность присутствия. Получатели должны игнорировать элементы с неопределёнными или неизвестными ключами, если спецификация поля специально на запрещает это.

При преобразовании в текстовое поле HTTP элементы упорядочиваются по результатам преобразования и разделяются запятыми с необязательным пробелом. Ключи не могут содержать символов верхнего регистра, между ключом и значением указывается знак равенства (=, без пробела). Например,

   Example-Dict: en="Applepie", da=:w4ZibGV0w6ZydGU=:

В этом примере символ = в конце относится к последовательности байтов (Byte Sequence, параграф 3.3.5).

В параметрах с логическим (параграф 3.3.6) значением true это значение должно исключаться при преобразовании. Например, при b и c со значением true запись будет иметь вид

   Example-Dict: a=?0, b, c; foo=bar

Это требование относится лишь к преобразованию и анализаторы должны корректно обрабатывать значение true.

Пример словаря с элементами типа Inner List из Token

   Example-Dict: rating=1.5, feelings=(joy sadness)

Словарь с сочетанием Item и Inner List, часть которых имеет параметры может иметь вид

   Example-Dict: a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid

Словари могут разбивать свои элементы на несколько строк одного заголовка или трейлера. Например,

   Example-Dict: foo=1, bar=2

эквивалентно

   Example-Dict: foo=1
   Example-Dict: bar=2

Однако отдельные элементы Dictionary нельзя разбивать по строкам (см. параграф 4.2).

Синтаксические анализаторы должны поддерживать словари с 1024 парами ключ-значение по меньшей мере. Спецификации полей могут порядок и типы значений отдельных элементов Dictionary.

3.3. Item

Item может быть целым числом (Integer, параграф 3.3.1), десятичным значением (Decimal, параграф 3.3.2), строкой (String, параграф 3.3.3), маркером (Token, параграф 3.3.4), последовательностью байтов (Byte Sequence, параграф 3.3.5), логическим значением (Boolean, параграф 3.3.6), датой (Date, параграф 3.3.7) или Display String (параграф 3.3.8) и включать параметры (параграф 3.1.2). Например, поле заголовка, заданное как Item типа Integer может иметь вид

   Example-Integer: 5

или включать параметры

   Example-Integer: 5; foo=bar

3.3.1. Integer

Целые числа имеют значения от -999999999999999 до 999999999999999, включительно (до 15 цифр и знак), для совместимости с IEEE 754 [IEEE754]. Например,

   Example-Integer: 42

Числа с количеством знаков больше 15 могут поддерживаться разными способами, например, с использованием String (параграф 3.3.3), Byte Sequence (параграф 3.3.5) или параметра типа Integer, указывающего коэффициент умножения.

Хотя допускается сериализация чисел с нулями в начале (например, 0002, -01) и нуля со знаком (-0), эти тонкости могут не поддерживаться реализациями.

3.3.2. Decimal

Decimal — это число с целой и дробной частью. Целая часть может иметь до 12 цифр, дробная — не более 3. Например, заголовок с полем Decimal может иметь вид

   Example-Decimal: 4.5

Хотя допускается сериализация Decimal с нулями в начале (например, 0002.5, -01.334), в конце (например, 5.230, -0.40) и нулей со знаком (например, -0.0), эти тонкости могут не поддерживаться реализациями.

Отметим, что алгоритмы преобразования (параграф 4.1.5) округляют входные значения, сохраняя в дробной части не более 3 цифр. Если нужен иной вариант округления, его следует указать до выполнения сериализации.

3.3.3. String

Строка содержит печатаемые символы ASCII [RFC0020] (%x20 — %x7E) и может быть пустой. Отметим, что набор символов не включает табуляцию, перевод строки, возврат каретки и т. п. Символы других кодировок напрямую не поддерживаются в String, поскольку вызывают проблемы совместимости и (за редкими исключениями) не требуются. Если же такие символы нужны, можно использовать Display String (параграф 3.3.8).

При преобразовании в текстовое поле HTTP строки заключаются в двойные кавычки с использованием символа обратной дробной черты (\) для экранирования кавычек и символов \. Например,

   Example-String: "hello world"

Отметим, что в строках применяется только разграничитель DQUOTE, а одинарные кавычки не указывают границу String. Кроме того, символы DQUOTE и \ могут экранироваться, а любой другой символ после \ должен вызывать отказ при синтаксическом анализе. Анализаторы должны поддерживать String размером (после декодирования) по меньшей мере 1024 символа.

3.3.4. Token

Маркерами (Token) называют короткие текстовые слова, начинающиеся с буквы или символа *, за которым могут следовать символы-маркеры, разрешённые правилом ABNF token из [HTTP], плюс символы : и /. Например,

   Example-Token: foo123/456

Анализаторы должны поддерживать Token размером по меньшей мере 512 символов.

Отметим, что маркеры определены в основном для совместимости с моделью данных имеющихся полей HTTP и для их использования в некоторых реализациях могут потребоваться дополнительные действия. Поэтому в новых полях рекомендуется использовать String.

3.3.5. Byte Sequence

В структурированных полях можно передавать последовательности байтов (Byte Sequence).

При преобразовании в текстовое поле HTTP последовательности байтов ограничиваются двоеточиями (:) и кодируются в формате base64 (раздел 4 в [RFC4648]). Например,

   Example-ByteSequence: :cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==:

Анализаторы должны поддерживать Byte Sequence размером (после декодирования) по меньшей мере 16384 октета.

3.3.6. Boolean

В структурированных полях могут передаваться логические значения (Boolean).

При преобразовании в текстовое поле HTTP значения Boolean указываются префиксом ?, за которым следует 1 для true или 0 для false. Например,

   Example-Boolean: ?1

Отметим, что в Dictionary (параграф 3.2) и Parameter (параграф 3.1.2) логическое значение true исключается.

3.3.7. Date

В структурированных полях могут передаваться значения дат (Date), для которых применяется модель данных, аналогичная Integer, с представлением числа (возможно отрицательного) секунд после полуночи 1 января 1970 г. (1970-01-01T00:00:00Z) без учёта високосных секунд. Преобразование Date в текстовые поля HTTP аналогично применяемому для Integer, но используется префикс @. Например,

   Example-Date: @1659578233

Анализаторы должны поддерживать Date, значения которых включают все дни в годах с 1 до 9999 (т. е. от -62135596800 до 253402214400 секунд от полуночи 1 января 1970 г.).

3.3.8. Display String

Тип Display String похож на String, но позволяет использовать скалярные значения Unicode (т. е. все коды Unicode кроме суррогатных). Тип Display String предназначен для случаев, когда значение представляется пользователю и может содержать символы, отличные от ASCII. Не рекомендуется применять этот тип в ситуациях, где подойдёт String (параграф 3.3.3) или Token (параграф 3.3.4), поскольку для Unicode имеются требования по обработке (например, нормализация) и безопасности (например, атаки с омографами), способные осложнить обработку. Отметим, что в Display String не указывается применяемый язык, при необходимости это можно сделать отдельно (например, с использованием параметра).

В текстовых поля HTTP представление Display String похоже на String, но используется префикс % и для символов, не относящихся к ASCII, применяется %-кодирование, например,

   Example-DisplayString: %"This is intended for display to %c3%bcsers."

Вопросы безопасности при обработке Display String рассматриваются в разделе 6.

4. Работа со структурированными полями в HTTP

В этом разделе определено преобразование (сериализация) и синтаксический анализ (разбор) абстрактных типов, заданных в разделе 3, в значения текстовых полей HTTP и другие совместимые кодировки (например, в HTTP/2 [HTTP/2] до сжатия с помощью HPACK [HPACK]).

4.1. Преобразование структурированных полей

Для заданной спецификацией структуры возвращается строка ASCII, подходящая в качестве значения поля HTTP.

  1. Если структура имеет тип Dictionary или List с пустым значением (нет элементов), поле не преобразуется совсем, т. е. исключаются field-name и field-value.

  2. Если структура имеет тип List, output_string будет результатом преобразования List (параграф 4.1.1).

  3. Если структура имеет тип Dictionary, output_string будет результатом преобразования Dictionary (параграф 4.1.2).

  4. Если структура имеет тип Item, output_string будет результатом преобразования Item (параграф 4.1.3).

  5. Иначе сериализация завершается отказом.

  6. Возвращается значение output_string в форме строки байтов с кодировкой ASCII [RFC0020].

4.1.1. List

Для массива кортежей (member_value, parameters) как input_list возвращается строка ASCII, пригодная для поля HTTP.

  1. В качестве выходного значения принимается пустая строка.

  2. Для каждого кортежа (member_value, parameters) из input_list выполняются следующие операции.

    1. Если member_value является массивом, в конец выходной строки добавляется результат преобразования Inner List (параграф 4.1.1.1) с (member_value, parameters).

    2. Иначе в конец выходной строки добавляется результат преобразования Item (member_value, parameters) (параграф 4.1.3).

    3. Если в input_list ещё есть member_value:

      1. в конец выходной строки добавляется запятая (,);

      2. в конец выходной строки добавляется пробел (SP).

  3. Возвращается выходная строка.

4.1.1.1. Inner List

Для массива кортежей (member_value, parameters) как inner_list и списка параметров в качестве list_parameters возвращается строка ASCII, пригодная для поля HTTP.

  1. В качестве выходного значения принимается открывающая круглая скобка «(«.

  2. Для каждого кортежа (member_value, parameters) из inner_list выполняются следующие операции.

    1. В конец выходной строки добавляется результат преобразования Item (member_value, parameters) (параграф 4.1.3).

    2. Если в inner_list ещё остаются значения, в конец выходной строки добавляется пробел (SP).

  3. В конец выходной строки добавляется закрывающая круглая скобка «)».

  4. В конец выходной строки добавляется результат обработки параметров list_parameters (параграф 4.1.1.2).

  5. Возвращается выходная строка.

4.1.1.2. Параметры

Для упорядоченного словаря input_parameters (каждый элемент имеет param_key и param_value) возвращается строка ASCII, пригодная для поля HTTP.

  1. В качестве выходного значения принимается пустая строка.

  2. Для каждого param_key со значением param_value из input_parameters выполняются следующие операции.

    1. В конец выходной строки добавляется точка с запятой (;).

    2. В конец выходной строки добавляется результат преобразования ключа param_key (параграф 4.1.1.3).

    3. Если param_value не является логическим (Boolean) значением true:

      1. В конец выходной строки добавляется знак равенства (=);

      2. В конец выходной строки добавляется результат преобразования param_value (параграф 4.1.3.1).

  3. Возвращается выходная строка.

4.1.1.3. Ключи

Для ключа input_key возвращается строка ASCII, пригодная для поля HTTP.

  1. Значение input_key преобразуется в последовательность символов ASCII. При отказе преобразование прерывается.

  2. Если input_key содержит символы, отличные от lcalpha3, DIGIT, «_», «-», «.», «*», преобразование прерывается.

  3. Если первый символ input_key отличается от lcalpha и «*», преобразование прерывается.

  4. В качестве выходного значения принимается пустая строка.

  5. В конец выходной строки добавляется input_key (после преобразований).

  6. Возвращается выходная строка.

4.1.2. Dictionary

Для упорядоченного словаря input_dictionary (каждый элемент имеет member_key и кортеж (member_value, parameters)) возвращается строка ASCII, пригодная для поля HTTP.

  1. В качестве выходного значения принимается пустая строка.

  2. Для каждого member_key со значением (member_value, parameters) из input_dictionary выполняются действия:

    1. В конец выходной строки добавляется результат преобразования ключа member_key (параграф 4.1.1.3).

    2. Если member_value является логическим (Boolean) значением true:

      1. В конец выходной строки добавляется результат преобразования параметров (параграф 4.1.1.2).

    3. Иначе:

      1. В конец выходной строки добавляется знак равенства (=);

      2. Если member_value является массивом, в конец выходной строки добавляется результат преобразования Inner List (member_value, parameters) (параграф 4.1.1.1);

      3. Иначе в в конец выходной строки добавляется результат преобразования Item (member_value, parameters) (параграф 4.1.3).

    4. Если в input_dictionary ещё имеются элементы:

      1. В конец выходной строки добавляется запятая (,).

      2. В конец выходной строки добавляется пробел (SP).

  3. Возвращается выходная строка.

4.1.3. Item

Для элемента bare_item и параметров item_parameters возвращается строка ASCII, пригодная для поля HTTP.

  1. В качестве выходного значения принимается пустая строка.

  2. В конец выходной строки добавляется результат преобразования простого элемента bare_item (параграф 4.1.3.1).

  3. В конец выходной строки добавляется результат преобразования параметров item_parameters (параграф 4.1.1.2).

  4. Возвращается выходная строка.

4.1.3.1. Простой элемент (Bare Item)

Для элемента input_item возвращается строка ASCII, пригодная для поля HTTP.

  1. Если input_item является Integer, возвращается результат преобразования Integer (параграф 4.1.4) для input_item.

  2. Если input_item является Decimal, возвращается результат преобразования Decimal (параграф 4.1.5) для input_item.

  3. Если input_item является String, возвращается результат преобразования строки input_item (параграф 4.1.6).

  4. Если input_item является Token, возвращается результат преобразования маркера input_item (параграф 4.1.7).

  5. Если input_item является Byte Sequence, возвращается результат преобразования Byte Sequence input_item (параграф 4.1.8).

  6. Если input_item является Boolean, возвращается результат преобразования Boolean для input_item (параграф 4.1.9).

  7. Если input_item является Date, возвращается результат преобразования даты input_item (параграф 4.1.10).

  8. Если input_item является Display String, r возвращается результат преобразования Display String input_item (параграф 4.1.11).

  9. В противном случае преобразование завершается отказом.

4.1.4. Integer

Для целого числа input_integer возвращается строка ASCII, пригодная для поля HTTP.

  1. Если input_integer выходит за пределы диапазона -999999999999999 — 999999999999999 (включительно), преобразование завершается отказом.

  2. В качестве выходного значения принимается пустая строка.

  3. Если input_integer меньше 0 (отрицательно), в конец выходного значения добавляется знак минус (-).

  4. В конец выходного значения добавляется десятичное представление (только цифры).

  5. Возвращается выходная строка.

4.1.5. Decimal

Для десятичного числа input_decimal возвращается строка ASCII, пригодная для поля HTTP.

  1. Если input_decimal не является десятичным числом, преобразование завершается отказом.

  2. Если input_decimal имеет более 3 значащих цифр после десятичной точки, дробная часть округляется до 3 знаков с использованием в последнем знаке ближайшей или чётной цифры (при равноудалённости).

  3. Если input_decimal имеет более 12 значащих цифр слева от десятичной точки, преобразование завершается отказом.

  4. В качестве выходного значения принимается пустая строка.

  5. Если input_decimal меньше 0 (отрицательно), в конец выходного значения добавляется знак минус (-).

  6. В конец выходного значения добавляется десятичное представление целой части input_decimal (только цифры) или 0, если целая часть равна 0 (отсутствует).

  7. В конец выходного значения добавляется точка (.).

  8. Если дробная часть равна 0, в конец выходного значения добавляется 0.

  9. Иначе в конец выходного значения добавляется десятичное представление дробной части после округления (только цифры).

  10. Возвращается выходная строка.

4.1.6. String

Для строки input_string возвращается строка ASCII, пригодная для поля HTTP.

  1. Значение input_string представляется строкой символов ASCII, при отказе всё преобразование завершается отказом.

  2. Если input_string содержит символы из диапазона %x00-1f или %x7f-ff (т. е., не VCHAR или SP), преобразование завершается отказом.

  3. В качестве выходного значения принимается DQUOTE («).

  4. Для каждого символа char из input_string выполняются следующие операции:

    1. Если char имеет значение \ или DQUOTE:

      1. В конец выходного значения добавляется символ \.

    2. В конец выходного значения добавляется char.

  5. В конец выходного значения добавляется DQUOTE.

  6. Возвращается выходная строка.

4.1.7. Token

Для маркера input_token возвращается строка ASCII, пригодная для поля HTTP.

  1. Строка input_token преобразуется в последовательность символов ASCII, при отказе всё преобразование завершается отказом.

  2. Если первый символ input_token не относится к ALPHA или «*» или остальная часть включает символ, не относящийся к tchar, «:», «/», преобразование завершается отказом.

  3. В качестве выходного значения принимается пустая строка.

  4. В конец выходного значения добавляется input_token.

  5. Возвращается выходная строка.

4.1.8. Byte Sequence

Для последовательности байтов input_bytes возвращается строка ASCII пригодная для использования в поле HTTP.

  1. Если input_bytes не является последовательностью байтов, преобразование завершается отказом.

  2. В качестве выходного значения принимается пустая строка.

  3. В конец выходного значения добавляется двоеточие (:).

  4. В конец выходного значения добавляется представление input_bytes в формате base64 в соответствии с разделом 4 [RFC4648] с учётом приведённых ниже требований.

  5. В конец выходного значения добавляется двоеточие (:).

  6. Возвращается выходная строка.

Закодированные данные (п. 4) дополняются знаками равенства (=), как указано в параграфе 3.2 [RFC4648]. В соответствии с параграфом 3.5 [RFC4648] в кодированных данных также следует использовать биты заполнения 0.

4.1.9. Boolean

Для логического значения input_boolean возвращается строка ASCII пригодная для использования в поле HTTP.

  1. Если input_boolean не является логическим значением, преобразование завершается отказом.

  2. В качестве выходного значения принимается пустая строка.

  3. В конец выходного значения добавляется знак вопроса (?).

  4. Если input_boolean = true, в конец выходного значения добавляется 1.

  5. Если input_boolean = false, в конец выходного значения добавляется 0.

  6. Возвращается выходная строка.

4.1.10. Date

Для даты input_date возвращается строка ASCII пригодная для использования в поле HTTP.

  1. В качестве выходного значения принимается @.

  2. В конец выходного значения добавляется результат преобразования целого числа input_date (параграф 4.1.4).

  3. Возвращается выходная строка.

4.1.11. Display String

Для последовательности символов Unicode input_sequence возвращается строка ASCII пригодная для использования в поле HTTP.

  1. Если input_sequence не является строкой Unicode, преобразование завершается отказом.

  2. В качестве byte_array принимается результат кодирования UTF-8 (раздел 3 в [UTF8]) для input_sequence. При отказе кодирования преобразование завершается отказом.

  3. В качестве encoded_string принимается строка %DQUOTE (%»).

  4. Для каждого байта в byte_array выполняются следующие операции:

    1. Для байтов %x25 (%), %x22 (DQUOTE), %x00-1f, %x7f-ff:

      1. В конец encoded_string добавляется символ процента (%).

      2. В качестве encoded_byte принимается результат кодирования base16 (раздел 8 в [RFC4648]) с переводом букв в нижний регистр;

      3. В конец encoded_string добавляется encoded_byte.

    2. В остальных случаях байт декодируется в символ ASCII, который добавляется в конец encoded_string.

  5. В конец encoded_string добавляется DQUOTE.

  6. Возвращается encoded_string.

Отметим, что [UTF8] запрещает коды между U+D800 и U+DFFF (суррогаты) и при их наличии в input_sequence преобразование завершается отказом.

4.2. Синтаксический анализ структурированных полей

При синтаксическом анализе принимающей стороной полей HTTP, которые заведомо являются структурированными, важно соблюдать осторожность, поскольку имеется ряд граничных случаев, которые могут вызывать проблемы совместимости и даже безопасности. Этот параграф посвящён алгоритмам синтаксического анализа (разбора).

Для массива байтов input_bytes, представляющих поле-значение (пусто при отсутствии поля) и тип поля (field_type — dictionary, list или item), возвращается полученное при разборе значения поля.

  1. Массив input_bytes преобразуется в строку ASCII input_string, а отказ преобразования ведёт к отказу разбора.

  2. Отбрасываются все символы SP (пробел) в начале input_string.

  3. При field_type list выходным значением (output) будет результат анализа List (параграф 4.2.1) для input_string.

  4. При field_type dictionary выходным значением будет результат анализа Dictionary (параграф 4.2.1) для input_string.

  5. При field_type item выходным значением будет результат анализа Item (параграф 4.2.1) для input_string.

  6. Отбрасываются все символы SP (пробел) в начале input_string.

  7. Если строка input_string не пуста, разбор завершается отказом.

  8. В ином случае возвращается выходное значение.

При генерации input_bytes синтаксический анализатор должен объединить все строки поля из одного раздела (заголовок или трейлер), соответствующие имени поля без учёта регистра символов, в один элемент поле-значение через запятые, как указано в параграфе 5.2 [HTTP] для обеспечения корректной обработки всего поля.

Для списков и словарей это обеспечивает корректную конкатенацию всех строк поля, если отдельные элементы структуры данных верхнего уровня были разнесены по строкам. Алгоритмы разбора для обоих типов допускают наличие символов табуляции, поскольку в некоторых реализациях они могут применяться для объединения строк поля.

Элементы String, разбитые по строкам поля, могут приводить к непредсказуемым результатам, поскольку одна или несколько запятых (возможно, с пробелами) станут частью выходной строки анализатора. Поскольку конкатенацию может выполнять восходящий посредник, результаты не контролируются преобразователем и синтаксическим анализатором, даже если оба находятся под единым управлением.

Элементы Token, Integer, Decimal, Byte Sequence не могут разделяться по нескольким строкам поля, поскольку вставленные запятые приведут к отказу синтаксического анализа.

Анализаторы могут давать отказ при обработке значения поля, разделённого на строки, если какая-либо из этих строк не разбирается как данное поле. Например, при разборе поля Example-String, заданного как sf-string разрешен отказ при обработке показанных ниже строк.

   Example-String: "foo
   Example-String: bar"

Если при разборе возникает отказ, поле должно игнорироваться целиком (как будто его не было в разделе) или, как вариант, все сообщение HTTP должно считаться некорректно сформированным. Это требование намеренно является строгим для повышения уровня совместимости и безопасности, а в определениях Structured Field не разрешается отступление от этого требования. Отметим, что требование не применяется к реализациям, не разбирающим поле, например, посредники не обязаны вырезать вызывающие отказ поля при пересылке сообщения.

4.2.1. List

Для ASCII-строки input_string возвращается массив кортежей (item_or_inner_list, parameters), извлечённые значения удаляются из input_string.

  1. В качестве members принимается пустая строка.

  2. Пока input_string не пуста выполняются следующие действия:

    1. в конец members добавляется результат разбора Item или Inner List (параграф 4.2.1.1) для input_string;

    2. отбрасываются все символы OWS в начале input_string;

    3. если строка input_string пуста, возвращается members;

    4. извлекается первый символ и, если это не запятая (,), разбор завершается отказом;

    5. отбрасываются все символы OWS в начале input_string;

    6. если строка input_string пуста, это завершающая запятая и разбор завершается отказом;

  3. Структурированных данных нет, возвращается members (пустое значение).

4.2.1.1. Item или Inner List

Для ASCII-строки input_string возвращается кортеж (item_or_inner_list, parameters), где item_or_inner_list может быть простым элементом или массивом (bare_item, parameters), извлечённые значения удаляются из input_string.

  1. Если первым символом input_string является открывающая круглая скобка «(», возвращается результат разбора Inner List (параграф 4.2.1.2) для input_string.

  2. Возвращается результат разбора Item (параграф 4.2.3) для input_string.

4.2.1.2. Inner List

Для ASCII-строки input_string возвращается кортеж (inner_list, parameters), где inner_list — массив (bare_item, parameters), извлечённые значения удаляются из input_string.

  1. Извлекается первый символ input_string и если это не (, разбор завершается отказом.

  2. В качестве inner_list принимается пустой массив.

  3. Пока строка input_string не пуста, выполняются следующие операции:

    1. Отбрасываются символы SP в начале input_string.

    2. Если первым символом input_string является ), выполняются следующие операции:

      1. извлекается первый символ input_string;

      2. в качестве параметров принимается результат разбора Parameters (параграф 4.2.3.2) для input_string;

      3. возвращается кортеж (inner_list, parameters).

    3. В качестве item принимается результат разбора Item (параграф 4.2.3) для input_string.

    4. В конец inner_list добавляется item.

    5. Если первый символ input_string не SP или ), разбор завершается отказом.

  4. Конец Inner List не найден, разбор завершается отказом.

4.2.2. Dictionary

Для ASCII-строки input_string возвращается упорядоченный набор кортежей (item_or_inner_list, parameters), извлечённые значения удаляются из input_string.

  1. В качестве dictionary принимается пустой набор.

  2. Пока строка input_string не пуста, выполняются следующие действия:

    1. В качестве this_key принимается результат разбора ключа Key (параграф 4.2.3.3) для input_string.

    2. Если первым символом input_string является =, выполняются следующие операции:

      1. извлекается первый символ input_string;

      2. в качестве member принимается результат разбора Item или Inner List (параграф 4.2.1.1) для input_string.

    3. В ином случае выполняются следующие операции:

      1. в качестве value принимается логическое (Boolean) значение true;

      2. в качестве parameters принимается результат разбора Parameters (параграф 4.2.3.2) для input_string;

      3. в качестве member принимается кортеж (value, parameters).

    4. Если в словаре уже имеется ключ this_key (посимвольное сравнение), его значение заменяется на member.

    5. В ином случае в конец dictionary добавляется ключ this_key со значением member.

    6. Отбрасываются символы OWS в начале input_string.

    7. Если строка input_string пуста, возвращается dictionary.

    8. Извлекается первый символ input_string и если это не запятая (,), разбор завершается отказом.

    9. Отбрасываются символы OWS в начале input_string.

    10. Если строка input_string пуста, это завершающая запятая и разбор завершается отказом.

  3. Структурированных данных не найдено, возвращается dictionary (пустое значение).

Отметим, что при дублировании ключей Dictionary игнорируются все экземпляры, кроме последнего.

4.2.3. Item

Для ASCII-строки input_string возвращается кортеж (bare_item, parameters), извлечённые значения удаляются из input_string.

  1. В качестве bare_item принимается результат разбора Bare Item (параграф 4.2.3.1) для input_string.

  2. В качестве parameters принимается результат разбора Parameters (параграф 4.2.3.2) для input_string.

  3. Возвращается кортеж (bare_item, parameters).

4.2.3.1. Простой элемент

Для ASCII-строки input_string возвращается простой элемент, извлечённые значения удаляются из input_string.

  1. Если первым символом input_string является знак минуса (-) или DIGIT, возвращается результат разбора Integer или Decimal (параграф 4.2.4) для input_string.

  2. Если первым символом input_string является DQUOTE, возвращается результат разбора String (параграф 4.2.5) для input_string.

  3. Если первым символом input_string является ALPHA или *, возвращается результат разбора Token (параграф 4.2.6) для input_string.

  4. Если первым символом input_string является двоеточие (:), возвращается результат разбора Byte Sequence (параграф 4.2.7) для input_string.

  5. Если первым символом input_string является знак вопроса (?), возвращается результат разбора Boolean (параграф 4.2.8) для input_string.

  6. Если первым символом input_string является @, возвращается результат разбора Date (параграф 4.2.9) для input_string.

  7. Если первым символом input_string является знак процента (%), возвращается результат разбора Display String (параграф 4.2.10) для input_string.

  8. Иное означает, что тип элемента не распознан и разбор завершается отказом.

4.2.3.2. Параметры

Для ASCII-строки input_string возвращается упорядоченный набор простых элементов, извлечённые значения удаляются из input_string.

  1. В качестве parameters принимается пустой набор.

  2. Пока строка input_string не пуста, выполняются следующие действия:

    1. Если первый символ input_string не точка с запятой (;), выход из цикла.

    2. Извлекается символ точки с запятой (;) из начала input_string.

    3. Отбрасываются символы SP в начале input_string.

    4. В качестве param_key принимается результат разбора ключа (параграф 4.2.3.3) для input_string.

    5. В качестве param_key принимается логическое (Boolean) значение true.

    6. Если первым символом input_string является знак равенства (=), выполняются следующие операции:

      1. Извлекается знак равенства (=) из начала input_string.

      2. В качестве param_key принимается результат разбора Bare Item (параграф 4.2.3.1) для input_string.

    7. Если в parameters уже имеется ключ param_key (посимвольное сравнение), его значение заменяется на param_value.

    8. Иначе ключ param_key со значением param_value добавляется в конец parameters.

  3. Возвращается значение parameters.

Отметим, что при дублировании ключей параметра игнорируются все экземпляры, кроме последнего.

4.2.3.3. Ключи

Для ASCII-строки input_string возвращается ключ, извлечённые значения удаляются из input_string.

  1. Если первый символ input_string не относится к lcalpha или *, разбор завершается отказом.

  2. В качестве output_string принимается пустая строка.

  3. Пока строка input_string не пуста, выполняются следующие действия:

    1. Если первый символ input_string не относится к lcalpha, DIGIT, «_», «-», «.» или «*», возвращается output_string.

    2. В качестве char принимается результат извлечения первого символа input_string.

    3. Символ char добавляется в конец output_string.

  4. Возвращается значение output_string.

4.2.4. Integer и Decimal

Для ASCII-строки input_string возвращается Integer (параграф 3.3.1) или Decimal (параграф 3.3.2), извлечённые значения удаляются из input_string.

  1. В качестве type принимается integer.

  2. В качестве sign принимается значение 1.

  3. В качестве input_number принимается пустая строка.

  4. Если первым символом input_string является знак минус (-), он извлекается и для sign устанавливается значение -1.

  5. Если строка input_string пуста, это означает пустое значение integer и разбор завершается отказом.

  6. Если первый символ input_string не относится к DIGIT, разбор завершается отказом.

  7. Пока строка input_string не пуста, выполняются следующие действия:

    1. В качестве char принимается результат извлечения первого символа input_string.

    2. Если char относится к DIGIT, его значение помещается в конец input_number.

    3. В остальных случаях при type = integer и char = «.» выполняются следующие действия:

      1. если input_number содержит более 12 символов, разбор завершается отказом;

      2. в остальных случаях char добавляется в конец input_number и устанавливается type = decimal.

    4. Иначе char помещается в начало input_string с выходом из цикла.

    5. Если type имеет значение integer, а input_number содержит более 15 символов, разбор завершается отказом.

    6. Если type имеет значение decimal, а input_number содержит более 15 символов, разбор завершается отказом.

  8. Если type имеет значение integer выполняется следующая операция.

    1. В качестве output_number принимается Integer, т. е. результатом разбора input_number является целое число.

  9. В иных случаях выполняются следующие операции.

    1. Если последним символом input_number является точка (.), разбор завершается отказом.

    2. Если число символов input_number после точки больше 3, разбор завершается отказом.

    3. В качестве output_number принимается Decimal, т. е. результатом разбора input_number является десятичное число.

  10. В качестве output_number принимается конкатенация sign и output_number4.

  11. Возвращается output_number.

4.2.5. String

Для ASCII-строки input_string возвращается String без кавычек, извлечённые значения удаляются из input_string.

  1. В качестве output_string принимается пустая строка.

  2. Если первый символ input_string не является DQUOTE, разбор завершается отказом.

  3. Отбрасывается первый символ input_string.

  4. Пока строка input_string не пуста, выполняются следующие действия:

    1. В качестве char принимается результат извлечения первого символа input_string.

    2. Если char является обратной дробной чертой (\) выполняются следующие действия:

      1. если строка input_string пуста, разбор завершается отказом;

      2. в качестве next_char принимается результат извлечения первого символа input_string;

      3. если next_char не DQUOTE и не \, разбор завершается отказом;

      4. в конец output_string добавляется next_char.

    3. Иначе, если char = DQUOTE, возвращается output_string.

    4. Иначе, если char относится к диапазону %x00-1f или %x7f-ff (не VCHAR или SP), разбор завершается отказом.

    5. Иначе в конец output_string добавляется char.

  5. При достижении конца input_string без закрывающего символа DQUOTE разбор завершается отказом.

4.2.6. Token

Для ASCII-строки input_string возвращается Token, извлечённые значения удаляются из input_string.

  1. Если первый символ input_string не относится к ALPHA или «*», разбор завершается отказом.

  2. В качестве output_string принимается пустая строка.

  3. Пока строка input_string не пуста, выполняются следующие действия.

    1. Если первый символ input_string не является tchar, двоеточием (:), или «/», возвращается output_string.

    2. В качестве char принимается результат извлечения первого символа input_string.

    3. В конец output_string добавляется char.

  4. Возвращается output_string.

4.2.7. Byte Sequence

Для ASCII-строки input_string возвращается Byte Sequence, извлечённые значения удаляются из input_string.

  1. Если первый символ input_string не является двоеточием (:), разбор завершается отказом.

  2. Отбрасывается первый символ input_string.

  3. Если до конца input_string нет двоеточия (:), разбор завершается отказом.

  4. В качестве b64_content принимается результат извлечения из input_string всех символов до первого двоеточия, не включая его.

  5. Извлекается символ двоеточия (:) в начале input_string.

  6. Если b64_content содержит символ вне набора ALPHA, DIGIT, «+», «/», «=», разбор завершается отказом.

  7. В качестве binary_content принимается результат base64 [RFC4648] для b64_content, дополненный при необходимости (см. требования ниже). При отказе декодирования base64, разбор завершается отказом.

  8. Возвращается binary_content.

Некоторые реализации base64 не разрешают отвергать декодированные данные с некорректным заполнением «=» (см. параграф 3.2 в [RFC4648]), поэтому синтаксическому анализатору не следует прерывать разбор при отсутствии «=», если он явно не настроен на это. Некоторые реализации base64 не позволяют отвергать декодированные данные с ненулевыми битами заполнения (см. параграф 3.5 в [RFC4648]), поэтому синтаксическому анализатору не следует прерывать разбор при наличии таких битов, если он явно не настроен на это.

Эта спецификация не смягчает требований параграфов 3.1 и 3.3 в [RFC4648], поэтому анализатор должен прерывать разбор при наличии символов, не входящих в алфавит base64, и символов перевода строки в кодированных данных.

4.2.8. Boolean

Для ASCII-строки input_string возвращается Boolean, извлечённые значения удаляются из input_string.

  1. Если первый символ input_string не является знаком вопроса (?), разбор завершается отказом.

  2. Отбрасывается первый символ input_string.

  3. Если первым символом input_string является «1», символ отбрасывается и возвращается значение true.

  4. Если первым символом input_string является «0», символ отбрасывается и возвращается значение false.

  5. Соответствующего значения нет, разбор завершается отказом.

4.2.9. Date

Для ASCII-строки input_string возвращается Date, извлечённые значения удаляются из input_string.

  1. Если первым символом input_string не является «@», разбор завершается отказом.

  2. Отбрасывается первый символ input_string.

  3. В качестве output_date принимается результат Integer или Decimal (параграф 4.2.4) для input_string.

  4. Если output_date имеет тип Decimal, разбор завершается отказом.

  5. Возвращается output_date.

4.2.10. Display String

Для ASCII-строки input_string возвращается последовательность кодов Unicode, извлечённые значения удаляются из input_string.

  1. Если первыми двумя символами input_string не являются % и DQUOTE (%»), разбор завершается отказом.

  2. Отбрасываются два первых символа input_string.

  3. В качестве byte_array принимается пустой массив.

  4. Пока строка input_string не пуста, выполняются следующие операции.

    1. В качестве char принимается результат извлечения первого символа input_string.

    2. Если char относится к диапазону %x00-1f или %x7f-ff (т. е. не VCHAR или SP), разбор завершается отказом.

    3. Если char имеет значение %, выполняются следующие операции:

      1. в качестве octet_hex принимается результат извлечения двух символов input_string, а при их отсутствии разбор завершается отказом;

      2. если octet_hex содержит символы, не относящиеся к %x30-39 или %x61-66 (т. е. не цифры и не буквы a-f в нижнем регистре), разбор завершается отказом;

      3. в качестве octet принимается результат декодирования шестнадцатеричного значения octet_hex (раздел 8 of [RFC4648]);

      4. Значение octet добавляется в конец byte_array.

    4. Если char имеет значение DQUOTE выполняются следующие операции:

      1. в качестве unicode_sequence принимается результат декодирования byte_array как строки UTF-8 (раздел 3 в [UTF8]) и при отказе декодирования разбор завершается отказом;

      2. Возвращается значение unicode_sequence.

    5. Иначе, если char не является знаком процента (%) или DQUOTE, выполняются следующие операции:

      1. В качестве byte принимается результат декодирования ASCII для char.

      2. Значение byte добавляется в конец byte_array.

  5. При достижении конца input_string без закрывающего символа DQUOTE разбор завершается отказом.

5. Взаимодействие с IANA

Агентство IANA добавило в реестр Hypertext Transfer Protocol (HTTP) Field Name приведённый ниже текст.

Столбец Structured Type указывает тип поля (в соответствии с RFC 9651) — Dictionary, List или Item (при наличии).

Отметим, что имена полей, начинающиеся с символов, отличных от ALPHA и «*», не могут быть представлены как структурированные поля Token и могут быть не совместимы с отображением в значения ссылающихся на них полей.

В реестр добавлен столбец Structured Type с внесением в него указанных в таблице 1 строк для имеющихся записей.

Таблица 1. Существующие поля.

 

Имя поля

Структурированный тип

Accept-CH

List

Cache-Status

List

CDN-Cache-Control

Dictionary

Cross-Origin-Embedder-Policy

Item

Cross-Origin-Embedder-Policy-Report-Only

Item

Cross-Origin-Opener-Policy

Item

Cross-Origin-Opener-Policy-Report-Only

Item

Origin-Agent-Cluster

Item

Priority

Dictionary

Proxy-Status

List

 

6. Вопросы безопасности

Размер большинства типов, задаваемых структурированными полями, не ограничен и очень большие поля могут стать объектом атак (например, для истощения ресурсов). Большинство реализаций HTTP ограничивает размер отдельных полей для смягчения таких атак.

Стороны, имеющие возможность внедрять новые поля HTTP, могут менять трактовку структурированных полей. В некоторых случаях это может приводить к отказам синтаксического анализа, но невозможно организовать гарантированные отказы во всех таких обстоятельствах.

Тип Display String позволяет передавать любые возможные коды Unicode без очистки, например, невыделенные коды, управляющие коды (включая NUL) или несимвольные коды. Поэтому приложениям, использующим Display String, необходимо рассмотреть такие стратегии, как фильтрация или экранирование недоверенного содержимого перед его отображением (см. [PRECIS] и [UNICODE-SECURITY]).

7. Литература

7.1. Нормативные документы

[HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., «HTTP Semantics», STD 97, RFC 9110, DOI 10.17487/RFC9110, June 2022, <https://www.rfc-editor.org/info/rfc9110>.

[RFC0020] Cerf, V., «ASCII format for network interchange», STD 80, RFC 20, DOI 10.17487/RFC0020, October 1969, <https://www.rfc-editor.org/info/rfc20>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC4648] Josefsson, S., «The Base16, Base32, and Base64 Data Encodings», RFC 4648, DOI 10.17487/RFC4648, October 2006, <https://www.rfc-editor.org/info/rfc4648>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[UTF8] Yergeau, F., «UTF-8, a transformation format of ISO 10646», STD 63, RFC 3629, DOI 10.17487/RFC3629, November 2003, <https://www.rfc-editor.org/info/rfc3629>.

7.2. Дополнительная литература

[HPACK] Peon, R. and H. Ruellan, «HPACK: Header Compression for HTTP/2», RFC 7541, DOI 10.17487/RFC7541, May 2015, <https://www.rfc-editor.org/info/rfc7541>.

[HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., «HTTP/2», RFC 9113, DOI 10.17487/RFC9113, June 2022, <https://www.rfc-editor.org/info/rfc9113>.

[IEEE754] IEEE, «IEEE Standard for Floating-Point Arithmetic», IEEE Std 754-2019, DOI 10.1109/IEEESTD.2019.8766229, ISBN 978-1-5044-5924-2, July 2019, <https://ieeexplore.ieee.org/document/8766229>.

[PRECIS] Saint-Andre, P. and M. Blanchet, «PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols», RFC 8264, DOI 10.17487/RFC8264, October 2017, <https://www.rfc-editor.org/info/rfc8264>.

[RFC5234] Crocker, D., Ed. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008, <https://www.rfc-editor.org/info/rfc5234>.

[RFC7493] Bray, T., Ed., «The I-JSON Message Format», RFC 7493, DOI 10.17487/RFC7493, March 2015, <https://www.rfc-editor.org/info/rfc7493>.

[RFC8259] Bray, T., Ed., «The JavaScript Object Notation (JSON) Data Interchange Format», STD 90, RFC 8259, DOI 10.17487/RFC8259, December 2017, <https://www.rfc-editor.org/info/rfc8259>.

[UNICODE-SECURITY] Davis, M. and M. Suignard, «Unicode Security Considerations», Unicode Technical Report #36, 19 September 2014, <https://www.unicode.org/reports/tr36/tr36-15.html>. Latest version available at <https://www.unicode.org/reports/tr36/>.

Приложение A. Ответы на вопросы

A.1. Почему не JSON?

Ранние предложения по структурированным полям основывались на JSON [RFC8259], однако ограничения на применение с полями HTTP требовали от получателей и отправителей дополнительной специальной обработки. Например, в спецификации JSON имеются проблемы, связанные с большими числами и объектами с дубликатами элементов. Рекомендации по решению этих проблем имеются (например, [RFC7493]), но полагаться на них нельзя.

Строки JSON по умолчанию являются строками Unicode, с чем связан ряд проблем совместимости (например, при сравнении). Разработчикам можно посоветовать избегать без необходимости отличного от ASCII содержимого, но реализацию этого трудно обеспечить. Другим примером является способность JSON размещать содержимое на произвольной глубине. Поскольку требуемый для этого объем памяти может оказаться недоступным (например, во встраиваемых устройствах и других системах с ограничениями), требуется ограничить его тем или иным способом. Существующие реализации JSON не имеют таких ограничений и даже при их задании вполне вероятно, что в каком-либо определении поля ограничения придётся нарушить. Широкое распространение JSON осложняет внесение таких ограничений для всех реализаций, часть их не будет соблюдать ограничения, что приведёт к проблемам совместимости.

Если что-то похоже на JSON, у людей будет соблазн применять JSON для сериализации и синтаксического анализа значений полей. Поскольку основной целью структурированных полей является улучшение функциональной совместимости, и упрощение реализации, эти опасения ведут к необходимости применять специальные преобразователи и синтаксические анализаторы. Кроме того, многие разделяют мнение о том, что JSON «не выглядит правильно» в полях HTTP.

Приложение B. Замечанию по реализации

Базовым реализациям этой спецификации следует предоставлять функции верхнего уровня для преобразования (сериализации, параграф 4.1) и разбора (синтаксического анализ, параграф 4.2). Это не обязательно должны быть функции и можно, например, реализовать их как объекты с методами для каждого типа верхнего уровня. Для обеспечения функциональной совместимости важна полнота реализаций и точное соответствие алгоритмам (см. параграф 1.1). Для оказания помощи в этом сообщество поддерживает специальный открытый ресурс <https://github.com/httpwg/structured-field-tests>.

Разработчикам следует принимать во внимание, что словари и параметры являются упорядоченными. Некоторые поля могут не передавать смысл такого порядка, но его все равно следует показывать, чтобы он был доступен приложениям, которым порядок требуется. При реализации следует осознавать различия между типами Token и String. Хотя большинство языков программирования имеет встроенные типы, которые сопоставляются с другими типами, может потребоваться создание специального объекта token или использование параметров функций для гарантированного разделения этих типов.

Алгоритм преобразования (сериализации) задан так, что он не ограничивается строго типами данных, определёнными в разделе 3. Например, тип Decimal предназначен для расширения диапазона входных значений и округления до допустимых значений.

Реализациям разрешается ограничивать размеры структур с учётом определённого для каждого типа минимума. Если структура превышает заданные реализацией ограничения размера, преобразование или разбор завершаются отказом.

Приложение C. ABNF

В этом приложении используется нотация расширенных форм Бэкуса-Наура (Augmented Backus-Naur Form или ABNF) [RFC5234] для иллюстрации ожидаемого синтаксиса структурированных полей. Однако она не может служить для проверки синтаксиса, поскольку не соответствует всем требованиям. Это приложение не является нормативным и при возникновении противоречий между алгоритмами синтаксического анализа и ABNF алгоритмы имеют преимущество.

   sf-list       = list-member *( OWS "," OWS list-member )
   list-member   = sf-item / inner-list

   inner-list    = "(" *SP [ sf-item *( 1*SP sf-item ) *SP ] ")"
                   parameters

   parameters    = *( ";" *SP parameter )
   parameter     = param-key [ "=" param-value ]
   param-key     = key
   key           = ( lcalpha / "*" )
                   *( lcalpha / DIGIT / "_" / "-" / "." / "*" )
   lcalpha       = %x61-7A ; a-z
   param-value   = bare-item

   sf-dictionary = dict-member *( OWS "," OWS dict-member )
   dict-member   = member-key ( parameters / ( "=" member-value ))
   member-key    = key
   member-value  = sf-item / inner-list

   sf-item   = bare-item parameters
   bare-item = sf-integer / sf-decimal / sf-string / sf-token
               / sf-binary / sf-boolean / sf-date / sf-displaystring

   sf-integer       = ["-"] 1*15DIGIT
   sf-decimal       = ["-"] 1*12DIGIT "." 1*3DIGIT
   sf-string        = DQUOTE *( unescaped / "%" / bs-escaped ) DQUOTE
   sf-token         = ( ALPHA / "*" ) *( tchar / ":" / "/" )
   sf-binary        = ":" base64 ":"
   sf-boolean       = "?" ( "0" / "1" )
   sf-date          = "@" sf-integer
   sf-displaystring = "%" DQUOTE *( unescaped / "\" / pct-encoded )
                      DQUOTE

   base64       = *( ALPHA / DIGIT / "+" / "/" ) *"="

   unescaped    = %x20-21 / %x23-24 / %x26-5B / %x5D-7E
   bs-escaped   = "\" ( DQUOTE / "\" )

   pct-encoded  = "%" lc-hexdig lc-hexdig
   lc-hexdig = DIGIT / %x61-66 ; 0-9, a-f

Приложение D. Отличия от RFC 8941

Эта версия спецификации значений структурированных полей для HTTP (Structured Field Values for HTTP) включает некоторые изменения:

  • добавлен тип Date (параграф 3.3.7);

  • отменена рекомендация использовать ABNF в определениях новых структурированных полей (раздел 2);

  • синтаксис ABNF перенесён в Приложение C;

  • добавлен столбец Structured Type в реестр Hypertext Transfer Protocol (HTTP) Field Name (раздел 5);

  • усовершенствована обработка ошибок при синтаксическом анализе (параграф 4.2);

  • добавлен тип Display String (параграф 3.3.8).

Благодарности

Большое спасибо Matthew Kerwin за предметные отклики и внимательное отношение при разработке спецификации.

Спасибо Ian Clelland, Roy Fielding, Anne van Kesteren, Kazuho Oku, Evert Pot, Julian Reschke, Martin Thomson, Mike West, Jeffrey Yasskin за их вклад в работу.

Адреса авторов

Mark Nottingham

Cloudflare

Prahran VIC

Australia

Email: mnot@mnot.net

URI: https://www.mnot.net/

Poul-Henning Kamp

The Varnish Cache Project

Email: phk@varnish-cache.org


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Латинские буквы нижнего регистра (a — z). Прим. перев.

4В оригинале «the product of output_number and sign». Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 9620 Guidelines for Human Rights Protocol and Architecture Considerations

Internet Research Task Force (IRTF)                            G. Grover
Request for Comments: 9620                                              
Updates: 8280                                               N. ten Oever
Category: Informational                          University of Amsterdam
ISSN: 2070-1721                                           September 2024

Guidelines for Human Rights Protocol and Architecture Considerations

Рекомендации по правам человека при разработке протоколов и архитектур

PDF

Аннотация

В этом документе приведены рекомендации по учёту прав человека при разработке сетевых протоколов и архитектуры, аналогично рекомендациям по учёту приватности (конфиденциальности) в RFC 6973. Документ является обновлением рекомендаций по правам человека, приведённых в RFC 8280.

Документ создан исследовательской группой IRTF Human Right Protocol Considerations (HRPC).

Статус документа

Документ не относится к категории Internet Standards Track и публикуется для информации.

Документ является результатом работы IRTF1. IRTF публикует результаты относящихся к Internet исследований и разработок. Эти результаты могут оказаться не пригодными для реализации. Данный RFC представляет согласованное мнение исследовательской группы QIRG в рамках IRTF. Документы, одобренные для публикации IRSG, не претендуют на статус Internet Standard (см. раздел 2 в RFC 7841).

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9620.

Авторские права

Авторские права (Copyright (c) 2024) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (https://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно.

1. Введение

В этом документе приведены соображения для разработчиков протоколов, связанные с правами человека. Указаны вопросы, на которые инженерам следует ответить при создании или совершенствовании протоколов, если они хотят понять, как их решения могут повлиять на права человека в Internet. Следует отметить, что влияние протоколов невозможно оценить лишь по их устройству и следует изучить также их реализацию и применение, чтобы полностью оценить влияние на права человека.

Вопросы основаны на исследованиях, выполненных группой Human Rights Protocol Considerations (HRPC) Research Group, которые были документированы до выхода этого документа. Исследования установили, что права человека связаны со стандартами и протоколами, и предоставляют базовый словарь технических понятий, влияющий на права человека, а также способы объединения этих технических понятий для сохранения в Internet благоприятной среды в части прав человека. Это формирует контуры для решения вопросов прав человека в протоколах.

Документ представляет собой итерацию руководств, представленных в [RFC8280]. Методы анализ прав человека (параграф 3.2) и рекомендации по учёту этих прав (параграф 3.3) в данном документе протестированы на предмет актуальности, точности и обоснованности [HR-RT]. Толкование прав человека основано на «Всеобщей декларации прав человека» (Universal Declaration of Human Rights) [UDHR] и последующих соглашениях, которые совместно формируют свод международных законов о правах человека [UNHR].

Документ не содержит подробной классификации характера (возможных) нарушений прав человека (прямых или косвенных, долгосрочных или краткосрочных, которые могут возникать при выборе того или иного протокола. Отчасти это объясняется сильной зависимостью от контекста а также тем, что целью документа является предоставление рекомендаций. Дальнейшие исследования в этой области принесут пользу разработчикам и исполнителям.

Этот информационный документ одобрен для публикации исследовательской группой HRPC в составе IRTF. Документ был рассмотрен, опробован и протестирован исследовательской группой, а также внешними исследователями и практиками. Исследовательская группа признает, что понимание воздействия протоколов и архитектуры Internet на общество ещё не завершено и включает совокупность продолжающихся исследований. Документ не является результатом работы IETF и не задаёт стандартов.

2. Угрозы правам человека

Угрозы реализации прав человека в Internet имеют много форм. Протоколы и стандарты могут наносить ущерб правам на свободу выражения и информации, отсутствие дискриминации, равную защиту, участие в культурной жизни, искусстве и науке, свободу собраний и ассоциаций, безопасность. Конечный пользователь, которому отказано в доступе к неким услугам или содержимому, может оказаться не в состоянии раскрыть важные сведения о недобросовестных действиях правительства или иных органов. Человеку, чьи коммуникации отслеживаются, могут препятствовать в осуществлении его прав на свободу ассоциаций или участие в политических процессах [Penney]. В худшем варианте утечка информации может вызывать физическую опасность. Реалистичным примером являются случаи, когда лица, сочтённые угрозой государству, подвергаются мучениям, внесудебным казням или заключению по стражу на основе сведений, собранных государственными органами путём отслеживания сетевого трафика.

В этом документе приведено несколько примеров реализации угроз правам человека в Internet. Моделирование угроз вдохновлено документом Privacy Considerations for Internet Protocols [RFC6973], основанным на анализе угроз безопасности. Этот метод ещё разрабатывается и не является идеальным для оценки рисков для прав человека в протоколах и системах Internet. Некоторые конкретные угрозы правам человека опосредованно учитываются в протоколах Internet как часть вопросов безопасности [RFC3552], однако соображения приватности [RFC6973], не говоря уже о влиянии протоколов на права человека не стандартизованы и не реализованы.

Многие угрозы, способствующие их возникновению факторы и риски связаны с различными правами. Это неудивительно с учётом взаимосвязанности, взаимозависимости и неделимости прав человека. Однако здесь рассматриваются лишь права человека, связанные с информационными и коммуникационными технологиями (Information and Communication Technologies или ICT) в целом, а также протоколами и стандартами, в частности [Orwat]:

Основным источником значимости прав человека является «Международный билль о правах человека», состоящий из «Всеобщей декларации прав человека» (UDHR) [UDHR], а также «Международного пакта о гражданских и политических правах (International Covenant on Civil and Political Rights или ICCPR) [ICCPR] и «Международного пакта об экономических, социальных и культурных правах» (International Covenant on Economic, Social and Cultural Rights или ICESCR) [ICESCR]. В свете некоторых фактов цензуры в Internet в 2012 г. была принята резолюция комитета по правам человека ООН (UN Human Rights Council Resolution) 20/8, в которой сказано: « … те же права, которые люди имеют вне сети (offline), должны быть защищены и в сети (online) …» [UNHRC2016]. В 2015 г. была разработана и опубликована «Хартия прав человека и принципов для Internet (Charter of Human Rights and Principles for the Internet) [IRP] [Jorgensen]. Согласно этим документам, примерами прав человека, связанных с системами ICT, являются человеческое достоинство (ст. 1 UDHR), отсутствие дискриминации (ст. 2), право на жизнь, свободу и безопасность (ст. 3), свобода мнений и их выражения (ст. 19), свобода собраний и ассоциаций (ст. 20), право на равную защиту, правовую защиту, справедливый суд, надлежащее судопроизводство, презумпция невиновности (ст. 7-11), подобающий социальный и международный порядок (ст. 28), участие в общественных делах (ст. 21), участие в культурной жизни, защита интеллектуальной собственности (ст. 27), приватность (ст. 12).

Часть каталога прав человека, связанных с ICT, включая экономически права, приведена в [Hill].

Здесь не предпринимается попыток исключить конкретные права или отдать предпочтение отдельным правам.

3. Обзоры по правам человека

В идеале создателям протоколов и их соавторам следует рассматривать вопросы прав человека в процессе разработки (см. параграф 3.1). В этом разделе приведены рекомендации по выполнению анализа прав человека, т. е. оценке на них протокола или стандарта. Анализ прав человека может выполнять любой участник на разных этапах создания Internet-Draft. Как правило, легче повлиять на разработку технологии на ранних этапах процесса, нежели на более поздних. Это не означает, что рецензии Last Call не имеют значения, но вероятность существенных изменений на их основе будет ниже.

Обзоры прав человека могут выполняться авторами документов, кураторами разработки, членами групп рецензирования, адвокатами и заинтересованными сообществами с целью влияния на процесс разработки стандартов. Документы IETF могут получить пользу от людей с разными знаниями, взглядами и опытом, тем более, что реализация документов может оказывать влияние на множество разных сообществ.

Методы анализа технологий на предмет влияния на права человека ещё только зарождаются. К настоящему моменту группа по анализу прав человека изучила 5 методов, часто применяемых в сочетании друг с другом.

3.1. Анализ Internet-Draft на основе рекомендаций модели

При таком анализе применяется модель, описанная в разделе 4. Описанные категории и вопросы можно применять для рецензирования Internet-Draft. Преимущество этого состоит в предоставлении понятного обзора и авторы документов могут обратиться к этому документу и [RFC8280] для понимания предыстории и контекста.

3.2. Анализ Internet-Draft на основе воздействия

При рассмотрении Internet-Draft конкретное влияние на права человека может стать очевидным при внимательном прочтении документов и попытке понять их воздействие на сети или сообщества. Хотя этот анализ менее структурирован по сравнению с прямым использованием модели рассмотрения прав человека, он может приводить к новому умозрительному пониманию связей между правами человека и протоколами.

3.3. Общение с экспертами

Общение с авторами документов, активными членами рабочей группы или экспертами в предметной области может помочь при изучении характеристик протокола и его влияния. Такой подход обеспечивает два основных преимущества.

  1. Возможность рецензента глубже понять (предусмотренную) работу протокола.

  2. Возможность рецензента начать обсуждение с экспертами или даже авторами документа, что может помочь в понимании рецензии после её публикации.

3.4. Собеседование с затрагиваемыми лицами и сообществами

Протоколы влияют на пользователей Internet. Собеседования могут помочь рецензентам понять влияние протоколов на использующих их людей. Поскольку права человека лучше всего рассматривать с точки зрения правообладателей, такой подход позволит лучше понять реальные последствия использования технологии. В то же время бывает трудно связать конкретные изменения с определенным протоколом, особенно, если тот не получил широкого распространения.

3.5. Отслеживание влияния реализаций

Реалии развёрнутых протоколов могут отличаться от ожиданий на этапах проектирования и разработки протокола [RFC8980]. Когда для спецификации уже имеется работающий код, его можно проанализировать в среде эксперимента или в Internet, наблюдая влияние протокола. В отличие от рассмотрения текста черновиков, этот подход позволяет рецензенту понять, как спецификации работают на практике и, возможно, обнаружить неизвестные и неожиданные влияния технологии.

4. Рекомендации по вопросам прав человека

В этом разделе приведены рекомендации для авторов документов в форме опросника о протоколах и возможном влиянии технических решений на соблюдение прав человека. Опросник может быть полезен на любом этапе процесса разработки, особенно после того, как авторы создали высокоуровневую модель протокола, как описано в [RFC4101]. Это руководство не стремится заменить какие-либо имеющиеся опорные спецификации, а скорее способствует их развитию и рассматривает процесс разработки с точки зрения прав человека.

Протоколы и стандарты Internet могут выиграть от документированного обсуждения возможных рисков для прав человека, возникающих из-за неправильного применения протокола или технологии, описанных в RFC. Это может быть дополнено заявлением о применимости (Applicability Statement) данного RFC.

Отметим, что представленные в этом разделе рекомендации не задают конкретной практики. Спектр разрабатываемых IETF протоколов слишком широк, чтобы давать рекомендации о конкретном использовании данных или балансе прав человека и других аспектов разработки. Однако тщательное продумывание ответов на приведённые ниже вопросы поможет авторам выполнить всесторонний анализ, который может стать основой для обсуждения адекватности учёта в протоколе конкретных угроз правам человека. Это руководство призвано помочь в процессе анализа прав человека и не содержит конкретных указаний для написания раздела о правах человека (как в примере из [RFC6973]).

При рассмотрении этих вопросов авторы должны учитывать влияние технического прогресса и изменений с течением времени на уровень защиты. В общем случае рассмотрение прав будет, скорей всего, более эффективным при наличии цели и конкретных вариантов применения (в отличие от абстрактных, абсолютных целей).

Хотя в разделе применяется слово «протокол», указанные в вопросах принципы могут применяться и к другим типам решений (расширение имеющихся протоколов, архитектура для решения конкретных задач и т. п.).

4.1. Посредники

Вопросы

Зависит ли протокол от конкретных функций на узлах-посредниках и разрешает ли такие функции?

Пояснения

Принцип сквозной (end-to-end) работы [Saltzer] гласит, что некоторые функции могут выполняться и их следует выполнять на концах сети. В [RFC1958] сказано «в более общем виде сообщество считает, что целью является связность …, а информация является сквозной, а не спрятанной где-то в сети». При включении в протокол конечных точек и посредников, особенно не находящихся под контролем какой-либо из конечных точек или даже практически невидимых для конечных точек (например, перехватывающие прокси HTTPS [HTTPS-interception]) появляются новые возможности отказов. Это также ведёт к консервативности, поскольку посредники могут задавать ограничения для протоколов (иногда в нарушение спецификации), которые помешают конечным точкам применять более современные протоколы, как описано в параграфе 9.3 [RFC8446].
Отметим, что посредники отличаются от служб. В первом случае сторонний элемент является частью протокольного обмена, а во втором конечные точки явно взаимодействуют со службой. Модель клиент-сервер обеспечивает более чёткое разделение ответственности между элементами, нежели наличие посредников. Однако даже в системах клиент-сервер зачастую полезно обеспечивать сквозное шифрование между конечными точками для элементов протокола, не входящих в сферу действия службы, как это сделано в Messaging Layer Security (MLS) [RFC9420].

Пример

Шифрование между конечными точками можно применять для защиты протокола от воздействия посредников. Примерами являются шифрование информации транспортного уровня в QUIC [RFC9000] и поле индикации имени сервера TLS (Server Name Indication или SNI) [TLS-ESNI]. Одним из следствий этого является ограничение возможности инспектирования трафика операторами сети, в случае шифрования оператору для отслеживания поведения потребуется контроль над ними.

Влияние

  • Право на свободу выражения.
  • Право на свободу собраний и ассоциаций

4.2. Связность

Вопросы

Оптимизирован ли протокол для соединений с малой пропускной способностью и высокой задержкой? Может ли протокол работать без поддержки состояний (stateless)?
С учётом изменения качества и условий в сети в зависимости от места и времени важно разрабатывать протоколы так, чтобы они были надёжными даже для соединений с малой пропускной способностью и высокой задержкой.

Влияние

  • Право на свободу выражения
  • Право на свободу собраний и ассоциаций

4.3. Надёжность

Вопросы

Устойчив ли протокол к отказам? Имеются ли механизмы аккуратного «отката» (downgrade) и/или уведомления? Может ли протокол противостоять злонамеренным попыткам сокращения возможностей (degradation)? Имеется ли документированный способ информирования о сокращении возможностей? Имеются ли средства (меры) восстановления или частичного исправления при отказе? Может ли протокол обеспечивать надёжность и производительность при непредвиденных изменениях или обстоятельствах?

Пояснения

Надёжность и отказоустойчивость гарантируют, что протокол будет выполнять свои функции согласованно и устойчиво к ошибкам (как описано), не приводя к неожиданным результатам. Меры обеспечения надёжности в протоколах гарантируют пользователям успешное выполнение желаемых коммуникаций.
Надёжная система сокращает свои возможности (деградирует) аккуратно и имеет документированные средства информирования об этом. Она также будет обеспечивать механизмы аккуратного восстановления после отказов и, по возможности, поддерживать частичное восстановление. Важно отличать случайное сокращение возможностей от злонамеренного. Например, некоторые атаки на прежние версии TLS использовали способность TLS аккуратно переходить к менее стойким шифрам [FREAK] [Logjam], что полезно с точки зрения функциональности, но может быть катастрофическим в плане безопасности.
Для надёжности требуется, чтобы службы уведомляли пользователей об отказах при доставке. В системах, работающих в реальном масштабе времени, протокол также должен обеспечивать своевременную доставку.

Пример

В структуре современного стека IP надёжный транспортный уровень требует индикации успешного завершения транспортной обработки, такой как сообщения TCP ACK [RFC9293]. Протокол прикладного уровня может требовать зависящий от приложения подтверждений, содержащих код состояния, указывающий статус обработки запроса (см. [RFC3724]).

Влияние

  • Право на свободу выражения
  • Право на безопасность (защиту)

4.4. Распознавание содержимого

Вопросы

Включает ли протокол явные или неявные открытые (plaintext) элементы, которые можно использовать для дифференцированной трактовки? Имеется ли возможность минимизировать утечку таких данных сетевым посредникам? При отсутствии такой возможности имеется ли при внедрении протокола возможность сделать дифференцированную обработку (включая приоритизацию определённого трафика), если таковая имеется, проверяемой на предмет негативного влияния не сетевой нейтралитет?

Пример

Когда сетевые посредники могут определить тип содержимого передаваемых пакетов, они могут воспользоваться этими сведениями для дискриминации одного типа содержимого в пользу другого. Это влияет на возможности пользователей передавать и принимать желаемое содержимое.
Как рекомендовано в [RFC8558], разработчикам протоколов следует избегать конструкций в неявной индикацией содержимого. В общем случае разработчикам следует избегать явных индикаторов содержимого для посредников. Иногда может возникать необходимость в добавлении таких явных индикаторов, но применять их следует лишь в случае уверенности разработчиков в их явной пользе для конечных пользователей (приоритеты пользователей более подробно рассмотрены в [RFC8890]). В таких случаях следует документировать влияние таких сигналов на права человека.
Отметим, что многие протоколы предоставляют предназначенные для конечных точек сигналы, которые посредники могут использовать как неявные индикаторы для разделения трафика по содержимому (например, номер порта TCP) или отправителям/получателям (адреса IP). По возможности следует использовать шифрование для защиты от посредников. Во многих случаях трудно скрыть сигналы (например, адреса IP), но в таких случаях, как TLS Application Layer Protocol Negotiation [RFC7301], предпринимаются усилия по защите данных [TLS-ESNI].

Влияние

  • Право на свободу выражения
  • Право на недискриминацию
  • Право на равную защиту

4.5. Поддержка разных языков

Вопросы

Поддерживает ли протокол или спецификация задание в содержимом или заголовках строковых элементов, которые должны быть поняты или введены человеком? Поддерживает ли спецификация кодировку Unicode? Если эта кодировка поддерживается, принимается ли только UTF-8 или также другие кодировки (может быть опасно в плане совместимости)? Если разрешены кодировки, отличные от UTF-8, требует ли спецификация корректного указания набора символов? Знакомы ли вы с [RFC6365]?

Пояснения

Поддержка разных языков (internationalization) позволяет создавать протоколы, стандарты и реализации, пригодные для использования с различными языками и шрифтами (см. параграф 4.6). В IETF это означает добавление или улучшение обработки в протоколе текстов, отличных от ASCII [RFC6365]. Другая точка зрения, более подходящая для протоколов, изначально предназначенных для глобального применения, используется в определении World Wide Web Consortium (W3C) [W3Ci18nDef]:
Интернационализация — это проектирование и разработка продукции, приложений и документов, позволяющая легко приспособить (localization) их для целевой аудитории, религии или языка.
Многие протоколы, работающие с текстом, используют лишь одну кодировку (US-ASCII) или оставляют выбор применяемой кодировки и набора символов пользователю (что, безусловно, ведёт к проблемам совместимости). Если поддерживается несколько кодировок, требуется явное указание применяемой [RFC2277]. Добавление в протокол отличного от ASCII текста позволяет обрабатывать большее число текстов, которые, как можно надеяться, представляют пользователей по всему миру. Сегодня это лучше всего обеспечивать за счёт поддержки кодировки Unicode UTF-8.
В современной практике IETF [RFC2277] поддержка разных языков нацелена на обращённые к пользователю строки, а не на элементы протокола, такие как используются в некоторых текстовых протоколах (следует отметить, что некоторые строки, например, идентификаторы, являются одновременно содержимым и элементами протокола). Хотя это разумно для элементов, не видимых пользователю, разработчикам следует обеспечивать полную и равную поддержку всех текстов и кодировок в ориентированных на пользователя функциях протокола, а также любом содержимом, которое передаётся.

Пример

См. параграф 4.6.

Влияние

  • Право на свободу выражения
  • Право на участие в политической жизни
  • Право на участие в культурной жизни, искусстве и науке

4.6. Локализация

Вопросы

Поддерживает ли протокол стандарты интернационализации? Сделаны ли какие-либо шаги в направлении локализации протокола для соответствующей аудитории?

Пояснения

«Локализация — это адаптация продукции, приложения или содержимого документов в соответствии с требованиями языка, культуры и т. д. конкретного целевого рынка (locale)» [W3Ci18nDef]. Для целей документа локализацию можно описать как перевод реализации для обеспечения функциональности на конкретном языке или для пользователей с определёнными локальными настройками (см. параграф 4.5). Интернационализация связана с локализацией, но не совпадает с ней. Поддержка разных языков является необходимым условием локализации.

Пример

Internet является глобальной средой, но многие протоколы и продукция разработаны с учётом интересов некой аудитории, которая часто обладает определёнными свойствами, например, умеет читать и писать в кодировке стандартного американского кода обмена информацией (American Standard Code for Information Interchange или ASCII) и знает английский язык. Это ограничивает возможности значительной части мирового сетевого сообщества использовать Internet так, чтобы сеть была доступна с точки зрения языка и культуры. Пример стандарта, учитывающего мнение о том, что люди хотят иметь доступ к данным, на предпочтительном для них языке, содержится в [RFC5646], где описан способ маркировки информации с помощью языковых тегов. Это позволяет представлять информацию и получать доступ к ней на нескольких языках.

Влияние

  • Право на недискриминацию
  • Право на участие в культурной жизни, искусстве и науке
  • Право на свободу выражения

4.7. Открытые стандарты

Вопросы

Документирован ли протокол полностью так, чтобы его можно было легко реализовать, улучшить, развить или продолжить его разработку? Требуется ли фирменный (proprietary) код для реализации, работы или дальнейшего развития протокола? Отдаёт ли протокол предпочтение своей спецификации перед технически эквивалентами конкурирующих спецификаций, например, делая встроенную спецификацию производителя требуемой или рекомендуемой [RFC2026]? Имеются ли ссылки на другие стандарты, которые требуют оплаты (можно ли обойтись без неё)? Известны ли какие-либо патенты, препятствующие полной реализации стандарта [RFC8179] [RFC6701]?

Пояснения

Сеть Internet смогла стать глобальной сетью сетей благодаря наличию открытых, не патентованных (non-proprietary) стандартов [Zittrain], которые имеют решающее значение для функциональной совместимости. Однако открытые стандарты не определены явно в рамках IETF. По этому поводу в [RFC2026] сказано:

Различные национальные и международные организации (такие, как ANSI, ISO, IEEE, ITU-T) разрабатывают многочисленные спецификации протоколов и услуг, подобные определенным здесь [в IETF] техническим спецификациям (Technical Specifications). Национальные и международные группы также публикуют «соглашения разработчиков», аналогичные определенным здесь заявлениям о применимости (Applicability Statement) и содержащие детали зависящих от реализации практических применений своих стандартов. В рамках процесса стандартизации Internet все эти документы рассматриваются, как открытые внешние стандарты (open external standards).

В [RFC3935] также нет определения открытых стандартов, но подчёркнута важность «открытого процесса»:
… любое заинтересованное лицо может участвовать в работе, знать, что решается, и высказывать [своё] мнение по данному вопросу.

Открытые стандарты (и программы с открытым кодом) позволяют пользователям собирать сведения о работе применяемых инструментов, включая их свойства в части безопасности и приватности. Они также позволяют совершенствования без получения разрешений, что важно для поддержки свободы и возможности свободно создавать и внедрять новые протоколы в имеющихся коммуникационных конструкциях. Это основа Internet с современном состоянии и для сохранения открытости требуется помнить о необходимости разработки открытых стандартов.

Все стандарты, требующие реализации, следует делать доступными свободно и обеспечивать им разумную защиту от патентных претензий, чтобы эти стандарты можно было реализовать в программах с открытым кодом или бесплатных программах. Патенты зачастую сдерживают открытую стандартизацию или используются против тех, кто внедряет открытые стандарты, особенно в сфере криптографии [Newegg]. Иногда делаются исключения, если стандартизованный протокол нормативно полагается на спецификации, разработанные другими органами стандартизации (Standards Development Organization или SDO), к которым нет свободного доступа. Патентам в открытых стандартах и нормативных ссылках на другие стандарты следует содержать раскрытие [Note-well], бесплатное лицензирование [Patent-policy] или иной вариант разумных, справедливых и недискриминационных условий.

Пример

В [RFC6108] описана система предоставления критических уведомлений конечным пользователям web-браузеров, которая была внедрена провайдером (Internet Service Provider или ISP) Comcast. Такая система уведомлений служит для практически мгновенного информирования клиентов, например, о том, что их трафик имеет поведение, характерное для наличия вредоносного кода или заражения вирусом. Имеются и другие фирменные системы, поддерживающие такие уведомления, но в них применяется технология глубокой проверки пакетов (Deep Packet Inspection или DPI). В упомянутом документе описана система, не использующая DPI и основанная на открытых стандартах IETF и приложениях с открытым исходным кодом.

Влияние

  • Право на свободу выражения
  • Право на участие в культурной жизни, искусстве и науке

4.8. Поддержка неоднородности

Вопросы

Поддерживает ли протокол неоднородность (гетерогенность) по своему устройству? Позволяет ли протокол использовать несколько типов оборудования? Разрешает ли протокол использовать несколько типов прикладных протоколов? Насколько строг протокол в отношении того, что он принимает и обрабатывает? Останется ли протокол пригодным для использования и открытым при смене контекста?

Пояснения

Сеть Internet является неоднородной на многих уровнях — устройства, узлы, алгоритмы планирования в маршрутизаторах, механизмы управления очередями, протоколы маршрутизации, уровни мультиплексирования, версии и реализации протоколов, базовые канальные уровни (например, «точка-точка», каналы с множественным доступом, FDDI и т. п.) в картине трафика и уровнях перегрузки в разное время в разных местах. Кроме того, Internet состоит из автономных организаций и ISP со своими интересами, поэтому имеется значительная неоднородность административных доменов и структур ценообразования. В результате при проектировании требуется поддерживать [FIArch] принципы неоднородности, предложенные в [RFC1958]. Таким образом, поддержка неоднородности протоколом может позволить широкому кругу устройств и (как следствие) пользователей участвовать в работе сети.

Пример

Поддержка неоднородности оказала существенное влияние на успех архитектуры Internet [Zittrain]. Есть знаменитая цитата, часто приписываемая Нильсу Бору: «Предсказывать очень трудно, особенно, когда речь идёт о будущем.» Это справедливо и для будущего архитектуры и инфраструктуры Internet. Поэтому, как правило, важно, насколько это возможно, разрабатывать протоколы для разных устройств и приложений, особенно на нижних уровнях стека. Если же это не делается, следует описать причины такого решения в соответствующем документе.

Влияние

  • Право на свободу выражения
  • Право на участие в политической жизни

4.9. Адаптивность

Вопросы

Является ли протокол модульным, возможно ли расширение протокола? Влияет ли в этом смысле протокол на инновации без получения разрешения? (см. параграф 4.7)

Пояснения

Адаптивность тесно связана с инновациями без получения разрешений — то и другое поддерживают возможность и свободу создания и внедрения новых протоколов на основе имеющихся коммуникационных конструкций. Это является основой Internet и для сохранения фундаментальной открытости требуется учитывать влияние протоколов на поддержание или сокращение инноваций без получений разрешений на них, чтобы обеспечить дальнейшее развитие Internet.
Адаптивность и инновации без разрешений можно применять для формирования информационных сетей в соответствии с предпочтениями групп пользователей. Более того, предварительным условием для адаптивности является способность людей приспособить (адаптировать) сеть, знать и понимать её. Именно поэтому адаптивность и инновации без согласования неразрывно связаны с правами на образование и науку, а также правом на свободу собраний и ассоциаций, поскольку они позволяют пользователям сети самим решать, как им собираться, сотрудничать и выражать своё мнение.

Пример

WebRTC генерирует голосовые и/или визуальные (видео) данные и может использоваться в разных местах различными сторонами. Разработаны стандартные интерфейсы прикладных программ (Application Programming Interface или API) для поддержки приложение от различных поставщиков голосовых услуг. Разные участники (стороны) получают близкие возможности. Чтобы все стороны могли опираться на имеющиеся стандарты, эти стандарты должны быть адаптивными и должны позволять инновации без специального разрешения.

Влияние

  • Право на обучение
  • Право на науку
  • Право на свободу выражения
  • Право на свободу собраний и ассоциаций

4.10. Целостность

Вопросы

Обеспечивает ли протокол поддержку, гарантию и/или проверку целостности данных в содержимом? Обеспечивает ли протокол поддержку и гарантии согласованности данных? Позволяет ли протокол (преднамеренно или нечаянно) изменить данные?

Пояснения

Целостностью называют поддержку и гарантии точности и согласованности данных, чтобы их невозможно было изменить (преднамеренно или нечаянно).

Пример

Проверка целостности важна для предотвращения уязвимостей и атак от злоумышленников на пути данных. Такие атаки происходят, когда посторонние лица (часто по злонамеренным причинам) перехватывают коммуникации между двумя сторонами, внедряясь в процесс и меняя содержимое данных. На практике это выглядит так:
Алиса хочет взаимодействовать с Бобом и передаёт ему сообщение, которое Корин перехватывает и изменяет. Боб не может знать о перехвате и изменении сообщения Корин. Сообщения между Алисой и Бобом могут перехватываться и изменяться Корин, обеспечивая контроль содержимого при обмене информацией.

Влияние

  • Право на свободу выражения
  • Право на безопасность (защиту)

4.11. Подлинность

Вопросы

Достаточны ли меры подтверждения подлинности отдельной атрибутов части данных или сущности (объекта)? Могут ли атрибуты быть искажены в пути (см. параграф 4.13)? Применяется ли стандарт защиты IPsec, DNS Security (DNSSEC), HTTPS и т. п., если это уместно?

Пояснения

Аутентичность говорит о получении данных из того источника, который заявлен. Это важно для предотвращения некоторых атак и несанкционированного доступа к данным и использования их. Проверку подлинности не следует применять для препятствования поддержке гетерогенности, как это зачастую делается для блокировки отдельных производителей или управления цифровыми правами.

Пример

Аутентификация данных важна для предотвращения уязвимостей и атак в пути доставки. Такие атаки происходят, когда посторонние перехватывают (зачастую с враждебными целями) коммуникации между двумя сторонами, внедряясь в них и выдавая себя за обе стороны. На практике это выглядит так:
Алиса хочет взаимодействовать с Бобом и передаёт ему сообщение, которое Корин перехватывает (и может изменять). Боб не может знать, что данные поступили от Корин, а не от Алисы.
При надлежащей аутентификации сценарий может выглядеть, как показано ниже.
Алиса хочет взаимодействовать с Бобом и передаёт ему сообщение. Корин перехватывает данные, направленные Бобу. Корин читает и изменяет направленное Бобу сообщение. Боб не может проверить, поступили ли данные от Алисы.

Влияние

  • Право на приватность
  • Право на свободу выражения
  • Право на безопасность (защиту)

4.12. Конфиденциальность

Вопросы

Раскрывает ли протокол передаваемые в линию данные? Раскрываются ли сведения, связанные с идентификаторами или данными? Если да, то что раскрывается каждому элементу протокола (получателям, посредникам, организаторам) [RFC6973]? Какие возможности предоставляются разработчикам для ограничения сведений, раскрываемых каждому элементу? Какие средства оперативного контроля доступны для ограничения сведений, передаваемых каждому объекту?
Какие механизмы контроля или согласования определяет или требует протокол до передачи или раскрытия персональных данных или идентификаторов? При отсутствии таких механизмов и элементов управления предполагаются ли внешние механизмы контроля или согласования?
Предусмотрены ли в протоколе возможности передачи инициатором разных частей информации разным получателям? Если нет, существуют ли внешние механизмы для такой дифференциации?
Предусматривает ли протокол средства для ограничения обмена информацией или выражения индивидуальных предпочтений в части сбора, использования или раскрытия персональных данных? Если нет, имеются ли внешние механизмы, предоставляющие пользователям такой контроль? Предполагается ли, что пользователи поддерживают отношения (соглашения или иные способы), регулирующие использование информации сторонами, которые управляют посредниками? Предпочитает ли протокол использовать шифрование, а не открытые данные?

Пояснения

Конфиденциальность означает сохранение данных в тайне от непредусмотренных лиц [RFC3552]. Рост Internet зависит от уверенности пользователей в защите сетью их персональных данных [RFC1984]. Возможность повсеместного мониторинга и наблюдения подрывает доверие пользователей и может быть снижена за счет гарантий конфиденциальности, т. е. пассивные атакующие не смогут получить информации (или получат очень мало сведений) из своих наблюдений и выводов об активности протоколов [RFC7258] [RFC7624].

Пример

Протоколы, не шифрующие содержимое, делают сообщения доступными для идеализированного злоумышленника на пути. В соответствии с [RFC3365] большинство таких протоколов имеет защищённый вариант с шифрованием содержимого для обеспечения конфиденциальности и такие варианты применяются все шире. Примечательным исключением является протокол DNS [RFC1035], поскольку DNSSEC [RFC4033] не включает требований конфиденциальности. Это означает, что без применения более современных стандартов, таких как DNS через TLS [RFC7858] или HTTPS [RFC8484], все запросы и отклики DNS, создаваемые при работе любого протокола, будут доступны злоумышленникам. При использовании протоколов пересылки с промежуточным хранением (store-and-forward, например, SMTP [RFC5321]) посредники оставляют сохранённые данные доступными для взломавших посредника злоумышленников, если только не применяется сквозное шифрование данных в протоколах прикладного уровня или реализация не помещает данные в шифрованное хранилище [RFC7624].

Влияние

  • Право на приватность
  • Право на безопасность (защиту)

4.13. Безопасность

Вопросы

Знакомы ли вы с «Руководством по написанию текста RFC по вопросам безопасности» [RFC3552]? Обнаружены ли какие-либо атаки, в той или иной степени связанные с протоколом (спецификацией), но считающиеся выходящими за рамки этого документа? Относятся ли эти атаки к свойствам Internet, связанным с правами человека (как описано в этом документе)?

Пояснения

Безопасность не является монолитным свойством протокола или системы, а скорее состоит из ряда связанных, но в определённой степени независимых свойств. Не все эти свойства нужны каждому приложению. Поскольку взаимодействия происходят между системами, а доступ к этим системам осуществляется по каналам связи, цели безопасности очевидно будут взаимосвязанными, но могут быть достигнуты независимыми путями [RFC3552].
Обычно любой протокол, применяемый в Internet, может стать целью пассивных (злоумышленник имеет доступ в сеть и способен просматривать пакеты) и активных (злоумышленник способен осуществлять запись в пакеты) атак [RFC3552].

Пример

См. [RFC3552].

Влияние

  • Право на свободу выражения
  • Право на свободу собраний и ассоциаций
  • Право на недискриминацию
  • Право на безопасность (защиту)

4.14. Приватность

Вопросы

Ознакомились ли вы с рекомендациями раздела 7 «Вопросы приватности для протоколов Internet» [RFC6973]? Поддерживает ли протокол конфиденциальность метаданных? Может ли протокол противостоять анализу трафика? Придерживается ли протокол принципам минимизации данных? Указаны ли в документе потенциально чувствительные данные, записываемые (log) протоколов и как долго их нужно хранить по техническим причинам?

Пояснения

Приватность относится к праву субъекта (обычно человека), действующего от своего имени, определять степень взаимодействия с окружением, включая уровень готовности делиться своей персональной информацией с другими [RFC4949]. Если протокол не обеспечивает достаточной защиты приватности, он может негативно влиять на свободу выражения, поскольку пользователи будут применять самоцензуру, опасаясь слежки, или сочтут невозможным свободное выражение своего мнения.

Пример

См. [RFC6973].

Влияние

  • Право на свободу выражения
  • Право на приватность
  • Право на недискриминацию

4.15. Анонимность и псевдонимы

Вопросы

Использует ли протокол идентификаторы? Являются ли идентификаторы постоянными? Применяются ли идентификаторы в разном контексте? Может ли пользователь сбросить или поменять идентификатор без негативного влияния на работу протокола? Видны ли идентификаторы за пределами конечных точек протокола? Связаны ли они с идентификаторами из реального мира? Рассматривался ли документ «Вопросы приватности для протоколов Internet» [RFC6973], особенно параграф 6.1.2?

Пояснения

Большинство протоколов зависит от использования тех или иных идентификаторов для сопоставления действий в пространстве и времени, например:
  • адреса IP служат для идентификации отправителей и получателей дейтаграмм IP;
  • идентификаторы соединений QUIC служат для распознавания пакетов, относящихся к соединению;
  • в HTTP применяются cookie для сопоставления запросов HTTP с клиентом;
  • в электронной почте применяются адреса вида example@example.com для указания отправителей и получателей.

В общем случае такие идентификаторы выполняют функции, требуемые для работы протокола, однако они могут вносить риск для приватности. Этот риск проявляется в основном двумя способами.

  • Идентификатор может сам раскрывать личность пользователя, как в случае применения (телефонных) номеров E.164 в системах мгновенного обмена сообщениями.

  • Идентификатор может не раскрывать пользователя, но позволять собрать достаточно подробные сведения о его поведении, чтобы поставить под угрозу его приватность, как в случае с HTTP cookie.

Поскольку идентификаторы нужны для работы протоколов, полной анонимности достигнуть сложно, но имеются методы, способствующие сохранению приватности пользователей даже при наличии идентификаторов.

Влияние

  • Право на недискриминацию
  • Право на свободу выражения
  • Право на участие в политической жизни
  • Право на свободу собраний и ассоциаций

4.15.1. Псевдонимы

В общем случае для повышения уровня приватности в качестве идентификаторов применяются псевдонимы, не связанные с отождествлением пользователей в реальном мире.

Пример

При разработке протокола IPv6 рассматривался вопрос встраивания адреса канального уровня (Media Access Control или MAC) в уникальный адрес IP. Это позволило бы прослушивающим трафик и другим сборщикам сведений сопоставлять адреса из разных транзакций с конкретными узлами. По этой причине были предприняты усилия по стандартизации, такие как «Temporary Address Extensions for Stateless Address Autoconfiguration in IPv6» [RFC8981] и рандомизация адресов MAC [MAC-ADDRESS-RANDOMIZATION].
Отметим, что зачастую представляется привлекательным создание псевдонимов из постоянных идентификаторов. Очень сложно сделать это так, чтобы невозможно было раскрыть такой постоянный идентификатор.

Пример

Распространённой практикой web-отслеживания является «шифрование» адресов электронной почты путём их хэширования, что якобы делает адреса не связанными с персональным идентификатором. Однако функции хэширования являются общедоступными и можно провести поиск по словарю возможных адресов и найти исходный адрес электронной почты [Email-hashing].

4.15.2. Невозможность привязки

Даже тщательно подобранные идентификаторы-псевдонимы могут представлять риск для приватности, если они применяются достаточно широко. Приватность пользователей обеспечивается лучше, если область действия идентификаторов ограничена как в пространстве, так и во времени.

Пример

Примером является протокол динамической настройки хостов (Dynamic Host Configuration Protocol или DHCP), где передача постоянного идентификатора в качестве имени клиента не была обязательной и на практике многие реализации делали это ещё до появления DHCP [RFC7844].

Пример

Сторонние cookie кв HTTP позволяют отслеживающим сопоставлять трафик HTTP с разными сайтами. Это является основой целой системы web-отслеживания. Браузеры web все чаще ограничивают использование сторонних cookie для защиты приватности пользователей.

4.16. Стойкость к цензуре

Вопросы

Способствует ли цензуре архитектура протокола? Включает ли она специальные точки (choke point), которые легко применить для цензуры? Раскрываются ли идентификаторы, которые можно использовать для селективной блокировки некоторых видов трафика? Можно ли сделать протокол более стойким к цензуре? Раскрывает ли протокол ограничения доступа к ресурсам и причины таких ограничений?

Пояснения

Правительства и поставщики услуг блокирует или фильтруют содержимое или трафик, зачастую в тайне от конечных пользователей [RFC7754]. Обзор применяемых методов цензуры приведён в [RFC9505], где описаны свойства протоколов, используемые для цензуры доступа к информации. Стойкость к цензуре относится к методам и мерам предотвращения цензуры в Internet.

Пример

В современной структуре Web имеется ряд архитектурных точек, допускающих вмешательство цензоров. Это включает получение контроля над доменным именем, блокировку DNS на уровне протокола или распознавателей, блокировку адресов IP и блокировку web-серверов. Ведётся активная работа по системам распространения содержимого, которые предполагаются более стойкими к цензуре, и некоторые из таких систем (например, BitTorrent) получили широкое распространение. Однако эти системы могут обладать меньшей надёжностью и производительностью по сравнению с Web (например, не поддерживают активное содержимое на серверах).

Пример

Идентификаторы содержимого, раскрываемые в протоколе, могут применяться для облегчения цензуры, позволяя цензорам определять, какой трафик блокировать. Запросы DNS, заголовки host в запросах HTTP и индикация имён серверов (Server Name Indication или SNI) в ClientHello протокола TLS являются примерами протокольных элементов, которые передаются в открытом виде и применяются цензорами для идентификации содержимого, к которому пользователь пытается получить доступ [RFC9505]. Механизмы вроде Encrypted ClientHello [TLS-ESNI] и DNS через HTTPS [RFC8484], которые шифруют метаданные, обеспечивают некоторую стойкость к этому типу инспекции протоколов. Для доступа к подвергаемым цензуре ресурсам могут также применяться системы с полным шифрованием трафика, такие как Tor <https://torproject.org>.

Пример

Как отмечено выше, одним из способов цензуры web-трафика является требование к серверам блокировать трафик или требование к ISP блокировать запросы к серверам. В HTTP отказ или ограничение доступа могут быть замечены в результате возврата кода состояния 451, который позволяет операторам серверов и посредникам более прозрачно выполнять операции в условиях, когда на их работу оказывают влияние законы или политика государств [RFC7725]. Если протокол потенциально допускает цензуру, разработчикам следует стремиться к заданию кодов ошибок, отражающих различные варианты (например, блокировку по административным правилам, недоступность в соответствии с законом и т. п.) для минимизации двусмысленности на стороне пользователей.

Влияние

  • Право на свободу выражения
  • Право на участие в политической жизни
  • Право на участие в культурной жизни, искусстве и науке
  • Право на свободу собраний и ассоциаций

4.17. Понимание результатов

Вопросы

Документированы ли предполагаемые влияния протокола и понятны ли они? Описаны ли основные варианты применения протокола с чётким указанием ожидаемого поведения и возможного влияния на другие протоколы, реализации, ожидания и поведение пользователей? Рассмотрены ли другие протоколы, решающие сходные задачи или использующие похожие механизмы, чтобы понять, можно ли извлечь уроки из их применения?

Пояснения

Некоторые технические решения могут приводить к непредвиденным последствиям.

Пример

Отсутствие проверки подлинности может приводить к нарушению целостности и негативным последствиям, например, к возможности спама. Отсутствие данных, которые можно использовать для учёта и выставления счетов, могут приводить к «бесплатным» соглашениям, когда скрываются фактические расходы и их распределение. Примерами являются бартерные соглашения на межоператорских соединениях Internet и коммерческое использование персональных данных для целевой рекламы, которое является наиболее распространённой моделью для так называемых «бесплатных» услуг поисковых машин и социальных сетей. Неожиданные результаты могут оказаться не техническими, а архитектурными, социальными или экономическими, поэтому важно документировать ожидаемые результаты и другие возможные последствия.

Влияние

  • Право на свободу выражения
  • Право на приватность
  • Право на свободу собраний и ассоциаций
  • Право на доступ к информации

4.18. Доступность

Вопросы

Предназначен ли протокол для обеспечения благоприятной среды для всех? Обращались ли разработчики к W3C Web Accessibility Initiative за примерами и рекомендациями [W3CAccessibility]?

Пояснения

Иногда при разработке протоколов, web-сайтов, web-технологий и инструментов создаются барьеры, препятствующие людям в использовании Web. Internet следует организовывать так, чтобы все люди, независимо от их оборудования, программ, языка, культуры, физических и умственных возможностей, могли пользоваться сетью. При соответствии технологий Internet этим целям сеть станет доступной для людей с разными возможностями слуха, зрения, подвижности, а также разными познавательными (когнитивными) возможностями [W3CAccessibility].

Пример

Протокол HTML, определённый в [HTML], требует, чтобы каждое изображение (с некоторыми исключениями) имело атрибут alt, чтобы изображения были доступны для людей, не способных самостоятельно разобраться с нетекстовым содержимым web-страниц.
Другим примером может служить работа групп AVT и AVTCORE в IETF по прочтению текста в multimedia, текстовой телефонии, беспроводным системам multimedia, и видеосвязи для языка жестов и чтения по губам (см. [RFC9071]).

Влияние

  • Право на недискриминацию
  • Право на свободу собраний и ассоциаций
  • Право на обучение
  • Право на участие в политической жизни

4.19. Децентрализация

Вопросы

Можно ли реализовать протокол без единой точки контроля? Можно ли, если это применимо, развернуть протокол федеративным образом? Создаёт ли протокол дополнительные централизованные точки контроля?

Пояснения

Децентрализация является одной из основных технических концепций Internet и принята в таком качестве IETF [RFC3935]. Это означает отсутствие или минимизацию централизованных точек управления, что, как предполагается, упростит присоединение новых пользователей и использование новых возможностей [Ziewitz]. Децентрализация также смягчает проблемы, связанные с критическими точками отказа и обеспечивает функционирование сети даже при отключении одного или нескольких узлов. С коммерциализацией Internet в начале 1990-х годов начался медленный отход от децентрализации в ущерб техническим преимуществам децентрализованной сети Internet. Более подробно этот вопрос рассматривается в [Arkko].

Пример

Данные (биты), передаваемые через Internet, становятся все более чувствительными к отслеживанию и цензуре со стороны правительств и ISP, а также третьих лиц (злоумышленников). Возможности мониторинга и цензуры становятся более доступными с ростом централизации в сети, создающей централизованные точки для подключения. Создание одноранговых сетей и разработка протоколов передачи голоса по IP (voice-over-IP) с использованием одноранговой технологии в сочетании с распределенными хэш-таблицами (Distributed Hash Table или DHT) для масштабируемости является примером сохранения децентрализации [Pouwelse].

Влияние

  • Право на свободу выражения
  • Право на свободу собраний и ассоциаций

4.20. Правовая защита

Вопросы

Может ли протокол способствовать реализации прав стороны, подвергшейся негативному воздействию, средствами правовой защиты без непропорционального ущемления прав других сторон (особенно в части их прав на приватность)?

Пояснения

Предоставление государствам и корпорациям доступа к средствам защиты является частью Руководящих принципов ООН для предпринимательской деятельности в аспекте прав человека (UN Guiding Principles on Business and Human Rights) [UNGP]. Доступ к средствам правовой защиты может способствовать жертвам нарушений прав человека в достижении справедливости или позволить правоохранительным органам установить личность возможного нарушителя. Однако имеющиеся в протоколах механизмы, пытающиеся разрешить «атрибутирование» отдельных лиц, препятствуют осуществлению права на приватность. Бывший специальный докладчик ООН по вопросам свободы выражения мнений (UN Special Rapporteur for Freedom of Expression) утверждал, что анонимность является неотъемлемой частью свободы выражения мнений [Kaye]. С учётом возможного влияния атрибутирования на право на приватность и свободу выражения мнений возможность атрибутирования на уровне отдельных лиц скорей всего не будет соответствовать правам человека.

Пример

Добавление идентифицирующих лицо сведений в потоки данных для реализации прав человека на правовую защиту может способствовать выявлению нарушителей прав человека и обеспечить доступ к средствам правовой защиты, но может оказывать непропорциональное влияние на право на приватность, анонимность выражения и участие в ассоциациях других пользователей. Кроме того, в последнее время были достигнуты успехи в части выявления злоупотреблений в системах обмена со сквозным шифрованием, с которыми также связан определённый риск нарушения приватности пользователей [Messenger-franking] [Hecate].

Влияние

  • Право на правовую защиту (возмещение)
  • Право на безопасность (защиту)
  • Право на приватность

4.21. Прочие вопросы

Вопросы

Рассмотрены ли возможные негативные последствия внедрения протокола или документа на отдельных лиц и общество?

Пояснения

Публикация RFC с определенным статусом имеет последствия. Публикация в качестве Internet Standard как часть Standards Track может говорить об определённой зрелости спецификации, опыте её внедрения и согласия на применение. Публикация в качестве экспериментального документа в рамках Standards Track будет указывать сообществу, что документ «может быть не рассчитан на применение как Internet Standard или предназначен для будущей стандартизации, но ещё не готов» для широкого внедрения [RFC2026]. Область внедрения и, следовательно, суммарное влияние на конечных пользователей могут зависеть от статуса документа, указанного в RFC. Более полное описание приведено в [RFC2026] и дополнениях к этому документу.

5. Статус документа

В этом документе исследовательской группы представлен опыт и рекомендации в части экспертизы влияния на права человека сетевых протоколов, архитектур и других документов Internet-Draft и RFC.

6. Вопросы безопасности

Третья статья Всеобщей декларации прав человека гласит: «Каждый человек имеет право на жизнь, свободу и личную неприкосновенность» [UDHR]. В этой статье подчёркнута важность безопасности и её связь с жизнью и свободой человека, а, поскольку права человека неделимы, взаимосвязаны и взаимозависимы, безопасность человека тесно связана с другими правами и свободами. Данный документ нацелен на укрепление прав человека, его свободы и безопасности путём сопоставления и трансляции этих концепций в концепции и практику при разработке протоколов и архитектуры Internet. Целью является соблюдение прав человека и соответствующее повышение устойчивости, эффективности и удобства использования сети. Документ стремиться достигнуть поставленных целей путём предоставления руководящих принципов в разделе 3.

7. Взаимодействие с IANA

Этот документ не предполагает действий IANA.

8. Сведения об исследовательской группе

Дискуссионная конференция исследовательской группы IRTF Human Rights Protocol Considerations доступна по адресу <mailto:hrpc@ietf.org>. Сведения о группе и способах подписки на рассылки доступны по ссылке <https://www.irtf.org/mailman/listinfo/hrpc>, архивы почтовой конференции — по ссылке <https://mailarchive.ietf.org/arch/browse/hrpc/>.

9. Литература

[Arkko] Arkko, J., Trammell, B., Nottingham, M., Huitema, C., Thomson, M., Tantsura, J., and N. ten Oever, «Considerations on Internet Consolidation and the Internet Architecture», Work in Progress, Internet-Draft, draft-arkko-iab-internet-consolidation-02, 8 July 2019, <https://datatracker.ietf.org/doc/html/draft-arkko-iab-internet-consolidation-02>.

[Email-hashing] Acar, G., Englehardt, S., and A. Narayanan, «Four cents to deanonymize: Companies reverse hashed email addresses», April 2018, <https://freedom-to-tinker.com/2018/04/09/four-cents-to-deanonymize-companies-reverse-hashed-email-addresses/>.

[FIArch] Papadimitriou, D., Zahariadis, T., Martinez-Julia, P., Papafili, I., Morreale, V., Torelli, F., Sales, B., and P. Demeester, «Design Principles for the Future Internet Architecture», The Future Internet, pp. 55-67, DOI 10.1007/978-3-642-30241-1_6, January 2012, <https://link.springer.com/chapter/10.1007/978-3-642-30241-1_6>.

[FREAK] University of Michigan, «Tracking the FREAK Attack», Wayback Machine archive, March 2015, <https://web.archive.org/web/20150304002021/https://freakattack.com/>.

[Hecate] Issa, R., Alhaddad, N., and M. Varia, «Hecate, Abuse Reporting in Secure Messengers with Sealed Sender», 31st USENIX Security Symposium (USENIX Security 22), pp 2335-2352, August 2022, <https://www.usenix.org/conference/usenixsecurity22/presentation/issa>.

[Hill] Hill, R., «Partial Catalog of Human Rights Related to ICT Activities», May 2014, <http://www.apig.ch/UNIGE%20Catalog.pdf>.

[HR-RT] «IRTF-HRPC / reviews», commit 3f5fbff, December 2020, <https://github.com/IRTF-HRPC/reviews>.

[HTML] WHATWG, «HTML Living Standard», August 2024, <https://html.spec.whatwg.org/multipage/>.

[HTTPS-interception] Durumeric, Z., Ma, Z., Springall, D., Barnes, R., Sullivan, N., Bursztein, E., Bailey, M., Halderman, J., and V. Paxson, «The Security Impact of HTTPS Interception», NDSS Symposium 2017, DOI 10.14722/ndss.2017.23456, February 2017, <https://doi.org/10.14722/ndss.2017.23456>.

[ICCPR] United Nations General Assembly, «International Covenant on Civil and Political Rights», December 1966, <https://www.ohchr.org/en/instruments-mechanisms/instruments/international-covenant-civil-and-political-rights>.

[ICESCR] United Nations General Assembly, «International Covenant on Economic, Social and Cultural Rights», December 1966, <https://www.ohchr.org/en/instruments-mechanisms/instruments/international-covenant-economic-social-and-cultural-rights>.

[IRP] Internet Rights and Principles Dynamic Coalition, «10 Internet Rights & Principles», <https://internetrightsandprinciples.org/campaign/>.

[Jorgensen] Jørgensen, R. F., «An internet bill of rights», Research Handbook on Governance of the Internet, edited by Ian Brown. Cheltenham: Edward Elgar Publishing, DOI 10.4337/9781849805025.00022, April 2013, <https://doi.org/10.4337/9781849805025.00022>.

[Kaye] Kaye, D., «Report of the Special Rapporteur on the Promotion and Protection of the Right to Freedom of Opinion and Expression, David Kaye», A/HRC/29/32, May 2015, <https://digitallibrary.un.org/record/798709?v=pdf>.

[Logjam] Adrian, D., Bhargavan, K., Durumeric, Z., Gaudry, P., Green, M., Halderman, J., Heninger, N., Springall, D., Thomé, E., Valenta, L., VanderSloot, B., Wustrow, E., Zanella-Béguelin, S., and P. Zimmerman, «Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice», CCS ’15: Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security, pp 5-17, DOI 10.1145/2810103.2813707, October 2015, <https://doi.org/10.1145/2810103.2813707>.

[MAC-ADDRESS-RANDOMIZATION] Zúñiga, J. C., Bernardos, C. J., Ed., and A. Andersdotter, «Randomized and Changing MAC Address State of Affairs», Work in Progress, Internet-Draft, draft-ietf-madinas-mac-address-randomization-15, 15 July 2024, <https://datatracker.ietf.org/doc/html/draft-ietf-madinas-mac-address-randomization-15>.

[Messenger-franking] Grubbs, P., Lu, J., and T. Ristenpart, «Message Franking via Committing Authenticated Encryption», Cryptology ePrint Archive, Paper 2017/664, July 2017, <https://eprint.iacr.org/2017/664>.

[Newegg] Mullin, J., «Newegg on trial: Mystery company TQP rewrites the history of encryption», Ars Technica, November 2013, <https://arstechnica.com/tech-policy/2013/11/newegg-on-trial-mystery-company-tqp-re-writes-the-history-of-encryption/>.

[Note-well] IETF, «Note Well», <https://www.ietf.org/about/note-well/>.

[Orwat] Orwat, C. and R. Bless, «Values and Networks: Steps Toward Exploring their Relationships», ACM SIGCOMM Computer Communication Review, vol. 46, no. 2, pp 25-31, DOI 10.1145/2935634.2935640, May 2016, <https://doi.org/10.1145/2935634.2935640>.

[Patent-policy] Weitzner, D., «W3C Patent Policy», W3C Recommendation, February 2004, <https://www.w3.org/Consortium/Patent-Policy-20040205/>.

[Penney] Penney, J., «Chilling Effects: Online Surveillance and Wikipedia Use», Berkeley Technology Law Journal, vol. 31, no. 1, pp 117-182, DOI 10.15779/Z38SS13, September 2016, <https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2769645>.

[Pouwelse] Pouwelse, J., Ed., «Media without censorship (CensorFree) scenarios», Work in Progress, Internet-Draft, draft-pouwelse-censorfree-scenarios-02, 22 October 2012, <https://datatracker.ietf.org/doc/html/draft-pouwelse-censorfree-scenarios-02>.

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, <https://www.rfc-editor.org/info/rfc1035>.

[RFC1958] Carpenter, B., Ed., «Architectural Principles of the Internet», RFC 1958, DOI 10.17487/RFC1958, June 1996, <https://www.rfc-editor.org/info/rfc1958>.

[RFC1984] IAB and IESG, «IAB and IESG Statement on Cryptographic Technology and the Internet», BCP 200, RFC 1984, DOI 10.17487/RFC1984, August 1996, <https://www.rfc-editor.org/info/rfc1984>.

[RFC2026] Bradner, S., «The Internet Standards Process — Revision 3», BCP 9, RFC 2026, DOI 10.17487/RFC2026, October 1996, <https://www.rfc-editor.org/info/rfc2026>.

[RFC2277] Alvestrand, H., «IETF Policy on Character Sets and Languages», BCP 18, RFC 2277, DOI 10.17487/RFC2277, January 1998, <https://www.rfc-editor.org/info/rfc2277>.

[RFC3365] Schiller, J., «Strong Security Requirements for Internet Engineering Task Force Standard Protocols», BCP 61, RFC 3365, DOI 10.17487/RFC3365, August 2002, <https://www.rfc-editor.org/info/rfc3365>.

[RFC3552] Rescorla, E. and B. Korver, «Guidelines for Writing RFC Text on Security Considerations», BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, <https://www.rfc-editor.org/info/rfc3552>.

[RFC3724] Kempf, J., Ed., Austein, R., Ed., and IAB, «The Rise of the Middle and the Future of End-to-End: Reflections on the Evolution of the Internet Architecture», RFC 3724, DOI 10.17487/RFC3724, March 2004, <https://www.rfc-editor.org/info/rfc3724>.

[RFC3935] Alvestrand, H., «A Mission Statement for the IETF», BCP 95, RFC 3935, DOI 10.17487/RFC3935, October 2004, <https://www.rfc-editor.org/info/rfc3935>.

[RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, «DNS Security Introduction and Requirements», RFC 4033, DOI 10.17487/RFC4033, March 2005, <https://www.rfc-editor.org/info/rfc4033>.

[RFC4101] Rescorla, E. and IAB, «Writing Protocol Models», RFC 4101, DOI 10.17487/RFC4101, June 2005, <https://www.rfc-editor.org/info/rfc4101>.

[RFC4949] Shirey, R., «Internet Security Glossary, Version 2», FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007, <https://www.rfc-editor.org/info/rfc4949>.

[RFC5321] Klensin, J., «Simple Mail Transfer Protocol», RFC 5321, DOI 10.17487/RFC5321, October 2008, <https://www.rfc-editor.org/info/rfc5321>.

[RFC5646] Phillips, A., Ed. and M. Davis, Ed., «Tags for Identifying Languages», BCP 47, RFC 5646, DOI 10.17487/RFC5646, September 2009, <https://www.rfc-editor.org/info/rfc5646>.

[RFC6108] Chung, C., Kasyanov, A., Livingood, J., Mody, N., and B. Van Lieu, «Comcast’s Web Notification System Design», RFC 6108, DOI 10.17487/RFC6108, February 2011, <https://www.rfc-editor.org/info/rfc6108>.

[RFC6365] Hoffman, P. and J. Klensin, «Terminology Used in Internationalization in the IETF», BCP 166, RFC 6365, DOI 10.17487/RFC6365, September 2011, <https://www.rfc-editor.org/info/rfc6365>.

[RFC6701] Farrel, A. and P. Resnick, «Sanctions Available for Application to Violators of IETF IPR Policy», RFC 6701, DOI 10.17487/RFC6701, August 2012, <https://www.rfc-editor.org/info/rfc6701>.

[RFC6973] Cooper, A., Tschofenig, H., Aboba, B., Peterson, J., Morris, J., Hansen, M., and R. Smith, «Privacy Considerations for Internet Protocols», RFC 6973, DOI 10.17487/RFC6973, July 2013, <https://www.rfc-editor.org/info/rfc6973>.

[RFC7258] Farrell, S. and H. Tschofenig, «Pervasive Monitoring Is an Attack», BCP 188, RFC 7258, DOI 10.17487/RFC7258, May 2014, <https://www.rfc-editor.org/info/rfc7258>.

[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, «Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension», RFC 7301, DOI 10.17487/RFC7301, July 2014, <https://www.rfc-editor.org/info/rfc7301>.

[RFC7624] Barnes, R., Schneier, B., Jennings, C., Hardie, T., Trammell, B., Huitema, C., and D. Borkmann, «Confidentiality in the Face of Pervasive Surveillance: A Threat Model and Problem Statement», RFC 7624, DOI 10.17487/RFC7624, August 2015, <https://www.rfc-editor.org/info/rfc7624>.

[RFC7725] Bray, T., «An HTTP Status Code to Report Legal Obstacles», RFC 7725, DOI 10.17487/RFC7725, February 2016, <https://www.rfc-editor.org/info/rfc7725>.

[RFC7754] Barnes, R., Cooper, A., Kolkman, O., Thaler, D., and E. Nordmark, «Technical Considerations for Internet Service Blocking and Filtering», RFC 7754, DOI 10.17487/RFC7754, March 2016, <https://www.rfc-editor.org/info/rfc7754>.

[RFC7844] Huitema, C., Mrugalski, T., and S. Krishnan, «Anonymity Profiles for DHCP Clients», RFC 7844, DOI 10.17487/RFC7844, May 2016, <https://www.rfc-editor.org/info/rfc7844>.

[RFC7858] Hu, Z., Zhu, L., Heidemann, J., Mankin, A., Wessels, D., and P. Hoffman, «Specification for DNS over Transport Layer Security (TLS)», RFC 7858, DOI 10.17487/RFC7858, May 2016, <https://www.rfc-editor.org/info/rfc7858>.

[RFC8179] Bradner, S. and J. Contreras, «Intellectual Property Rights in IETF Technology», BCP 79, RFC 8179, DOI 10.17487/RFC8179, May 2017, <https://www.rfc-editor.org/info/rfc8179>.

[RFC8280] ten Oever, N. and C. Cath, «Research into Human Rights Protocol Considerations», RFC 8280, DOI 10.17487/RFC8280, October 2017, <https://www.rfc-editor.org/info/rfc8280>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC8484] Hoffman, P. and P. McManus, «DNS Queries over HTTPS (DoH)», RFC 8484, DOI 10.17487/RFC8484, October 2018, <https://www.rfc-editor.org/info/rfc8484>.

[RFC8558] Hardie, T., Ed., «Transport Protocol Path Signals», RFC 8558, DOI 10.17487/RFC8558, April 2019, <https://www.rfc-editor.org/info/rfc8558>.

[RFC8890] Nottingham, M., «The Internet is for End Users», RFC 8890, DOI 10.17487/RFC8890, August 2020, <https://www.rfc-editor.org/info/rfc8890>.

[RFC8980] Arkko, J. and T. Hardie, «Report from the IAB Workshop on Design Expectations vs. Deployment Reality in Protocol Development», RFC 8980, DOI 10.17487/RFC8980, February 2021, <https://www.rfc-editor.org/info/rfc8980>.

[RFC8981] Gont, F., Krishnan, S., Narten, T., and R. Draves, «Temporary Address Extensions for Stateless Address Autoconfiguration in IPv6», RFC 8981, DOI 10.17487/RFC8981, February 2021, <https://www.rfc-editor.org/info/rfc8981>.

[RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., «QUIC: A UDP-Based Multiplexed and Secure Transport», RFC 9000, DOI 10.17487/RFC9000, May 2021, <https://www.rfc-editor.org/info/rfc9000>.

[RFC9071] Hellström, G., «RTP-Mixer Formatting of Multiparty Real-Time Text», RFC 9071, DOI 10.17487/RFC9071, July 2021, <https://www.rfc-editor.org/info/rfc9071>.

[RFC9293] Eddy, W., Ed., «Transmission Control Protocol (TCP)», STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022, <https://www.rfc-editor.org/info/rfc9293>.

[RFC9420] Barnes, R., Beurdouche, B., Robert, R., Millican, J., Omara, E., and K. Cohn-Gordon, «The Messaging Layer Security (MLS) Protocol», RFC 9420, DOI 10.17487/RFC9420, July 2023, <https://www.rfc-editor.org/info/rfc9420>.

[RFC9505] Hall, J. L., Aaron, M. D., Andersdotter, A., Jones, B., Feamster, N., and M. Knodel, «A Survey of Worldwide Censorship Techniques», RFC 9505, DOI 10.17487/RFC9505, November 2023, <https://www.rfc-editor.org/info/rfc9505>.

[Saltzer] Saltzer, J. H., Reed, D. P., and D. D. Clark, «End-to-end arguments in system design», ACM Transactions on Computer Systems, vol. 2, no. 4, pp 277-288, DOI 10.1145/357401.357402, November 1984, <https://doi.org/10.1145/357401.357402>.

[TLS-ESNI] Rescorla, E., Oku, K., Sullivan, N., and C. A. Wood, «TLS Encrypted Client Hello», Work in Progress, Internet-Draft, draft-ietf-tls-esni-20, 4 August 2024, <https://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-20>.

[UDHR] United Nations General Assembly, «Universal Declaration of Human Rights», December 1948, <https://www.un.org/en/about-us/universal-declaration-of-human-rights>.

[UNGP] United Nations, «Guiding Principles on Business and Human Rights: Implementing the United Nations ‘Protect, Respect and Remedy’ Framework», January 2012, <https://www.ohchr.org/en/publications/reference-publications/guiding-principles-business-and-human-rights>.

[UNHR] United Nations, «The Core International Human Rights Instruments and their monitoring bodies», <https://www.ohchr.org/en/core-international-human-rights-instruments-and-their-monitoring-bodies>.

[UNHRC2016] United Nations Human Rights Council, «The promotion, protection and enjoyment of human rights on the Internet», A/HRC/32/L.20, June 2016, <https://digitallibrary.un.org/record/845728?ln=en>.

[W3CAccessibility] W3C, «Accessibility», <https://www.w3.org/standards/webdesign/accessibility>.

[W3Ci18nDef] Ishida, R. and S. Miller, «Localization vs. Internationalization», December 2005, <https://www.w3.org/International/questions/qa-i18n.en>.

[Ziewitz] Ziewitz, M. and I. Brown, «A Prehistory of Internet Governance», Research Handbook on Governance of the Internet, edited by Ian Brown. Cheltenham: Edward Elgar Publishing, DOI 10.4337/9781849805025.00008, April 2013, <https://doi.org/10.4337/9781849805025.00008>.

[Zittrain] Zittrain, J., «The Future of the Internet and How to Stop It», Yale University Press, 2008, <https://dash.harvard.edu/handle/1/4455262>.

Благодарности

Спасибо:

  • Corinne Cath-Speth за работу над [RFC8280];

  • Reese Enghardt, Joe Hall, Avri Doria, Joey Salazar, Corinne Cath-Speth, Farzaneh Badii, Sandra Braman, Colin Perkins, John Curran, Eliot Lear, Mallory Knodel, Brian Trammell, Jane Coffin, Eric Rescorla, Sofía Celi и почтовой конференции hrpc за рецензии и предложения;

  • лицам, выполнившим обзоры прав человека, за их рецензии и отклики — Amelia Andersdotter, Shane Kerr, Beatrice Martini, Karan Saini, Shivan Kaul Sahib.

Адреса авторов

Gurshabad Grover
Email: gurshabad@cis-india.org
 
Niels ten Oever
University of Amsterdam
Email: mail@nielstenoever.net

Перевод на русский язык

nmalykh@protokols.ru


1Internet Research Task Force — комиссия по исследовательским задачам Internet.

Рубрика: RFC | Оставить комментарий

RFC 9595 YANG Schema Item iDentifier (YANG SID)

Internet Engineering Task Force (IETF)                 M. Veillette, Ed.
Request for Comments: 9595                       Trilliant Networks Inc.
Category: Standards Track                                  A. Pelov, Ed.
ISSN: 2070-1721                                           IMT Atlantique
                                                          I. Petrov, Ed.
                                                 Google Switzerland GmbH
                                                              C. Bormann
                                                  Universität Bremen TZI
                                                           M. Richardson
                                                Sandelman Software Works
                                                               July 2024

YANG Schema Item iDentifier (YANG SID)

Идентификатор элемента схемы YANG

PDF

Аннотация

Идентификатор элемента схемы YANG (YANG Schema Item iDentifier или YANG SID) — глобально уникальное 63-битовое целое число без знака, служащее для идентификации элементов YANG. SID обеспечивают более компактный метод идентификации тех элементов YANG, которые могут использоваться эффективно, в частности, в средах с ограничениями (RFC 7228). Этот документ задаёт семантику, процессы регистрации и процессы назначения YANG SID для управляемых IETF модулей YANG. Для обеспечения возможности реализации процессов документ также определяет формат файла, используемый для хранения и публикации назначенных YANG SID.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9595.

Авторские права

Авторские права (Copyright (c) 2024) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно, поскольку в них описаны права и ограничения, относящиеся к данному документу. Компоненты кода, извлечённые из этого документа, должны включать текст пересмотренной лицензии BSD (Revised BSD License), как указано в параграфе 4.e документа Trust Legal Provisions и предоставляются без гарантий, как указано в Revised BSD License.

1. Введение

Для некоторых элементов, определённых в YANG [RFC7950], требуется использовать уникальный идентификатор. В протоколах NETCONF3 [RFC6241] и RESTCONF [RFC8040] эти идентификаторы реализуются в форме имён. Для реализации моделей данных YANG в устройствах [RFC7228] и сетях с ограничениями, требуется более компактный метод идентификации элементов YANG. Этот компактный идентификатор, называемый идентификатором элемента схемы YANG (YANG Schema Item iDentifier, YANG SID или просто SID, когда контекст в этом документе понятен), представляется в форме 63-битового целого числа без знака. Ограничение размера 63 битами позволяет проще работать с SID на платформах, где для иных задач не требуется поддержка операций с 64-битовыми целыми числами без знака. Потеря одного бита не является существенной с учётом остающегося пространства значений.

С использованием SID указываются:

  • отождествления (идентификаторы);

  • узлы данных (включая узлы, заданные расширениями rc:yang-data [RFC8040] и sx:structure [RFC8791]);

  • вызовы удалённых процедур (remote procedure call, RPC) и связанные с ними входные и выходные данные);

  • действия и связанные с ними входные и выходные данные);

  • уведомления и связанная с ними информация;

  • модули YANG и свойства (функции).

Возможно, что некоторые протоколы будут использовать лишь часть назначенных SID. Например, для отличных от NETCONF [RFC6241] протоколов, предоставляющих доступ к данным на основе моделей YANG, таких как [CORE-COMI], доставка SID модуля YANG может быть ненужной. Доставка такой информации может потребоваться другим протоколам, например, протоколам, связанным с обнаружением, таким как библиотека модулей YANG с ограничениями (Constrained YANG Module Library) [YANG-LIBRARY].

SID — это глобально уникальные целые числа. Для обеспечения уникальности применяется система регистрации. SID регистрируются блоками (диапазонами) — SID range. После признания SID «стабильными» они назначаются навсегда. Элементы, назначенные новой версией модуля YANG добавляются в список уже выделенных SID. Этот вопрос более подробно рассматривается в разделе 2.

Присвоение SID элементам YANG обычно выполняется автоматизировано, как описано в Приложении B, где рассмотрены также случаи, когда может быть уместно ручное вмешательство.

В разделе 3 подробно рассматриваются процессы регистрации для модулей YANG и связанных с ними SID. Для обеспечения реализации этих процессов в разделе 4 определён стандартный формат файлов для хранения и публикации SID.

Управляемые IETF модули YANG, которым нужно выделить SID, будут использовать механизмы IANA, заданные в этом документе (см. раздел 6). Для модулей YANG других организаций выделение SID происходит с помощью механизмов IANA через мегадиапазоны (Mega-Range, см. параграф 6.3), в рамках которых соответствующая сторона может использовать свои механизмы выделения значений.

YANG SID особенно полезны для компактного кодирования YANG-CBOR [RFC9254]. На момент создания этого документа инструмент для автоматизированного создания файлов .sid был доступен в рамках проекта с открытым кодом PYANG [PYANG].

1.1. Термины и обозначения

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

Ниже перечислены элементы, определённые в [RFC7950].

  • action
  • feature
  • module
  • notification
  • RPC
  • schema node
  • schema tree
  • submodule

В этой спецификации также используются указанные ниже термины.

Item — элемент

Узел схемы, идентификатор (отождествление), модуль или свойство, заданные с использованием языка моделирования YANG.

YANG Schema Item iDentifier (YANG SID или SID) — идентификатор узла схемы YANG

Целое число без знака, служащее для идентификации элемента YANG (см. параграф 3.2 в [RFC9254]).

YANG name — имя YANG

Текстовая строка, служащая для идентификации элемента YANG (см. параграф 3.3 в [RFC9254]).

2. Цели

Главная цель системы назначения и регистрации SID состоит в обеспечении глобальной совместимости протоколов, применяющих SID для обмена данными, смоделированными в YANG. Это вносит определённые требования к стабильности SID, но не препятствует активному развитию модулей YANG, для поддержки которых предназначены SID. Дополнительные цели включают:

  • предоставление разработчикам модулей YANG возможности создания относящихся к этим модулям SID;

  • упрощение разработчикам YANG получения SID;

  • предоставление другим разработчикам возможности задания SID для модулей, создатели которых не заинтересовались назначением SID;

  • поддержка режима назначения, при котором короткие SID (2-4 байта) легко доступны для приложений, где они будут полезны, в сочетании с использованием 63-битового пространства SID для облегчения действий, не требующих разрешения;

  • предоставление множеству организаций возможности предлагать услуги в поддержку назначения SID;

  • поддержка некоторой лакальности назначения SID для эффективного использования диапазонов (SID delta);

  • предоставление различным программным компонентам возможности работать с SID без полной информации о других участниках коммуникационных процессов.

Хотя реестры, управляющие SID для определяемых IETF модулей, в конечном итоге поддерживает IANA, нужны различные инструменты (такие как каталог YANG [yangcatalog]) для предоставления возможности назначать и использовать SID в модулях, ещё находящихся в разработке IETF. Разработчикам открытых и фирменных модулей YANG требуется возможность автономного назначения идентификаторов, возможно, с формированием независимых от IETF объединений, с сохранением общего пространства значений SID, управляемого IANA. Очевидно, что этот процесс имеет много сходства с распределением адресов IP, но между ними есть и существенные различия.

2.1. Технические цели

Как отмечено в введении, идентификаторы SID задуманы как глобально уникальные целые числа без знака. Это, в частности, означает цель 1 (MUST — должно):

Любое 63-битовое целое число без знака (1) либо не назначается как SID, либо (2) незыблемо связывается в точности с одним именем YANG. Разрешен лишь переход невыделенных значений в число привязанных навсегда.

Это позволяет получателю структуры данных, содержащей SID, преобразовать их в глобально значимые имена YANG, которые применяются в настоящее время в имеющихся кодировках данных YANG, таких как YANG-XML [RFC7950] и YANG-JSON [RFC7951].

Термин «имя YANG» не определён вне этого документа и в YANG применяется сложная схема имён и сущностей, которые могут иметь имена. Вместо технического определения термина набор целей использует его так, чтобы были достигнуты общие цели YANG SID. Желательная цель 2 (SHOULD — следует):

Любое активно применяемое имя YANG имеет один назначенный ему идентификатор SID.

Это означает, что:

  1. не следует иметь имена YANG без назначенного SID;

  2. именам YANG не следует иметь несколько SID.

Эти цели в полной мере не достижимы, поскольку имена YANG не обязательно создаются с назначением SID, а совершенно не связанные органы (сущности) могут назначить SID для одного имени YANG, не взаимодействуя между собой (как корабли в ночи). Отметим, что при сохранении такой автономности у любого отдельного наблюдателя будет складываться впечатление, что цель 2 достигнута. Отклонение будет замечено лишь при общении автономно действовавших сущностей.

2.2. Эволюция и версии модулей

Модули YANG эволючионируют (см. раздел 11 в [RFC7950] и параграф 4.27 в RFC 8407 [BCP216]), а технические цели с формулированы выше без учёта этого развития. Однако некоторые модули все ещё находятся в очень подвижном состоянии и назначать постоянные SID именам YANG из таких модулей нежелательно. Это относится не только к новым модулям, но и к создаваемым новым версиях имеющихся стабильных модулей. С этим связана цель 3 (MUST — должно):

Система назначения SID независима от версий модулей.

2.3. Компоненты решения и производные цели

Для гарантии уникальности SID применяется система регистрации. Чтобы обеспечить некоторую автономность при выделении (и избежать раскрытия информации там, где это нежелательно) SID регистрируются диапазонами (SID range). Значения SID выделяются навсегда и не могут быть изменены. Элементы, введённые новым выпуском модуля YANG, добавляются к списку уже выделенных SID.

2.4. Участники и роли

В процессе разработки YANG можно выделить несколько сторон, имяющих отношение к модулю YANG.

module controller — контролёр модуля

Владелец модуля YANG, т. е. лицо (организация), контролирующее развитие модуля.

registration entity — орган регистрации

Контролёр пространства имён модуля, в частности, префиксов, которые обычно применяются (неообязательная строна).

module repository — репозиторий модулей

Сущность, предоставляющая модули их пользователям. Это может быть «официальный» (например, IANA для модулей IETF) или «неофициальный» орган (например, каталог YANG [yangcatalog]). Не все репозитории могут выступать в роли реестра, т. е. постоянного хранилища записей для предоставляемой информации. Репозитории могут обращаться к владельцам модулей как стабильному источнику сведений.

module user — пользователь модуля

Субъект, использующий модуль после его получения от контролёра или из репозитория.

Этот набор сторон нужно расширить с учётом дополнительных ролей, требуемых для процесса назначения SID.

SID assigner — назначающий SID орган (сущность)

Орган, назначающих SID для модуля. Цель 2 состоит в том, чтобы для каждого модуля SID назначал лишь один орган. Желательно, чтобы назначающий SID орган не менялся в процессе разработки модуля, однако данная спецификация определяет файлы .sid для обеспечения организованной передачи.

SID range registry — реестр диапазонов SID

Орган, которыя предоставляет назначающему SID органу диапазоны SID для выделения SID модулям. В данной спецификации имеется структура с мегадиапазонами (Mega-Range) и индивидуальными диапазонами SID.

SID repository — репозиторий SID

Сущность, предоставляющая назначенные SID их пользователям (обычно в форме файла .sid).

SID user — пользователь SID

Пользователь модуля, которые применяет SID, предоставленные назначающим SID органом для модуля YANG. Пользователям SID требуется найти назначившие SID органы или выделенные значения SID.

По мере внедрения SID в модели данных YANG распределение ролей между имеющимися сторонами для модуля YANG будет развиваться. Желаемое финальное состояние этого развития показано в таблице 1.

Таблица . Стороны и роли — желаемое финальное состояние.

 

Роль

Сторона

Назначающий SID орган

Разработчик модуля

Реестр диапазонов SID

В соответствии с данной спецификацией

Репозиторий SID

Репозиторий модулей

Пользователь SID

Пользователь модуля

 

Такое распределение ролей позволяет разработчику модуля достигнуть целей, указанных в этом разделе (контролёр модуля руководящий SID, тип 1). Хотя теоретически кто-то другой может назначить дополнительные SID в противоречие цели 2, для этого будет мало причин, если разработчик модуля всегда предоставляет вместе с модулем файл .sid.

Остальная часть раздела посвящена переходу в желаемое финальное состояние.

Для существующих модулей нет файлов .sid и орган, выделяющий SID не указан. В такой ситуации наиболее вероятен конфликт с целью 2. При разработке нового модуля его создатели могут ещё не знать о SID или не быть заинтересованными в их назначении (например, из-за отсутствия в организации нужных программ или процедур).

Для этих двух случаев (контролёр модуля, безразличный к SID, тип 3) репозитории модулей могут послужить посредником, предоставляющим пользователям SID доступ к назначающему SID, который тщательно выбирается, чтобы его можно было использовать и другим репозиториям для повышения вероятности достижение цели 2.

Если контролёр модуля знает о SID, но пока не назначает их, он может указать назначающего SID вместо себя. Это может привести к тому, что стабильный набор уникальных SID будет назначаться разработчиком модуля опосредованно (знающий о SID контролёр, тип 2). Органы, предлагающие услуги назначенного SID-ассистента, могут обеспечивать обслуживание удобным способом, например, через web-интерфейс.

Назначающий SID орган должен, по меньшей мере, зарезервировать диапазон SID, который он будет использовать для назначения SID. Если используемый реестр диапазонов SID может записывать имена и выпуски модулей и процессы назначения (включая применяемые программы) стабильны, назначающий SID орган теоретически может реконструировать свои назначения, но это может вызвать ошибки в реализациях.

Назначающий SID орган, имеющий дело с разрабатываемым (ещё нестабильным) модулей, должен решить, назначать ли SID для нового выпуска «с нуля» (с чистого листа) или использовать имеющиеся назначения из предыдущего выпуска как базу и назначать новые SID только для новых имён. Когда модуль сочтён стабильным, назначенные для него SID также следует объявить стабильными (с учётом того, что для имеющихся модулей YANG может потребоваться тот или иной пересмотр).

В данной спецификации не рассматривается работа органов-посредников, таких как назначенные распределители SID или репозитории SID, указаны лишь цели действий таких органов.

3. Жизненный цикл файла .sid

Язык YANG предназначен для моделирования данных, доступ к которым осуществляется по одному из совместимых протоколов, например, NETCONF [RFC6241], RESTCONF [RFC8040], CORECONF (CoAP Management Interface) [CORE-COMI]). Модули YANG задают иерархии данных, включая данные конфигурации и состояния, RPC, действия и уведомления. Многие модули YANG создаются вне контекста приложений с ограничениями. Модули YANG можно реализовать с использованием NETCONF [RFC6241] или RESTCONF [RFC8040] без необходимости назначать SID.

При необходимости авторы модулей YANG могут присваивать SID для своих модулей. Для этого им следует сначала получить диапазон SID из реестра, а затем использовать этот диапазон для назначения или генерации SID для элементов их модулей YANG. Выделенные идентификаторы могут сохраняться в файле .sid. Пример реализации этого представлен в Приложении C.

Элементы, введённые новым выпуском модуля YANG, добавляются в список уже выделенных SID. Когда это происходит в процессе создания документа по новому протоколу, может потребоваться предварительное назначение идентификаторов, которые могут быть изменены, пересмотрены или отозваны во время разработки нового стандарта. Такие предварительные назначения получают статус нестабильных, чтобы их можно было удалить, а SID потом заново выделить для другого имени/пути схемы YANG в процессе разработки. Когда спецификация становится завершённым документом, назначенные идентификаторы получают статус стабильных. В процессе разработки, начиная с момента публикации спецификации, для средств разработки следует делать доступными два варианта файла .sid: (1) «общедоступный файл» файл .sid, содержащий только стабильные (в том числе в процессе разработки) SID, и «непубличный», который содержит нестабильные назначения SID.

Регистрация файла .sid, связанного с модулем YANG не требуется, но рекомендуется и будет способствовать функциональной совместимости устройств, а также позволит избежать дублирования SID для одного модуля YANG. Реестры могут предъявлять разные требования к регистрации и публикации файлов .sid. В качестве одного из вариантов может служить диаграмма действий на рисунке 4 в Приложении C.

При каждом обновлении модуля YANG, его субмодулей или импортируемых модулей может создаваться новый файл .sid, если новым или измененным элементам нужны SID. Все SID из прежней версии файла .sid, которая активно применялась, должны присутствовать в новаой версии файла. Создавать новые версии файлов .sid следует с помощью автоматизированных инструментов.

Если для новой версии требуется больше SID, чем было выделено изначально, в элемент assignment-range (раздел 4) должен добавляться новый диапазон SID. Эти SID применяются для последующих назначений. Пример процесса обновления представлен на рисунке 5 в Приложении C.

4. Формат файла .sid

Файлы .sid применяются для хранения и публикации SID, выделенных элементам YANG в конкретном модуле YANG. На рисунке 1 представлено дерево [BCP215], иллюстрирующее модель данных.

   module: ietf-sid-file

     structure sid-file:
       +-- module-name            yang:yang-identifier
       +-- module-revision?       revision-identifier
       +-- sid-file-version?      sid-file-version-identifier
       +-- sid-file-status?       enumeration
       +-- description?           string
       +-- dependency-revision*   [module-name]
       |  +-- module-name         yang:yang-identifier
       |  +-- module-revision     revision-identifier
       +-- assignment-range*      [entry-point]
       |  +-- entry-point         sid
       |  +-- size                uint64
       +-- item*                  [namespace identifier]
          +-- status?             enumeration
          +-- namespace           enumeration
          +-- identifier          union
          +-- sid                 sid

Рисунок . Дерево YANG для ietf-sid-file.


Ниже представлен модуль YANG, определяющий структуру файлов .sid. Кодирование выполняется в формате JSON [STD90] по правилам, заданным в [RFC7951]. Этот модуль импортирует ietf-yang-types [RFC6991] и ietf-yang-structure-ext [RFC8791], а также ссылается на [STD68], [RFC7950] и [BCP216].

   <CODE BEGINS> file "ietf-sid-file@2024-07-31.yang"
   module ietf-sid-file {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-sid-file";
     prefix sid;

     import ietf-yang-types {
       prefix yang;
       reference
         "RFC 6991: Common YANG Data Types";
     }
     import ietf-yang-structure-ext {
       prefix sx;
       reference
         "RFC 8791: YANG Data Structure Extensions";
     }

     organization
       "IETF CORE Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/core/> 

        WG List:  <mailto:core@ietf.org> 

        Editor:   Michel Veillette
                  <mailto:michel.veillette@trilliant.com> 

        Editor:   Andy Bierman
                  <mailto:andy@yumaworks.com> 

        Editor:   Alexander Pelov
                  <mailto:alexander.pelov@imt-atlantique.fr> 

        Editor:   Ivaylo Petrov
                  <mailto:ivaylopetrov@google.com>"; 

     description
       "Этот модуль определяет структуру файлов .sid.

        Каждый файл .sid содержит сопоставление строковых идентификаторов
        модуля YANG с соответствующими числовыми значениями YANG SID.

        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
        указаны заглавными буквами, как показано здесь.

        Авторские права (Copyright (c) 2024) принадлежат IETF Trust
        и лицам, указанным в качестве авторов кода. Все права защищены.

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия данного модуля YANG является частью RFC 9595, где
        правовые вопросы рассмотрены более полно.";

     revision 2024-07-31 {
       description
         "Исходный выпуск.";
       reference
         "RFC 9595: YANG Schema Item iDentifier (YANG SID)";
     }

     typedef revision-identifier {
       type string {
         pattern '[0-9]{4}-[0-9]{2}-[0-9]{2}';
       }
       description
         "Дата в формате YYYY-MM-DD.";
     }

     typedef sid-file-version-identifier {
       type uint32;
       description
         "Версия файла .sid.";
     }

     typedef sid {
       type uint64 {
         range "0..9223372036854775807";
       }
       description
         "Идентификатор элемента схемы YANG.";
       reference
         "RFC 9595: YANG Schema Item iDentifier (YANG SID)";
     }

     typedef schema-node-path {
       type string {
         pattern
           '/[a-zA-Z_][a-zA-Z0-9\-_.]*:[a-zA-Z_][a-zA-Z0-9\-_.]*' +
           '(/[a-zA-Z_][a-zA-Z0-9\-_.]*(:[a-zA-Z_][a-zA-Z0-9\-_.]*)?)*';
       }
       description
         "Путь к узлу схемы - это абсолютный идентификатор узла схемы 
          YANG, по правилу YANG ABNF absolute-schema-nodeid, но с
          использованием имён модулей вместо префиксов.
          К этой строке дополнительно применяются указанные ниже правила
          -  самое левое (верхний уровень) имя узла данных всегда 
             указывается с пространством имён (namespace-qualified);
          -  любое последующее имя узла схемы имеет форму namespace-
             qualified, если узел определён в модуле, отличном от
             родительского, и простую форму в иных случаях. Предикаты
             не разрешены";
       reference
         "RFC 5234 (STD 68): Augmented BNF for Syntax Specifications:
                             ABNF
          RFC 7950: The YANG 1.1 Data Modeling Language,
                    Section 6.5: Schema Node Identifier";
     }

     sx:structure sid-file {
       uses sid-file-contents;
     }

     grouping sid-file {
       description
         "Группировка с контейнером YANG, представляющим структуру
          файла .sid.";

       container sid-file {
         description
           "Контейнер-оболочка, который вместе с расширением 
            sx:structure маркирует находящиеся в нем структуры данных
            YANG как не предназначенные для реализации в виде части
            хранилища конфигурации или рабочего состояния на сервере.";
         uses sid-file-contents;
       }
     }

     grouping sid-file-contents {
       description
         "Группировка, задающая содержимое контейнера, представляющего
          структуру файла .sid.";

       leaf module-name {
         type yang:yang-identifier;
         mandatory true;
         description
           "Имя модуля YANG, связанного с файлом .sid.";
       }

       leaf module-revision {
         type revision-identifier;
         description
           "Выпуск модуля YANG, связанного с этим файлом .sid. Этот лист
            отсутствует, если в модуле YANG нет оператора revision.";
       }

       leaf sid-file-version {
         type sid-file-version-identifier;
         default 0;
         description
           "Необязательный лист, указывающий номер версии файла .sid.
            Нумерация версий определяется конкретным выпуском модуля
            YANG, начинается с 0 для первого выпуска и далее возрастает
            монотонно. Значение позволяет различать обновления файла
            .sid, например, в результате обработки или исправления
            найденных ошибок.";
       }

       leaf sid-file-status {
         type enumeration {
           enum unpublished {
             description
               "Этот файл .sid не является общедоступным (BCP 216) и
                называется рабочим. Он может сопровождать непубличный
                модуль YANG. Список item МОЖЕТ включать записи со
                статусом unstable.";
             reference
               "RFC 8407 (BCP 216): Guidelines for Authors and
                                    Reviewers of Documents Containing
                                    YANG Data Models";
           }
           enum published {
             description
               "Этот файл .sid является опубликованным. Такой статус 
                применяется к файлам .sid для опубликованных модулей
                YANG. В список item НЕДОПУСТИМО включать записи со
                статусом unstable.";
           }
         }
         default "published";
         description
           "Необязательный лист, указывающий статус файла .sid.";
       }

       leaf description {
         type string;
         description
           "Метаинформация о сгенерированном файле в произвольной форме.
            Може указывать инструмент, создавший файл .sid, время
            генерации и другие данные.";
       }

       list dependency-revision {
         key "module-name";

         description
           "Сведения о выпусках, использованных при генерации файла .sid
            для каждой зависимости, т. е. для каждого модуля YANG,
            импортируемого связанным в файлом .sid модулем YANG.";

         leaf module-name {
           type yang:yang-identifier;
           description
             "Имя модуля YANG для данной зависимости.";
         }
         leaf module-revision {
           type revision-identifier;
           mandatory true;
           description
             "Выпуск модуля YANG для данной зависимости .";
         }
       }

       list assignment-range {
         key "entry-point";
         description
           "Диапазоны YANG-SID, выделенные модулю YANG, указанному
            module-name и module-revision.
            -  Первое значение диапазона YANG-SID - это  entry-point,
               последнее - (entry-point + size - 1).
            -  НЕДОПУСТИМО перерытие диапазонов assignment-range.";

         leaf entry-point {
           type sid;
           description
             "Наименьшее значение YANG SID для выделения.";
         }

         leaf size {
           type uint64;
           mandatory true;
           description
             "Число YANG SID, доступных для выделения.";
         }
       }

       list item {
         key "namespace identifier";
         unique "sid";

         description
           "Каждая запись списка сопоставляет строку идентификатора YANG
            с YANG SID. Список ДОЛЖЕН включать сопоставления для всех
            элементов YANG, заданных в модуле, указанном в module-name и
            module-revision.";

         leaf status {
           type enumeration {
             enum stable {
               value 0;
               description
                 "Это назначение SID опубликовано как стабильное для
                  данного пространства имён и идентификатора.";
             }
             enum unstable {
               value 1;
               description
                 "Это назначение SID выполнено в процессе разработки
                  и ещё не является стабильным.";
             }
             enum obsolete {
               value 2;
               description
                 "Это значение SID больше не используется и указано для
                  предотвращения повторного выделения.";
             }
           }
           default "stable";
           description
             "Сведения о стабильности назначения. Каждое конкретное
              значение SID с течением времени может переходить из 
              состояния unstable в stable, а stable может смениться на
              obsolete.";
         }

         leaf namespace {
           type enumeration {
             enum module {
               value 0;
               description
                 "Все имена в модуле и субмодулях используют глобальное
                  пространство имён идентификаторов этого модуля.";
             }
             enum identity {
               value 1;
               description
                 "Все имена идентификаторов в модуле и его субмодулях 
                  используют некое общее пространство имен.";
             }
             enum feature {
               value 2;
               description
                 "Все имена свойств (feature) в модуле и его субмодулях
                  используют некое общее пространство имен.";
             }
             enum data {
               value 3;
               description
                 "Пространство имён всех узлов данных задано в YANG.";
             }
           }
           description
             "Пространство имён для элемента YANG в этом отображении.";
         }

         leaf identifier {
           type union {
             type yang:yang-identifier;
             type schema-node-path;
           }
           description
             "Строковый идентификатор элемента YANG в этой записи. Если
              соответствующее поле namespace имеет значение module,
              feature, или identity, это поде ДОЛЖНО содержать
              действительный идентификатор YANG. Если поле namespace
              имеет значение data, поле ДОЛЖНО содержать действительный
              путь к узлу схемы YANG.";
         }

         leaf sid {
           type sid;
           mandatory true;
           description
             "Значение YANG SID, выделенное элементу YANG.";
         }
       }
     }
   }
   <CODE ENDS>

Рисунок . Модуль YANG ietf-sid-file.

5. Вопросы безопасности

Этот документ определяет новый тип идентификатора, применяемый для кодирования данных, моделируемых в YANG [RFC7950]. Новый идентификатор сопоставляет семантические поняти с целыми числами и при отсутствия доверия к источнику отображения могут возникать новые риски безопасности, если злоумышленник контролирует отображение.

На момент написания документа предполагалось, что файлы .sid обрабатываются разработчиками программ в среде разработки. Разработчикам рекомендуется импортировать файлы .sid только из полномочных источников. Для поддерживаемых IETF модулей YANG полномочным источником является IANA.

Файлы .sid могут обрабатываться и менее ограниченными целевыми системами, например, системами управления сетью. Таким системам нужно быть особенно внимательными и обеспечивать обработку лишь файлов .sid из полномочных источников, доверие к которым не ниже уровня доверия к используемым модулям YANG.

Файлы .sid указываются ссылочными идентификаторами и могут включать их, т. е. такие идентификаторы в определённых ситуациях могут автоматически организовать удалённый доступ, цель которого хотя бы частично указывается соответствующим идентификатором. Это может предоставить злоумышленникам сведения о таком доступе и даже контроль над ним, что может повлиять на приватность и безопасность. Дополнительные сведения по этим вопросам представлены в разделах 6 и 7 [DEREF-ID].

6. Взаимодействие с IANA

6.1. Регистрация пространства имён YANG

Этот документ регистрирует пространство имён XML URN в реестре IETF XML Registry в соответствии с [BCP81].

   URI:  urn:ietf:params:xml:ns:yang:ietf-sid-file
   Registrant Contact:  The IESG.
   XML:  N/A; регистрируемый URI является пространством имён XML.
   Reference:  RFC 9595

6.2. Регистрация модуля формата файла .sid

Этот документ регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

   Name:  ietf-sid-file
   Namespace:  urn:ietf:params:xml:ns:yang:ietf-sid-file
   Prefix:  sid
   Reference:  RFC 9595

6.3. Новый реестр IANA YANG-SID Mega-Ranges

Реестр YANG-SID Mega-Ranges служит для записей о передаче полномочий управления блоками SID тем или иным организациям, например, органам стандартизации (Standards Development Organization или SDO) или регистраторам.

6.3.1. Структура

Каждая запись реестра должна включать:

  • начальную точку (первый SID) зарегистрированного блока SID;

  • размер зарегистрированного блока SID (следует выделять блоки по 1 миллиону SID, но в исключительных случаях можно выделять кратные миллиону блоки);

  • политика выделения SID из блока (Public, Private или то и другое);

  • компактные сведений о запросившей блок организации, включая:

    • название организации;

    • URL.

6.3.2. Правила выделения

Для добавления в этот реестр используется процедура IANA Expert Review (параграф 4.5 в RFC 8126 [BCP26]).

Организация, желающая управлять диапазоном YANG-SID (иметь запись в реестре YANG-SID Mega-Ranges), должна иметь указанные ниже возможности.

  • Способность управлять и поддерживать реестр диапазонов YANG-SID, который должен обеспечивать для всех выделенных реестром диапазонов YANG-SID:

    • начальную точку выделенного диапазона YANG-SID;

    • размер выделенного диапазона YANG-SID;

    • тип (Public или Private).

      • Публичные диапазоны должны включать, по меньшей мере, ссылку на модуль YANG и файлы .sid для этого диапазона YANG-SID (в параграфе 6.4.3 дан пример для реестра IETF YANG-SID Ranges).

      • Частные диапазоны должны иметь метку Private.

  • Политика выделения, чётко указывающая, будет ли выделенный диапазон YANG-SID частным (Private), общедоступным (Public) или тем и другим сразу.

  • Техническая возможность предоставления файлов .sid или ссылок на них с обеспечением целостности данных в этих файлах (см. раздел 5).

  • Техническая возможность обеспечить стабильную работу реестра в течение, по меньшей мере, 5 лет. Если допускается регистрация в категории Private, этот период должен быть не мнее 10 лет.

Если желателен диапазон более 1 миллиона значений, организация дожна продемонстрировать устойчивость технического подхода к использованию такого блока, отсутствие негативного влияния на удобство использования механизмов выделения SID в целом. Такие блоки SID предпочтительно размещать в пространстве не менее 4295000000 (64 бита).

6.3.2.1. Первое выделение

Для первого выделения организация-заявитель должна продемонстрировать функциональную инфраструктуру реестра.

6.3.2.2. Последующее выделение

При последующем выделении диапазона организация должна продемонстрировать исчерпание выделенного ранее диапазона, что должно быть подтверждено назначенным экспертом (экспертами). Если запрос на дополнительное выделение подан не позднее 3 лет после предыдущего выделения, эксперты должны обсудить этот запрос в почтовой конференции рабочей группы CORE и достичь согласия по части выделения нового Mega-Range.

6.3.3. Исходное содержимое реестра

Таблица . Исходное содержимое реестра YANG-SID Mega-Ranges.

 

Начало

Размер

Выделение

Организация

URL

0

1 000 000

Public

IANA

<https://www.iana.org/>

 

6.4. Новый реестр IANA IETF YANG-SID Ranges

Реестр IETF YANG-SID Ranges служит для записи сведений о назначений из диапазонов SID (например, начало и размер) для модулей YANG, указанных именем.

6.4.1. Структура

Каждая запись реестра должна включать:

  • начальное значение диапазона SID;

  • размер диапазона SID;

  • имя модуля YANG;

  • ссылку на документ, на основании которого выполняется регистрация.

6.4.2. Правила выделения

Первый миллион SID, выделенных IANA поделён, как показано ниже.

  1. Значения от 0 до 999 (размер 1000) выделяются по процедуре IESG Approval, заданной в параграфе 4.10 и RFC 8126 [BCP26], при этом значение 0 зарезервировано для реализаций, указывающих отсутствие SID, и не применяется в обмене.

  2. Значения от 1000 до 59999 (размер 59000) и от 100000 до 299999 (размер 200000) предназначены для модулей YANG, заданных в RFC.

    1. Процедуры IANA для добавления в реестр указаны ниже.

      1. Expert Review (параграф 4.5 в RFC 8126 [BCP26]), если файл .sid происходит из модуля YANG, заданного имеющимся RFC.

      2. RFC Required (параграф 4.7 в RFC 8126 [BCP26]) в ином случае.

    2. Эксперт должен убедиться, что модуль YANG, для которого выделяются значения, опубликован в RFC или документ находится в стадии публикации RFC (раннее выделение по запросу от руководителей рабочей группы, как указано в [BCP100]).

  3. Значения от 60000 до 99999 (размер 40000) зарезервированы для экспериментальных модулей YANG. Этот диапазон недопустимо использоваться в рабочих системах, поскольку SID из него не являются глобально уникальными и их функциональная совместимость ограничена. Для выделения значений применяется процедура IANA Experimental Use (параграф 4.2 в RFC 8126 [BCP26]).

  4. Диапазон от 300000 до 999999 (размер 700000) является резервным, как указано в разделе 6 RFC 8126 [BCP26].

Таблица . Реестр IETF YANG-SID Ranges, правила для диапазонов IETF.

 

Начало

Размер

Процедура IANA

0

1000

IESG Approval

1000

59000

RFC и Expert Review (см. п. 2)

60000

40000

Experimental Use

100000

200000

RFC и Expert Review (см. п. 2)

300000

700000

Reserved

 

Размер диапазона SID, выделяемого модулю YANG, рекомендуется делать кратным 50 и по меньшей мере на 33% больше числа имеющихся в модуле элементов YANG. Это позволит выделять новым элементам YANG идентификаторы из имеющегося запаса. Размер диапазона SID не следует делать больше 1000, но авторы модуля могут запросить больший размер при необходимости. Важно отметить, что имеющемуся модулю YANG может быть выделен дополнительный диапазон SID, если исходный диапазон исчерпан. Это ведёт лишь к некоторому снижению эффективности представления.

Если диапазон SID выделяется для имеющегося RFC по процедуре Expert Review (параграф 4.5 в RFC 8126 [BCP26]), в поле Reference для этой записи следует указывать RFC, где определён модуль YANG.

Если диапазон SID требуется до публикации RFC, поскольку реализациям нужны стабильные SID, для процедуры RFC Required может применять раннее выделение (Early Allocation, раздел 2 в RFC 7120 [BCP100]).

6.4.3. Публикация файла .sid

В процессе публикации RFC IANA связывается с назначенными экспертами (команда), отвечающими за предоставление окончательного файла .sid для каждого модуля, определённого в этом RFC. Для разработчиков типа 3 (SID-oblivious, см. параграф 2.4) команда создаёт файл .sid из каждого модуля YANG (см. ниже). Для разработчиков типа 2 (SID-aware) команда сначала получает черновой файл .sid по стабильной ссылке в одобренном проекте, для разработчиков типа 1 (SID-guiding) файл .sid берётся из одобренного черновика. Команда использует инструменты для создания окончательного файла .sid по каждому из модулей YANG, в котором все назначения SID имеют статус stable, а сам файл .sid имеет статус published. В опубликованном файле .sid недопустимы SID со статусом unstable.

Кроме случаев типа 3 (SID-oblivious) команда подаёт имеющийся черновик .sid на вход используемого инструмента (опорный файл), чтобы изменения при повторной генерации были минимальными. Для модулей YANG, являющихся новым выпуском опубликованного ранее модуля имеющийся опубликованный файл .sid должен применяться в качестве опорного для инструмента при генерации пересмотренного чернового (типы 1 и 2) или окончательного (тип 3) файла .sid.

В любой случае команда проверяет сгенерированный файл, включая проверку пригодности для использования в качестве .sid, соответствия диапазону SID, полного охвата элементов из модуля YANG и максимально возможного соответствия имеющемуся черновому файлу .sid.

Затем назначенные эксперты передают файл .sid в IANA для публикации в реестре IETF YANG-SID Modules (параграф 6.5) вместе с модулем YANG.

Недопустимо публиковать файл .sid как часть RFC. Реестр IANA является полномочным и ссылка на него включается в RFC (данный RFC является исключением из этого правила, поскольку файл .sid в нем служит для иллюстрации). Документы Internet-Draft, которым требуются SID для новых модулей, используемые в тексте документа (скажем, для примеров), должны указать это редактору RFC в тексте чернового документа. Такие RFC не могут создавать разработчики типа 3 (SID-oblivious), SID, используемые в тексте, должны быть назначены в имеющемся черновом файле .sid, а команда экспертов должна проверить согласованность назначения в окончательном файле .sid и использования идентификаторов в тексте RFC или соответствующего одобренного черновика.

6.4.4. Исходное содержимое реестра

Таблица . Реестр IETF YANG-SID Ranges, исходное выделение.

 

Начало

Размер

Имя модуля

Документ

0

1

Резерв, не является действительным SID

RFC 9595

1000

100

ietf-coreconf

RFC 9595, [CORE-COMI]

1100

50

ietf-yang-types

[RFC6991]

1150

50

ietf-inet-types

[RFC6991]

1200

50

iana-crypt-hash

[RFC7317]

1250

50

ietf-netconf-acm

[STD91]

1300

50

ietf-sid-file

RFC 9595

1500

100

ietf-interfaces

[RFC8343]

1600

100

ietf-ip

[RFC8344]

1700

100

ietf-system

[RFC7317]

1800

400

iana-if-type

[RFC7224]

 

Для выделения диапазона требуется публикация RFC с модулем YANG в соответствии с процедурой RFC Required, заданной в параграфе 4.7 RFC 8126 [BCP26]. Модуль YANG должен регистрироваться в реестре YANG Module Names по правилам, заданным в разделе 14 [RFC6020].

6.5. Новый реестр IANA IETF YANG-SID Modules

Реестр IETF YANG-SID Modules служит для записи выделения SID элементам отдельных модулей YANG.

6.5.1. Структура

Каждая запись реестра должна включать:

  • имя модуля YANG, которое должно быть представлено в столбце Name реестра YANG Module Names;

  • URI связанного файле .yang, который должен быть указан в столбце File реестра YANG Module Names;

  • URI файла .sid, определяющего выделение идентификаторов (файл .sid сохраняется агентством IANA);

  • число фактически выделенных в файле .sid идентификаторов SID.

6.5.2. Правила выделения

Выделение происходит по процедуре Expert Review (параграф 4.5 в RFC 8126 [BCP26]). Эксперты должны обеспечить выполнение указанных ниже условий.

  • Файл .sid имеет корректную структуру:

    • файл .sid должен быть корректным файлом JSON, соответствующим структуре заданного здесь модуля.

  • Файл .sid назначает индивидуальные SID только из диапазонов YANG-SID для данного модуля YANG (как указано в реестре IETF YANG-SID Ranges):

    • все SID в файле .sid должны относиться к диапазонам, выделенным данному модулю YANG в реестре IETF YANG-SID Ranges.

  • Если другой файл .sid уже содержит SID для этого модуля YANG (например, для других версий модуля), элементам YANG присваиваются SID, которые уже указаны в том файле .sid.

  • Если имеется более старая версия файла .sid, выделенные в нем SID включаются в текущий файл.

6.5.3. Рекурсивное выделение YANG SID при принятии документа

Из-за сложности смены значений SID в процессе обработки документа в IETF ожидается, для для большинства it документов будет запрашиваться выделение SID заранее (Early Allocation [BCP100]). Детали раннего выделения, включая предполагаемые сроки, следует включать в запрос на принятие документа рабочей группой. До принятия проекта документа (Internet-Draft) рабочей группой авторы могут использовать SID из диапазона для экспериментов (см. параграф 6.4.2) или иные значения, не вызывающие путаницы с другими SID (например, можно использовать диапазоны из реестров, не управляемых IANA, которые основаны на выделении YANG-SID Mega-Range).

Предполагается, что после принятия рабочей группой любые изменения файла .sid обсуждаются в списке рассылки этой группы. Особое внимание следует уделять мнениям внедряющих после Working Group Last Call, если значение SID меняет смысл. Во всех случаях файл .sid и связанные с ним SID можно изменить до публикации Internet-Draft как RFC.

Поскольку концепция SID применяется впервые, для опубликованных ранее модулей YANG значения SID не выделены. Чтобы назначение было полезным, для включённых модулей YANG также может потребоваться выделение SID в процессе, который обычно будет аналогичен процессу из параграфа 6.4.3 для типа 3 (SID-oblivious).

Эксперты, анализирующие (ранее) назначение, должны просмотреть список включённых модулей YANG и выделить для них SID.

  • Если документ опубликован как RFC, выделение SID для ссылающихся на него модулей YANG будет постоянным. Эксперт-рецензент предоставляет сгенерированный файл .sid в IANA для регистрации.

  • Если документ является необработанным Internet-Draft, принятым рабочей группой, для него применяется раннее выделение, которое требует одобрения руководителем направления IESG. Ранее выделение, требующее дополнительных назначений, будет включать в своё описание список таких выделений, который будет передаваться в списки рассылки затрагиваемых рабочих групп.

  • Модуль YANG, ссылающийся на модуль из документа, который ещё не принят рабочей группой, не может получить раннее выделение для этого документа, пока тот не будет принят рабочей группой. Как указано в разделе 3 RFC 7120 [BCP100], курирующий директор направления (AD) будет выступать в роли руководителя рабочей группы, если документ не является результатом работы группы IETF, что фактически позволяет AD обойти применение для документа этого правила.

В конце процесса IETF всем зависимостям модуля, для которого выделяются SID, также следует иметь SID. Эти назначения следует делать постоянными (не Early Allocation).

Модуль YANG с выделенными ранее SID, который меняет свои ссылки, включая модуль YANG, ещё не имеющий SID, должен повторить процедуру Early Allocation.

В [BCP100] задан срок действия Early Allocation, по истечении которого выделение теряет силу, если оно не возобновлено. В параграфе 3.3 RFC 7120 [BCP100] также сказано:

Отметим, что для случаев, когда документ представлен на рассмотрение IESG и на момент подачи срок действия Early Allocation ещё не истёк, назначения не будут считаться просроченными, пока документ рассматривается в IESG или ожидает публикации в очереди RFC Editor после одобрения IESG.

6.5.4. Исходное содержимое реестра

На момент написания этого документа в реестре ещё не было записей.

6.6. Регистрация типа носителя и формата содержимого

6.6.1. Тип носителя application/yang-sid+json

Этот документ добавляет описанный ниже тип носителя в реестр Media Types.

Таблица . Регистрация типа носителя для файлов .sid.

 

Имя

Шаблон

Документ

yang-sid+json

application/yang-sid+json

RFC 9595

 

   Type name:  application
   Subtype name:  yang-sid+json
   Required parameters:  N/A
   Optional parameters:  N/A
   Encoding considerations:  binary (UTF-8)
   Security considerations:  см. раздел 5 в RFC 9595.
   Published specification:  RFC 9595
   Applications that use this media type: Приложения, которым нужны YANG
      SID для обмена данными YANG с компактным представлением.
   Fragment identifier considerations: Синтаксис и семантика 
      идентификаторов фрагментов для application/yang-sid+json совпадают
      с заданными для application/json (на момент публикации документа
      синтаксис для application/json не был задан).
   Additional information:
      Magic number(s):  N/A
      File extension(s):  .sid
      Macintosh file type code(s):  N/A
   Person & email address to contact for further information: список 
      рассылки CORE WG (core@ietf.org) или IETF Applications and 
      Real-Time Area (art@ietf.org). 
   Intended usage:  COMMON
   Restrictions on usage:  нет
   Author/Change controller:  IETF

6.6.2. Формат содержимого CoAP

Этот документ добавляет указанный в таблице 6 формат содержимого (Content-Format) в реестр CoAP Content-Formats группы реестров Constrained RESTful Environments (CoRE) Parameters, со значением 260 из диапазона IETF Review (256 — 9999) (см. параграф 4.8 в RFC 8126 [BCP26]).

Таблица . Регистрация формата содержимого для файлов .sid.

 

Тип содержимого

Кодирование содержимого

ID

Документ

application/yang-sid+json

260

RFC 9595

 

7. Литература

7.1. Нормативные документы

[BCP100] Best Current Practice 100, <https://www.rfc-editor.org/info/bcp100>. At the time of writing, this BCP comprises the following: Cotton, M., «Early IANA Allocation of Standards Track Code Points», BCP 100, RFC 7120, DOI 10.17487/RFC7120, January 2014, <https://www.rfc-editor.org/info/rfc7120>.

[BCP14] Best Current Practice 14, <https://www.rfc-editor.org/info/bcp14>. At the time of writing, this BCP comprises the following:
Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[BCP81] Best Current Practice 81, <https://www.rfc-editor.org/info/bcp81>. At the time of writing, this BCP comprises the following: Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <https://www.rfc-editor.org/info/rfc7951>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8791] Bierman, A., Björklund, M., and K. Watsen, «YANG Data Structure Extensions», RFC 8791, DOI 10.17487/RFC8791, June 2020, <https://www.rfc-editor.org/info/rfc8791>.

[STD68] Internet Standard 68, <https://www.rfc-editor.org/info/std68>. At the time of writing, this STD comprises the following: Crocker, D., Ed. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008, <https://www.rfc-editor.org/info/rfc5234>.

[STD90] Internet Standard 90, <https://www.rfc-editor.org/info/std90>. At the time of writing, this STD comprises the following: Bray, T., Ed., «The JavaScript Object Notation (JSON) Data Interchange Format», STD 90, RFC 8259, DOI 10.17487/RFC8259, December 2017, <https://www.rfc-editor.org/info/rfc8259>.

7.2. Дополнительная литература

[BCP215] Best Current Practice 215, <https://www.rfc-editor.org/info/bcp215>. At the time of writing, this BCP comprises the following: Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[BCP216] Best Current Practice 216, <https://www.rfc-editor.org/info/bcp216>. At the time of writing, this BCP comprises the following: Bierman, A., «Guidelines for Authors and Reviewers of Documents Containing YANG Data Models», BCP 216, RFC 8407, DOI 10.17487/RFC8407, October 2018, <https://www.rfc-editor.org/info/rfc8407>.

[BCP26] Best Current Practice 26, <https://www.rfc-editor.org/info/bcp26>. At the time of writing, this BCP comprises the following: Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

[CORE-COMI] Veillette, M., Ed., van der Stok, P., Ed., Pelov, A., Ed., Bierman, A., and C. Bormann, Ed., «CoAP Management Interface (CORECONF)», Work in Progress, Internet-Draft, draft-ietf-core-comi-18, 23 July 2024, <https://datatracker.ietf.org/doc/html/draft-ietf-core-comi-18>.

[DEREF-ID] Bormann, C. and C. Amsüss, «The ‘dereferenceable identifier’ pattern», Work in Progress, Internet-Draft, draft-bormann-t2trg-deref-id-03, 2 March 2024, <https://datatracker.ietf.org/doc/html/draft-bormann-t2trg-deref-id-03>.

[PYANG] Björklund, M., «An extensible YANG validator and converter in python», commit fc9a965, May 2024, <https://github.com/mbj4668/pyang>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC7224] Bjorklund, M., «IANA Interface Type YANG Module», RFC 7224, DOI 10.17487/RFC7224, May 2014, <https://www.rfc-editor.org/info/rfc7224>.

[RFC7228] Bormann, C., Ersue, M., and A. Keranen, «Terminology for Constrained-Node Networks», RFC 7228, DOI 10.17487/RFC7228, May 2014, <https://www.rfc-editor.org/info/rfc7228>.

[RFC7317] Bierman, A. and M. Bjorklund, «A YANG Data Model for System Management», RFC 7317, DOI 10.17487/RFC7317, August 2014, <https://www.rfc-editor.org/info/rfc7317>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8344] Bjorklund, M., «A YANG Data Model for IP Management», RFC 8344, DOI 10.17487/RFC8344, March 2018, <https://www.rfc-editor.org/info/rfc8344>.

[RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, «Handling Long Lines in Content of Internet-Drafts and RFCs», RFC 8792, DOI 10.17487/RFC8792, June 2020, <https://www.rfc-editor.org/info/rfc8792>.

[RFC9195] Lengyel, B. and B. Claise, «A File Format for YANG Instance Data», RFC 9195, DOI 10.17487/RFC9195, February 2022, <https://www.rfc-editor.org/info/rfc9195>.

[RFC9254] Veillette, M., Ed., Petrov, I., Ed., Pelov, A., Bormann, C., and M. Richardson, «Encoding of Data Modeled with YANG in the Concise Binary Object Representation (CBOR)», RFC 9254, DOI 10.17487/RFC9254, July 2022, <https://www.rfc-editor.org/info/rfc9254>.

[STD91] Internet Standard 91, <https://www.rfc-editor.org/info/std91>. At the time of writing, this STD comprises the following: Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[YANG-LIBRARY] Veillette, M., Ed. and I. Petrov, Ed., «Constrained YANG Module Library», Work in Progress, Internet-Draft, draft-ietf-core-yang-library-03, 11 January 2021, <https://datatracker.ietf.org/doc/html/draft-ietf-core-yang-library-03>.

[yangcatalog] «YANG Catalog», <https://yangcatalog.org>.

Приложение A. Пример файла .sid

Приведённый ниже файл .sid (ietf-system@2014-08-06.sid) создан с использованием модулей YANG:

  • ietf-system@2014-08-06.yang [RFC7317];

  • ietf-yang-types@2013-07-15.yang [RFC6991];

  • ietf-inet-types@2013-07-15.yang [RFC6991];

  • ietf-netconf-acm@2018-02-14.yang [STD91];

  • iana-crypt-hash@2014-08-06.yang [RFC7317].

В соответствии с [RFC8792] длинные строки JSON разделены символом \.

   {
     "ietf-sid-file:sid-file": {
       "module-name": "ietf-system",
       "module-revision": "2014-08-06",
       "description": "Example '.sid' file",
       "dependency-revision": [
         {
           "module-name": "ietf-yang-types",
           "module-revision": "2013-07-15"
         },
         {
           "module-name": "ietf-inet-types",
           "module-revision": "2013-07-15"
         },
         {
           "module-name": "ietf-netconf-acm",
           "module-revision": "2018-02-14"
         },
         {
           "module-name": "iana-crypt-hash",
           "module-revision": "2014-08-06"
         }
       ],
       "assignment-range": [
         {
           "entry-point": "1700",
           "size": "100"
         }
       ],
       "item": [
         {
           "namespace": "module",
           "identifier": "ietf-system",
           "sid": "1700"
         },
         {
           "namespace": "identity",
           "identifier": "authentication-method",
           "sid": "1701"
         },
         {
           "namespace": "identity",
           "identifier": "local-users",
           "sid": "1702"
         },
         {
           "namespace": "identity",
           "identifier": "radius",
           "sid": "1703"
         },
         {
           "namespace": "identity",
           "identifier": "radius-authentication-type",
           "sid": "1704"
         },
         {
           "namespace": "identity",
           "identifier": "radius-chap",
           "sid": "1705"
         },
         {
           "namespace": "identity",
           "identifier": "radius-pap",
           "sid": "1706"
         },
         {
           "namespace": "feature",
           "identifier": "authentication",
           "sid": "1707"
         },
         {
           "namespace": "feature",
           "identifier": "dns-udp-tcp-port",
           "sid": "1708"
         },
         {
           "namespace": "feature",
           "identifier": "local-users",
           "sid": "1709"
         },
         {
           "namespace": "feature",
           "identifier": "ntp",
           "sid": "1710"
         },
         {
           "namespace": "feature",
           "identifier": "ntp-udp-port",
           "sid": "1711"
         },
         {
           "namespace": "feature",
           "identifier": "radius",
           "sid": "1712"
         },
         {
           "namespace": "feature",
           "identifier": "radius-authentication",
           "sid": "1713"
         },
         {
           "namespace": "feature",
           "identifier": "timezone-name",
           "sid": "1714"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:set-current-datetime",
           "sid": "1715"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:set-current-datetime/input",
           "sid": "1775"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:set-current-datetime/input/\
                                                      current-datetime",
           "sid": "1776"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system",
           "sid": "1717"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-restart",
           "sid": "1718"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-shutdown",
           "sid": "1719"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state",
           "sid": "1720"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/clock",
           "sid": "1721"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/clock/boot-datetime\
                                                                      ",
           "sid": "1722"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/clock/current-\
                                                              datetime",
           "sid": "1723"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/platform",
           "sid": "1724"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/platform/machine",
           "sid": "1725"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/platform/os-name",
           "sid": "1726"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/platform/os-release\
                                                                      ",
           "sid": "1727"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system-state/platform/os-version\
                                                                      ",
           "sid": "1728"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication",
           "sid": "1729"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user",
           "sid": "1730"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user-\
                                                  authentication-order",
           "sid": "1731"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user/\
                                                        authorized-key",
           "sid": "1732"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user/\
                                              authorized-key/algorithm",
           "sid": "1733"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user/\
                                               authorized-key/key-data",
           "sid": "1734"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user/\
                                                   authorized-key/name",
           "sid": "1735"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user/name",
           "sid": "1736"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/authentication/user/\
                                                              password",
           "sid": "1737"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/clock",
           "sid": "1738"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/clock/timezone-name",
           "sid": "1739"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/clock/timezone-utc-offset\
                                                                      ",
           "sid": "1740"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/contact",
           "sid": "1741"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver",
           "sid": "1742"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/options",
           "sid": "1743"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/options/\
                                                              attempts",
           "sid": "1744"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/options/\
                                                               timeout",
           "sid": "1745"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/search",
           "sid": "1746"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/server",
           "sid": "1747"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/server/name",
           "sid": "1748"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/server/udp-\
                                                               and-tcp",
           "sid": "1749"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/server/udp-\
                                                       and-tcp/address",
           "sid": "1750"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/dns-resolver/server/udp-\
                                                          and-tcp/port",
           "sid": "1751"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/hostname",
           "sid": "1752"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/location",
           "sid": "1753"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp",
           "sid": "1754"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/enabled",
           "sid": "1755"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server",
           "sid": "1756"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/association-\
                                                                  type",
           "sid": "1757"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/iburst",
           "sid": "1758"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/name",
           "sid": "1759"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/prefer",
           "sid": "1760"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/udp",
           "sid": "1761"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/udp/address",
           "sid": "1762"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/ntp/server/udp/port",
           "sid": "1763"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius",
           "sid": "1764"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/options",
           "sid": "1765"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/options/attempts",
           "sid": "1766"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/options/timeout",
           "sid": "1767"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server",
           "sid": "1768"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server/\
                                                   authentication-type",
           "sid": "1769"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server/name",
           "sid": "1770"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server/udp",
           "sid": "1771"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server/udp/address\
                                                                      ",
           "sid": "1772"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server/udp/\
                                                   authentication-port",
           "sid": "1773"
         },
         {
           "namespace": "data",
           "identifier": "/ietf-system:system/radius/server/udp/shared-\
                                                                secret",
           "sid": "1774"
         }
       ]
     }
   }

Рисунок . Пример файла .sid (модуль ietf-system с переносом длинных строк).

Приложение B. Автоматическая генерация SID

Назначение SID для элементов YANG следует автоматизировать. Рекомендуемый процесс приведён ниже.

  1. Инструмент извлекает элементы, заданные в конкретном модуле YANG.

  2. Элементы сортируются по алфавиту с размещением записей namespace в порядке убывания, а identifier — в порядке возрастания. Формат namespace и identifier описан в модуле YANG ietf-sid-file, заданном в разделе 4.

  3. Значения SID выделяются последовательно от начальной точки до максимального значения в зарегистрированном диапазоне SID. Этот подход рекомендуется для минимизации издержек на сериализацию, (delta) между опорным и текущим SID используется протоколами, нацеленными на снижение размера сообщений.

  4. Если число элементов превышает размер диапазона SID, выделенного модулю YANG, добавляется ещё один диапазон для назначения.

  5. В элементе списка dependency-revision следует отражать номера выпусков каждого импортируемого модуля YANG (на момент генерации).

При обновлении активно используемого модуля YANG имеющиеся назначения SID сохраняются, а при обновлении рабочей версии Internet-Draft, ещё не принятой сообществом, назначение SID лучше выполнять «с нуля». Если имя узла схемы меняется, а данные структурно и семантически схожи с доступными раньше по старому имени, SID для старого имени можно продолжать использовать с новым. Если меняется значение элемента, ему можно выделить новый SID, это особенно полезно для идентификации новой структуры и семантики элемента. Если тип данных YANG меняется в новом выпуске опубликованного модуля так, что в результате изменяется кодирование CBOR, реализация существенно упростится при назначении нового SID. Отметим, что такие решения обычно принимает автор модуля YANG, которому следует решить, нужно ли ручное вмешательство в процесс автоматического назначения.

При обновлении имеющегося файла .sid требуется дополнительный шаг для увеличения номера версии файла .sid. Если у прежнего файла не было номера версии, принимается значение 0 и новому файлу .sid присваивается номер версии 1. Изменения в файлах .sid можно автоматизировать с использованием приведённой выше схемы за исключением того, что в п. 3 сохраняются прежние назначения SID и обрабатываются только новые элементы YANG, которым назначаются SID. Имеющимся в файле .sid элементам не следует присваивать новые SID.

Отметим, что версия файла .sid специфична для выпуска модуля YANG т для каждого нового модуля YANG или нового выпуска имеющегося модуля начальному файлу .sid следует (1) задавать версию 0 или (2) не указывать версию.

Отметим, что элементам YANG input и output в RPC и action должны назначаться SID, даже если в них нет других элементов YANG. Причина этого заключается в том, что данный модуль может дополняться другими модулями, которым могут требоваться SID.

Приложение C. Жизненный цикл файла .sid

До назначения SID элементам модулей YANG авторы модуля должны получить диапазон SID из реестра YANG-SID Ranges. Если модуль YANG является частью IETF Internet-Draft или RFC, диапазон SID нужно получать из реестра IETF YANG-SID Ranges, как указано в параграфе 6.4. Для иных модулей YANG авторы могут получить диапазон SID из любого реестра YANG-SID Ranges.

После получения диапазона SID его владельцы могут использовать диапазон для генерации одного или нескольких файлов .sid для своих модулей YANG. Рекомендуется оставлять некоторое число нераспределенных SID после выделенного для файла .sid блока, чтобы упростить будущее развитие модулей YANG. Создавать файлы .sid с помощью автоматизированных инструментов. Отметим, что файлы .sid создаются лишь для модулей YANG (не субмодулей).

C.1. Создание файла .sid

          +---------------+
    o     | Создание      |
   -+- -->| модуля YANG   |
   / \    +------+--------+
                 |
                 v
          .-------------.
         / Стандатизован.\     да
         \ модуль YANG?  /------------+
          '-----+-------'             |
                |  нет                |
                v                     v
         .-------------.      +---------------+
   +--> / Приложения с  \ да  | Регистрация   |
   |    \ ограничениями?/---->| диапазона SID |<--------+
   |     '-----+-------'      +------+--------+         |
   |           |  нет                |                  |
   |           v                     v                  |
   |    +---------------+    +---------------+          |
   +----+ Обновление    |    | Выделение     |          |
        | модуля YANG   |    | субблока SID  |<---------+
        +---------------+    +-------+-------+          |
                                     |                  |
                                     v                  |
                            +---------------+    +------+------+
                            | Генерация     |    | Переработка |
                            | файла .sid    |    | модуля YANG |
                            +-------+-------+    +-------------+
                                    |                   ^
                                    v                   |
                              .----------.  да          |
                             /   Работа   \ ------------+
                             \  продолж.? /
                              '----+-----'
                                   |  нет
                                   v
                          .-------------.
                         /  Публикация   \ нет
                         \      RFC?     /--------------+
                          '------+------'               |
                            да   |                      |
                                 v                      v
                       +---------------+        +---------------+
                       |  Регистрация  |        |   Сторонняя   |
                       |      IANA     |        |  регистрация  |
                       +-------+-------+        +-------+-------+
                               |                        |
                               +------------------------+
                               v
                             [DONE]

Рисунок . Жизненный цикл SID.

На рисунке ниже кратко представлен процесс создания модуля YANG и файла .sid для него.

C.2. Обновление файла .sid

На рисунке ниже кратко представлен процесс обновления модуля YANG и связанного с ним файла .sid.


           +--------------------+
     o     | Обновление модуля  |
    -+- -->| YANG, включённых и |
    / \    | импортируемых фалов|
           +------+-------------+
                  |
                  v
              .-------------.
             / Созданы новые \ да
             \ элементы?     /------+
              '------+------'       |
                     |  нет         v
                     |       .-------------.      +----------------+
                     |      /  Диапазон SID \ да  | Выделение      |
                     |      \  исчерпан?    /---->| дополнительного|
                     |       '------+------'      +-------+--------+
                     |              |  нет                |
                     |              +---------------------+
                     |              |
                     |              v
                     |      +---------------+
                     |      | Обновление    |
                     |      | файла .sid на |
                     |      |основе прежнего|
                     |      +-------+-------+
                     |              |
                     |              v
                     |       .-------------.      +---------------+
                     |      /  Доступен     \ да  | Регистрация   |
                     |      \  публично?    /---->| модуля YANG   |
                     |       '------+------'      +-------+-------+
                     |              | нет                 |
                     +--------------+---------------------+
                                    |
                                    v
                                  [DONE]

Рисунок . Обновление модуля YANG и файла .sid.

Приложение D. Сохранение файла .sid в файле данных экземпляра

В [RFC9195] определён формат данных экземпляра YANG (YANG instance data). Это, по сути, ведёт к инкапсуляции данных экземпляра в некую «оболочку» метаданных.

Если файл .sid нужно сохранить в файле данных экземпляра YANG, это можно сделать, встроив файл .sid как значение элемента content-data, как показано в шаблоне ниже (элементы второго уровня указаны в квадратных скобках).

   {
     "ietf-yang-instance-data:instance-data-set": {
       "name": "<module-name>@<module-revision>.sid",
       "description":  ["<description>"],
       "content-schema": {
         "module": "ietf-sid-file@2024-06-17"
       },
       "content-data": {  <замените этот объект>
         "ietf-sid-file:sid-file" : {
           "module-name": ...
         }
       }
     }
   }

Благодарности

Авторы благодарны Andy Bierman, Abhinav Somaraju, Peter van der Stok, Laurent Toutain и Randy Turner за помощь в создании этого документа и полезные комментарии в процессе рецензирования. Особая благодарность членам IESG, предоставившим очень полезные замечания в процессе обработки IESG, в частности, Benjamin Kaduk и Rob Wilton, а также Francesca Palombini (ответственный руководитель направления AD).

Участник работы

Andy Bierman
YumaWorks
685 Cochran St.
Suite #160
Simi Valley, CA 93065
United States of America
Email: andy@yumaworks.com

Адреса авторов

Michel Veillette (editor)
Trilliant Networks Inc.
610 Rue du Luxembourg
Granby Quebec J2J 2V2
Canada
Phone: +1-450-375-0556
Email: michel.veillette@trilliant.com
 
Alexander Pelov (editor)
IMT Atlantique
2 rue de la Châtaigneraie
35510 Cesson-Sévigné Cedex
France
Email: alexander.pelov@imt-atlantique.fr
 
Ivaylo Petrov (editor)
Google Switzerland GmbH
Brandschenkestrasse 110
CH-8002 Zurich
Switzerland
Email: ivaylopetrov@google.com
 
Carsten Bormann
Universität Bremen TZI
Postfach 330440
D-28359 Bremen
Germany
Phone: +49-421-218-63921
Email: cabo@tzi.org
 
Michael Richardson
Sandelman Software Works
Canada
Email: mcr+ietf@sandelman.ca

Перевод на русский язык

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Network Configuration Protocol — протокол настройки сети.

Рубрика: RFC | Оставить комментарий

RFC 9606 DNS Resolver Information

Internet Engineering Task Force (IETF)                        T. Reddy.K
Request for Comments: 9606                                         Nokia
Category: Standards Track                                   M. Boucadair
ISSN: 2070-1721                                                   Orange
                                                               June 2024

DNS Resolver Information

Сведения о распознавателе DNS

PDF

Аннотация

Этот документ задаёт для распознавателей DNS метод публикации сведений о себе. Клиенты DNS могут использовать эти сведения для определения возможностей распознавателя DNS. Способ использования сведений клиентами DNS выходит за рамки этого документа.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9606.

Авторские права

Авторские права (Copyright (c) 2024) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно, поскольку в них описаны права и ограничения, относящиеся к данному документу. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Введение

Исторически сложилось так, что клиенты DNS взаимодействуют с распознавателями без необходимости знать что-либо о поддерживаемых теми функциях. Однако все больше рекурсивных распознавателей поддерживает разные функции, что может влиять на предоставляемые ими услуги DNS (сохранение приватности, фильтрация, прозрачность поведения и т. п.). Клиенты DNS могут находить и аутентифицировать распознаватели DNS с поддержкой шифрования в своей локальной сети, используя, например, протоколы обнаружения назначенных сетью распознавателей (Discovery of Network-designated Resolvers или DNR) [RFC9463] и обнаружения назначенных распознавателей (Discovery of Designated Resolvers или DDR) [RFC9462]. Однако эти клиенты DNS не могут получить от найденных рекурсивных распознавателей сведений об их возможностях для процесса выбора распознавателя. Вместо того, чтобы приспосабливаться к распознавателям, клиентам DNS нужны более надёжные механизмы определения функций, настроенных на этих распознавателях.

Данный документ задаёт механизм, позволяющий передавать клиентам DNS сведения о распознавателях DNS в процессе выбора распознавателя. Например, процедура выбора распознавателя может использовать извлечённые сведения о распознавателях для установки более высокого приоритета сохраняющим приватность распознавателям по отношению к не поддерживающим минимизацию QNAME [RFC9156].Другим примером является выбор клиентом DNS распознавателя на основе возможностей фильтрации. Например, клиент DNS может выбрать распознаватель, фильтрующий домены на основе правил безопасности с блокировкой расширенных ошибок (Blocked (15) Extended DNS Error или EDE) [RFC8914]. Как вариант, клиент может использовать правило отказа от выбора распознавателей, подменяющих отклики с использованием Forged Answer (4) EDE. Однако определение процедур и правил выбора выходит за рамки документа. Если явно не указано иное, этот документ не влияет на операции распознавателя после выбора распознавателя клиентом DNS.

Документ определяет новый тип записи о ресурсах (resource record или RR), позволяющий клиентам DNS подавать запросы к рекурсивным распознавателям. Исходные сведения, которые может захотеть предоставлять распознаватель, указаны в разделе 5. Эта информация включает свойства, влияющие на политику приватности и прозрачности распознавателя. В будущем могут регистрироваться и другие сведения, как указано в параграфе 8.2. Сведения о распознавателях не предназначены для конечного пользователя.

2. Термины

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

В документе применяются термины, определённые в [RFC9499], а также приведённые ниже термины.

Encrypted DNS — DNS с шифрованием

Схема DNS где обмен сообщениями DNS выполняется по шифрованному каналу между клиентом и сервером DNS (например, DNS over HTTPS (DoH) [RFC8484], DNS over TLS (DoT) [RFC7858], DNS over QUIC (DoQ) [RFC9250]).

Encrypted DNS resolver — распознаватель DNS с шифрованием

Распознаватель DNS, поддерживающий схему DNS с шифрованием.

Reputation — репутация

Оценка, получаемая идентифицируемым участником в сообществе или Internet в целом, как указано в разделе 1 [RFC7070].

3. Извлечение сведений о распознавателе

Клиент DNS, желающий получить сведения о распознавателе, может использовать RR типа RESINFO, определённого в этом документе. Содержимое RDATA в отклике на запрос RESINFO RR QTYPE описано в разделе 5. Если распознаватель понимает RESINFO RR, в RRset должна включаться единственная запись. Клиенты DNS должны игнорировать недействительные записи. RESINFO — это свойство распознавателя, а не субъект рекурсивного распознавания.

Клиент DNS может извлекать сведения о распознавателе и помощью RESINFO RR и QNAME доменного имени, применяемого для аутентификации распознавателя DNS и названного Authentication Domain Name (ADN) в DNR [RFC9463].

Если применяется специальное имя resolver.arpa, определённое в [RFC9462], для обнаружения распознавателей DNS с шифрованием, клиент может получить сведения о распознавателе с помощью RESINFO RR и QNAME resolver.arpa. В этом случае клиенту придётся сталкиваться с риском отсутствия поддержки распознавателем типа RESINFO. Распознаватель может передать запрос выше (upstream) и тогда клиент может получить положительный отклик RESINFO от любого легитимного распознавателя DNS или от злоумышленника.

Клиент DNS должен сбрасывать (0) в запросе бит желательности рекурсии (Recursion Desired или RD). Клиент DNS должен отбрасывать отклик, если в нем сброшен (0) флаг AA, что указывает отсутствие у распознавателя DNS полномочий для данного отклика.

Если группа распознавателей имеет общий домен ADN и/или anycast-адрес, этим распознавателям следует раскрывать согласованные сведения RESINFO.

4. Формат сведений о распознавателе

Записи сведений о распознавателе имеют такой же формат, как DNS TXT. Правила для записей TXT заданы в базовой спецификации DNS (параграф 3.3.14 в [RFC1035]) и более подробно описаны в спецификации обнаружения служб на основе DNS (DNS-based Service Discovery или DNS-SD) (параграф 6.1 в [RFC6763]). Рекомендации по ограничению размера записей TXT рассмотрены в параграфе 6.1 [RFC6763].

Подобно DNS-SD, тип RESINFO RR использует пары ключ-значение для передачи сведений о распознавателе. Каждая пара кодируется с использованием правил, заданных в параграфе 6.3 [RFC6763]. Использование стандартизованного синтаксиса для типа RESINFO RR упрощает определение новых ключей. Если клиент DNS встречает в RESINFO RR неизвестный ключ, он должен игнорировать его. Для ключей RESINFO должны применяться правила параграфа 6.4 [RFC6763].

Ключи сведений о распознавателе должны быть определены в реестре IANA (параграф 8.2) или начинаться с префикса temp-, обозначающего локальное использование.

5. Ключи и значения сведений о распознавателе

Ниже приведены определения ключей сведений о распознавателе.

qnamemin

Наличие этого ключа указывает поддержку распознавателем DNS минимизации QNAME [RFC9156] для повышения уровня приватности DNS. Отметим, что в соответствии с правилами параграфа 6.4 в [RFC6763] отсутствие символа = делает ключ логическим атрибутом, не имеющим значения.
Наличие ключа указывает, что распознаватель DNS настроен на минимизацию влияющих на приватность данных, передаваемых полномочному серверу имён.
Этот атрибут является необязательным.

exterr

Если распознаватель DNS поддерживает опцию EDE, определённую в [RFC8914], для возврата дополнительных сведений о причинах ошибок DNS, значение этого ключа содержит коды EDE, которые может возвращать этот распознаватель DNS. Это может быть один или несколько кодов EDE. Диапазоны значений должны указываться через дефис (-), набор несмежных значений должен указываться через запятые.
Возвращаемые коды EDE (например, Blocked (15), Censored (16), Filtered (17)) показывают, настроен ли распознаватель DNS на раскрытие причин, по которым запрос был отфильтрован/заблокирован при возникновении соответствующего события. Если возможности распознавателя обновляются для включения новых похожих кодов, он может прервать сессию TLS, предлагая клиенту организовать новое соединение TLS и снова извлечь сведения о распознавателе. Это позволяет клиенту иметь актуальные сведения о возможностях распознавателя. При получении клиентом для запроса DNS кода EDE, не указанного в exterr, клиент может снова запросить распознаватель о его возможностях в части возврата новых кодов ошибок. Если несоответствие сохраняется, клиент может счесть сведения о распознавателе недостоверными и отбросить их.
Этот атрибут является необязательным.

infourl

Ссылка URL, указывающая базовые неструктурированные сведения о распознавателе (например, поддерживаемые DoH API, возможные коды статуса HTTP, возвращаемые сервером DoH, способы оповещения о проблемах) для поиска неполадок. Сервер, раскрывающий такие сведения, называется сервером сведений о распознавателе (resolver information server). Такой сервер должен поддерживать для сведений о распознавателе только тип содержимого text/html. Клиент DNS должен отвергать, как недействительные, URL с отличной от https схемой. Недействительные URL должны игнорироваться. Полученные по URL сведение должны рассматриваться лишь как диагностическая информация для персонала IT. Они не предназначены для конечных пользователей, поскольку могут вводить их в заблуждение.
Этот ключ может применяться персоналом IT для получения иных полезных сведений о распознавателе, а также для процедур информирования о проблемах (например, некорректная фильтрация).
Этот атрибут является необязательным.

Новые ключи могут создаваться по процедуре, указанной в параграфе 8.2.

6. Пример

На рисунке 1 представлен пример записи со сведениями о распознавателе.

     resolver.example.net. 7200 IN RESINFO qnamemin exterr=15-17
                           infourl=https://resolver.example.com/guide

Рисунок . Пример записи сведений о распознавателе.


Как отмечено в разделе 3, клиент DNS, обнаруживший ADN resolver.example.net своего распознавателя с использованием DNR, будет передавать запрос RESINFO RR QTYPE для ADN и узнает, что:

  • распознаватель поддерживает минимизацию QNAME;

  • распознаватель может возвращать коды Blocked (15), Censored (16), Filtered (17);

  • дополнительную информацию можно получить по ссылке https://resolver.example.com/guide.

7. Вопросы безопасности

Клиенты DNS, взаимодействующие с обнаруженными распознавателями DNS, должны использовать одну из указанных мер предотвращения атак с поддельными откликами DNS.

  1. Организация аутентифицированного защищённого соединения с распознавателем DNS.

  2. Реализация локальной проверки DNSSEC (раздел 10 в [RFC9499]) для контроля подлинности сведений о распознавателе.

Важно отметить, что для запросов resolver.arpa подходит лишь первый вариант.

Распознаватель с шифрованием может возвращать в RESINFO некорректные сведений. Если клиент не может проверить полученные от распознавателя атрибуты, которые будут служить для выбора распознавателя или отображаться конечному пользователю, клиенту следует обрабатывать такие атрибуты лишь при наличии у распознавателя с шифрованием достаточной в соответствии с локальной политикой репутации (например, настройки пользователя или администратора, встроенный список проверенных распознавателей). Такой подход ограничивает возможности злонамеренных распознавателей в части нанесения вреда ложными заявлениями.

8. Взаимодействие с IANA

8.1. Тип RESINFO RR

Агентство IANA обновило реестр Resource Record (RR) TYPEs в рамках группы реестров Domain Name System (DNS) Parameters [RRTYPE], как показано ниже.

   Type:  RESINFO
   Value:  261
   Meaning:  Resolver Information as Key/Value Pairs
   Reference:  RFC 9606

8.2. Регистрация ключей DNS Resolver Information

Агентство IANA создало новый реестр DNS Resolver Information Keys в рамках группы реестров Domain Name System (DNS) Parameters [IANA-DNS]. Этот реестр содержит определения ключей, которые могут применяться для предоставления сведений о распознавателях. Ключи добавляются в реестр по процедуре Specification Required (параграф 4.6 в [RFC8126]). Назначенным экспертам следует тщательно рассматривать влияние на безопасность в результате добавления ключа в этот реестр. Дополнительные подробности приведены в параграфе 8.3. Структура реестра приведена ниже.

Name

Имя ключа, которое должно соответствовать определению из раздела 4. В реестр IANA недопустимо включать имена с префиксом temp-, поскольку такие имена могут свободно применяться в любой реализации.

Description

Описание зарегистрированного ключа.

Reference

Указание документа со спецификацией зарегистрированного элемента.

Исходное содержимое реестра представлено в таблице 1.

Таблица . Исходное содержимое реестра DNS Resolver Information Keys.

Имя

Описание

Документ

qnamemin

Наличие этого ключа указывает поддержку минимизации QNAME.

RFC 9606

exterr

Список поддерживаемых кодов расширенных ошибок DNS. Это должны быть десятичные значения INFO-CODE из реестра Extended DNS Error Codes <https://www.iana.org/assignments/dns-parameters/>.

RFC 9606

infourl

Ссылка URL на неструктурированные сведения о распознавателе, используемые для устранения неполадок.

RFC 9606

8.3. Рекомендации для назначенных экспертов

Предполагается назначать несколько экспертов для рассмотрения запросов на включение в реестр.

Критерии, которым следует руководствоваться назначенным экспертам, включают проверку дублирования имеющихся записей, чёткость описания и соответствие целям данного реестра.

Запросы на регистрацию рассматриваются в течение двухнедельного срока по результатам рассмотрения одним или несколькими назначенными экспертами. В течение этого срока назначенные эксперты одобряют или отклоняют запрос и передают своё решение в IANA. При отказе следует включать объяснение причин и, при необходимости, рекомендации по внесению изменений для последующего одобрения запроса.

9. Литература

9.1. Нормативные документы

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, <https://www.rfc-editor.org/info/rfc1035>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC6763] Cheshire, S. and M. Krochmal, «DNS-Based Service Discovery», RFC 6763, DOI 10.17487/RFC6763, February 2013, <https://www.rfc-editor.org/info/rfc6763>.

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8914] Kumari, W., Hunt, E., Arends, R., Hardaker, W., and D. Lawrence, «Extended DNS Errors», RFC 8914, DOI 10.17487/RFC8914, October 2020, <https://www.rfc-editor.org/info/rfc8914>.

[RFC9156] Bortzmeyer, S., Dolmans, R., and P. Hoffman, «DNS Query Name Minimisation to Improve Privacy», RFC 9156, DOI 10.17487/RFC9156, November 2021, <https://www.rfc-editor.org/info/rfc9156>.

[RFC9462] Pauly, T., Kinnear, E., Wood, C. A., McManus, P., and T. Jensen, «Discovery of Designated Resolvers», RFC 9462, DOI 10.17487/RFC9462, November 2023, <https://www.rfc-editor.org/info/rfc9462>.

[RFC9463] Boucadair, M., Ed., Reddy.K, T., Ed., Wing, D., Cook, N., and T. Jensen, «DHCP and Router Advertisement Options for the Discovery of Network-designated Resolvers (DNR)», RFC 9463, DOI 10.17487/RFC9463, November 2023, <https://www.rfc-editor.org/info/rfc9463>.

9.2. Дополнительная литература

[IANA-DNS] IANA, «Domain Name System (DNS) Parameters», <https://www.iana.org/assignments/dns-parameters/>.

[RESINFO] Sood, P. and P. Hoffman, «DNS Resolver Information Self-publication», Work in Progress, Internet-Draft, draft-pp-add-resinfo-02, 27 June 2020, <https://datatracker.ietf.org/doc/html/draft-pp-add-resinfo-02>.

[RFC7070] Borenstein, N. and M. Kucherawy, «An Architecture for Reputation Reporting», RFC 7070, DOI 10.17487/RFC7070, November 2013, <https://www.rfc-editor.org/info/rfc7070>.

[RFC7858] Hu, Z., Zhu, L., Heidemann, J., Mankin, A., Wessels, D., and P. Hoffman, «Specification for DNS over Transport Layer Security (TLS)», RFC 7858, DOI 10.17487/RFC7858, May 2016, <https://www.rfc-editor.org/info/rfc7858>.

[RFC8484] Hoffman, P. and P. McManus, «DNS Queries over HTTPS (DoH)», RFC 8484, DOI 10.17487/RFC8484, October 2018, <https://www.rfc-editor.org/info/rfc8484>.

[RFC9250] Huitema, C., Dickinson, S., and A. Mankin, «DNS over Dedicated QUIC Connections», RFC 9250, DOI 10.17487/RFC9250, May 2022, <https://www.rfc-editor.org/info/rfc9250>.

[RFC9499] Hoffman, P. and K. Fujiwara, «DNS Terminology», BCP 219, RFC 9499, DOI 10.17487/RFC9499, March 2024, <https://www.rfc-editor.org/info/rfc9499>.

[RRTYPE] IANA, «Resource Record (RR) TYPEs», <https://www.iana.org/assignments/dns-parameters/>.

Благодарности

В этой спецификации используется документ [RESINFO].

Спасибо Tommy Jensen, Vittorio Bertola, Vinny Parla, Chris Box, Ben Schwartz, Tony Finch, Daniel Kahn Gillmor, Eric Rescorla, Shashank Jain, Florian Obser, Richard Baldry, Martin Thomson за обсуждения и комментарии.

Спасибо Mark Andrews, Joe Abley, Paul Wouters, Tim Wicinski за обсуждение правил форматирования RR.

Отдельная благодарность Tommy Jensen за тщательную вдумчивую рецензию Shepherd.

Спасибо Johan Stenstam и Jim Reid за рецензию dns-dir, Ray Bellis за рецензию выделения RRTYPE, Arnt Gulbrandsen за рецензию ART и Mallory Knodel за рецензию gen-art.

Спасибо Éric Vyncke за рецензию AD.

Спасибо Gunter Van de Velde, Erik Kline, Paul Wouters, Orie Steele, Warren Kumari, Roman Danyliw, Murray Kucherawy за рецензию IESG.

Адреса авторов

Tirumaleswar Reddy.K
Nokia
India
Email: kondtir@gmail.com
 
Mohamed Boucadair
Orange
35000 Rennes
France
Email: mohamed.boucadair@orange.com

Перевод на русский язык

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC | Оставить комментарий

RFC 9608 No Revocation Available for X.509 Public Key Certificates

Internet Engineering Task Force (IETF)                        R. Housley
Request for Comments: 9608                                Vigil Security
Updates: 5280                                                   T. Okubo
Category: Standards Track                                       DigiCert
ISSN: 2070-1721                                                J. Mandel
                                                            AKAYLA, Inc.
                                                               June 2024

No Revocation Available for X.509 Public Key Certificates

Расширение для указания недоступности отзыва сертификатов открытых ключей X.509

PDF

Аннотация

Сертификаты открытых ключей X.509v3 описаны в RFC 5280. В Internet всё шире применяются краткосрочные сертфикаты и удостоверяющие центры (Certification Authority или CA), выпускающие такие сертификаты не публикуют сведений об отзыве, поскольку сроки действия сертификатов меньше времени, требуемого на обнаружение и распространение сведений об отзыве. У некоторых долгосрочных сертификатов открытых ключей X.509v3 срок действия не ограничен и они тоже не отзываются. Данная спецификация определяет расширение сертификата noRevAvail, чтобы полагающаяся на сертификат сторона могла легко определить, что CA не публикует сведений об отзыве и обновить алгоритм проверки пути сертификации, заданный в RFC 5280, чтобы пропускать проверку отзыва при наличии в сертификате расширения noRevAvail.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9608.

Авторские права

Авторские права (Copyright (c) 2024) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно, поскольку в них описаны права и ограничения, относящиеся к данному документу. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Введение

Краткосрочные сертификаты открытых ключей X.509v3 [RFC5280] все шире применяются в Internet. Например, среда автоматического управления сертификатами (Automatic Certificate Management Environment или ACME) [RFC8555] обеспечивает простой способ получения краткосрочных сертификатов. Во многих случаях удостоверяющие центры (CA) не предоставляют сведений об отзыве краткосрочных сертификатов. Это обусловлено тем, что срок их действия меньше времени, требуемого для обнаружения и распространения сведений об отзыве. В результате отзыв краткосрочных сертификатов, служащих для проверки подлинности или управления ключами, становится ненужным и бессмысленным. С другой стороны, отзыв сертификатов, связанных с долгосрочными подписями (например, для документов или программного кода), позволяет получить важные сведения о моментах обнаружения компрометации.

Некоторые сертификаты открытых ключей X.509v3 имеют неограниченный срок действия и никогда не отзываются. Например, фабрика может включать сертификат IDevID [IEEE802.1AR] для привязки назначенного устройству идентификатора к устаноленному при производстве открытому ключу. Идентификатор может включать модель и серийный номер устройства, которые никогда не меняются. Для указания того, что для сертификата не задан срок действия, в поле notAfter периода действия сертификата устанавливается значение 99991231235959Z [RFC5280].

Данная спецификация задаёт расширение сертификата noRevAvail, позволяющее доверяющей стороне легко понять, что CA не публикует сведений об отзыве сертификата конечного субъекта, и обновляет алгоритм проверки пути сертификации [RFC5280], чтобы проверка отзыва не выполнялась при наличии в сертификате расширения noRevAvail.

Отметим, что расширение сертификата noRevAvail обеспечивает функциональность, похожую на расширение ocsp-nocheck [RFC6960]. Последнее подходит лишь для включения в сертификаты, выпущенные для респондентов протокола Online-статуса сертификатов (Online Certificate Status Protocol или OCSP), тогда как расширение noRevAvail можно применять в любом сертификате конечного субъекта, для которого CA не публикует сведений об отзыве. Чтобы не нарушать экосистему OCSP, разработчикам не следует считать расширение noRevAvail заменой ocsp-nocheck и оно может включаться в сертификаты для ответчиков OCSP, как дополнение к ocsp-nocheck.

1.1. Уровни требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.2. ASN.1

Сертификаты X.509 создаются с помощью ASN.1 [X.680] по базовым (Basic Encoding Rules или BER) и отличительным (Distinguished Encoding Rules или DER) правилам кодирования [X.690].

1.3. История

В 1988 г. сертификат X.509v1 был определён CCITT [X.509-1988].

В 1997 г. сертификат X.509v3 и сертификат атрибута был определён ITU-T [X.509-1997].

В 1999 г. IETF впервые было предложено использовать сертификаты X.509v3 в Internet [RFC2459].

В 2000 г. определено (ITU-T) расширение noRevAvail для использования сертификатами атрибутов [X.509-2000].

В 2002 г. впервые задан профиль сертификата атрибута (IETF) для использования в Internet [RFC3281] и этот профиль включал поддержку расширения noRevAvail.

В 2019 г., опубликовано обновление ITU-T Recommendation X.509 [X.509-2019].

В связи с расширяющимся применением в Internet краткосрочных сертификатов недавнее техническое исправление (Technical Corrigendum) для ITU-T Recommendation X.509 [X.509-2019-TC2] позволяет применять расширение noRevAvail для сертификатов открытых ключей и атрибутов.

2. Расширение сертификата noRevAvail

Расширение noRevAvail, заданное в [X.509-2019-TC2], позволяет CA указать недоступность сведений об отзывае для этого сертификата.

Это расширение недопустимо включать в сертификаты открытых ключей CA.

Соответствующие спецификации CA должны включать это расширение в сертификаты, для которых не будут публиковаться сведения об отзыве. При наличии расширения соответствующий спецификации CA должен помечать расширение как некритическое (non-critical).

   name           id-ce-noRevAvail
   OID            { id-ce 56 }
   syntax         NULL (i.e. '0500'H is the DER encoding)
   criticality    MUST be FALSE

Полагающаяся на сертификат сторона, не понимающая это расширение, может получить список отзыва сертификатов (Certificate Revocation List или CRL) от CA, но в этом CRL не будет записей для сертификатов с таким расширением.

3. Другие расширения сертификатов X.509

В сертификаты CA недопустимо включать расширение noRevAvail. В сертификаты с noRevAvail недопустимо включать расширения, указывающие репозитории CRL или местоположение ответчиков OCSP. При наличии noRevAvail в сертификате:

  • недопустимо включать в него расширение с cA BOOLEAN = TRUE (см. параграф 4.2.1.9 в [RFC5280]);

  • недопустимо включать в него расширение CRL Distribution Points (см. параграф 4.2.1.13 в [RFC5280]);

  • недопустимо включать в него расширение Freshest CRL (см. параграф 4.2.1.15 в [RFC5280]);

  • при наличии расширения Authority Information Access недопустимо включать в него id-ad-ocsp accessMethod (см. параграф 4.2.2.1 в [RFC5280]).

При нарушении любого из условий принимающая сертификат сторона должна считать его недействительным.

4. Проверка пути сертификации

В параграфе 6.1.3 [RFC5280] описана обработка сертификата в рамках процедур проверки пути сертификации. В частности, в п. (a)(3) сказано:

В настоящий момент сертификат не отозван. Это можно определить из соответствующего CRL (параграф 6.3), сведений о состоянии или автономных (out-of-band) механизмов.

При наличии заданного здесь расширения noRevAvail или расширения ocsp-nocheck [RFC6960] п. (a)(3) пропускается, а ином случае выполняется определение статуса отзыва сертификата.

5. Модуль ASN.1

В этом разделе представлен модуль ASN.1 [X.680] для расширения сертификата noRevAvail с использованием соглашений [RFC5912] и [RFC6268].

   <CODE BEGINS>
     NoRevAvailExtn
       { iso(1) identified-organization(3) dod(6) internet(1)
         security(5) mechanisms(5) pkix(7) id-mod(0)
         id-mod-noRevAvail(110) }

     DEFINITIONS IMPLICIT TAGS ::=
     BEGIN

     IMPORTS
       EXTENSION
       FROM PKIX-CommonTypes-2009  -- RFC 5912
         { iso(1) identified-organization(3) dod(6) internet(1)
           security(5) mechanisms(5) pkix(7) id-mod(0)
           id-mod-pkixCommon-02(57) } ;

     -- Расширение сертификата noRevAvail

     ext-noRevAvail EXTENSION ::= {
       SYNTAX NULL
       IDENTIFIED BY id-ce-noRevAvail
       CRITICALITY { FALSE } }

     -- noRevAvail Certificate Extension OID

     id-ce OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) ds(5) 29 }

     id-ce-noRevAvail OBJECT IDENTIFIER ::= { id-ce 56 }

     END
   <CODE ENDS>

6. Вопросы безопасночти

К этом документу применим одноимённый раздел [RFC5280].

При наличии в сертификате расширения noRevAvail проверки отзыва сертификата обходятся. Правила и практика CA должны гарантировать включение noRevAvail лишь в те сертификаты, где оно необходимо, поскольку некорректное использование или ошибочная конфигурация могут привести к доверию получающей стороны к отозванному сертификату. При обнаружении такого некорректного использования единственно возможным средством исправления является отзыв CA.

Некоторые приложения могут зависеть от сведений об отзыве или предполагать их доступность. Отсутствие таких сведений может потребовать изменения приложения или его настроек для обеспечения надлежащей безопасности и функциональности приложения.

Отсутствие сведений об отзыве ограничивает возможности принимающей сертификат стороны в плане обнаружения компрометации ключевого материала конечного субъекта или вредоносных сертификатов. Это также ограничивает возможности обнаружения CA, не обеспечивающих практику безопасности, правила выпуска сертификатов и контроль операций, заданные в политике сертификата (Certificate Policy или CP) или заявлении о практике сертификации (Certification Practices Statement или CPS) [RFC3647].

Поскольку отсутствие сведений об отзыве может ограничивать возможности обнаружения скомпрометированного ключевого материала и вредоносных сертификатов, принимающим сертификаты сторонам нужна уверенность в том, что CA следует практике безопасности, реализует правила выпуска сертификатов и надёжно управляет операциями. Доверяющие стороны могут оценивать надёжность CA, отслеживает их производительность и наблюдать за возможностями реагирования на инциденты.

6.1. Краткосрочные сертификаты

Для краткосрочных сертификатов сведения об отзыва не предоставляются, поскольку срок действия сертификата меньше времени, требуемого для обнаружения и распространения таких сведений. При некорректном использовании noRevAvail в сертификатах с недостаточно коротким сроком действия возникает возможность использования скомпрометированных секретных ключей. Поэтому важно до реализации расширения noRevAvail тщательно оценить и установить подходящие сроки действия сертификатов.

6.2. Долгосрочные сертификаты

Для некоторых долгосрочных сертификатов сведения об отзыва не предоставляются, поскольку срок действия сертификата никогда не заканчивается. Например, сертификаты IDevID [IEEE802.1AR] включаются в устройства при производстве и служат для получения сертификатов LDevID [IEEE802.1AR] в рабочей среде. В этом случае необходимо выбирать криптографические алгоритмы, которые считаются безопасными в течение предполагаемого срока использования устройств. Если применяется расширение noRevAvail, у CA не будет возможности уведомить доверяющие стороны о компрометации установленного при производстве ключевого материала.

7. Взаимодействие с IANA

Агентство IANA выделило приведённый в таблице 1 идентификатор объекта (OID) для модуля ASN.1 (раздел 5) в реестре SMI Security for PKIX Module Identifier (1.3.6.1.5.5.7.0).

Таблица .

 

Десятичное значение

Описание

110

id-mod-noRevAvail

 

8. Литература

8.1. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, «Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile», RFC 5280, DOI 10.17487/RFC5280, May 2008, <https://www.rfc-editor.org/info/rfc5280>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[X.509-2019-TC2] ITU-T, «Information Technology — Open Systems Interconnection — The Directory: Public-key and attribute certificate frameworks — Technical Corrigendum 2», ITU-T Recommendation X.509-2019/Cor.2-2023, October 2023, <https://www.itu.int/rec/T-REC-X.509-202310-I!Cor2>.

[X.680] ITU-T, «Information technology — Abstract Syntax Notation One (ASN.1): Specification of basic notation», ITU-T Recommendation X.680, ISO/IEC 8824-1:2021, February 2021, <https://www.itu.int/rec/T-REC-X.680>.

[X.690] ITU-T, «Information technology — ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)», ITU-T Recommendation X.690, ISO/IEC 8825-1-2021, February 2021, <https://www.itu.int/rec/T-REC-X.690>.

8.2. Дополнительная литература

[IEEE802.1AR] IEEE, «IEEE Standard for Local and Metropolitan Area Networks — Secure Device Identity», IEEE 802.1AR-2018, DOI 10.1109/IEEESTD.2018.8423794, 2 August 2018, <https://ieeexplore.ieee.org/document/8423794>.

[RFC2459] Housley, R., Ford, W., Polk, W., and D. Solo, «Internet X.509 Public Key Infrastructure Certificate and CRL Profile», RFC 2459, DOI 10.17487/RFC2459, January 1999, <https://www.rfc-editor.org/info/rfc2459>.

[RFC3281] Farrell, S. and R. Housley, «An Internet Attribute Certificate Profile for Authorization», RFC 3281, DOI 10.17487/RFC3281, April 2002, <https://www.rfc-editor.org/info/rfc3281>.

[RFC3647] Chokhani, S., Ford, W., Sabett, R., Merrill, C., and S. Wu, «Internet X.509 Public Key Infrastructure Certificate Policy and Certification Practices Framework», RFC 3647, DOI 10.17487/RFC3647, November 2003, <https://www.rfc-editor.org/info/rfc3647>.

[RFC5912] Hoffman, P. and J. Schaad, «New ASN.1 Modules for the Public Key Infrastructure Using X.509 (PKIX)», RFC 5912, DOI 10.17487/RFC5912, June 2010, <https://www.rfc-editor.org/info/rfc5912>.

[RFC6268] Schaad, J. and S. Turner, «Additional New ASN.1 Modules for the Cryptographic Message Syntax (CMS) and the Public Key Infrastructure Using X.509 (PKIX)», RFC 6268, DOI 10.17487/RFC6268, July 2011, <https://www.rfc-editor.org/info/rfc6268>.

[RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., Galperin, S., and C. Adams, «X.509 Internet Public Key Infrastructure Online Certificate Status Protocol — OCSP», RFC 6960, DOI 10.17487/RFC6960, June 2013, <https://www.rfc-editor.org/info/rfc6960>.

[RFC8555] Barnes, R., Hoffman-Andrews, J., McCarney, D., and J. Kasten, «Automatic Certificate Management Environment (ACME)», RFC 8555, DOI 10.17487/RFC8555, March 2019, <https://www.rfc-editor.org/info/rfc8555>.

[X.509-1988] CCITT, «The Directory — Authentication Framework», CCITT Recommendation X.509-1988, November 1988, <https://www.itu.int/rec/T-REC-X.509-198811-S>.

[X.509-1997] ITU-T, «Information technology — Open Systems Interconnection — The Directory: Authentication framework», ITU-T Recommendation X.509-1997, August 1997, <https://www.itu.int/rec/T-REC-X.509-199708-S>.

[X.509-2000] ITU-T, «Information Technology — Open Systems Interconnection — The Directory: Public-key and attribute certificate frameworks», ITU-T Recommendation X.509-2000, March 2000, <https://www.itu.int/rec/T-REC-X.509-200003-S>.

[X.509-2019] ITU-T, «Information Technology — Open Systems Interconnection — The Directory: Public-key and attribute certificate frameworks», ITU-T Recommendation X.509-2019, October 2019, <https://www.itu.int/rec/T-REC-X.509-201910-I>.

Благодарности

Большое спасибо Erik Anderson за его усилия по созданию расширения сертификатов noRevAvail для использования с сертификатами открытых ключей конечных субъектов и сертификатами атрибутов.

Большое спасибо Corey Bonnell, Hendrik Brockhaus, Tim Hollebeek, Mike Ounsworth, Seo Suchan, Carl Wallace, Éric Vyncke, Paul Wouters (указаны в алфавитном порядке) за рецензиии и полезные комментарии.

Адреса авторов

Russ Housley
Vigil Security, LLC
Herndon, Virginia
United States of America
Email: housley@vigilsec.com
 
Tomofumi Okubo
DigiCert, Inc.
Fairfax, Virginia
United States of America
Email: tomofumi.okubo+ietf@gmail.com
 
Joseph Mandel
AKAYLA, Inc.
Tacoma, Washington
United States of America
Email: joe@akayla.com

Перевод на русский язык

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC | Оставить комментарий

RFC 9583 Application Scenarios for the Quantum Internet

Internet Research Task Force (IRTF)                              C. Wang
Request for Comments: 9583              InterDigital Communications, LLC
Category: Informational                                        A. Rahman
ISSN: 2070-1721                                                 Ericsson
                                                                   R. Li
                                                     Kanazawa University
                                                              M. Aelmans
                                                        Juniper Networks
                                                          K. Chakraborty
                                             The University of Edinburgh
                                                               June 2024

Application Scenarios for the Quantum Internet

Сценарии применения Quantum Internet

PDF

Аннотация

Quantum Internet может улучшить функциональность приложений за счёт внедрения квантовой теории информации в инфраструктуру Internet. В этом документе представлен обзор некоторых приложений, которые предположительно будут применяться в Quantum Internet, и дана их классификация. Рассматриваются также некоторые общие требования к Quantum Internet. Целью документа является описание модели для приложений и некоторых вариантов применения Quantum Internet. Документ является результатом работы исследовательской группы Quantum Internet (QIRG).

Статус документа

Документ не относится к категории Internet Standards Track и публикуется для информации.

Документ является результатом работы IRTF1. IRTF публикует результаты относящихся к Internet исследований и разработок. Эти результаты могут оказаться не пригодными для реализации. Данный RFC представляет согласованное мнение исследовательской группы QIRG в рамках IRTF. Документы, одобренные для публикации IRSG, не претендуют на статус Internet Standard (см. раздел 2 в RFC 7841).

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9583.

Авторские права

Авторские права (Copyright (c) 2024) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (https://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно.

1. Введение

Классическая (не квантовая) сеть Internet постоянно растёт с момента, когда она стала коммерчески доступной в начале 1990-х годов. По сути, сеть состоит из большого числа конечных узлов (например, ноутбуков, смартфонов, серверов), соединённых маршрутизаторами и объединённых в автономные системы (Autonomous System или AS). На конечных узлах могут работать приложения, предоставляющие конечным пользователям такие услуги, как передача голоса, видео или данных. Соединения между узлами Internet включают магистральные каналы (например, оптические), линии доступа (например, оптически, Wi-Fi, сотовые сети, DSL2). Биты передаются через Classical Internet в пакетах.

В последние несколько лет активизировались исследования и эксперименты по разработке квантовых сетей (Quantum Internet) [Wehner]. Конечные узлы также будут частью Quantum Internet и в этом случае их называют квантовыми конечными узлами (quantum end node). Эти узлы могут соединяться квантовыми повторителями и маршрутизаторами. На конечных квантовых узлах будут работать добавляющие услуги (value-added) приложения, которые будут рассмотрены ниже.

Квантовые каналы физического уровня между узлами Quantum Internet могут быть волноводами (например, оптическими волокнами) или открытым пространством. Особенно полезны фотонные каналы, поскольку свет (фотоны) очень хорошо подходит для физической реализации кубитов. Quantum Internet будет работать в соответствии с принципами квантовой физики, такими как суперпозиция и запутанность [RFC9340].

Предполагается, что Quantum Internet не заменит, а усовершенствует Classical Internet и/или обеспечит прорывные приложения. Например, квантовое распространение ключей может повысить уровень безопасности Classical Internet, а квантовые вычисления — ускорить и оптимизировать задачи с большим объёмом расчётов. Quantum Internet будет работать в связке с Classical Internet, а процессы интеграции будут похожи на процесс внедрения новых коммуникационных и сетевых парадигм в существующую сеть Internet, но с более серьёзными последствиями.

Назначение этого документа состоит в обеспечении базового понимания и моделей применения Quantum Internet. Отмечается, что в ITU-T SG13-TD158/WP3 [ITUT] кратко описаны 4 вида использования квантовых сетей в дополнение к квантовому распространению ключей. Это квантовая синхронизация часов, квантовые вычисления, квантовые генераторы случайных чисел и квантовые коммуникации (например, квантовые цифровые подписи, квантовая анонимная передача, квантовые деньги). Этот документ сосредоточен на квантовых приложениях, оказывающих важное влияние на работу сетей, таких как организация защищённых коммуникаций, квантовые вычисления вслепую и распределенные квантовые вычисления. Хотя такие приложения упомянуты в [ITUT], этот документ указывает больше деталей и задаёт некоторые требования с точки зрения сети.

Документ был создан исследовательской группой QIRG и обсуждался в почтовой конференции QIRG и на встречах исследовательской группы. Документ был детально рассмотрен членами QIRG, имеющими опыт в квантовой физике и работе Classical Internet. Документ представляет согласованное мнение членов QIRG, являющихся как экспертами в данной области (квантовая физика и сети), так и новичками, которые являются целевой аудиторией. Это не результат работы IETF и не стандарт.

2. Термины и сокращения

В этом документе предполагается знакомство читателя с концепциями и терминами квантовой теории информации, представленными в [RFC9340]. Кроме того, ниже даны определения некоторых терминов и сокращений.

Bell Pairs — пары Белла

Особый тип квантового состояния двух кубитов. Такие два кубита демонстрируют корреляцию, которую невозможно встретить в классической теории информации. Такую корреляцию называют квантовой запутанностью. Пары Белла демонстрируют максимальную квантовую запутанность. Одним из примеров пары Белла является (|00>+|11>)/(Sqrt(2)). Пары Белла являются фундаментальным ресурсом квантовых коммуникаций.

Bit — бит

Двоичная цифра (фундаментальная единица информации в классических коммуникациях и вычислениях). Биты применяются в Classical Internet, где состояние бита детерминировано. В Quantum Internet состояние кубита является неопределённым до его измерения.

Classical Internet

Существующая сеть Internet (около 2020 г.), где биты переносятся в пакетах между узлами для передачи информации. В Classical Internet поддерживаются приложения, которые могут быть усовершенствованы в Quantum Internet. Например, сквозная защита приложений Classical Internet может быть улучшена за счёт защищённой организации коммуникаций с использованием квантовых приложений. Classical Internet — это сеть классических сетевых узлов, не поддерживающих квантовую теорию информации. Quantum Internet состоит из квантовых узлов, основанных на квантовой теории информации.

Entanglement Swapping — обмен запутанностью

Процесс обобщения (sharing) запутанности между двумя удалёнными одна от другой сторонами через некие промежуточные узлы. Предположим, например, что имеется три стороны (A, B, C) и каждая из сторон имеет общие пары Белла — (A, B) и (B, C). B может использовать кубиты, общие с A и C, для выполнения операций обмена запутанностью и в результате A и C будут иметь одщие пары Белла. Обмен запутанностью, по сути, реализует распространение (распределение) запутанности, где два разнесённых территориально узла могут иметь общую пару Белла.

Fast Byzantine Negotiation — быстрые византийские переговоры (согласование)

Квантовый метод быстрого согласования в Византийских переговорах3 [Ben-Or] [Taherkhani].

Local Operations and Classical Communication (LOCC) — локальные операции и классические коммуникации

Метод, при котором узлы могут взаимодействовать в раундах, где (1) они могут передавать друг другу любую классическую информацию, (2) могут индивидуально выполнять локальные квантовые операции и (3) выполняемые в каждом раунде операции могут зависеть от результатов предыдущих раундов.

Noisy Intermediate-Scale Quantum (NISQ) — зашумлённые квантовые системы промежуточного уровня

Определение NISQ было дано в [Preskill] для представления ближайшей эры квантовой технологии. Согласно этому определению, компьютеры NISQ имеют две важных особенности: (1) размер компьютеров NISQ варьируется от 50 до нескольких сотен физических кубитов (промежуточный уровень) и (2) кубиты в компьютерах NISQ имеют врожденные ошибки и контроль над ними несовершенен (шум).

Packet — пакет

Самоидентифицирующееся сообщение со встроенными адресами или иными сведениями, которые могут служить для пересылки сообщения. Сообщение содержит упорядоченный набор битов определённого числа (количества). Биты пакета являются классическими.

Prepare and Measure — подготовка и измерение

Набор сценариев Quantum Internet, в которых квантовые узлы поддерживают лишь простые квантовые функции (подготовка и измерение кубитов). Например, BB84 [BB84] — это протокол квантового распределения ключей с подготовкой и измерением.

Quantum Computer (QC) — квантовый компьютер

Квантовый конечный узел, имеющий квантовую память и возможности квантовых вычислений, считается полноценным квантовым компьютером.

Quantum End Node — квантовый конечный узел

Конечный узел, на котором размещаются приложения и интерфейсы с остальной частью Internet. Обычно конечный узел может служить клиентом, сервером или узлом одноранговой сети в зависимости от приложения. Квантовый конечный узел должен также быть способным взаимодействовать с Classical Internet для целей управления, т. е. принимать, обрабатывать и передавать классические биты и/или пакеты.

Quantum Internet

Сеть квантовых сетей. Предполагается слияние Quantum Internet с Classical Internet. Quantum Internet может улучшить классические приложения и создать новые квантовые приложения.

Quantum Key Distribution (QKD) — квантовое распространение ключей

Метод, использующий квантовую механику (например, теорему об отсутствии клонирования), чтобы позволить паре узлов создать один и тот же произвольный классический ключ.

Quantum Network — квантовая сеть

Новый тип сети, создаваемый на основе квантовой теории информации, где квантовые ресурсы, такие как кубиты и запутанность, используются и передаются между квантовыми узлами. Квантовая сеть будет использовать квантовые каналы и классические каналы Classical Internet. Это называется гибридной реализацией.

Quantum Teleportation — квантовая телепортация

Метод доставки квантовой информации с помощью локальных операций и классической связи (LOCC). Если две стороны имеют общую пару Белла, отправитель может передать квантовый бит данных получателю без его передачи по физическому квантовому каналу.

Qubit — кубит

Квантовый бит (фундаментальная единица информации в квантовых коммуникациях и вычислениях). Кубит похож на классический бит в том, что имеет после измерения состояние 0 или 1, обозначаемые как |0> и |1> в нотации Дирака. Однако кубит отличается от классического бита тем, что он до измерения может быть линейной комбинацией обоих состояний, которую называют суперпозицией. Для кодирования кубита может применяться любая из нескольких степеней свободы (Degrees of Freedom или DOF) фотона (например, поляризация, time-bin, частота) или электрона (например, спин).

Teleport a Qubit — телепортация кубита

Операция на двух или более кубитах последовательно для переноса кубита от отправителя к получателю с использованием квантовой телепортации.

Transfer a Qubit — перенос кубита

Операция переноса кубита от отправителя к получателю без указания способа перемещения кубита, каковым может служить передача или телепортаци.

Transmit a Qubit — передача кубита

Операция кодирования кубита в подвижный носитель (обычно, фотон) и его передачи по квантовому каналу от отправителя (передатчик) к получателю.

3. Применение Quantum Internet

Предполагается, что применение Quantum Internet будет полезно для некоторых имеющихся и новых приложений. Приложения Quantum Internet все ещё находятся в стадии разработки, поскольку становление Quantum Internet пока не завершено [Castelvecchi] [Wehner]. Однако начальный (и неполный) список приложений, поддерживаемых в Quantum Internet уже можно определить и классифицировать с использованием двух разных схем. Отметим, что этот документ не рассматривает квантовых вычислений, которые полностью выполняются на локальном узле.

Приложения можно группировать по решаемым задачам (услугам). В частности, можно выделить указанные ниже категории.

Quantum cryptography applications — квантовая криптография

Использование квантовой теории информации для задач криптографии (например, квантового распространения ключей [Renner]).

Quantum sensor applications — квантовые датчики

Использование квантовой теории информации для поддержки распределенных датчиков (например, синхронизации часов [Jozsa2000] [Komar] [Guo]).

Quantum computing applications — квантовые вычисления

Использование квантовой теории информации для поддержки удалённых квантовых вычислительных комплексов (например, распределённые квантовые вычисления [Denchev]).

Эта схема будет понятна технической и нетехнической аудитории. Ниже схема рассматривается более подробно.

3.1. Квантовая криптография

Примеры квантовой криптографии включают организацию защищённой квантовой связи и быстрое византийское согласование.

Secure communication setup — организация защищённых коммуникаций

Защищённое распространение криптографических ключей между двумя (или более) конечными узлами. Наиболее известный метод называется квантовым распространением ключей (QKD) [Renner].

Fast Byzantine negotiation — быстрое византийское согласование

Квантовый мотод быстрого согласования в византийских переговорах [Ben-Or], например, для сокращения числа ожидаемых раундов связи и ускоренного соглашения в классических византийских переговорах. Квантовое византийское соглашение в сетях квантовых повторителей, предложенное в [Taherkhani], включает методы оптимизации, позволяющие значительно сократить глубину квантовой схемы (устройства) и число кубитов на каждом узле. Квантовые методы бытрого согласования в византийских переговорах можно применять для улучшения протколов согласия (consensus), таких как pBFT4, а также иных функций распределенного вычисления, использующих византийское согласование.

Quantum money — квантовые деньги

Основным требованием к деньгам является невозможность их подделки. Схема квантовых денег нацелена на использованием свойства невозможности клонирования неизвестных квантовых состояний. Хотя идея квантовых денег возникла ещё в 1970 г., ранние протоколы позволяли проверить подлинность квантовых денег лишь банку-эмитенту. Недавние протоколы, такие как квантовые деньги с открытым ключом [Zhandry] позволяют любому локально проверить подлинность денег.

3.2. Квантовые датчики и метрология

Запутанность, суперпозиция, интерференция и сжатие свойств могут повышать чувствительность квантовых датчиков и в конечном счёте превзойти классические варианты. Примерами применения квантовых датчиков являются синхронизация часов, высокочувствительные датчики и т. п. Эти приложения в основном используют сеть запутанных квантовых датчиков (т. е. сеть квантовых датчиков) для высокоточных измерений множества параметров [Proctor].

Network clock synchronization — синхронизация часов

Общемировой набор часов, подключённых к Quantum Internet для обеспечения сверхточных сигналов часов [Komar] с ограничениями точности, определяемыми квантовой теорией.

High-sensitivity sensing — датчики с высокой чувствительностью

Приложения, использующие квантовые явления для достижения надёжного наноразмерного измерения физических величин. Например, в [Guo] применяется запутанная квантовая сеть для измерения среднего сдвига фазы между множеством распределенных узлов.

Interferometric telescopes using quantum information — интерферометрические телескомы

Интерферометрические методы, применяемые для объединения сигналов от двух и более телескопов с целью получения изображений с более высоким разрешением, нежели может обеспечить отдельный телескоп. Это позволяет исследовать очень мелкие астрономические объекты, если телескопы распределены по большой площади. Однако флуктуации фазы и потери фотонов в каналах связи между телескопами вносят ограничения на размер базы оптических интерферометров. Потенциально это ограничение можно обойти с помощью квантовой телепортации. В общем случае обобщение пар Эйнштейна-Подольского-Розена с использованием квантовых повторителей позволяет оптическим интерферометрам обмениваться фотонами на больших расстояниях, обеспечивая базу произвольного размера [Gottesman2012].

3.3. Квантовые вычисления

В этом параграфе рассматриваются приложения для квантовых вычислений. Предполагается, что квантовые компьютеры в будущем станут доступными как облачные услуги. Иногда для запуска таких приложений в облаке с сохранением приватности клиенту и серверу потребуется обмен кубитами (например, для расчётов вслепую [Fitzsimons], как описано ниже. Поэтому для сохранения приватности в приложениях квантовых вычислений потребуется Quantum Internet.

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

Distributed quantum computing — распределенные квантовые вычисления

Набор распределенных квантовых компьютеров малой мощности (например, с небольшим числом кубитов), соединённых между собой и работающих согласованно для имитации высокопроизводительного квантового компьютера [Wehner].

Blind quantum computing — квантовые вычисления вслепую

Квантовые расчёты с сохранением приватности, обеспечивающие клиентам возможность передачи вычислительных задач одному или нескольким удалённым квантовым компьютерам без раскрытия источника данных для расчётов [Fitzsimons].

4. Некоторые приложения Quantum Internet

В Quantum Internet будут поддерживаться различные приложения и конфигурации развёртывания. В этом разделе описано несколько ключевых сценариев использования, демонстрирующих преимущества Quantum Internet. В системной инженерии сценарий приложения обычно представляет собой набор возможных последовательностей взаимодействия между узлами и пользователями в определённой серде для достижения конкретной цели. Это определение применяется в данном разделе.

4.1. Организация защищённых коммуникаций

В этом сценарии двум узлам (например, квантовым узлам A и B) требуется организовать защищённую связь для передачи конфиденциальных сведений (см. рисунок 1). Для этого им сначала нужно защищённым способом организовать общий классический секретный криптографический ключ (последовательность классических битов). Процесс запускает конечный пользователь с защищённым локальным интерфейсом к квантовому узлу A. В результате квантовый узел A защищённо организует классический секретный ключ с квантовым узлом B. Это называется организацией защищённой связи. Отметим, что квантовые узлы A и B могут быть простыми (bare-bone) квантовыми узлами или полноценными квантовыми компьютерами. Это приложение показывает, что Quantum Internet можно использовать для повышения защищенности приложений Classical Internet.

Одним из требований к такому процессу организации защищённой связи является неуязвимость к классическим и квантовым вычислительным атакам. Этого можно добиться с помощью квантового распространения ключей (QKD), которое в принципе не поддаётся взлому. QKD может защищённо организовать секретный ключ между парой квантовых узлов, используя классический канал проверки подлинности и незащищённый квантовый канал без физической передачи ключа через сеть, что обеспечивает требуемую защиту. Однако необходимо позаботиться о защите системы QKD от атак по побочным физическим каналам, которые могут скомпрометировать систему. Примером атаки по побочному физическому каналу является скрытое введение дополнительного света в оптические устройства, применяемые QKD, чтобы получить сведения о системе, такие как поляризация. Другие специализированные атаки на QKD используют классический канал аутентификации и незащищённый квантовый канал. К таким атакам относятся переотображение фазы (phase-remapping), расщепление числа фотонов, ложное состояние [Zhao2018]. QKD можно применять для разных криптографических коммуникаций, таких как IPsec и защита транспортного уровня (Transport Layer Security или TLS), где участвующие стороны должны организовать общий ключ защиты, хотя это обычно влечёт высокую задержку.

QKD является наиболее развитым свойством квантовой информационной технологии и такое распространение ключей уже реализовано коммерчески в небольших системах и на коротких расстояниях. Варианты применения QKD описаны в документе ETSI [ETSI-QKD-UseCases], а интерфейс между пользователями и устройствами QKD задан в [ETSI-QKD-Interfaces].

В общем случае протоколы QKD с подготовкой и измерением (например, [BB84]) без использования запутанности работают, как описано ниже.

  1. Квантовый узел A кодирует классические биты в кубиты. Узел A генерирует две строки случайных классических битов X и Y. Строка X служит для выбора базы, Y — для выбора состояния, соответствующего выбранной базе. Например, при X=0 в случае использования протокола BB84 Алиса готовит состояние в базе {|0>, |1>}, иначе — в базе {|+>, |->}. При Y=0 Алиса готовит кубит как |0> или |+> (в зависимости от X), а при Y =1 — как |1> или |->.

  2. Квантовый узел A передаёт кубиты квантовому узлу B по квантовому каналу.

  3. Квантовый узел B принимает кубиты и измеряет каждый из них в одной из двух баз, выбранной случайно.

  4. Квантовый узел B информирует квантовый узел A о своём выборе базы для каждого кубита.

  5. Квантовый узел A сообщает квантовому узлу B, какие из случайно выбранных баз были верны.

  6. Оба узла отбрасывают все биты измерений с отличающейся квантовой базой, а оставшиеся биты могут служить секретным ключом. Перед генерацией финального секретного ключа выполняется процедура пост-обработки через аутентифицированные классические каналы. Эта процедура может делиться на 3 этапа — оценка параметров, исправление ошибок и повышение приватности. На этапе оценки параметров Алиса и Боб используют некоторые из битов для оценки канальных ошибок. Если число ошибок превышает некий порог, протокол прерывается, иначе выполняется корректировка ошибок. Если подслушивающий попытается перехватить и прочитать кубиты, переданные от A к B, он будет обнаружен в соответствии с теоремой квантовой механики об энтропийной неопределённости. Как часть процедуры пост-обработки оба узла обычно выполняют сверку (reconciliation) информации [Elkouss] для эффективного исправления ошибок и/или проводят усиление приватности [Tang] для генерации окончательных ключей на основе теории информации.

  7. Процедура пост-обработки должна выполняться по аутентифицированному классическому каналу. Иными словами, квантовым узлам A и B нужно убедиться в подлинности классического канала, чтобы быть уверенными в отсутствии на пути подслушивающих или атакующих. Проверка выполняется по протоколам аутентификации, иаким как [Kiktenko]. В соответствии с [Kiktenko] подлинность классического канала проверяется в самом конце процедуры пост-обработки вместо того, чтобы делать это для каждого классического сообщения передаваемого по каналу между квантовыми узлами A и B.

Следует отметить ряд обстоятельств, указанных ниже.

  1. Имеются усовершенствованные протоколы QKD, основанные на [BB84]. Например, был обнаружен ряд брешей, связанных с несовершенством измерительных устройств, и имеются решения, учитывающие такие атаки, например, независимое от измерительных устройств решение QKD [Zheng2019]. Эти улучшенные протоколы QKD могут работать иначе, нежели описанные этапы протокола BB84 [BB84].

  2. Для крупномасштабных QKD, требуются сети QKD (QKD Network или QKDN), которые можно считать частью Quantum Internet. QKDN может включать прикладной, сетевой и канальный уровень QKD [Qin]. Между квантовыми узлами A и B может находиться один или несколько ретрансляторов QKD [Zhang2018], соединённых через QKDN. Как вариант, QKDN может работать на основе распространения запутанности и основанных на запутанности протоколов QKD. В результате для крупномасштабных QKD будут требоваться квантовые повторители и/или маршрутизаторы вместо доверенных ретрансляторов QKD. Для распределения запутанности может применяться обмен запутанностью.

  3. QKD обеспечивает основанные на теории информации общие секретные ключи для двух сторон (передатчик и приёмник) при наличии подслушивания. Однако это верно в теории, которая в значительной мере оторвана от практики. Используя несовершенство детекторов, Ева может получить сведения об общем ключе [Xu]. Для предотвращения таких атак через побочные каналы в [Lo] исследователи предложили протокол QKD, названный независимым от измерительных устройств (Measurement Device-Independent или MDI) QKD, где два пользователя (передатчик Алиса и приёмник Боб) могут безопасно взаимодействовать даже если используемое ими (измерительное) оборудование подменено (захвачено) злоумышленником и перестало быть доверенным. Это достигается путём измерения корреляция между сигналами от Алисы и Боба вместо измерения самих сигналов.

  4. Протоколы QKD, основанные на QKD с непрерывной переменной (Continuous Variable QKD или CV-QKD), вызывают в последнее время большой интерес, поскольку для их реализации достаточно легко доступного и широко распространённого телекоммуникационного оборудования. Этот тип технологии потенциально обеспечит высокопроизводительный метод защищённого распространения ключей на ограниченных расстояниях. Недавние демонстрации CV-QKD показали совместимость с классическими схемами когерентного детектирования, которые широко применяются в классических широкополосных системах связи [Grosshans]. Отметим, что до сих пор нет квантовых повторителей для систем с непрерывными переменными, поэтому этот тип QKD пригоден лишь для коротких расстояний или сетей QKD с доверенными ретрансляторами.

  5. Распространение секретов может применяться для распределения секретного ключа между множеством узлов, позволяя каждому узлу знать долю или часть секретного ключа, но не предоставляя всего ключа ни одному из узлов. Секретный ключ можно восстановить лишь при совместной работе достаточного числа узлов. Квантовым обменом секретами (Quantum Secret Sharing или QSS) обычно называют сценарий, где секретный ключ обобществляется на основе квантовых состояний, а не классических битов. QSS позволяет разделять (splitting) и обобществлять (sharing) такие квантовые состояния между множеством узлов.

  6. Имеются основанные на запутанности протоколы QKD, такие как описано в [Treiber], [E91] и [BBM92], которые работают не так, как описано в предыдущих этапах. Основанные на запутанности схемы, где состояния запутанности подготавливаются вне квантовых узлов A и B, обычно не считают подготовкой и измерением, описанными в [Wehner]. Другие схемы на основе запутанности, где запутанность создаётся внутри квантового узла-источника и служит для вывода ключей, могут считаться подготовкой и измерением. Схемы с передачей и возвратом (Send-and-return) могут считаться подготовкой и измерением, если информационное содержимое, из которого выводятся ключи, подготавливаются в квантовом узле A перед их отправкой квантовому узлу B для измерения.

Quantum Internet на рисунке 1 включает квантовые каналы. Для организации защищённой связи, особенно в больших системах, требуется также генерация и распространение запутанности [QUANTUM-CONNECTION], квантовые повторители и/или маршрутизаторы, доверенные ретрансляторы QKD.

+---------------------+
|Конечный пользователь|
+---------------------+
      ^
      | Локальный защищённый интерфейс
      | (например, то же физическое оборудование
      | или локальная защищённая сеть)
      V
+-----------------+     /--------\     +-----------------+
|                 |--->( Quantum  )--->|                 |
|                 |    ( Internet )    |                 |
|                 |     \--------/     |                 |
|Квантовый узел A |                    |Квантовый узел B |
|                 |     /--------\     |                 |
|                 |    ( Classical)    |                 |
|                 |<-->( Internet )<-->|                 |
+-----------------+     \--------/     +-----------------+

Рисунок . Организация защищённой связи.


4.2. Квантовые расчёты вслепую

Квантовыми расчётами вслепую называют описанный ниже сценарий.

  1. Клиентский узел с исходными данными передаёт вычисления удалённому расчётному узлу (серверу).

  2. Клиентский узел не хочет раскрывать удалённому узлу исходные данные, сохраняя их приватность.

  3. Нет каких-либо допущений или гарантий о доверии к удалённому расчётному узлу в части приватности исходных данных.

В примере на рисунке 2 терминальный узел может быть небольшим квантовым компьютером с ограниченными вычислительными возможностями по сравнению с удаленным квантовым расчётным узлом (например, квантовым мэйнфреймом), но терминальному узлу нужно решить задачу с большим объёмом вычислений (например, алгоритм факторизации Шора). Терминальный узел может создать отдельные кубиты и передать их удалённому квантовому расчётному узлу. После этого удалённый квантовый узел может запутать кубиты, выполнить расчёты, провести измерения, оформляя их результаты в классических битах, и вернуть эти результаты терминальному узлу. Следует отметить, что для удалённого квантового расчётного узла эти результаты будут выглядеть просто случайными данными, поскольку начальные состояния кубитов были выбраны криптографически защищённым способом.

Как новая вычислительная модель клиент-сервер, квантовые расчёты вслепую (Blind Quantum Computation или BQC) в целом позволяет выполнить представленный ниже процесс.

  1. Клиент делегирует вычислительную функцию серверу.

  2. Клиент не передаёт исходные кубиты серверу, но передаёт тому преобразованные кубиты.

  3. Сервер применяет вычислительную функцию к преобразованным кубитам для создания промежуточных результатов (кубиты) с помощью квантовых расчётов на основе квантовой схемы (устройства) или квантовых измерений. Сервер передаёт клиенту кубиты промежуточных результатов.

  4. Клиент получает кубиты промежуточных результатов и преобразует их в кубиты окончательных результатов.

В этом процессе сервер не может восстановить исходные кубиты из преобразованных. Прямое и обратное (для результатов) преобразование кубитов не требует от клиента значительных усилий. Один из первых протоколов BQC (например, описанный в [Childs]) следует этому процессу, но у клиента требуется наличие некоторого объёма квантовой памяти, подготовка и измерение кубитов, а также их передача. Основанные на измерениях квантовые вычисления выходят за рамки этого документа, а более подробные сведения приведены в [Jozsa2005].

Следует отметить ряд обстоятельств, указанных ниже.

  1. Протокол BQC из [Childs] — это основанная на устройстве модель BQC, где клиент реализует лишь простую квантовую схему, а сервер выполняет цепочку квантовых логических операций. Кубиты передаются туда и обратно между клиентом и сервером.

  2. Universal BQC (UBQC) из [Broadbent] — это основанная на измерениях модель BQC, где выполняются квантовые измерения с использованием запутанных состояний. Принцип UBQC основан на том, что квантовая трансформация плюс измерение Белла с поворотом (базы) реализуют квантовые вычисления, которые могут повторяться для реализации расчётной цепочки. В этом случае клиент сначала готовит преобразованные кубиты, затем передаёт их серверу, а тому нужно сначала подготовить запутанные состояния из всех принятых кубитов. Далее между клиентом и сервером выполняется множество раундов взаимодействия и измерения:

    1. клиент передаёт серверу новые инструкции по измерению или его адаптации;

    2. сервер выполняет измерения в соответствии с полученными инструкциями для получения результатов (в кубитах или классических битах);

    3. клиент получает результаты измерения и преобразует их в окончательные результаты.

  3. В [Zhang2009] предложен гибридный вариант UBQC, где сервер реализует квантовые устройства (схемы), подобно показанным в [Childs], и квантовые измерения, похожие на показанные в [Broadbent], для снижения числа требуемых запутанных состояний [Broadbent]. Клиент в этом случае много проще, нежели в [Childs]. Этот гибридный вариант BQC является сочетанием моделей BQC на основе схемы и измерений.

  4. В идеальном случае клиент BQC является чисто классическим и ему требуется лишь взаимодействие с сервером по классическим каналам. В [Huang] продемонстрирован такой подход, где клиент использует два запутанных сервера для выполнения BQC в предположении невозможности взаимодействия между этими серверами (в противном случае расчёты вслепую и приватность клиента не гарантируются). Продемонстрированный в [Huang] сценарий, по сути, является примером BQC с несколькими серверами.

  5. Проверка соответствия выполненного сервером запросам и ожиданиям клиента важна для многих протоколов BQC, называемых верифицируемыми. В [Fitzsimons] обсуждается этот вопрос и сравниваются протоколы BQC.

На рисунке 2 Quantum Internet включает квантовые каналы и квантовые повторители и/или квантовые маршрутизаторы для передачи кубитов на большие расстояния [RFC9340].

+----------------+     /--------\     +-------------------+
|                |--->( Quantum  )--->|                   |
|  Терминальный  |    ( Internet )    | Удалённый узел    |
|  узел          |     \--------/     | квантовых расчётов|
|  (например     |                    | (например,        |
|  небольшой     |     /--------\     | удалённый         |
|  квантовый     |    ( Classical)    | квантовый         |
|  компьютер     |<-->( Internet )<-->| мэйнфрейм)        |
+----------------+     \--------/     +-------------------+

Рисунок . Квантовые расчёты вслепую.


4.3. Распределённые квантовые расчёты

Существует два способа распределенных квантовых расчётов [Denchev].

  1. Использование квантовой механики для улучшений классических распределенных расчётов. Например, можно использовать запутанные квантовые состояния для улучшения выбора лидера в классических распределенных расчётах путём простого измерения запутанных квантовых состояний на каждой стороне (например, на узле или устройстве) без каких-либо классических коммуникаций между разнесёнными сторонами [Pal]. Обычно сначала нужно организовать между сторонами предварительную запутанность, а затем выполнить операции LOCC на каждой стороне. При этом обычно не нужно передавать кубиты между сторонами.

  2. Распределение функций квантовых вычислений между разнесёнными квантовыми компьютерами. Задача или функция квантовых расчётов (например, квантовые вентили) расщепляется и распределяется между множеством физически разделённых квантовых компьютеров. При этом может потребоваться передача кубитов (входных или выходных) между этими распределенными компьютерами. Для поддержки таких распределенных задач требуются и фактически применяются запутанные состояния.

    1. Запутанные состояния можно создавать заранее и хранить или буферизовать.

    2. Скорость создания запутанности будет ограничивать производительность практических приложений Quantum Internet, включая распределенные квантовые расчёты, хотя запутанные состояния можно буферизовать.

    Например, в [Gottesman1999] и [Eisert] показано, что управляемые инверторы (Controlled NOT или CNOT) можно реализовать совместно на нескольких квантовых компьютерах и распределить между ними. Далее в этом параграфе рассматривается в основном этот тип распределенных квантовых вычислений.

В качестве варианта распределенных квантовых вычислений второго типа можно рассматривать зашумлённые квантовые компьютеры среднего масштаба (NISQ), размещённые в разных местах, доступных для обобществления. В соответствии с определением [Preskill] компьютер NISQ может реализовать лишь небольшое число кубитов и имеет ограниченные возможности корректировки квантовых ошибок. Этот вариант называют распределёнными квантовыми расчётами [Caleffi] [Cacciapuoti2020] [Cacciapuoti2019]. Он отражает значительный рост вычислительной мощности, которые квантовые компьютеры могут обеспечить в составе Quantum Internet по сравнению с классическими компьютерами Classical Internet в контексте экосистемы распределенных квантовых вычислений [Cuomo]. Согласно [Cuomo], квантовая телепортация позволяет применять новую парадигму связи, называемую «теледанными» (teledata) [VanMeter2006-01], где квантовые состояния переносятся между кубитами разнесённых квантовых компьютеров. Для распределенных квантовых расчётов требуется возможность удалённо выполнять квантовые вычисления на кубитах распределённых квантовых компьютеров, например, методом «телевентилей» (telegate) [VanMeter2006-02].

Например, пользователь может применить соединённые компьютеры NISQ для выполнения сложных научных расчётов, таких как анализ химических взаимодействий для разработки медицинских препаратов [Cao] (см. рисунок 3). В этом случае кубиты передаются между квантовыми компьютерами по квантовым каналам, а запросы пользователя для координации и управления — по классическим. Другим примером являются многосторонние защищённые квантовые расчёты (Multi-Party Quantum Computation или MPQC) [Crepeau], которые можно считать квантовым вариантом классических многосторонних защищённых расчётов (Multi-Party Computation или MPC). В защищённом протоколе MPQC множество участников совместно выполняют квантовые расчёты с набором входных квантовых состояний, подготавливаемых и предоставляемых разными участниками. Одной из целей защищённого MPQC является гарантия того, что ни один из участников не будет знать квантовых состояний, предоставленных другими. Защищённые расчёты MPQC полагаются на верифицированный квантовый обмен секретами [Lipinska].

В примере на рисунке 3 нужно перенести кубиты с одного компьютера NISQ на другой. Для этого можно применить квантовую телепортацию для переноса с квантового компьютера (A) на квантовый компьютер (B). Отметим, что на рисунке 3 не рассматриваются распределенный квантовый расчёт на основе измерений, где телепортация может не требоваться. При реализации квантовой телепортации между узлами A и B выполняются указанные ниже действия. Фактически на обоих компьютерах выполняются операции LOCC [Chitambar] для выполнения квантовой телепортации.

  1. Квантовый компьютер A генерирует некие кубиты конфиденциальных данных для телепортирования в B.

  2. Организуется общая запутанность A и B (т. е. имеется два запутанных кубита — q1 на A и q2 на B). Например, квантовый компьютер A может создать два запутанных кубита (q1 и q2) и передать q2 квантовому компьютеру B, используя квантовую связь.

  3. Компьютер A выполняет измерение Белла для запутанного кубита q1 и кубита конфиденциальных данных.

  4. Результат измерения Белла кодируется в 2 классических бита, которые передаются по классическому каналу квантовому компьютеру B.

  5. На основе полученных 2 классических битов компьютер B меняет состояние запутанного кубита q2, чтобы создать кубит, идентичный кубиту конфиденциальных данных в компьютере A.

На рисунке Quantum Internet включает квантовые каналы и квантовые повторители и/или маршрутизаторы [RFC9340]. Этот вариант приложения должен поддерживать создание и распространение запутанности (или квантовое соединение) [QUANTUM-CONNECTION] для выполнения квантовой телепортации.

                +---------------------+
                |Конечный пользователь|
                +---------------------+
                           ^
                           | Локальный защищённый интерфейс
                           | (например, то же физическое оборудование
                           |  или локальная защищённая сеть)
                           V
        +------------------+-------------------+
        |                                      |
        |                                      |
        V                                      V
+----------------+     /--------\     +----------------+
|                |--->( Quantum  )--->|                |
|                |    ( Internet )    |                |
|   Квантовый    |     \--------/     |   Квантовый    |
|   компьютер A  |                    |   компьютер B  |
|  (например,    |     /--------\     |  (например,    |
|   сайт 1)      |    ( Classical)    |   сайт 2)      |
|                |<-->( Internet )<-->|                |
+----------------+     \--------/     +----------------+

Рисунок . Распределённые квантовые вычисления.


5. Общие требования

Квантовые технологии постоянно развиваются и совершенствуются, поэтому сложно предсказать сроки и этапы будущего квантовых технологий, как отмечено в [Grumbling]. В настоящее время компьютер NISQ может поддерживать от 50 до нескольких сотен кубитов с определённой долей ошибок.

В работе [Wehner] описаны 6 этапов развития Quantum Internet на сетевом уровне.

  1. Сети доверенных повторителей (Этап 1).

  2. Сети с подготовкой и измерением (Этап 2).

  3. Сети распределения запутанности (Этап 3).

  4. Сети квантовой памяти (Этап 4).

  5. Устойчивые к отказам сети из нескольких кубитов (Этап 5).

  6. Сети квантовых вычислений (Этап 6).

Первый этап — это простые сети доверенных повторителей, а на последнем возникают сети квантовых вычислений, образующие Quantum Internet. Каждый промежуточный этап добавляет функции, приложения и характеристики. В таблице 1 показаны сценарии применения Quantum Internet, описанные в разделах 3 и 4, с отображением на этапы Quantum Internet из [Wehner]. Например, организация защищённой связи может поддерживаться на этапе 1, 2 или 3, но с применением разных решений QKD.

  • На этапе 1 возможны базовые решения QKD для поддержки организации защищённой связи, но для сквозной защиты нужны доверенные узлы. Их наличие является основным требованием.

  • На этапе 2 конечные пользователи могут подготавливать и измерять кубиты. Доступна проверка классических паролей без их раскрытия.

  • На этапе 3 может обеспечиваться сквозная защита на основе квантовых повторителей и распределения запутанности для поддержки одного и того же приложения организации защищённой связи. Основным требованием является распространение запутанности для использования QKD на длинных дистанциях.

  • На этапе 4 квантовые повторители получат возможность хранения кубитов и манипуляций ими в квантовой памяти. В этих квантовых сетях можно выполнять расчёты вслепую, выбор лидера, обобществление секретов.

  • На этапе 5 квантовые повторители смогут исправлять ошибки, что позволит выполнять отказоустойчивые квантовые расчёты по полученным данным. Эти повторители позволят выполнять распределенные квантовые расчёты и приложения с квантовыми датчиками на небольшом числе кубитов.

  • На этапе 6 станут возможны распределенные между большим числом кубитов квантовые расчёты.

Таблица . Примеры приложений на разных этапах Quantum Internet.

 

Этап

Примеры приложений Quantum Internet

Характеристики

1

Организация защищённой связи с базовыми QKD

Доверенные узлы

2

Организация сквозной защиты связи с применением QKD

Подготовка и измерение

3

Организация защищённой связи с применением QKD с запутанностью

Распространение запутанности

4

Квантовые вычисления вслепую

Квантовая память

5

Высокоточная синхронизация часов

Отказоустойчивость

6

Распределенные квантовые вычисления

Множество кубитов

 

Некоторые общие и функциональные требования к Quantum Internet с точки зрения сетей, основанные на указанных выше вариантах применения и планах развития технологий Quantum Internet [Wehner] кратко описаны в последующих параграфах.

5.1. Операции на запутанных кубитах

Требуются методы, позволяющие квантовым приложениям эффективно взаимодействовать с запутанными кубитами, чтобы можно было инициировать распространение выбранных запутанных кубитов потенциально любому квантовому узлу Quantum Internet. Для этого нужно выполнить на запутанных кубитах определённые операции (например, обмен запутанностью или её очистка). Квантовые узлы могут быть конечными узлами, повторителями, маршрутизаторами, квантовыми компьютерами.

5.2. Распределение запутанности

Квантовым повторителям и маршрутизаторам следует поддерживать отказоустойчивое и эффективное распределение запутанности для организации и расширения высокоточной связи между двумя квантовыми узлами. Для этого нужно сначала создать запутанную пару на каждом этапе (hop) пути между двумя узлами, а затем выполнить обмен запутанностью на каждом из промежуточных узлов.

5.3. Необходимость классических каналов

Квантовые конечные узлы должны передавать дополнительную информацию по классическим каналам, чтобы помочь в передаче и распознании кубитов через квантовые повторители и/или маршрутизаторы. Примеры такой дополнительной информации включают измерения кубитов при организации защищённой связи (параграф 4.1) и измерения Белла в распределенных квантовых вычислениях (параграф 4.3). Кроме того, кубиты передаются индивидуально и с ними не связано заголовков пакетов, которые могли бы помочь при передаче. Любые сведения, способствующие маршрутизации, идентификации кубитов и т. п., должны передаваться по классическим каналам.

5.4. Управление Quantum Internet

Для Quantum Internet нужны методы управления и контроля на уровне квантовых узлов и их квантовых ресурсов. Ресурсы квантового узла могут включать квантовую память, квантовые каналы, кубиты, организованные квантовые соединения и т. п. Методы управления могут применяться для отслеживания состояния Quantum Internet, диагностики и обнаружения возможных проблем (например, в квантовых соединениях), а также настройки на квантовых узлах новых действий и/или правил (например, новых операций обмена запутанностью). Может потребоваться разработка новой информационной модели для Quantum Internet.

6. Заключение

В этом документе приведён обзор некоторых ожидаемых категорий приложений Quantum Internet, а также описаны детали некоторых вариантов применения. Приложения сгруппированы по их использованию для упрощения понимания схемы классификации. Набор приложений, разумеется, может расширяться по мере развития Quantum Internet. Приведены также некоторые базовые требования к Quantum Internet.

Документ может служить введением для читателей, заинтересованных в изучении практического применения Quantum Internet. Авторы надеются, что документ поможет направить дальнейшие исследования и разработки функциональности Quantum Internet, требуемой для реализации описанных здесь вариантов применения.

7. Взаимодействие с IANA

Этот документ не требует действия IANA.

8. Вопросы безопасности

Этот документ не задаёт архитектуру или конкретные протоколы для Quantum Internet и посвящён лишь вариантам применения, требованиям и описанию типичных приложений Quantum Internet. Тем не менее можно сделать несколько важных замечаний в части безопасности Quantum Internet.

В [NISTIR8240] отмечено, что реализация крупномасштабных квантовых вычислений позволит взломать множество систем с открытым ключом (асимметричных), используемых сегодня. Это связано с ростом вычислительных возможностей квантовых компьютеров для некоторых классов задач (например, факторизации и оптимизации простых чисел). Это негативно повлияет на многие механизмы защиты, применяемые в Classical Internet и основанные на шифровании с открытым ключом (Diffie-Hellman (DH)). Это стало мощным стимулом для разработки новых криптографических систем, устойчивых в атакам с использованием квантовых вычислений [NISTIR8240]. Развитие Quantum смягчит угрозы, вносимые атаками на криптосистемы на основе открытых ключей DH. В частности, организация защищённых коммуникаций Quantum (параграф 4.1) будет устойчива к квантовым и классическим атакам на криптосистемы с открытыми ключами Diffie-Hellman.

В [RFC7258] рассмотрена важная для Quantum Internet угроза и отмечена опасность внедрения повсеместного мониторинга как широкой атаки на приватность. Повсеместный мониторинг определён как широко распространённое и обычно скрытое наблюдение путём сбора содержимого приложений или метаданных протокола, таких как заголовки. Это может быть реализовано путём пассивного или активного прослушивания, анализа трафика или подмены криптографических ключей, применяемых для защиты коммуникаций.

Организация защищённой связи в Quantum Internet (параграф 4.1) устойчива к повсеместному мониторингу, основанному на прямых атаках на ключи шифрования (Diffie-Hellman). Кроме того, в параграфе 4.2 описан метод распределенных квантовых расчётов с сохранением приватности исходных данных. Присущее кубитам свойство распада при наблюдении (даже скрытном) теоретически позволит обнаружить нежелательное наблюдение в некоторых будущих решениях.

Современные сети основаны на принципах отсутствия доверия (zero trust), где классическая криптография служит для защиты конфиденциальности и целостности, а также для аутентификации на разных логических уровнях сетевого стека, зачастую на всем пути от устройства до программ в облаке [NISTSP800-207]. Используемые сегодня криптографические решения основаны на хорошо известных примитивах, заведомо безопасных протоколах и современных реализациях, защищённых от множества атак через побочные каналы.

В отличие от традиционной и постквантовой криптографии (Post-Quantum Cryptography или PQC), защита QKD неотъемлемо связана с физическим уровнем, что делает фронты атаки на QKD и традиционную криптографию совершенно разными. Реализации QKD уже подвергались известным атакам [Zhao2008] и Агентство национальной безопасности (National Security Agency или NSA) США отмечает, что профиль рисков традиционной криптографии известен лучше [NSA]. Реализация традиционной криптографии и PQC на более высоких уровнях, чем физический, означает, что PQC можно использовать для передачи защищённой информации через недоверенные ретрансляторы. Это контрастирует с QKD, где основой является сквозная защита путём передачи через доверенные промежуточные узлы. PQC лучше подходит для современных технологий, где все больше приложение переходит к принципам сквозной защиты и отсутствия доверия. Важно отметить, что PQC можно внедрить путём обновления программ, а для QKD требуется новое оборудование. В IETF имеется рабочая группа по использованию постквантовой криптографии в протоколах (Post-Quantum Use In Protocols или PQUIP), изучающая вопросы перехода на PQC.

В плане реализации QKD АНБ (NSA) утверждает, что в QKD требования к защите и связи имеют физические противоречия, а инженерные решения для их балансировки крайне неустойчивы к ошибкам. Традиционная криптография может быть реализована аппаратно для повышения производительности или по иным причинам, а QKD по своей природе является аппаратным решением. АНБ отмечает, что это делает подход QKD менее гибким в части обновления или защитных исправлений. Поскольку QKD является протоколом «точка-точка» (point-to-point), АНБ также отмечает, что сети QKD часто требуют использования доверенных ретрансляторов, что повышает риск, связанный с внутренними угрозами.

Национальный центр кибербезопасности Великобритании (UK National Cyber Security Centre) предостерегает от применения QKD, особенно в критически важных секторах национальной инфраструктуры, и предлагает использовать криптографию PQC, стандартизованную NIST, как лучшее решение [NCSC]. Национальное агентство кибербезопасности Франции (National Cybersecurity Agency of France) считает возможным применять QKD в качестве средства глубокой защиты, дополняющего традиционную криптографию, если связанные с этим затраты не окажут негативного влияния на защиту от текущих угроз инфраструктуре систем IT [ANNSI].

9. Литература

[ANNSI] French Cybersecurity Agency (ANSSI), «Should Quantum Key Distribution be Used for Secure Communications?», May 2020, <https://www.ssi.gouv.fr/en/publication/should-quantum-key-distribution-be-used-for-secure-communications/>.

[BB84] Bennett, C. H. and G. Brassard, «Quantum cryptography: Public key distribution and coin tossing», DOI 10.1016/j.tcs.2014.05.025, December 2014, <https://doi.org/10.1016/j.tcs.2014.05.025>.

[BBM92] Bennett, C. H., Brassard, G., and N. D. Mermin, «Quantum cryptography without Bell’s theorem», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.68.557, February 1992, <https://link.aps.org/doi/10.1103/PhysRevLett.68.557>.

[Ben-Or] Ben-Or, M. and A. Hassidim, «Fast quantum byzantine agreement», STOC ’05, Association for Computing Machinery, DOI 10.1145/1060590.1060662, May 2005, <https://dl.acm.org/doi/10.1145/1060590.1060662>.

[Broadbent] Broadbent, A., Fitzsimons, J., and E. Kashefi, «Universal Blind Quantum Computation», 50th Annual IEEE Symposium on Foundations of Computer Science, IEEE, DOI 10.1109/FOCS.2009.36, December 2009, <https://arxiv.org/pdf/0807.4154.pdf>.

[Cacciapuoti2019] Cacciapuoti, A. S., Caleffi, M., Van Meter, R., and L. Hanzo, «When Entanglement meets Classical Communications: Quantum Teleportation for the Quantum Internet (Invited Paper)», DOI 10.48550/arXiv.1907.06197, July 2019, <https://arxiv.org/abs/1907.06197>.

[Cacciapuoti2020] Cacciapuoti, A. S., Caleffi, M., Tafuri, F., Cataliotti, F. S., Gherardini, S., and G. Bianchi, «Quantum Internet: Networking Challenges in Distributed Quantum Computing», IEEE Network, DOI 10.1109/MNET.001.1900092, February 2020, <https://ieeexplore.ieee.org/document/8910635>.

[Caleffi] Caleffi, M., Cacciapuoti, A. S., and G. Bianchi, «Quantum internet: from communication to distributed computing!», NANOCOM ’18, Association for Computing Machinery, DOI 10.1145/3233188.3233224, September 2018, <https://dl.acm.org/doi/10.1145/3233188.3233224>.

[Cao] Cao, Y., Romero, J., and A. Aspuru-Guzik, «Potential of quantum computing for drug discovery», IBM Journal of Research and Development, DOI 10.1147/JRD.2018.2888987, December 2018, <https://doi.org/10.1147/JRD.2018.2888987>.

[Castelvecchi] Castelvecchi, D., «The quantum internet has arrived (and it hasn’t)», Nature 554, 289-292, DOI 10.1038/d41586-018-01835-3, February 2018, <https://www.nature.com/articles/d41586-018-01835-3>.

[Childs] Childs, A. M., «Secure assisted quantum computation», DOI 10.26421/QIC5.6, July 2005, <https://arxiv.org/pdf/quant-ph/0111046.pdf>.

[Chitambar] Chitambar, E., Leung, D., Mančinska, L., Ozols, M., and A. Winter, «Everything You Always Wanted to Know About LOCC (But Were Afraid to Ask)», Communications in Mathematical Physics, Springer, DOI 10.1007/s00220-014-1953-9, March 2014, <https://link.springer.com/article/10.1007/s00220-014-1953-9>.

[Crepeau] Crépeau, C., Gottesman, D., and A. Smith, «Secure multi-party quantum computation», STOC ’02, Association for Computing Machinery, DOI 10.1145/509907.510000, May 2002, <https://doi.org/10.1145/509907.510000>.

[Cuomo] Cuomo, D., Caleffi, M., and A. S. Cacciapuoti, «Towards a distributed quantum computing ecosystem», IET Quantum Communication, DOI 10.1049/iet-qtc.2020.0002, July 2020, <http://dx.doi.org/10.1049/iet-qtc.2020.0002>.

[Denchev] Denchev, V. S. and G. Pandurangan, «Distributed quantum computing: a new frontier in distributed systems or science fiction?», ACM SIGACT News, DOI 10.1145/1412700.1412718, September 2008, <https://doi.org/10.1145/1412700.1412718>.

[E91] Ekert, A. K., «Quantum cryptography based on Bell’s theorem», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.67.661, August 1991, <https://link.aps.org/doi/10.1103/PhysRevLett.67.661>.

[Eisert] Eisert, J., Jacobs, K., Papadopoulos, P., and M. B. Plenio, «Optimal local implementation of nonlocal quantum gates», Physical Review A, American Physical Society, DOI 10.1103/PhysRevA.62.052317, October 2000, <https://doi.org/10.1103/PhysRevA.62.052317>.

[Elkouss] Elkouss, D., Martinez-Mateo, J., and V. Martin, «Information Reconciliation for Quantum Key Distribution», DOI 10.48550/arXiv.1007.1616, April 2011, <https://arxiv.org/pdf/1007.1616.pdf>.

[ETSI-QKD-Interfaces] ETSI, «Quantum Key Distribution (QKD); Components and Internal Interfaces», V2.1.1, ETSI GR QKD 003, March 2018, <https://www.etsi.org/deliver/etsi_gr/QKD/001_099/003/02.01.01_60/gr_QKD003v020101p.pdf>.

[ETSI-QKD-UseCases] ETSI, «Quantum Key Distribution; Use Cases», V1.1.1, ETSI GS QKD 002, June 2010, <https://www.etsi.org/deliver/etsi_gs/qkd/001_099/002/01.01.01_60/gs_qkd002v010101p.pdf>.

[Fitzsimons] Fitzsimons, J. F., «Private quantum computation: an introduction to blind quantum computing and related protocols», DOI 10.1038/s41534-017-0025-3, June 2017, <https://www.nature.com/articles/s41534-017-0025-3.pdf>.

[Gottesman1999] Gottesman, D. and I. Chuang, «Demonstrating the viability of universal quantum computation using teleportation and single-qubit operations», Nature 402, 390-393, DOI 10.1038/46503, November 1999, <https://doi.org/10.1038/46503>.

[Gottesman2012] Gottesman, D., Jennewein, T., and S. Croke, «Longer-Baseline Telescopes Using Quantum Repeaters», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.109.070503, August 2012, <https://link.aps.org/doi/10.1103/PhysRevLett.109.070503>.

[Grosshans] Grosshans, F. and P. Grangier, «Continuous Variable Quantum Cryptography Using Coherent States», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.88.057902, January 2002, <https://doi.org/10.1103/PhysRevLett.88.057902>.

[Grumbling] Grumbling, E., Ed. and M. Horowitz, Ed., «Quantum Computing: Progress and Prospects», National Academies of Sciences, Engineering, and Medicine, The National Academies Press, DOI 10.17226/25196, 2019, <https://doi.org/10.17226/25196>.

[Guo] Guo, X., Breum, C. R., Borregaard, J., Izumi, S., Larsen, M. V., Gehring, T., Christandl, M., Neergaard-Nielsen, J. S., and U. L. Andersen, «Distributed quantum sensing in a continuous-variable entangled network», Nature Physics, DOI 10.1038/s41567-019-0743-x, December 20219, <https://www.nature.com/articles/s41567-019-0743-x>.

[Huang] Huang, H-L., Zhao, Q., Ma, X., Liu, C., Su, Z-E., Wang, X-L., Li, L., Liu, N-L., Sanders, B. C., Lu, C-Y., and J-W. Pan, «Experimental Blind Quantum Computing for a Classical Client», DOI 10.48550/arXiv.1707.00400, July 2017, <https://arxiv.org/pdf/1707.00400.pdf>.

[ITUT] ITU-T, «Draft new Technical Report ITU-T TR.QN-UC: ‘Use cases of quantum networks beyond QKDN'», ITU-T SG 13, November 2022, <https://www.itu.int/md/T22-SG13-221125-TD-WP3-0158/en>.

[Jozsa2000] Josza, R., Abrams, D. S., Dowling, J. P., and C. P. Williams, «Quantum Clock Synchronization Based on Shared Prior Entanglement», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.85.2010, August 2000, <https://link.aps.org/doi/10.1103/PhysRevLett.85.2010>.

[Jozsa2005] Josza, R., «An introduction to measurement based quantum computation», DOI 10.48550/arXiv.quant-ph/0508124, September 2005, <https://arxiv.org/pdf/quant-ph/0508124.pdf>.

[Kiktenko] Kiktenko, E. O., Malyshev, A. O., Gavreev, M. A., Bozhedarov, A. A., Pozhar, N. O., Anufriev, M. N., and A. K. Fedorov, «Lightweight authentication for quantum key distribution», DOI 10.1109/TIT.2020.2989459, September 2020, <https://arxiv.org/pdf/1903.10237.pdf>.

[Komar] Kómár, P., Kessler, E. M., Bishof, M., Jiang, L., Sørensen, A. S., Ye, J., and M. D. Lukin, «A quantum network of clocks», DOI 10.1038/nphys3000, October 2013, <https://arxiv.org/pdf/1310.6045.pdf>.

[Lipinska] Lipinska, V., Murta, G., Ribeiro, J., and S. Wehner, «Verifiable hybrid secret sharing with few qubits», Physical Review A, American Physical Society, DOI 10.1103/PhysRevA.101.032332, March 2020, <https://doi.org/10.1103/PhysRevA.101.032332>.

[Lo] Lo, H-K., Curty, M., and B. Qi, «Measurement-Device-Independent Quantum Key Distribution», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.108.130503, March 2012, <https://doi.org/10.1103/PhysRevLett.108.130503>.

[NCSC] National Cyber Security Centre (NCSC), «Quantum security technologies», Whitepaper, March 2020, <https://www.ncsc.gov.uk/whitepaper/quantum-security-technologies>.

[NISTIR8240] Alagic, G., Alperin-Sheriff, J., Apon, D., Cooper, D., Dang, Q., Liu, Y-K., Miller, C., Moody, D., Peralta, R., Perlner, R., Robinson, A., and D. Smith-Tone, «Status Report on the First Round of the NIST Post-Quantum Cryptography Standardization Process», DOI 10.6028/NIST.IR.8240, NISTIR 8240, January 2019, <https://nvlpubs.nist.gov/nistpubs/ir/2019/NIST.IR.8240.pdf>.

[NISTSP800-207] Rose, S., Borchert, O., Mitchell, S., and S. Connelly, «Zero Trust Architecture», NIST SP 800-207, DOI 10.6028/NIST.SP.800-207, August 2020, <https://doi.org/10.6028/NIST.SP.800-207>.

[NSA] National Security Agency (NSA), «Post-Quantum Cybersecurity Resources», <https://www.nsa.gov/Cybersecurity/Post-Quantum-Cybersecurity-Resources/>.

[Pal] Pal, S. P., Singh, S. K., and S. Kumar, «Multi-partite Quantum Entanglement versus Randomization: Fair and Unbiased Leader Election in Networks», DOI 10.48550/arXiv.quant-ph/0306195, June 2003, <https://arxiv.org/pdf/quant-ph/0306195.pdf>.

[Preskill] Preskill, J., «Quantum Computing in the NISQ era and beyond», DOI 10.22331/q-2018-08-06-79, July 2018, <https://arxiv.org/pdf/1801.00862>.

[Proctor] Proctor, T. J., Knott, P. A., and J. A. Dunningham, «Multiparameter Estimation in Networked Quantum Sensors», Physical Review Letters, American Physical Society, DOI 10.1103/PhysRevLett.120.080501, February 2018, <https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.120.080501>.

[Qin] Qin, H., «Towards large-scale quantum key distribution network and its applications», June 2019, <https://www.itu.int/en/ITU-T/Workshops-and-Seminars/2019060507/Documents/Hao_Qin_Presentation.pdf>.

[QUANTUM-CONNECTION] Van Meter, R. and T. Matsuo, «Connection Setup in a Quantum Network», Work in Progress, Internet-Draft, draft-van-meter-qirg-quantum-connection-setup-01, 11 September 2019, <https://datatracker.ietf.org/doc/html/draft-van-meter-qirg-quantum-connection-setup-01>.

[Renner] Renner, R., «Security of Quantum Key Distribution», DOI 10.48550/arXiv.quant-ph/0512258, September 2005, <https://arxiv.org/pdf/quant-ph/0512258.pdf>.

[RFC7258] Farrell, S. and H. Tschofenig, «Pervasive Monitoring Is an Attack», BCP 188, RFC 7258, DOI 10.17487/RFC7258, May 2014, <https://www.rfc-editor.org/info/rfc7258>.

[RFC9340] Kozlowski, W., Wehner, S., Van Meter, R., Rijsman, B., Cacciapuoti, A. S., Caleffi, M., and S. Nagayama, «Architectural Principles for a Quantum Internet», RFC 9340, DOI 10.17487/RFC9340, March 2023, <https://www.rfc-editor.org/info/rfc9340>.

[Taherkhani] Taherkhani, M. A., Navi, K., and R. Van Meter, «Resource-aware System Architecture Model for Implementation of Quantum aided Byzantine Agreement on Quantum Repeater Networks», DOI 10.1088/2058-9565/aa9bb1, January 2017, <https://arxiv.org/abs/1701.04588>.

[Tang] Tang, B-Y., Liu, B., Zhai, Y-P., Wu, C-Q., and W-R. Yu, «High-speed and Large-scale Privacy Amplification Scheme for Quantum Key Distribution», Scientific Reports, DOI 10.1038/s41598-019-50290-1, October 2019, <https://doi.org/10.1038/s41598-019-50290-1>.

[Treiber] Treiber, A., Poppe, A., Hentschel, M., Ferrini, D., Lorünser, T., Querasser, E., Matyus, T., Hübel, H., and A. Zeilinger, «A fully automated entanglement-based quantum cryptography system for telecom fiber networks», New Journal of Physics 11 045013, DOI 10.1088/1367-2630/11/4/045013, April 2009, <https://iopscience.iop.org/article/10.1088/1367-2630/11/4/045013>.

[VanMeter2006-01] Van Meter, R., Nemoto, K., Munro, W. J., and K. M. Itoh, «Distributed Arithmetic on a Quantum Multicomputer», 33rd International Symposium on Computer Architecture (ISCA ’06), DOI 10.1109/ISCA.2006.19, June 2006, <https://doi.org/10.1109/ISCA.2006.19>.

[VanMeter2006-02] Van Meter, R. D., «Architecture of a Quantum Multicomputer Optimized for Shor’s Factoring Algorithm», DOI 10.48550/arXiv.quant-ph/0607065, February 2008, <https://arxiv.org/pdf/quant-ph/0607065.pdf>.

[Wehner] Wehner, S., Elkouss, D., and R. Hanson, «Quantum internet: A vision for the road ahead», Science 362, DOI 10.1126/science.aam9288, October 2018, <http://science.sciencemag.org/content/362/6412/eaam9288.full>.

[Xu] Xu, F., Qi, B., and H-K. Lo, «Experimental demonstration of phase-remapping attack in a practical quantum key distribution system», New Journal of Physics 12 113026, DOI 10.1088/1367-2630/12/11/113026, November 2010, <https://iopscience.iop.org/article/10.1088/1367-2630/12/11/113026>.

[Zhandry] Zhandry, M., «Quantum Lightning Never Strikes the Same State Twice», Advances in Cryptology — EUROCRYPT 2019, DOI 10.1007/978-3-030-17659-4_14, April 2019, <http://doi.org/10.1007/978-3-030-17659-4_14>.

[Zhang2009] Zhang, X., Luo, W., Zeng, G., Weng, J., Yang, Y., Chen, M., and X. Tan, «A hybrid universal blind quantum computation», DOI 10.1016/j.ins.2019.05.057, September 2019, <https://www.sciencedirect.com/science/article/abs/pii/S002002551930458X>.

[Zhang2018] Zhang, Q., Xu, F., Chen, Y-A., Peng, C-Z., and J-W. Pan, «Large scale quantum key distribution: challenges and solutions [Invited]», Optics Express, DOI 10.1364/OE.26.024260, August 2018, <https://doi.org/10.1364/OE.26.024260>.

[Zhao2008] Zhao, Y., Fred Fung, C-H., Qi, B., Chen, C., and H-K. Lo, «Quantum hacking: Experimental demonstration of time-shift attack against practical quantum-key-distribution systems», Physical Review A, American Physical Society, DOI 10.1103/PhysRevA.78.042333, October 2008, <https://link.aps.org/doi/10.1103/PhysRevA.78.042333>.

[Zhao2018] Zhao, Y., «Development of Quantum Key Distribution and Attacks against It», Journal of Physics: Conference Series, DOI 10.1088/1742-6596/1087/4/042028, 2018, <https://iopscience.iop.org/article/10.1088/1742-6596/1087/4/042028>.

[Zheng2019] Zheng, X., Zhang, P., Ge, R., Lu, L., He, G., Chen, Q., Qu, F., Zhang, L., Cai, X., Lu, Y., Zhu, S., Wu, P., and X-S. Ma, «Heterogeneously integrated, superconducting silicon-photonic platform for measurement-device-independent quantum key distribution», DOI 10.1117/1.AP.3.5.055002, December 2019, <https://arxiv.org/abs/1912.09642>.

Благодарности

Авторы благодарны Michele Amoretti, Mathias Van Den Bossche, Xavier de Foy, Patrick Gelard, Álvaro Gómez Iñesta, Mallory Knodel, Wojciech Kozlowski, John Preuß Mattsson, Rodney Van Meter, Colin Perkins, Joey Salazar, Joseph Touch, Brian Trammell и сообществу QIRG в целом за полезные рецензии и комментарии к документу.

Адреса авторов

Chonggang Wang
InterDigital Communications, LLC
1001 E Hector St
Conshohocken, PA 19428
United States of America
Email: Chonggang.Wang@InterDigital.com
 
Akbar Rahman
Ericsson
349 Terry Fox Drive
Ottawa Ontario K2K 2V6
Canada
Email: Akbar.Rahman@Ericsson.Com
 
Ruidong Li
Kanazawa University
Kakumamachi, Kanazawa, Ishikawa
920-1192
Japan
Email: lrd@se.kanazawa-u.ac.jp
 
Melchior Aelmans
Juniper Networks
Boeing Avenue 240
1119 PZ Schiphol-Rijk
Netherlands
Email: maelmans@juniper.net
 
Kaushik Chakraborty
The University of Edinburgh
10 Crichton Street
Edinburgh, Scotland
EH8 9AB
United Kingdom
Email: kaushik.chakraborty9@gmail.com

Перевод на русский язык

nmalykh@protokols.ru


1Internet Research Task Force — комиссия по исследовательским задачам Internet.

2Digital Subscriber Line — цифровая абонентская линия.

3В русском языке принят термин «задача византийских генералов», см. здесь. Прим. перев.

4Byzantine Fault Tolerance — византийская отказоустойчивость.

Рубрика: RFC | Оставить комментарий

RFC 9587 YANG Data Model for OSPFv3 Extended Link State Advertisements (LSAs)

Internet Engineering Task Force (IETF)                         A. Lindem
Request for Comments: 9587                       LabN Consulting, L.L.C.
Category: Standards Track                                      S. Palani
ISSN: 2070-1721                                                Microsoft
                                                                   Y. Qu
                                                  Futurewei Technologies
                                                               June 2024

YANG Data Model for OSPFv3 Extended Link State Advertisements (LSAs)

Модель данных YANG для расширенных анонсов LSA в OSPFv3

PDF

Аннотация

В этом документе определена модель данных YANG, дополняющая модель IETF OSPF YANG (RFC 9129) для поддержки расширяемости анонсов состояния каналов (Link State Advertisement или LSA) в OSPFv3, определённой в RFC 8362. OSPFv3 Extended LSA обеспечивают на основе TLV расширения типов LSA, определённых в RFC 5340.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9587.

Авторские права

Авторские права (Copyright (c) 2024) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно, поскольку в них описаны права и ограничения, относящиеся к данному документу. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Обзор

Язык определения данных YANG [RFC7950] служит для задания содержимого концептуального хранилища данных, которое позволяет управлять сетевыми устройствами с помощью NETCONF [RFC6241]. YANG подходит и для других ситуаций, таких как привязка к другим интерфейсам (например, RESTCONF [RFC8040]) и отличное от XML кодирование (например, JSON). Кроме того, модели данных YANG могут служить основой для реализации таких интерфейсов, как командный (Command-Line Interface или CLI) или программный API.

В этом документе задана модель данных YANG, дополняющая модель IETF OSPF YANG [RFC9129], которая сама дополняет [RFC8349], для поддержки конфигурации и рабочих состояний расширенных анонсов состояния каналов OSPFv3 (LSA), определённых в [RFC8362].

Заданный здесь модуль YANG соответствует архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA) [RFC8342].

2. Диаграммы деревьев

В документе используется графическое представление моделей данных, описанное в [RFC8340].

3. OSPFv3 Extended LSA

Этот документ определяет модель данных YANG для OSPFv3 Extended LSA, дополняя базовую модель OSPF [RFC9129] для поддержки расширения OSPFv3 LSA [RFC8362]. Расширенные OSPFv3 LSA поддерживают анонсы состояния каналов на основе TLV в соответствии с [RFC5340].

Модуль YANG OSPFv3 Extended LSA требует поддержки базовой модели OSPF, определяющей базовые состояния и конфигурацию OSPF. Модуль YANG OSPF дополняет модель данных YANG ietf-routing, заданную в [RFC8349]. Дополнения модуля YANG ietf-ospfv3-extended-lsa обеспечивают поддержку глобальной конфигурации, конфигурации областей (area) и добавление OSPFv3 Extended LSA к рабочему состоянию базы состояний каналов (Link State Database или LSDB).

   module: ietf-ospfv3-extended-lsa

     augment /rt:routing/rt:control-plane-protocols
               /rt:control-plane-protocol/ospf:ospf:
       +--rw extended-lsa-support?   boolean
     augment /rt:routing/rt:control-plane-protocols
               /rt:control-plane-protocol/ospf:ospf/ospf:areas
               /ospf:area:
       +--rw extended-lsa-support?   boolean
     augment /rt:routing/rt:control-plane-protocols
               /rt:control-plane-protocol/ospf:ospf/ospf:areas/ospf:area
               /ospf:interfaces/ospf:interface/ospf:database
               /ospf:link-scope-lsa-type/ospf:link-scope-lsas
               /ospf:link-scope-lsa/ospf:version/ospf:ospfv3/ospf:ospfv3
               /ospf:body:
       +--ro e-link
          +--ro rtr-priority?   uint8
          +--ro lsa-options
          |  +--ro lsa-options*   identityref
          +--ro e-link-tlvs* []
             +--ro unknown-tlv
             |  +--ro type?     uint16
             |  +--ro length?   uint16
             |  +--ro value?    yang:hex-string
             +--ro intra-prefix-tlv
             |  +--ro metric?           ospf:ospf-metric
             |  +--ro prefix?           inet:ip-prefix
             |  +--ro prefix-options
             |  |  +--ro prefix-options*   identityref
             |  +--ro sub-tlvs* []
             |     +--ro unknown-sub-tlv
             |        +--ro type?     uint16
             |        +--ro length?   uint16
             |        +--ro value?    yang:hex-string
             +--ro ipv6-link-local-addr-tlv
             |  +--ro link-local-address?   inet:ipv6-address
             |  +--ro sub-tlvs* []
             |     +--ro unknown-sub-tlv
             |        +--ro type?     uint16
             |        +--ro length?   uint16
             |        +--ro value?    yang:hex-string
             +--ro ipv4-link-local-addr-tlv
                +--ro link-local-address?   inet:ipv4-address
                +--ro sub-tlvs* []
                   +--ro unknown-sub-tlv
                      +--ro type?     uint16
                      +--ro length?   uint16
                      +--ro value?    yang:hex-string
     augment /rt:routing/rt:control-plane-protocols
               /rt:control-plane-protocol/ospf:ospf/ospf:areas/ospf:area
               /ospf:database/ospf:area-scope-lsa-type
               /ospf:area-scope-lsas/ospf:area-scope-lsa/ospf:version
               /ospf:ospfv3/ospf:ospfv3/ospf:body:
       +--ro e-router
       |  +--ro router-bits
       |  |  +--ro rtr-lsa-bits*   identityref
       |  +--ro lsa-options
       |  |  +--ro lsa-options*   identityref
       |  +--ro e-router-tlvs* []
       |     +--ro unknown-tlv
       |     |  +--ro type?     uint16
       |     |  +--ro length?   uint16
       |     |  +--ro value?    yang:hex-string
       |     +--ro link-tlv
       |        +--ro interface-id?            uint32
       |        +--ro neighbor-interface-id?   uint32
       |        +--ro neighbor-router-id?      rt-types:router-id
       |        +--ro type?                    ospf:router-link-type
       |        +--ro metric?                  ospf:ospf-link-metric
       |        +--ro sub-tlvs* []
       |           +--ro unknown-sub-tlv
       |              +--ro type?     uint16
       |              +--ro length?   uint16
       |              +--ro value?    yang:hex-string
       +--ro e-network
       |  +--ro lsa-options
       |  |  +--ro lsa-options*   identityref
       |  +--ro e-network-tlvs* []
       |     +--ro unknown-tlv
       |     |  +--ro type?     uint16
       |     |  +--ro length?   uint16
       |     |  +--ro value?    yang:hex-string
       |     +--ro attached-router-tlv
       |        +--ro adjacent-neighbor-router-id*   rt-types:router-id
       +--ro e-nssa
       |  +--ro e-external-tlvs* []
       |     +--ro unknown-tlv
       |     |  +--ro type?     uint16
       |     |  +--ro length?   uint16
       |     |  +--ro value?    yang:hex-string
       |     +--ro external-prefix-tlv
       |        +--ro flags
       |        |  +--ro ospfv3-e-external-prefix-bits*   identityref
       |        +--ro metric?           ospf:ospf-metric
       |        +--ro prefix?           inet:ip-prefix
       |        +--ro prefix-options
       |        |  +--ro prefix-options*   identityref
       |        +--ro sub-tlvs* []
       |           +--ro ipv6-fwd-addr-sub-tlv
       |           |  +--ro forwarding-address?   inet:ipv6-address
       |           +--ro ipv4-fwd-addr-sub-tlv
       |           |  +--ro forwarding-address?   inet:ipv4-address
       |           +--ro route-tag-sub-tlv
       |           |  +--ro route-tag?   uint32
       |           +--ro unknown-sub-tlv
       |              +--ro type?     uint16
       |              +--ro length?   uint16
       |              +--ro value?    yang:hex-string
       +--ro e-inter-area-prefix
       |  +--ro e-inter-prefix-tlvs* []
       |     +--ro unknown-tlv
       |     |  +--ro type?     uint16
       |     |  +--ro length?   uint16
       |     |  +--ro value?    yang:hex-string
       |     +--ro inter-prefix-tlv
       |        +--ro metric?           ospf:ospf-metric
       |        +--ro prefix?           inet:ip-prefix
       |        +--ro prefix-options
       |        |  +--ro prefix-options*   identityref
       |        +--ro sub-tlvs* []
       |           +--ro unknown-sub-tlv
       |              +--ro type?     uint16
       |              +--ro length?   uint16
       |              +--ro value?    yang:hex-string
       +--ro e-inter-area-router
       |  +--ro e-inter-router-tlvs* []
       |     +--ro unknown-tlv
       |     |  +--ro type?     uint16
       |     |  +--ro length?   uint16
       |     |  +--ro value?    yang:hex-string
       |     +--ro inter-router-tlv
       |        +--ro lsa-options
       |        |  +--ro lsa-options*   identityref
       |        +--ro metric?                  ospf:ospf-metric
       |        +--ro destination-router-id?   rt-types:router-id
       |        +--ro sub-tlvs* []
       |           +--ro unknown-sub-tlv
       |              +--ro type?     uint16
       |              +--ro length?   uint16
       |              +--ro value?    yang:hex-string
       +--ro e-intra-area-prefix
          +--ro referenced-ls-type?         uint16
          +--ro referenced-link-state-id?   uint32
          +--ro referenced-adv-router?      rt-types:router-id
          +--ro e-intra-prefix-tlvs* []
             +--ro unknown-tlv
             |  +--ro type?     uint16
             |  +--ro length?   uint16
             |  +--ro value?    yang:hex-string
             +--ro intra-prefix-tlv
                +--ro metric?           ospf:ospf-metric
                +--ro prefix?           inet:ip-prefix
                +--ro prefix-options
                |  +--ro prefix-options*   identityref
                +--ro sub-tlvs* []
                   +--ro unknown-sub-tlv
                      +--ro type?     uint16
                      +--ro length?   uint16
                      +--ro value?    yang:hex-string
     augment /rt:routing/rt:control-plane-protocols
               /rt:control-plane-protocol/ospf:ospf/ospf:database
               /ospf:as-scope-lsa-type/ospf:as-scope-lsas
               /ospf:as-scope-lsa/ospf:version/ospf:ospfv3/ospf:ospfv3
               /ospf:body:
       +--ro e-as-external
          +--ro e-external-tlvs* []
             +--ro unknown-tlv
             |  +--ro type?     uint16
             |  +--ro length?   uint16
             |  +--ro value?    yang:hex-string
             +--ro external-prefix-tlv
                +--ro flags
                |  +--ro ospfv3-e-external-prefix-bits*   identityref
                +--ro metric?           ospf:ospf-metric
                +--ro prefix?           inet:ip-prefix
                +--ro prefix-options
                |  +--ro prefix-options*   identityref
                +--ro sub-tlvs* []
                   +--ro ipv6-fwd-addr-sub-tlv
                   |  +--ro forwarding-address?   inet:ipv6-address
                   +--ro ipv4-fwd-addr-sub-tlv
                   |  +--ro forwarding-address?   inet:ipv4-address
                   +--ro route-tag-sub-tlv
                   |  +--ro route-tag?   uint32
                   +--ro unknown-sub-tlv
                      +--ro type?     uint16
                      +--ro length?   uint16
                      +--ro value?    yang:hex-string

4. Модуль YANG OSPFv3 Extended LSA

[RFC6991] и [RFC8294] не упоминаются в этом документе, но ссылки на них даны в модуле ietf-ospfv3-extended-lsa.yang.

   <CODE BEGINS> file "ietf-ospfv3-extended-lsa@2024-06-07.yang"
   module ietf-ospfv3-extended-lsa {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-ospfv3-extended-lsa";
     prefix ospfv3-e-lsa;

     import ietf-routing-types {
       prefix rt-types;
       reference
         "RFC 8294: Common YANG Data Types for the Routing Area";
     }
     import ietf-inet-types {
       prefix inet;
       reference
         "RFC 6991: Common YANG Data Types";
     }
     import ietf-routing {
       prefix rt;
       reference
         "RFC 8349: A YANG Data Model for Routing
          Management (NMDA Version)";
     }
     import ietf-ospf {
       prefix ospf;
       reference
         "RFC 9129: YANG Data Model for the OSPF Protocol";
     }

     organization
       "IETF LSR - Link State Routing Working Group";
     contact
       "WG Web:   <https://datatracker.ietf.org/wg/lsr/> 
        WG List:  <mailto:lsr@ietf.org> 

        Author:   Acee Lindem
                  <mailto:acee.ietf@gmail.com> 
        Author:   Sharmila Palani
                  <mailto:sharmila.palani@microsoft.com> 
        Author:   Yingzhen Qu
                  <mailto:yingzhen.ietf@gmail.com>"; 
     description
       "Этот модуль YANG определяет конфигурацию и рабочее состояние
        OSPFv3 Extended LSA, общие для реализаций всех производителей.
        Семантика и кодирование OSPFv3 Extended LSA описаны в RFC 8362. 
        OSPFv3 Extended LSA обеспечивают на основе TLV расширения базовых 
        типов LSA, определённых в RFC 5340.

        Модуль YANG соответствует архитектуре NMDA (RFC 8342).

        Авторские права (Copyright (c) 2024) принадлежат IETF Trust
        и лицам, указанным в качестве авторов кода. Все права защищены.

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия данного модуля YANG является частью RFC 9587, где
        правовые вопросы рассмотрены более полно.";

     reference
       "RFC 9587: YANG Data Model for OSPFv3 Extended Link State
        Advertisements (LSAs)";

     revision 2024-06-07 {
       description
         "Исходный выпуск.";
       reference
         "RFC 9587: YANG Data Model for OSPFv3 Extended Link State
          Advertisements (LSAs)";
     }

     /*
      * Идентификаторы типов OSPFv3 Extended LSA
      */

     identity ospfv3-e-router-lsa {
       base ospf:ospfv3-lsa-type;
       description
         "OSPFv3 E-Router-LSA - тип 0xA021.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.1";
     }

     identity ospfv3-e-network-lsa {
       base ospf:ospfv3-lsa-type;
       description
         "OSPFv3 E-Network-LSA - тип 0xA022.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.2";
     }

     identity ospfv3-e-summary-lsa-type {
       base ospf:ospfv3-lsa-type;
       description
         "Типы OSPFv3 Extended Summary LSA 
          E-Inter-Area-Prefix-LSA and E-Inter-Area-Router-LSA.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграфы 4.3 и 4.4";
     }

     identity ospfv3-e-inter-area-prefix-lsa {
       base ospfv3-e-summary-lsa-type;
       description
         "OSPFv3 E-Inter-Area-Prefix-LSA - тип 0xA023.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.3";
     }

     identity ospfv3-e-inter-area-router-lsa {
       base ospfv3-e-summary-lsa-type;
       description
         "OSPFv3 E-Inter-Area-Router-LSA - тип 0xA024.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.4";
     }

     identity ospfv3-e-external-lsa-type {
       base ospf:ospfv3-lsa-type;
       description
         "Типы OSPFv3 Extended External LSA 
          E-AS-External-LSA и E-NSSA-LSA (NSSA- это 
          Not-So-Stubby-Area — не совсем тупиковая область).";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграфы 4.5 и 4.6";
     }

     identity ospfv3-e-as-external-lsa {
       base ospfv3-e-external-lsa-type;
       description
         "OSPFv3 E-AS-External-LSA - тип 0xC025.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.5";
     }

     identity ospfv3-e-nssa-lsa {
       base ospfv3-e-external-lsa-type;
       description
         "OSPFv3 E-NSSA-LSA - тип 0xA027.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.6";
     }

     identity ospfv3-e-link-lsa {
       base ospf:ospfv3-lsa-type;
       description
         "OSPFv3 E-Link-LSA - тип 0x8028.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.7";
     }

     identity ospfv3-e-intra-area-prefix-lsa {
       base ospf:ospfv3-lsa-type;
       description
         "OSPFv3 E-Intra-Area-Prefix-LSA - тип 0xA029.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4.8";
     }

     identity ospfv3-e-prefix-option {
       description
         "Базовые идентификаторы для опций префикса OSPFv3.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.1";
     }

     identity nu-bit {
       base ospfv3-e-prefix-option;
       description
         "При установленном флаге префикс следует исключать
          из расчётов IPv6.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.1
          RFC 5340: OSPF for IPv6, Приложение A.4.1.1";
     }

     identity la-bit {
       base ospfv3-e-prefix-option;
       description
         "При установленном флаге префикс фактически является
          адресом IPv6 анонсирующего маршрутизатора.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.1
          RFC 5340: OSPF for IPv6, Приложение A.4.1.1";
     }

     identity p-bit {
       base ospfv3-e-prefix-option;
       description
         "При установленном флаге префикс NSSA следует транслировать
          в E-AS-External-LSA и анонсировать транслирующему NSSA BR.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.1
          RFC 5340: OSPF for IPv6, Приложение A.4.1.1";
     }

     identity dn-bit {
       base ospfv3-e-prefix-option;
       description
         "При установленном флаге префикс E-Inter-Area-Prefix-LSA или
          E-AS-External-LSA анонсируется как префикс L3VPN.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.1
          RFC 5340: OSPF for IPv6, Приложение A.4.1.1";
     }

     identity n-bit {
       base ospfv3-e-prefix-option;
       description
         "При установленном флаге префикс является адресом хоста,
          который идентифицирует анонсирующий маршрутизатор.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.1
          RFC 5340: OSPF for IPv6, Приложение A.4.1.1";
     }

     identity ospfv3-e-external-prefix-option {
       description
         "Базовый идентификатор для опций внешнего префикса OSPFv3.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.6";
     }

     identity e-bit {
       base ospfv3-e-external-prefix-option;
       description
         "При установленном флаге E заданная метрика является внешней
          метрикой типа 2. Это означает, что метрика считается больше,
          чем у любого пути внутри AS. Сброшенный бит E указывает 
          внешнюю метрику типа 1. Это означает, что она выражается в 
          таких же единицах, как и в других LSA (как стоимость
          интерфейса в Router-LSA).";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.6";
     }

     grouping unknown-sub-tlv {
       description
         "Неизвестная группа TLV.";
       container unknown-sub-tlv {
         uses ospf:tlv;
         description
           "Неизвестный суб-TLV внешнего TLV.";
       }
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 6.3";
     }

     grouping ospfv3-lsa-prefix {
       description
         "Префикс OSPFv3 LSA.";
       leaf prefix {
         type inet:ip-prefix;
         description
           "LSA prefix.";
       }
       container prefix-options {
         leaf-list prefix-options {
           type identityref {
             base ospfv3-e-prefix-option;
           }
           description
             "Список флагов опций префикса OSPFv3, содержащий
              идентификаторы опций OSPFv3, установленных для
              префикса OSPFv3.";
         }
         description
           "Опции префикса.";
         reference
           "RFC 8362:  OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 3.1";
       }
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3";
     }

     grouping external-prefix-tlv {
       container external-prefix-tlv {
         description
           "External-Prefix TLV.";
         container flags {
           leaf-list ospfv3-e-external-prefix-bits {
             type identityref {
               base ospfv3-e-external-prefix-option;
             }
             description
               "Список битов OSPFv3 External-Prefix TLV.";
           }
           description
             "Флаги внешнего префикса.";
         }
         leaf metric {
           type ospf:ospf-metric;
           description
             "Метрика внешнего префикса.";
         }
         uses ospfv3-lsa-prefix;
         list sub-tlvs {
           description
             "Суб-TLV External-Prefix TLV.";
           container ipv6-fwd-addr-sub-tlv {
             description
               "Суб-TLV IPv6-Forwarding-Address для E-AS-External-LSA
                и E-NSSA-LSA для семейства адресов IPv6.";
             leaf forwarding-address {
               type inet:ipv6-address;
               description
                 "Адрес пересылки IPv6.";
             }
             reference
               "RFC 8362: OSPFv3 Link State Advertisement (LSA)
                Extensibility, параграф 3.10";
           }
           container ipv4-fwd-addr-sub-tlv {
             description
               "Суб-TLV IPv4-Forwarding-Address для E-AS-External-LSA
                и E-NSSA-LSA для семейства адресов IPv4.";
             leaf forwarding-address {
               type inet:ipv4-address;
               description
                 "Адрес пересылки IPv4.";
             }
             reference
               "RFC 8362: OSPFv3 Link State Advertisement (LSA)
                Extensibility, параграф 3.11";
           }
           container route-tag-sub-tlv {
             description
               "Суб-TLV Route-Tag.";
             leaf route-tag {
               type uint32;
               description
                 "Тег маршрута.";
             }
             reference
               "RFC 8362: OSPFv3 Link State Advertisement (LSA)
                Extensibility, параграф 3.12";
           }
           uses unknown-sub-tlv;
         }
       }
       description
         "Группа External-Prefix TLV.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.6";
     }

     grouping intra-area-prefix-tlv {
       container intra-prefix-tlv {
         description
           "Intra-Area-Prefix-LSA TLV.";
         leaf metric {
           type ospf:ospf-metric;
           description
             "Метрика внутриобластного префикса.";
         }
         uses ospfv3-lsa-prefix;
         list sub-tlvs {
           description
             "Суб-TLV Intra-Area-Prefix TLV.";
           uses unknown-sub-tlv;
         }
       }
       description
         "Группа Intra-Area-Prefix TLV.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.7";
     }

     grouping ipv6-link-local-addr-tlv {
       container ipv6-link-local-addr-tlv {
         description
           "IPv6 Link-Local Address TLV.";
         leaf link-local-address {
           type inet:ipv6-address;
           description
             "Адрес IPv6 Link-Local.";
         }
         list sub-tlvs {
           description
             "Суб-TLV IPv6 Link-Local Address TLV.";
           uses unknown-sub-tlv;
         }
       }
       description
         "Группа IPv6 Link-Local Address TLV.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.8";
     }

     grouping ipv4-link-local-addr-tlv {
       container ipv4-link-local-addr-tlv {
         description
           "IPv4 Link-Local Address TLV.";
         leaf link-local-address {
           type inet:ipv4-address;
           description
             "Адрес IPv4 Link-Local.";
         }
         list sub-tlvs {
           description
             "Суб-TLV IPv4 Link-Local Address TLV.";
           uses unknown-sub-tlv;
         }
       }
       description
         "Группа IPv4 Link-Local Address TLV.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 3.9";
     }

     /* Конфигурация */

     augment "/rt:routing/rt:control-plane-protocols"
           + "/rt:control-plane-protocol/ospf:ospf" {
       when "../rt:type = 'ospf:ospfv3'" {
         description
           "Дополняет протокол маршрутизации OSPFv3.";
       }
       description
         "Дополняет конфигурацию на уровне экземпляра OSPFv3 поддержкой
          Extended LSA. При включённой поддержке будут анонсироваться
          OSPFv3 Extended LSA, и не будут передаваться OSPFv3 Legacy
          LSA, которые анонсируются при отключённой поддержке. Однако 
          OSPFv3 Extended LSA могут анонсироваться в Extended LSA Sparse
          Mode для поддержки постепенного внедрения, как описано в
          параграфе 6.2 of RFC 8362.";
       leaf extended-lsa-support {
         type boolean;
         default "false";
         description
           "Включает поддержку OSPFv3 Extended LSA для домена OSPFv3.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, Приложение A - Global Configuration Support";
       }
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/ospf:ospf/ospf:"
           + "areas/ospf:area" {
       when "../../../rt:type = 'ospf:ospfv3'" {
         description
           "Дополняет конфигурацию протокола OSPFv3 на уровне области.";
       }
       description
         "Дополняет конфигурацию протокола OSPFv3 на уровне области
          поддержкой Extended LSA.";
       leaf extended-lsa-support {
         type boolean;
         must "derived-from(../ospf:area-type,'stub-nssa-area') or "
            + "(current() = 'true') or "
            + "(../../../extended-lsa-support = 'false')" {
           description
             "Для обычных областей (области с лавинной рассылкой LSA
              уровня AS) отключение AreaExtendedLSASupport на уровне
              области запрещено при включении ExtendedLSASupport на
              уровне экземпляра. Анонсы E-AS-External-LSA рассылаются
              лавинно во все обычные области OSPFv3 (не тупиковые и не
              NSSA), поэтому отключение поддержки на уровне области
              невозможно.";
         }
         description
           "Дополняет конфигурацию протокола OSPFv3 на уровне области
            поддержкой Extended LSA. При включённой поддержке будут
            анонсироваться OSPFv3 Extended LSA и не будут передаваться 
            OSPFv3 Legacy LSA, которые анонсируются при отключённой 
            поддержке. Однако OSPFv3 Extended LSA могут анонсироваться
            в Extended LSA Sparse Mode для поддержки постепенного 
            внедрения, как описано в параграфе 6.2 of RFC 8362. По
            умолчанию статус поддержки Extended LSA наследуется из
            конфигурации на уровне экземпляра.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, Приложение B - Area Configuration Support";
       }
     }

     /*
      * Дополнения базы состояний каналов (Link State Database или LSDB)
      */

     augment "/rt:routing/"
           + "rt:control-plane-protocols/rt:control-plane-protocol/"
           + "ospf:ospf/ospf:areas/ospf:area/"
           + "ospf:interfaces/ospf:interface/ospf:database/"
           + "ospf:link-scope-lsa-type/ospf:link-scope-lsas/"
           + "ospf:link-scope-lsa/ospf:version/ospf:ospfv3/"
           + "ospf:ospfv3/ospf:body" {
       when "../../../../../../../../../../../"
          + "rt:type = 'ospf:ospfv3'" {
         description
           "Это дополнение применимо лишь к OSPFv3.";
       }
       description
         "Добавляет OSPFv3 Link-scoped Extended LSA к рабочему
          состоянию LSDB на интерфейсе.";
       container e-link {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-link-lsa'" {
           description
             "Применимо лишь к E-Link-LSA.";
         }
         description
           "E-Link-LSA contents.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.7";
         leaf rtr-priority {
           type uint8;
           description
             "Приоритет маршрутизатора для интерфейса.";
         }
         uses ospf:ospfv3-lsa-options;
         list e-link-tlvs {
           description
             "E-Link-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-Link TLV.";
           }
           uses intra-area-prefix-tlv;
           uses ipv6-link-local-addr-tlv;
           uses ipv4-link-local-addr-tlv;
         }
       }
     }

     augment "/rt:routing/"
           + "rt:control-plane-protocols/rt:control-plane-protocol/"
           + "ospf:ospf/ospf:areas/ospf:area/ospf:database/"
           + "ospf:area-scope-lsa-type/ospf:area-scope-lsas/"
           + "ospf:area-scope-lsa/ospf:version/ospf:ospfv3/"
           + "ospf:ospfv3/ospf:body" {
       when "../../../../../../../../../"
          + "rt:type = 'ospf:ospfv3'" {
         description
           "Это дополнение применимо лишь к OSPFv3.";
       }
       description
         "Добавляет OSPFv3 Area-scoped Extended LSA к рабочему
          состоянию LSDB для области.";
       reference
         "RFC 8362: OSPFv3 Link State Advertisement (LSA)
          Extensibility, параграф 4";
       container e-router {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-router-lsa'" {
           description
             "Применимо лишь к OSPFv3 E-Router-LSA.";
         }
         description
           "Содержимое OSPFv3 E-Router-LSA.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.1";
         uses ospf:ospf-router-lsa-bits;
         uses ospf:ospfv3-lsa-options;
         list e-router-tlvs {
           description
             "E-Router-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-Router TLV.";
           }
           container link-tlv {
             description
               "E-Router-LSA TLV.";
             leaf interface-id {
               type uint32;
               description
                 "Идентификатор интерфейса для канала.";
             }
             leaf neighbor-interface-id {
               type uint32;
               description
                 "Идентификатор интерфейса соседа по каналу.";
             }
             leaf neighbor-router-id {
               type rt-types:router-id;
               description
                 "Идентификатор соседнего маршрутизатора на канале.";
             }
             leaf type {
               type ospf:router-link-type;
               description
                 "Тип канала: 1 - «точка-точка»
                              2 - канал в транзитную сеть
                              3 - канал в тупиковую сеть
                              4 - виртуальный канал.";
             }
             leaf metric {
               type ospf:ospf-link-metric;
               description
                 "Метрика канала.";
             }
             list sub-tlvs {
               description
                 "Суб-TLV Link TLV.";
               uses unknown-sub-tlv;
             }
           }
         }
       }
       container e-network {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-network-lsa'" {
           description
             "Применимо лишь к E-Network-LSA.";
         }
         description
           "Содержимое E-Network-LSA.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.2";
         uses ospf:ospfv3-lsa-options;
         list e-network-tlvs {
           description
             "E-Network-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-Network TLV.";
           }
           container attached-router-tlv {
             description
               "Attached-Routers TLV.";
             leaf-list adjacent-neighbor-router-id {
               type rt-types:router-id;
               description
                 "Идентификатор смежного маршрутизатора.";
             }
           }
         }
       }
       container e-nssa {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-nssa-lsa'" {
           description
             "Применимо лишь к E-NSSA-LSA.";
         }
         description
           "Содержимое E-NSSA-LSA.";
         list e-external-tlvs {
           description
             "E-NSSA-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-External TLV.";
           }
           uses external-prefix-tlv;
         }
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.6";
       }
       container e-inter-area-prefix {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-inter-area-prefix-lsa'" {
           description
             "Применимо лишь к E-Inter-Area-Prefix-LSA.";
         }
         description
           "Содержимое E-Inter-Area-Prefix-LSA.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.3";
         list e-inter-prefix-tlvs {
           description
             "E-Inter-Area-Prefix-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-Inter-Area-Prefix TLV.";
           }
           container inter-prefix-tlv {
             description
               "Неизвестный E-Inter-Area-Prefix-LSA TLV.";
             leaf metric {
               type ospf:ospf-metric;
               description
                 "Метрика внутриобластного префикса.";
             }
             uses ospfv3-lsa-prefix;
             list sub-tlvs {
               description
                 "Суб-TLV Inter-Area-Prefix TLV.";
               uses unknown-sub-tlv;
             }
           }
         }
       }
       container e-inter-area-router {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-inter-area-router-lsa'" {
           description
             "Применимо лишь к E-Inter-Area-Router-LSA.";
         }
         description
           "Содержимое E-Inter-Area-Router-LSA.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.4";
         list e-inter-router-tlvs {
           description
             "E-Inter-Area-Router-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-Inter-Area-Router TLV.";
           }
           container inter-router-tlv {
             description
               "Неизвестный E-Inter-Area-Router-LSA TLV.";
             uses ospf:ospfv3-lsa-options;
             leaf metric {
               type ospf:ospf-metric;
               description
                 "Метрика межобластного маршрутизатора.";
             }
             leaf destination-router-id {
               type rt-types:router-id;
               description
                 "Идентификатор целевого маршрутизатора.";
             }
             list sub-tlvs {
               description
                 "Inter-Area-Router TLV sub-TLV.";
               uses unknown-sub-tlv;
             }
           }
         }
       }
       container e-intra-area-prefix {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-intra-area-prefix-lsa'" {
           description
             "Применимо лишь к E-Intra-Area-Prefix-LSA.";
         }
         description
           "Содержимое E-Intra-Area-Prefix-LSA.";
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.8";
         leaf referenced-ls-type {
           type uint16;
           description
             "Тип Referenced Link State.";
         }
         leaf referenced-link-state-id {
           type uint32;
           description
             "Referenced Link State ID.";
         }
         leaf referenced-adv-router {
           type rt-types:router-id;
           description
             "Анонсирующий маршрутизатор.";
         }
         list e-intra-prefix-tlvs {
           description
             "E-Intra-Area-Prefix-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-Intra-Area-Prefix TLV.";
           }
           uses intra-area-prefix-tlv;
         }
       }
     }

     augment "/rt:routing/"
           + "rt:control-plane-protocols/rt:control-plane-protocol/"
           + "ospf:ospf/ospf:database/"
           + "ospf:as-scope-lsa-type/ospf:as-scope-lsas/"
           + "ospf:as-scope-lsa/ospf:version/ospf:ospfv3/"
           + "ospf:ospfv3/ospf:body" {
       when "../../../../../../../"
          + "rt:type = 'ospf:ospfv3'" {
         description
           "Это дополнение действительно лишь для OSPFv3.";
       }
       description
         "Это дополнение добавляет OSPFv3 AS-scoped Extended LSA к
          рабочему состоянию для LSDB на уровне экземпляра AS.";
       container e-as-external {
         when "../../ospf:header/ospf:type = "
            + "'ospfv3-e-lsa:ospfv3-e-as-external-lsa'" {
           description
             "Применимо лишь к E-AS-External-LSA.";
         }
         description
           "Содержимое E-AS-External-LSA.";
         list e-external-tlvs {
           description
             "E-AS-External-LSA TLV.";
           container unknown-tlv {
             uses ospf:tlv;
             description
               "Неизвестный E-External TLV.";
           }
           uses external-prefix-tlv;
         }
         reference
           "RFC 8362: OSPFv3 Link State Advertisement (LSA)
            Extensibility, параграф 4.5";
       }
     }
   }
   <CODE ENDS>

5. Вопросы безопасности

Заданный этим документом модуль YANG определяет схему для данных, предназначенную для доступа через сеть с использованием протоколов управления, таких как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF служит защищённый транспорт с обязательной поддержкой SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF служит протокол HTTPS с обязательной поддержкой защиты на транспортном уровне (TLS) [RFC8446].

Модель доступа к конфигурации сети (NACM – Network Configuration Access Control Model) [RFC8341] обеспечивает возможность разрешить доступ лишь определённых пользователей NETCONF или RESTCONF к заранее заданному подмножеству операций NETCONF или RESTCONF и содержимого.

В заданном здесь модуле ietf-ospfv3-extended-lsa.yang определено множество узлов данных, которые разрешают запись, создание и удаление (т. е. config true, как принято по умолчанию). Эти узлы могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Запись в такие узлы (например, edit-config) без должной защиты может негативно влиять на работу сети. Ниже перечислены ветви и узлы, которые могут быть конфиденциальны или уязвимы.

/ospf:ospf/extended-lsa-support

/ospf:ospf/ospf:areas/ospf:area/extended-lsa-support

Способность управлять поддержкой OSPFv3 Extended LSA может приводить к атакам на службы (Denial-of-Service или DoS), поскольку маршрутизаторы OSPFv3 будут использовать для расчётов OSPFv3 SPF исключительно OSPFv3 Extended LSA, либо OSPFv3 Legacy LSA. Использование маршрутизаторами OSPFv3 разных типов LSA приведёт к неполной доступности и возможному разделению на части домена маршрутизации OSPFv3. Дополнительные сведения о совместимости OSPFv3 Extended LSA приведены в разделе 6 [RFC8362].

Некоторые из доступных для чтения узлов в этом модуле YANG могут быть конфиденциальны или уязвимы в той или иной сетевой среде. Важно контролировать доступ к таким объектам (например, get, get-config, notification).

Раскрытие LSDB будет приводить к раскрытию топологии сети, включая топологические сведения от других маршрутизаторов. Это может быть нежелательно из-за того, что может способствовать другим атакам. Кроме того, операторы могут считать сведения о топологии своих сетей конфиденциальными.

6. Взаимодействие с IANA

В соответствии с этим документом агентство IANA внесло URI в реестр IETF XML Registry [RFC3688]

   URI:  urn:ietf:params:xml:ns:yang:ietf-ospfv3-extended-lsa
   Registrant Contact:  The IESG.
   XML:  N/A; запрошенный URI является пространством имён XML.

В соответствии с этим документом агентство IANA зарегистрировало модуль YANG в реестре YANG Module Names [RFC6020]

   Name:  ietf-ospfv3-extended-lsa
   Maintained by IANA:  N
   Namespace:  urn:ietf:params:xml:ns:yang:ietf-ospfv3-extended-lsa
   Prefix:  ospfv3-e-lsa
   Reference:  RFC 9587

7. Литература

7.1. Нормативные документы

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC5340] Coltun, R., Ferguson, D., Moy, J., and A. Lindem, «OSPF for IPv6», RFC 5340, DOI 10.17487/RFC5340, July 2008, <https://www.rfc-editor.org/info/rfc5340>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8294] Liu, X., Qu, Y., Lindem, A., Hopps, C., and L. Berger, «Common YANG Data Types for the Routing Area», RFC 8294, DOI 10.17487/RFC8294, December 2017, <https://www.rfc-editor.org/info/rfc8294>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8349] Lhotka, L., Lindem, A., and Y. Qu, «A YANG Data Model for Routing Management (NMDA Version)», RFC 8349, DOI 10.17487/RFC8349, March 2018, <https://www.rfc-editor.org/info/rfc8349>.

[RFC8362] Lindem, A., Roy, A., Goethals, D., Reddy Vallem, V., and F. Baker, «OSPFv3 Link State Advertisement (LSA) Extensibility», RFC 8362, DOI 10.17487/RFC8362, April 2018, <https://www.rfc-editor.org/info/rfc8362>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC9129] Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem, «YANG Data Model for the OSPF Protocol», RFC 9129, DOI 10.17487/RFC9129, October 2022, <https://www.rfc-editor.org/info/rfc9129>.

[W3C.REC-xml-20081126] Bray, T., Paoli, J., Sperberg-McQueen, C. M., Maler, E., and F. Yergeau, «Extensible Markup Language (XML) 1.0 (Fifth Edition)», W3C Recommendation REC-xml-20081126, November 2008, <https://www.w3.org/TR/xml/>.

7.2. Дополнительная литература

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <https://www.rfc-editor.org/info/rfc7951>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, «Handling Long Lines in Content of Internet-Drafts and RFCs», RFC 8792, DOI 10.17487/RFC8792, June 2020, <https://www.rfc-editor.org/info/rfc8792>.

Приложение A. Пример конфигурации

Ниже приведён пример XML (в соответствии с [W3C.REC-xml-20081126]) использования модели данных YANG для OSPFv3 Extended LSA. Длинные строки разорваны (\) в соответствии с [RFC8792].

   <?xml version='1.0' encoding='UTF-8'?>
     <routing xmlns="urn:ietf:params:xml:ns:yang:ietf-routing">
       <router-id>192.0.2.1</router-id>
       <control-plane-protocols>
         <control-plane-protocol>
           <type xmlns:ospf="urn:ietf:params:xml:ns:yang:ietf-ospf">\
           ospf:ospfv3</type>
           <name>"OSPFv3"</name>
           <ospf xmlns="urn:ietf:params:xml:ns:yang:ietf-ospf">
             <extended-lsa-support xmlns="urn:ietf:params:xml:ns:yang:\
               ietf-ospfv3-extended-lsa">true</extended-lsa-support>
           </ospf>
         </control-plane-protocol>
       </control-plane-protocols>
     </routing>

Этот же пример в формате JSON [RFC7951] показан ниже.

   {
     "routing": {
       "router-id": "192.0.2.1",
       "control-plane-protocols": {
         "control-plane-protocol": {
           "type": "ospf:ospfv3",
           "name": "\"OSPFv3\"",
           "ospf": {
             "extended-lsa-support": true
           }
         }
       }
     }
   }

Благодарности

Определённая в этом документе модель данных YANG была создана с помощью набора инструментов YANG, созданных и поддерживаемых множеством авторов.

Большое спасибо Tom Petch, Mahesh Jethanandani, Renato Westphal, Victoria Pritchard, Reshad Rahman, Chris Hopps за их рецензии и комментарии.

Адреса авторов

Acee Lindem
LabN Consulting, L.L.C.
301 Midenhall Way
Cary, NC 27513
United States of America
Email: acee.ietf@gmail.com
 
Sharmila Palani
Microsoft
1 Microsoft Way
Redmond, WA 98052
United States of America
Email: sharmila.palani@microsoft.com
 
Yingzhen Qu
Futurewei Technologies
2330 Central Expressway
Santa Clara, CA 95050
United States of America
Email: yingzhen.ietf@gmail.com

Перевод на русский язык

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC | Оставить комментарий

RFC 9562 Universally Unique Identifiers (UUIDs)

Internet Engineering Task Force (IETF)                          K. Davis
Request for Comments: 9562                                 Cisco Systems
Obsoletes: 4122                                               B. Peabody
Category: Standards Track                                        Uncloud
ISSN: 2070-1721                                                 P. Leach
                                                University of Washington
                                                                May 2024

Universally Unique Identifiers (UUIDs)

Глобально уникальные идентификаторы (UUID)

PDF

Аннотация

В этой спецификации определены глобально уникальные идентификаторы UUID (Universally Unique Identifier), которые называют также GUID (Globally Unique Identifier), и пространство имён Uniform Resource Name для UUID. UUID имеют размер 128 битов и предназначены для обеспечения пространственной и временной уникальности. Изначально UUID применялись в сетевой вычислительной системе Apollo Network Computing System (NCS), затем в среде распределенных вычислений DCE (Distributed Computing Environment) фонда OSF (Open Software Foundation) и платформах Microsoft Windows.

Данная спецификация основана на спецификации OSF DCE с любезного разрешения OSF (сейчас известен как The Open Group). Информация из ранних версий спецификации OSF DCE также включена в документ. Данный документ отменяет RFC 4122.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительные сведения о документах Internet Standard приведены в разделе 2 RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9562.

Авторские права

Авторские права (Copyright (c) 2025) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с пересмотренной лицензией BSD (Revised BSD License), как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).

1. Введение

Эта спецификация определяет пространство имён Uniform Resource Name для глобально уникальных идентификаторов (UUID), называемых также GUID. UUID имеет размер 128 битов и не требует централизованной регистрации.

Применение UUID очень широко распространено в вычислительных системах. UUID образуют ядро инфраструктуры идентификаторов для многих операционных систем, таких как Microsoft Windows, и приложений, таких как Web-браузер Mozilla. Во многих случаях идентификаторы могут раскрываться (expose) разными нестандартными способами.

Эта спецификация пытается стандартизовать практику применения как максимально открытую так, чтобы она приносила пользу всем в рамках Internet. Представленные здесь сведения предназначены служить кратким руководством для желающих реализовать услуги с использованием UUID в сочетании с URN [RFC8141] или иначе.

Имеются документы ITU-T Recommendation и ISO/IEC Standard [X667], основанные на [RFC4122]. Оба набора спецификаций согласованы и полностью совместимы технически. Ничто в этом документе не следует считать отменой стандартов DCE, определяющих UUID.

2. Мотивация

Одной из основных причин широкого применения UUID является отсутствие централизованного администрирования (хотя два формата могут использовать необязательные IEEE 802 Node ID, в остальных этого нет). В результате генерацию по запросу можно полностью автоматизировать и применять идентификаторы с разными целями. Описанный здесь алгоритм генерации UUID поддерживает очень высокую скорость (10 миллионов и более идентификаторов в секунду на одной машине), что позволяет при необходимости использовать UUID даже в качестве идентификаторов транзакций.

UUID имеют фиксированный размер (128 битов), который достаточно мал по сравнению с другими вариантами. Это хорошо подходит для сортировки, упорядочивания и хэширования всех видов, хранения в базах данных, простого выделения и программирования в целом.

Поскольку UUID уникальны и постоянны, они очень хороши в качестве URN. Возможность генерации UUID без регистрации делает UUID одними из наиболее дешёвых URN.

2.1. Причины обновления

С момента создания UUID многое было изменено. Современным приложениям требуется создание и использование UUID в качестве первичных идентификаторов для различных элементов в сложных вычислительных системах, включая ключи баз данных, имена файлов машин или систем, идентификаторы транзакций по событиям и многое другое.

Одной из областей, где UUID популярны, являются ключи баз данных (БД). Это связано со всё более распределенной природой современных приложений. В таких случаях системы автоинкремента, часто применяемые в БД, уже не работают хорошо, а согласование порядковых номеров через сеть может стать проблемой. Возможность применения UUID в распределённых системах в качестве уникальных и сравнительно коротких значений, не требующих координации, является хорошим вариантом, но UUID версий 1-5, определённые в [RFC4122], не обладают некоторыми желаемыми характеристиками, как указано ниже.

  1. Версии UUID без упорядочения по времени (такие как UUIDv4, см. параграф 5.4) имеют слабую локальность индексов БД. Это означает, что новые значения, созданные последовательно, не размещаются в индексе близко одно к другому, что требует их вставки в случайные места. В результате снижение производительности основных используемых структур (B-tree и варианты) может быть значительным.

  2. 100-наносекундная Григорианская эпоха во временных метках UUIDv1 (параграф 5.1) необычна и её трудно точно представить с использованием стандартных форматов чисел, таких как описаны в [IEEE754].

  3. Для упорядочения по времени требуется самопроверка/синтаксический анализ вместо обычного побайтового сравнения.

  4. Возникают проблемы приватности и сетевой безопасности при использовании адреса MAC3 в поле узла (node) UUIDv1. Раскрываемые MAC-адрес может применяться в атаках для определения местоположения сетевых интерфейсов и раскрытия иных сведений о соответствующих машинах (как минимум, производитель, а, возможно и другие детали). Кроме того, с появлением виртуальных машин и контейнеров уникальность MAC-адресов не гарантируется.

  5. Многие детали реализации, заданные в [RFC4122], предполагали компромиссы, которые невозможно соблюсти для всех приложений и которые не являются необходимыми для совместимости реализаций.

  6. В [RFC4122] не различаются требования к генерации и простому хранению UUID, хотя они зачастую разные.

В связи с отмеченными проблемами многие распределенные приложения БД и крупные поставщики приложений пытались разработать более совершенные универсальные идентификаторы на основе времени, которые можно сортировать и применять в качестве ключей БД. Это привело к появлению за последние 10 с лишним лет множества реализаций, решающих одну и ту же проблему слегка различающимися способами.

При подготовке этой спецификации были проанализированы указанные ниже 16 разных реализаций на предмет размера идентификаторов, схемы битов, лексического форматирования и кодирования, типа временных меток, их формата и точности, формата и компонентов узлов, обработки коллизий и последовательности генерации с множеством временных меток.

  1. [ULID]

  2. [LexicalUUID]

  3. [Snowflake]

  4. [Flake]

  5. [ShardingID]

  6. [KSUID]

  7. [Elasticflake]

  8. [FlakeID]

  9. [Sonyflake]

  10. [orderedUuid]

  11. [COMBGUID]

  12. [SID]

  13. [pushID]

  14. [XID]

  15. [ObjectID]

  16. [CUID]

Рассмотрение этих реализаций с учётом отмеченных проблем привело к созданию этого документа с UUID, решающими эти проблемы. Кроме того, документ [RFC4122] нуждался в переработке для решения ряда вопросов.

  1. Исправление замеченных ошибок, связанных в основном с размещением битов, ведущим к несовместимости реализаций [Err1957], [Err3546], [Err4975], [Err4976], [Err5560] и т. п.

  2. Отвязывание других версий UUID от битовой схемы UUIDv1, чтобы поля (такие как time_hi_and_version) не требовалось указывать в UUID, не основанных на времени, а также предоставление определений для UUIDv3, UUIDv4 и UUIDv5, аналогичных UUIDv1.

  3. Представление опыта реализации в реальных сценариях и крайних случаях, отмеченных в имеющихся прототипах реализаций.

  4. Представление опыта и проблем безопасности для современной эпохи в отношении адресов MAC, алгоритмов хэширования, защищённых случайных значений и др.

  5. Предоставление стандартизованных вариантов для конкретных реализаций и/или экспериментов с UUID.

  6. Предоставление тестовых векторов для иллюстрации реальных UUID, созданных по этой спецификации.

3. Терминология

3.1. Уровни требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

3.2. Сокращения

ABNF

Augmented Backus-Naur Form — расширенная форма Бакуса-Наура

CSPRNG

Cryptographically Secure Pseudorandom Number Generator — криптографически защищённый генератор случайных чисел

DBMS

Database Management System — система управления базами данных (СУБД)

IEEE

Institute of Electrical and Electronics Engineers — институт инженеров по электротехнике и электронике

ITU

International Telecommunication Union — Международный союз электросвязи (МСЭ)

MAC

Media Access Control — управление доступом к среде

MD5

Message Digest 5 — дайджест сообщения 5

MSB

Most Significant Bit — наиболее значимый (старший) бит

OID

Object Identifier — идентификатор объекта

SHA

Secure Hash Algorithm — защищённый алгоритм хэширования

SHA-1

Secure Hash Algorithm 1 — защищённый алгоритм хэширования со 160-битовым дайджестом сообщения

SHA-3

Secure Hash Algorithm 3 — защищённый алгоритм хэширования (произвольный размер)

SHA-224

Secure Hash Algorithm 2 — защищённый алгоритм хэширования со 224-битовым дайджестом сообщения

SHA-256

Secure Hash Algorithm 2 — защищённый алгоритм хэширования со 256-битовым дайджестом сообщения

SHA-512

Secure Hash Algorithm 2 — защищённый алгоритм хэширования со 512-битовым дайджестом сообщения

SHAKE

Secure Hash Algorithm 3 based on the KECCAK algorithm — защищённый алгоритм хэширования на базе KECCAK

URN

Uniform Resource Names — унифицированные имена ресурсов

UTC

Coordinated Universal Time — универсальное координатное время

UUID

Universally Unique Identifier — глобально уникальный идентификатор

UUIDv1

Universally Unique Identifier version 1 — глобально уникальный идентификатор версии 1

UUIDv2

Universally Unique Identifier version 2 — глобально уникальный идентификатор версии 2

UUIDv3

Universally Unique Identifier version 3 — глобально уникальный идентификатор версии 3

UUIDv4

Universally Unique Identifier version 4 — глобально уникальный идентификатор версии 4

UUIDv5

Universally Unique Identifier version 5 — глобально уникальный идентификатор версии 5

UUIDv6

Universally Unique Identifier version 6 — глобально уникальный идентификатор версии 6

UUIDv7

Universally Unique Identifier version 7 — глобально уникальный идентификатор версии 7

UUIDv8

Universally Unique Identifier version 8 — глобально уникальный идентификатор версии 8

4. Формат UUID

Размер UUID составляет 16 октетов (128 битов), а структура определяется битами полей variant и version, как описано ниже. Биты UUID нумеруются от 0 до 127, а октеты — от 0 до 15.

При отсутствии иных явных спецификаций приложения или протокола представления каждое поле кодируется, начиная со старшего байта (сетевой порядок байтов — network byte order).

Сохранение UUID в двоичной форме выполняется упорядочением всех полей в формате big-endian. Однако известно, что GUID компонентной модели объектов (Component Object Model или COM) компании Microsoft используют порядок little-endian. Рассмотрение этого вопроса выходит за рамки спецификации (см. [MS_COM_GUID]).

UUID можно представлять в двоичном или целочисленном формате. При использовании с URN или в тексте приложений UUID следует представлять строками hex-and-dash, состоящими из нескольких групп шестнадцатеричных цифр (в верхнем или нижнем регистре), разделённых одиночными тире/дефисами. Использование в БД описано в параграфе 6.13.

Формальное определение строкового представления UUID имеет показанную ниже форму ABNF [RFC5234].

   UUID     = 4hexOctet «-»
              2hexOctet «-»
              2hexOctet «-»
              2hexOctet «-»
              6hexOctet
   hexOctet = HEXDIG HEXDIG
   DIGIT    = %x30-39
   HEXDIG   = DIGIT / «A» / «B» / «C» / «D» / «E» / «F»
f81d4fae-7dec-11d0-a765-00a0c91e6bf6

Рисунок 1. Пример строкового формата UUID.


Отметим, что буквы могут быть как строчными, так и прописными (включая те и другие в одном значении), как указано в параграфе 2.3 [RFC5234]. Пример текстового представления UUID показан на рисунке 1.

Значение UUID на рисунке 1 может быть представлено в двоичной форме (рисунок 2), целым числом (рисунок 3) или как URN (рисунок 4) [RFC8141].

111110000001110101001111101011100111110111101100000100011101000\
01010011101100101000000001010000011001001000111100110101111110110

Рисунок 2. Пример двоичного формата UUID.

329800735698586629295641978511506172918

Рисунок 3. Пример целочисленного UUID без знака (десятичное значение).

urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

Рисунок 4. Пример URN для UUID.


Имеется много других форматов представления UUID и ниже приведены примеры некоторых из них.

  • Некоторые реализации UUID (например, [Python] и [Microsoft]) выводят UUID в форме строк в фигурных скобках, включая символы тире.

  • В [X667] дано определение формата UUID для использования UUID с OID.

  • [IBM_NCS] содержит устаревшую спецификацию уникального формата UUID, совместимого с Variant 0xx из таблицы 1.

4.1. Поле Variant

Поле variant определяет схему UUID. Интерпретация всех остальных битов зависит от установки битов этого поля. Поэтому было бы точнее назвать его полем типа, но здесь сохранено исходное название для совместимости. Поле variant включает переменное число старших битов октета 8 в UUID. Содержимое поля variant показано в таблице 1, x указывает, что бит не имеет значения.

Таблица 1. Варианты UUID.

MSB0

MSB1

MSB2

MSB3

Вариант

Описание

0

x

x

x

14-7

Резерв. Совместимость с системой сетевых вычислений (Network Computing System или NCS). Включает Nil UUID (см. параграф 5.9).

1

0

x

x

8-9,A-B

Вариант, описываемый в этом документе.

1

1

0

x

C-D

резерв. Совместимость со старыми версиями Microsoft Corporation.

1

1

1

x

E-F

Резерв для будущих определений, включая Max UUID (параграф 5.10).

Совместимость с вариантами, не указанными здесь не гарантируется, но это вряд ли будет проблемой на практике.

Биты 64 и 65 в UUID (биты 0 и 1 октета 8) должны быть установлены в соответствии со строкой 2 таблицы 1, поэтому во всех схемах битов и полей эти биты не указаны.

4.2. Поле Version

Номер версии указывается четырьмя старшими битами октета 6 (биты 48 — 51 в UUID). В таблице 2 показаны все версии для UUID variant 10xx, задаваемые этим документом.

Таблица 2. Версии UUID Variant 10xx, заданные этой спецификацией.

MSB0

MSB1

MSB2

MSB3

Версия

Описание

0

0

0

0

0

Не используется.

0

0

0

1

1

UUID на основе григорианского времени, заданные этим документом.

0

0

1

0

2

Резерв для версии DCE Security со встроенными POSIX UUID.

0

0

1

1

3

Заданная этим документом версия на основе имени с хэшированием MD5.

0

1

0

0

4

Случайно или псевдослучайно генерируемая версия, заданная этим документом.

0

1

0

1

5

Заданная этим документом версия на основе имени с хэшированием SHA-1.

0

1

1

0

6

Заданный здесь UUID на базе григорианского времени со сменой порядка.

0

1

1

1

7

Заданный этим документом UUID на основе времени Unix Epoch.

1

0

0

0

8

Резерв для пользовательских форматов, заданных этим документом.

1

0

0

1

9

Резерв для будущих определений.

1

0

1

0

10

Резерв для будущих определений.

1

0

1

1

11

Резерв для будущих определений.

1

1

0

0

12

Резерв для будущих определений.

1

1

0

1

13

Резерв для будущих определений.

1

1

1

0

14

Резерв для будущих определений.

1

1

1

1

15

Резерв для будущих определений.

Примеры версии и варианта в соответствии с таблицей приведены на рисунке 5, где M представляет размещение версии для шестнадцатеричного значения 0x4 (0b0100), а N — размещение варианта для одного из 4 возможных значений варианта 10xx: 0x8 (0b1000), 0x9 (0b1001), 0xA (0b1010), 0xB (0b1011).

00000000-0000-4000-8000-000000000000
00000000-0000-4000-9000-000000000000
00000000-0000-4000-A000-000000000000
00000000-0000-4000-B000-000000000000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

Рисунок 5. Примеры UUIDv4 Variant.


Следует отметить, что остальные варианты из таблицы 1 используют разные механизмы субтипов или версионирования. Запись и определение остальных комбинаций вариантов и субтипов UUID выходит за рамки документа.

5. Схемы UUID

Для минимизации путаницы в части назначения битов и разных версий определения записей UUID предоставляются как группы полей в строка по 4 октета, начиная со старшего.

5.1. UUID версии 1

UUIDv1 базируется на времени и содержит 60-битовую метку времени в формате UTC в виде числа интервалов по 100 наносекунд с момента времени 00:00:00.00 15 октября 1582 (дата григорианской реформы христианского календаря).

UUIDv1 включает также поле clock_seq для предотвращения дубликатов, которые могут возникать при переводе часов назад или смене идентификатора узла (Node ID).

Поле node содержит адрес IEEE 802 MAC, который обычно является адресом хоста или случайным значением, созданным в соответствии с параграфами 6.9 и 6.10.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           time_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           time_mid            |  ver  |       time_high       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|         clock_seq         |             node              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 6. Схема полей и битов UUIDv1.


time_low

32 младших бита 60-битовой стартовой метки времени (биты 0 — 31, октеты 0 — 3).

time_mid

Средние 16 битов 60-битовой стартовой метки времени (биты 32 — 47, октеты 4 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b0001 (1) (биты 48 — 51, октет 6).

time_high

12 старших5 битов 60-битовой стартовой метки времени (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

clock_seq

14-битовое поле упорядочения часов (биты 66 — 79, октеты 8 — 9).

node

48-битовый пространственно-уникальный идентификатор (биты 80 — 127, октеты 10 — 15).

Для систем, не имеющих доступа к UTC, но поддерживающих местное время, это время можно применять взамен UTC при условии согласованности времени во всей системе. Однако это не рекомендуется, поскольку получить UTC из местного времени можно просто вычитанием значения часового пояса.

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

При смене Node ID (например, при переносе сетевого адаптера в другую машину) установка в поле clock_seq случайного значения минимизирует вероятность дубликата из-за незначительной разницы времени в машинах. Если значение clock_seq, связанное с измененным Node ID, известно, его можно инкрементировать (маловероятно).

Поле clock_seq должно исходно (один раз за время существования системы) инициализироваться случайным значением для минимизации сходства (корреляции между системами). Это обеспечивает максимальную защиту в случае быстрого переноса Node ID от системы к системе. Исходному значению недопустимо коррелировать с Node ID.

Замечания для идентификаторов узлов на основе IEEE 802

  • В системах с несколькими адресами IEEE 802 можно использовать любой доступный адрес.

  • В системах без адреса IEEE должно использоваться случайное или псевдослучайное значение (см. параграфы 6.9 и 6.10).

  • В системах с 64-битовым адресом MAC можно использовать 48 младших (правых) битов.

  • Системам с 16-битовым адресом IEEE 802.15.4 следует применять взамен его 64-битовый MAC-адрес (можно использовать младшие 48 битов). Как вариант, можно сгенерировать 32 случайных бита и добавить их в конец 16-битового MAC-адреса для создания 48-битового значения.

5.2. UUID версии 2

UUIDv2 предназначены для DCE Security UUID (см .[C309] [C311]), поэтому определение здесь не приводится.

5.3. UUID версии 3

UUIDv3 предназначены для создания UUID по именам, которые берутся из некого пространства имён и уникальны в нём (см. параграф 6.5). Значения UUIDv3 создаются путём расчёта хэш-значения MD5 [RFC1321] для данного значения Namespace ID (параграф 6.6), объединённого (конкатенация) со значением желаемого имени, после их приведения к канонической последовательности октетов, заданной стандартами или соглашениями пространства имён, в сетевом порядке байтов. Значение MD5 помещается в UUID, затем устанавливаются поля version и variant в соответствии с параграфами 4.2 и 4.1 (см. пример в Приложении A.2). Информация о выборе канонического формата желаемого имени приведена в параграфе 6.5 (Замечание об именах).

По возможности вместо UUIDv3 следует применять UUIDv5. Сведения о безопасности MD5 приведены в [RFC6151].

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            md5_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          md5_high             |  ver  |       md5_mid         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        md5_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            md5_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 7. Схема полей и битов UUIDv2.


md5_high

48 старших (слева) битов рассчитанного значения MD5 (биты 0 — 47, октеты 0 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b0011 (3) (биты 48 — 51, октет 6).

md5_mid

12 младших (справа) из 16 битов рассчитанного значения MD5, следующих за md5_high (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

md5_low

62 младших (справа) битов из оставшихся 64 битов рассчитанного значения MD5 (биты 66 — 127, октеты 8 — 15).

5.4. UUID версии 4

UUIDv4 предназначена для генерации UUID из действительно случайных или псевдослучайных значений.

Реализация может генерировать 128 битов случайных данных и заполнять ими структуру UUID (рисунок 8). Затем поля version и variant устанавливаются в соответствии с параграфами 4.1 и 4.2. Как вариант, реализация может генерировать случайные значения random_a, random_b и random_c (всего 122 бита), а затем заполнить поля version и variant. Рекомендации по генерации случайных значений приведены в параграфе 6.9.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           random_a                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          random_a             |  ver  |       random_b        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                       random_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           random_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 8. Схема полей и битов UUIDv4.


random_a

Первые 48 битов, заполненные случайными данными (параграф 6.9) (биты 0 — 47, октеты 0 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b0100 (4) (биты 48 — 51, октет 6).

random_b

12 дополнительных битов, заполненные случайными данными (параграф 6.9) (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

random_c

62 бита после поля var, заполненные случайными данными (параграф 6.9) (биты 66 — 127, октеты 8 — 15).

5.5. UUID версии 5

UUIDv5 предназначены для генерации UUID по «именам», которые берутся из некого пространства имён и уникальны в нем, как описано в параграфе 6.5.

Значения UUIDv5 создаются путём расчёта хэш-значения SHA-1 [FIPS180-4] для данного значения Namespace ID (параграф 6.6), объединённого (конкатенация) с желаемым именем, после их приведения к канонической форме в соответствии со стандартами или соглашениями пространства имён с сетевым порядком байтов. Старшие (слева) 128 битов значения SHA-1 помещаются в схему UUID, а оставшиеся 32 (младшие) бита SHA-1 отбрасываются. Затем в UUID заполняются поля version и variant в соответствии с параграфами 4.2 и 4.1. Пример подстановки битов и отбрасывания лишнего представлен в Приложении A.4. Информация о выборе канонического формата желаемого имени приведена в параграфе 6.5 (Замечание об именах).

Возможны ситуации (обычно в зависимости от политики безопасности), когда библиотеки SHA-1 недоступны или сочтены небезопасными для применения. Поэтому может оказаться желательной генерация UUID по именам с использованием SHA-256 или более новых методов SHA. Для таких UUID недопустимо использовать UUIDv5 и взамен должны применяться UUIDv8, заданные в параграфе 5.8. Иллюстративный пример UUIDv8 для основанных на имени идентификаторов с использованием SHA-256 приведён в Приложении B.2.

Вопросы безопасности SHA-1 рассмотрены в [RFC6194].

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           sha1_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         sha1_high             |  ver  |      sha1_mid         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                       sha1_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           sha1_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 9. Схема полей и битов UUIDv5.


sha1_high

Старшие (слева) 48 битов рассчитанного значения SHA-1 (биты 0 — 47, октеты 0 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b0101 (5) (биты 48 — 51, октет 6).

sha1_mid

Младшие 12 из следующих после sha1_high 16 битов рассчитанного значения SHA-1 (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

sha1_low

62 младших бита оставшейся части (старшие 128 битов) хэш-значения SHA-1 (биты 66 — 127, октеты 8 — 15).

5.6. UUID версии 6

UUIDv6 — совместимая по полям версия UUIDv1 (параграф 5.1) с переупорядочением для улучшения локальности БД. Ожидается применение UUIDv6 прежде всего в контексте использования UUIDv1. Системам, не использующим устаревшую версию UUIDv1, следует применять UUIDv7 (параграф 5.7).

Вместо расщепления временной метки на три части (low, mid, high) как в UUIDv1 версия UUIDv6 обращает последовательность битов метки времени и записывает их от старшего к младшему. Т. е. из 60-битовой метки времени, принятой в UUIDv1 (параграф 5.1) в UUIDv6 сначала берутся 48 старших битов, за которыми следует 4 бита версии и оставшиеся 12 битов исходной 60-битовой временной метки. Поле clock_seq применяется, как указано в параграфе 5.1.

Для битов clock_seq и node следует устанавливать псевдослучайные значение при каждой генерации нового UUIDv6, однако реализация может применять поведение clock_seq и MAC-адреса, описанное в параграфе 5.1. Дополнительные сведения о применении MAC-адресов в UUID представлены в разделе 8.

Формат UUIDv6 показан на рисунке 10.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           time_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           time_mid            |  ver  |       time_low        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|         clock_seq         |             node              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 10. Схема полей и битов UUIDv6.


time_high

32 старших (слева) бита 60-битовой стартовой метки времени (биты 0 — 31, октеты 0 — 3).

time_mid

Средние 16 битов 60-битовой стартовой метки времени (биты 32 — 47, октеты 4 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b0110 (биты 48 — 51, октет 6).

time_low

Оставшиеся 12 битов 60-битовой стартовой метки времени (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

clock_seq

14-битовое поле упорядочения часов (биты 66 — 79, октеты 8 — 9).

node

48-битовый пространственно-уникальный идентификатор (биты 80 — 127, октеты 10 — 15).

В UUIDv6 расщепление метки времени на time_high и time_mid необязательно, поскольку порядок 48 битов time_high и time_mid не меняется. Этот шаг остаётся полезным при использовании имеющийся реализации UUIDv1.

5.7. UUID версии 7

UUIDv7 включает упорядоченные по времени значения меток из широко применяемого и хорошо известного источника Unix Epoch — число миллисекунд, прошедших с полуночи 1 января 1970 г. UTC, без учёта високосных секунд. В общем случае UUIDv7 обеспечивает лучшую энтропию по сравнению с UUIDv1 (параграф 5.1) и UUIDv6 (параграф 5.6).

Значения UUIDv7 создаются путём размещения временной метки Unix в миллисекундах) в старших 48 битах, заполнения полей version и variant, а также размещения случайных битов в оставшихся частях UUIDv7 для обеспечения уникальности, как указано в параграфе 6.9. Как вариант, реализации могут заполнять эти 74 указанной ниже комбинацией полей для обеспечения монотонного роста в рамках 1 миллисекунды:

  1. необязательная субмиллисекундная часть метки времени (до 12 битов), см. параграф 6.2 (метод 3);

  2. необязательный счётчик с хорошей затравкой, как указано в параграфе 6.2 (метод 1 или 2);

  3. случайные данные для каждого нового значения UUIDv7 в остальных битах.

Реализациям следует, по возможности, применять UUIDv7 вместо UUIDv1 и UUIDv6.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           unix_ts_ms                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          unix_ts_ms           |  ver  |       rand_a          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 11. Схема полей и битов UUIDv7.


unix_ts_ms

48-битовое беззнаковое значение (big-endian) временной метки Unix Epoch в миллисекундах, как указано в параграфе 6.1 (биты 0 — 47, октеты 0 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b0111 (7) (биты 48 — 51, октет 6).

rand_a

12 псевдослучайных битов для обеспечения уникальности (параграф 6.9) и/или дополнительной монотонности, как указано в параграфе 6.2 (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

rand_b

62 псевдослучайных бита для обеспечения уникальности (параграф 6.9) и/или дополнительной монотонности, как указано в параграфе 6.2 (биты 66 — 127, октеты 8 — 15). .

5.8. UUID версии 8

UUIDv8 обеспечивает формат для экспериментов и фирменных решений. Единственным требованием к этой версии является то, что биты variant и version должны быть установлены в соответствии с параграфами 4.1 и 4.2. Уникальность UUIDv8 будет зависеть от реализации и предполагать её недопустимо.

Явно определены лишь биты полей version и variant, а оставшиеся 122 контролируются реализацией. Важно отметить, что UUIDv8 не является заменой UUIDv4 (параграф 5.4), где эти 122 бита заполняются случайными значениями.

Ниже указаны примеры ситуаций, где могут применяться UUIDv8.

  • Реализация хочет включить в UUID информацию, не заданную в этом документе.

  • У реализации имеются ограничения на уровне языка или приложения, препятствующие применению стандартных UUID.

В Приложении B приведены два иллюстративных примера фирменных алгоритмов UUIDv8.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           custom_a                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          custom_a             |  ver  |       custom_b        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                       custom_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           custom_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 12. Схема полей и битов UUIDv8.


custom_a

48 битов, заполняемых в соответствии с потребностями реализации (биты 0 — 47, октеты 0 — 5).

ver

4-битовое поле версии, заданное в параграфе 4.2, со значением 0b1000 (8) (биты 48 — 51, октет 6).

custom_b

12 битов, заполняемых в соответствии с потребностями реализации (биты 52 — 63, октеты 6 — 7).

var

2-битовое поле варианта, заданное в параграфе 4.1, со значением 0b10 (биты 64 — 65, октет 8).

custom_c

62 бита после поля var, заполняемых в соответствии с потребностями реализации 62 (биты 66 — 127, октеты 8 — 15).

5.9. Nil UUID

00000000-0000-0000-0000-000000000000

Рисунок 13. Формат Nil UUID.


Nil UUID — это особый случай UUID, где все 128 имеют значение 0.

Nil UUID может применяться для указания отсутствия иного значения UUID, если требуется или применяется 128-битовый идентификатор UUID. Nil UUID можно считать эквивалентом отсутствия нужного значения, т. е это резервное значение для особых случаев в конкретной реализации.

Отметим, что Nil UUID относится к диапазону варианта Apollo NCS в соответствии с первой строкой таблицы 1.

5.10. Max UUID

Max UUID — это особый случай UUID, где все 128 битов имеют значение 1. Этот идентификатор можно считать инверсией Nil UUID (см. параграф 5.9).

FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF

Рисунок 14. Формат Max UUID.


Max UUID можно применять в качестве контрольного значения, когда требуется 128-битовый идентификатор UUID, но такие концепции как «конец списка UUID» нужно выражать и резервировать для зависящих от реализации случаев.

Отметим, что значение Max UUID относится к диапазону ещё не определённых (yet-to-be defined) в соответствии с последней строкой таблицы 1.

6. Опыт применения UUID

Минимальные требования к генерации UUID каждой версии описаны в этом документе. Остальное отдаётся на откуп реализации. Ниже рассматриваются важные факторы, которые могут помочь разработчикам найти компромисс между разными реализациями UUID.

6.1. Временные метки

Источники, размер и точность временных меток UUID были предметом долгих дискуссий при разработке спецификации UUIDv7. Выбор правильной метки времени очень важен для приложений и в этом параграфе рассматриваются наиболее важные аспекты этого выбора.

Надёжность

Реализация получает текущую временную метку из надёжного источника для генерации упорядоченных по времени и постоянно увеличивающихся значений. Следует позаботиться о том, чтобы изменения временных меток из среды или операционной системы обрабатывались должным образом в соответствии с требованиями реализации. Например, если системные часы могут быть переведены назад из-за настройки вручную или корректировки по протоколу точного времени, реализации нужно понимать, как обрабатывать такие случаи (см. «Изменение, размытие, размазывание» ниже).

Источник

В UUIDv1 и UUIDv6 применяются временные метки Gregorian Epoch, а в UUIDv7 — Unix Epoch. Если нужны метки другой эпохи, должна применяться версия UUIDv8.

Субсекундное разрешение и точность

Для временных меток применяется множество уровней точности: миллисекунды, микросекунды, наносекунды и т. д. Кроме того, для упорядочения по времени при разных субсекундных уровнях могут применяться дробные значения. Системные часы имеют тот или иной уровень дискретности, который зачатую ниже точности, обеспечиваемой операционной системой. В настоящее время для UUIDv1 и UUIDv6 применяется дискретность в 100 нсек, а для UUIDv7 — 1 мсек для Unix Epoch, что не выше точности многих современных систем. Для других уровней точности можно применять UUIDv8. По аналогии с параграфом 6.2 для UUIDv1 и UUIDv6 можно имитировать более высокую точность временных меток, подсчитывая число UUID с одинаковым значением системного времени и создавая на основе этого дробную часть временной метки. Число меток высокого разрешения будет варьироваться от 0 до числа интервалов по 100 нсек в одном интервале системных часов.

Размер

От размера временной ветки напрямую зависит продолжительность её возможного использования в UUID до достижения максимального значения и это следует принимать во внимание при выборе типа метки. В версиях UUIDv1 и UUIDv6 применяются 60-битовые метки времени, пригодные до 52366 н. э., в UUIDv7 — 48-битовые, которые будут действовать до 10889 н. э.

Изменение, размытие, размазывание

Реализации могут изменять фактические метки времени. Примерами этого являются соображения безопасности, связанные с предоставлением реального времени в UUID для 1) корректировки неточных часов, 2) обработки високосных секунд, 3) получение значений миллисекунд путём деления на 1024 (или иное значение) по причинам производительности (вместо деления числа микросекунд на 1000). Эта спецификация не задаёт требований или гарантий точности часов (совпадения с фактическим временем). Если не требуется частая генерация UUID, метки UUIDv1 и UUIDv6 могут просто быть системным временем, умноженным на число 100-наносекундных интервалов в одном интервале системного таймера.

Заполнение

Если требуется дополнение меток времени, реализация должна заполнять старшие (слева) биты. Примером является заполнение старших битов метки Unix нулями до размера 48 битов в UUIDv7 или заполнение старших битов числом переходов 32-битовых меток Unix через 0 после 19 января 2038 г.

Отсечка

Если требуется отсечка временной метки, отбрасываться должны младшие (справа) биты. Примером может служить отсечка 16 младших битов 64-битовых меток Unix до 48 битов в UUIDv7.

Обработка ошибок

Если система перегружает генератор, запрашивая слишком много UUID в одном интервале системного таймера, служба UUID может возвращать ошибку или приостанавливать генератор UUID до смены значения системных часов. Недопустимо сознательно возвращать дубликаты значений при переходе счётчика через 0 (rollover). Отметим, что при частой перегрузке генераторов UUID системе могут быть выделены добавочные Node ID, что позволит ускорить выделение, делая потенциально доступными множество UUID для каждого значения метки. Похожие методы рассматриваются в параграфе 6.4.

6.2. Монотонность и счётчики

Монотонность (каждое следующее значение больше предыдущего) является основой для сортируемых по времени UUID на базе времени. Обычно UUID по времени из этого документа будут монотонными из-за встроенной метки времени, однако реализации могут усилить монотонность с помощью описанных ниже концепций.

Следует озаботиться монотонностью UUID при пакетной генерации. Т. е. при создании 1000 UUID для одной метки времени следует обеспечить логику упорядочения генерации этой 1000 UUID. Реализации пакетной генерации UUID могут применять монотонный счётчик, инкрементируемый для каждого UUID создаваемого с той же меткой времени.

В реализациях UUID для одного узла, которым не требуется пакетное создание UUID, встроенные метки времени UUIDv6 и UUIDv7 могут обеспечить достаточные гарантии монотонности просто за счёт создания нового UUID после того, как временная метка обновилась. Узлы распределенных систем рассматриваются в параграфе 6.4.

Реализациям для одного узла при пакетном создании UUID следует применять указанные ниже методы или обеспечивать иным способом монотонность при высокой скорости генерации UUID.

Выделенный счётчик фиксированного размера (метод 1)

Некоторые реализации выделяют определённое число битов в схеме UUID исключительно для подсчёта числа UUID созданных в течение данного интервала меток UUID. При наличии счётчика фиксированного размера он должен помещаться сразу после встроенной временной метки. Это улучшает сортировку и позволяет генерировать случайные данные для каждого увеличения счётчика. В этом случае поле rand_a (или часть его битов слева) в UUIDv7 служит выделенным счётчиком фиксированного размера, который инкрементируется при каждой генерации UUID. Случайные биты в конце rand_b (трейлер) при каждой генерации UUID помогут создавать непредсказуемые UUID. Если для счётчика нужно больше битов можно использовать также старшие (слева) биты поля rand_b.

Монотонные случайные числа (метод 2)

Этот метод позволяет использовать случайные данные как счётчик. Эти монотонные значения можно рассматривать как «счётчик со случайной затравкой», которая должна инкрементироваться в младших битах при каждой генерации UUID с данной временной меткой. В UUIDv7 для этого следует использовать поле rand_b при пакетной генерации в течение одного интервала временной метки. Приращение для каждой генерации UUID является случайным положительным целым числом желаемого размера. Это обеспечивает требуемый уровень непредсказуемости UUID за счёт базовой энтропии. Можно инкрементировать значение на 1, если важно число генерируемых в определённом интервале UUID, а предсказуемость не является проблемой. Однако не следует увеличивать счётчик на 1 в реализациях, поддерживающих непредсказуемость, поскольку значения легко угадать.

Замена старших битов для повышения точности часов (метод 3)

Для UUIDv7 с миллисекундной дискретностью меток времени можно использовать дополнительную точность часов, доступную в системе, для замены 12 случайных битов, следующих сразу за меткой времени. Это позволяет получить упорядоченные по времени значения с субмиллисекундным разрешением, используя подходящее для среды реализации число битов. В этом случае биты повышения точности должны размещаться в начале (слева) поля rand_a для UUIDv7.

Расчёт значения начинается с дробной части временной метки (доли миллисекунды в UUIDv7). Рассчитывается число значений, которые могут быть представлены доступным числом битов (4096 для поля UUIDv7 rand_a). С помощью арифметики с плавающей запятой или масштабируемой целочисленной арифметики дробная часть значения миллисекунд умножается на 4096 с округлением вниз (уменьшение) до целого числа, чтобы получить значение от 0 до максимума для выбранного числа битов. Эти числа будут монотонно возрастать со временем. Каждое возрастающее дробное значение будет приводить к росту значения используемого битового поля.

Предположим, например, системное время 1 января 2023 г. 12:34:56,1234567. С учётом точности лучше 1 мсек получим значение 0,4567 как дробную часть миллисекунды. Для кодирования этого значения в 12 битов можно взять число возможных значений этих битов (4096 или 212), умножить его на значение дробной части и отсечь результат до целого числа, что даёт 1870. Это число можно представить в шестнадцатеричной (0x74E) или двоичной (0b011101001110) форме. Затем эти 12 битов можно использовать как старшие (слева) биты поля случайного значения UUID (rand_a в UUIDv7). Это работает для любого числа битов, помещаемых в UUID, и приложение может выбрать число битов на основе доступного разрешения часов. Для UUIDv7 число ограничено 12 битами, доступными в поле случайных значений.

Основным преимуществом кодирования повышенной точности меток является возможность использования данных, доступных из системных часов, которые с высокой вероятностью будут уникальными. Это может упростить некоторые реализации. Метод можно применять в сочетании с другими, где биты дополнительной точности будут размещаться сразу после метки времени. Тогда при использовании битов упорядочения часов (clock_seq) они будут следующими.

Ниже рассматриваются вопросы создания надёжных выделенных счётчиков с фиксированным числом битов.

Затравка выделенного счётчика с фиксированным размером

Реализации со счётчиком фиксированного размера инициализируют этот счётчик случайным значением при каждом увеличении (шаге) метки времени. При неизменном значении метки счётчик инкрементируется по специальной логике. При использовании счётчика со случайной затравкой (seed) вместе с методом 1 (см. выше) случайное значение может генерироваться при каждом увеличении счётчика без влияния на сортируемость. Недостатком такого подхода является возможность переполнения счётчика при выборе недостаточного размера или нехватке места для требуемого числа приращений. Реализации со счётчиком фиксированного размера могут применять случайную инициализацию части, а не всего значения счётчика. Например, в 24-битовом счётчике можно случайно инициализировать 23 младших бита, а старший бит инициализировать 0 с целью предотвращения переполнения счётчика.

Размер выделенного счётчика с фиксированным размером

Разрядность счётчика выбирается в соответствии с уровнем точности меток времени. Например, для миллисекундной точности обычно требуется больший размер счётчика, чем для наносекундной. В общем случае следует делать размер не менее 12 битов и не более 42. Нужно выбирать размер так, чтобы обеспечивалась достаточная энтропия случайной части UUID после размещения счётчика. Энтропия позволяет улучшить непредсказуемость UUID при пакетной генерации.

Далее рассматриваются вопросы, связанные с переходом счётчика через максимум (rollover).

Защита от обнуления (rollover)

Описанная выше «Затравка счётчика фиксированного размера» полезна и для устранения перехода счётчика через 0 при достижении максимума. Это подходит и для методов с монотонным случайным счётчиком, когда гарантируется, что размер инкрементируемой части меньше общего размера случайного приращения. Это позволяет инкрементировать младшие (справа) биты счётчика без риска перехода через максимальное значение счётчика.

Обработка достижения максимума счётчика (Rollover)

Для предотвращения проблем при сортировки приложение должно обрабатывать достижение счётчиком максимума. В общем случае приложениям, озабоченным монотонностью и сортируемостью следует «замораживать» счётчик в ожидании новой временной метки, что обеспечит сохранение монотонности. Как вариант, можно инкрементировать метку за пределы текущего времени и снова инициализировать счётчик.

Для обеспечения монотонности идентификаторов UUID со встроенным счётчиком реализация может:

  1. сравнить текущую метку времени с сохранённой;

  2. если метки совпадают, счётчик инкрементируется выбранным методом;

  3. если значение текущей метки больше предыдущего, счётчик инициализируется заново выбранным методом для новой метки и генерируются новые случайные биты (если биты были заморожены или применялись в качестве затравки монотонного счётчика).

Проверка ошибок монотонности

Реализации следует проверять, что текущий созданный идентификатор UUID больше предыдущего. Нарушение этого говорит о том, что могли произойти такие события, как перевод часов, обработка високосных секунд, переполнение счётчика. В приложения следует внедрять логику обнаружения таких ситуаций и устранения проблем или хотя бы информирования о соответствующей ошибке. В общем случае приложение может для этого повторно использовать предыдущую или инкрементировать счётчик.

6.3. Состояния генератора UUID

Состояние генератора UUID (необязательное) требуется считывать из стабильного хранилища лишь один раз в процессе загрузки, если оно считывается в энергонезависимое системное хранилище (и обновляется вместе с этим хранилищем). Это стабильное хранилище можно применять для записи различных частей генерации UUID, что будет полезно при пакетной генерации и проверке ошибок монотонности в UUIDv6 и UUIDv7. Сохраняемые значения могут включать последнюю известную метку времени, поле упорядочения часов, счётчики, случайные данные и т. п.

Если реализации не доступно стабильное хранилище, она может генерировать UUID как для первого случая при пакетной генерации. Это менее желательно, поскольку повышает частоту создания таких значений, как поле упорядочения часов, счётчики и случайные данные, что повышает вероятность дубликатов. Кроме того, частая генерация случайных значений создаёт дополнительную нагрузку на источник энтропии и/или пул энтропии, служащий основой для случайных чисел. Если очень важна устойчивость к коллизиям, реализация может возвращать ошибку приложения (см. параграф 6.7).

Для UUIDv1 и UUIDv6 при неизменном Node ID (например, сетевой адаптер для Node ID не отделим от системы) или реинициализации упорядочения часов случайным значением можно возвращать текущее значение Node ID вместо его записи в стабильное хранилище. Состояние не требуется записывать в стабильное хранилище при каждой генерации UUIDv1 или UUIDv6. Для метки времени в хранилище можно периодически устанавливать значение больше уже использованного в UUID. Пока в генерируемых UUID метка времени меньше записанной в хранилище, а clock_seq и Node ID остаются неизменными, обновлять нужно лишь общую энергонезависимую копию состояния. Если значение метки в хранилище указывает в будущее на величину меньше типичного времени перезагрузки системы, отказ (перезагрузка) не приведёт к необходимости заново инициализировать clock_seq.

Если доступ к общему состоянию при каждой генерации UUID слишком дорог, можно реализовать общесистемный генератор для выделения блока меток времени при каждом вызове, которые затем будут служить для генерации UUID.

6.4. Распределённая генерация UUID

Некоторым реализациям может потребоваться использование многоузловых кластеризованных приложений, где два и более узла независимо генерируют UUID, сохраняемые в одном месте. Хотя UUID уже имеют достаточную энтропию, гарантирующую малую вероятность конфликтов, с ростом числа генерирующих узлов вероятность коллизий растёт.

В этом параграфе описаны два устойчивых к конфликтам подхода при многоузловой генерации UUID в распределенных средах. Несмотря на описание здесь двух методов, в реализациях следует применять вариант псевдослучайных Node ID, если требуется устойчивость к конфликтам при распределенной генерации UUID. Применение любого из этих методов не требует распределенной генерации UUID.

Node ID

В этом методе в структуру UUID помещается псевдослучайное значение Node ID, которое помогает гарантировать уникальность битового пространства для данного узла. В результате созданные узлом UUID не конфликтуют с UUID, созданными другими узлами (с иным Node ID ). Реализациям со встроенным идентификатором узла следует использовать UUIDv8. В качестве Node ID не следует применять адреса IEEE 802 MAC (см. раздел 8). Местоположение и число используемых битов определяется реализацией и выходит за рамки документа. Не рассматривается здесь также создание и согласование уникальных идентификаторов для каждого узла.

Централизованный реестр

В этом методе все узлы, генерирующие UUID, обращаются к центральному реестру и подтверждают уникальность созданных значений. По мере масштабирования взаимодействие с центральным реестром может стать узким местом, негативно влияющим на генерацию UUID. Этот метод не рекомендуется и выходит за рамки документа.

Распределенные приложения, генерирующие UUID на множестве хостов, должны быть готовы полагаться на источник случайных чисел каждого хоста.

6.5. Генерация UUID на основе имён

Хотя некоторые предпочитают термин «основанные на хэше» для описания UUID, применяющих алгоритмы хэширования (MD5 или SHA-1), в документе сохраняется термин «основанные на именах» для согласованности с ранее опубликованными документами и имеющимися реализациями. Требования к UUID на основе имён приведены ниже.

  • UUID, созданные из одного имени (в одном каноническом формате) в одном пространстве имён, должны быть одинаковыми.

  • UUID, созданным из разных имён (в одном или разных канонических форматах) в одном пространстве имён, следует быть разными (с высокой вероятностью).

  • UUID, созданным из одного имени (в одном или разных канонических форматах) в разных пространствах имён, следует быть разными (с высокой вероятностью).

  • Если два UUID, созданных по именам (в одном каноническом формате), совпадают, они были созданы из одного имени в одном и том же пространстве имён (с высокой вероятностью).

Замечание об именах

Понятие имени (и пространства имён) следует трактовать широко, не ограничиваясь текстовыми именами. Каноническая последовательность октетов — это последовательность, соответствующая спецификации канонической формы представления данной формы имени. Имя может иметь множество форм, из которых лишь 1 является канонической. Разработчики новых пространств имён для UUID должны указывать спецификацию канонической формы имён в этом пространстве или определять каноническую форму, если её ещё нет. Например, на момент создания этого документа в системе доменных имён ((Domain Name System или DNS) [RFC9499] было 3 формата передачи: базовый (www.example.com), для представления (www.example.com.) и для передачи в линию (3www7example3com0). Для отличительных имён [X500] (Distinguished Name или Dn) [RFC4122] разрешает принимать текстовые и двоичные (DER). Для унифицированных указателей ресурсов (Uniform Resource Locator или URL) [RFC1738] можно указать полное доменное имя (Fully Qualified Domain Name или FQDN) с идентификатором протокола или без него (www.example.com или https://www.example.com). Для идентификаторов объектов (OID) [X660] можно выбрать нотацию с точками без точки (2.999) или с точкой (.2.999) в начале, а также один из многих форматов [X680], таких как OID Internationalized Resource Identifier (OID-IRI) (/Joint-ISO-ITU-T/Example). Хотя по умолчанию большинство пользователей могут применять базовый формат для DNS, FQDN для URL, текст для X.500 и нотацию без ведущей точки для OID, реализациям UUID на основе имён обычно следует принимать ввод в любой форме. Каждый из форматов имени в пространстве имён будет давать на выходе свой UUID. Поэтому механизмы и соглашения, применяемые для выделения имён и обеспечения их уникальности в своём пространстве выходят за рамки этой спецификации.

6.6. Распределение и использование идентификаторов пространства имён

В этом параграфе описаны идентификаторы некоторых потенциально интересных пространств имён, таких как DNS [RFC9499], URL [RFC1738], OID [X660], Dns [X500]. Описаны также выделение, регистрация в IANA и другие детали.

Таблица 3. Идентификаторы пространств имён.

 

Пространство имён

Namespace ID

Документ

для имени

для идентификатора

DNS

6ba7b810-9dad-11d1-80b4-00c04fd430c8

[RFC9499]

[RFC4122], RFC 9562

URL

6ba7b811-9dad-11d1-80b4-00c04fd430c8

[RFC1738]

[RFC4122], RFC 9562

OID

6ba7b812-9dad-11d1-80b4-00c04fd430c8

[X660]

[RFC4122], RFC 9562

X500

6ba7b814-9dad-11d1-80b4-00c04fd430c8

[X500]

[RFC4122], RFC 9562

 

Элементы добавляются в реестр по процедуре Specification Required [RFC8126]. Распределение Namespace ID назначенными экспертами показано ниже.

  • Первое значение Namespace ID для DNS было рассчитано из UUIDv1 на основе времени и в качестве стартовой точки служит 6ba7b810-9dad-11d1-80b4-00c04fd430c8.

  • В последующих значениях Namespace ID увеличивается младший (справа) бит time_low 6ba7b810, а для остальной части UUID фиксируется значение 9dad-11d1-80b4-00c04fd430c8.

  • Новые значения Namespace ID должны использовать такую же логику и недопустимо выдавать ранее использованные значения Namespace ID.

  • Таким образом, для следующего Namespace ID доступно значение time_low 6ba7b815 а полный идентификатор будет иметь значение 6ba7b815-9dad-11d1-80b4-00c04fd430c8.

  • Верхней границей time_low в случае значений Namespace ID является ffffffff (полный идентификатор ffffffff-9dad-11d1-80b4-00c04fd430c8), что должно обеспечить достаточно места для будущих значений Namespace ID.

Отметим, что 6ba7b813-9dad-11d1-80b4-00c04fd430c8 и его использование не заданы этим документом и [RFC4122], поэтому его не следует применять значение Namespace ID.

Новые Namespace ID должны документироваться в соответствии с разделом 7, если они должны быть глобально доступны и совместимы. Реализации могут продолжать специфичные для поставщика, приложения или внедрения значения Namespace ID, но это не гарантирует совместимости. Для таких ID недопустимо применять указанную выше логику и взамен рекомендуется Namespace ID UUIDv4 или UUIDv7. Если вероятность конфликтов (параграф 6.7) и уникальность (параграф 6.8) UUID на основе имени не являются проблемой, реализация может применять при создании Namespace ID для приложения версию UUIDv8. Реализациям следует возможность ввода пользовательских пространств имён для вновь зарегистрированных IANA Namespace ID сверх указанных выше, а также специфичных для приложения Namespace ID.

6.7. Устойчивость к конфликтам

Реализациям следует учитывать последствия конфликтов UUID в приложениях и при выборе между версиями UUID, использующими энтропию (случайность), и другими компонентами, такими как описаны в параграфах 6.1 и 6.2. Это особенно важно для устойчивости к конфликтам в распределенных системах, как описано в параграфе 6.4. Ниже приведены два примера, иллюстрирующие разный уровень влияния конфликтов на приложение.

Слабое влияние

Конфликт UUID вызывает появление дубликата записи в системном журнале, что искажает статистику, полученную на основе данных. Реализации, на которые не влияют конфликты, могут продолжать использование энтропии и уникальности, обеспечиваемых UUID, заданными в этом документе.

Сильное влияние

дубликат ключа ведёт к получению самолётом неверного курса, что ставит под угрозу жизнь людей. В таких случаях нет места для ошибок. Конфликтов необходимо избегать, отказы недопустимы. Приложения, работающие в таких условиях, должны обеспечивать максимальную устойчивость к конфликтам в рамках заданного контекста.

6.8. Глобальная и локальная уникальность

Созданные по этой спецификации UUID могут применяться для обеспечения гарантий локальной уникальности. Например, в случаях, когда не нужна глобальная уникальность вне приложения, уникальности созданных в рамках локального приложения UUID может быть достаточно для БД. Хотя абсолютную глобальную уникальность невозможно обеспечить без схемы обмена данными, для практической уникальности UUID такая схема не требуется. Реализации могут при необходимости использовать общую схему обмена данными, описанную в параграфе 6.4для повышения уровня уникальности, обеспечиваемого данной спецификацией.

6.9. Непредсказуемость

Реализациям следует применять криптозащищенный генератор псевдослучайных чисел (CSPRNG) для создания трудно предсказуемых значений с низкой вероятностью коллизий (уникальность). Исключением являются случаи недоступности CSPRNG в среде исполнения. Следует озаботиться подобающим обновлением состояния CSPRNG в таких ситуациях, как ветвление процессов. CSPRNG гарантирует, что лучшие решения из параграфов 6.7 и 8 будут в современных UUID. Дополнительные сведения по созданию случайных чисел криптографического качества даны в [RFC4086], [RFC8937], [RANDOM].

6.10. UUID, не идентифицирующие хост

В этом параграфе описана генерация UUIDv1 или UUIDv6 в случаях недоступности или нежелательности применения адресов IEEE 802. Реализации могут использовать методы рандомизации MAC-адресов [IEEE802.11bh] в качестве альтернативы псевдослучайной логике, описанной в этом параграфе. Как вариант, реализации могут выбрать получение 48-битового псевдослучайного числа криптографического качества в соответствии с параграфом 6.9 для использования в качестве Node ID. После генерации 48-битового случайного идентификатора узла реализация должна установить в младшем бите первого октета Node ID значение 1. Этот бит служит для указания индивидуального или группового адреса и никогда не устанавливается в адресах IEEE 802 реальных сетевых плат. Поэтому не может возникать конфликтов между UUID, созданных на машинах с сетевым адаптером и без такового. Пример генерации случайного 48-битового значения и его последующего использования приведён в Приложении A. Дополнительные сведения об адресах IEEE 802, битах unicast/multicast и local/global приведены в [RFC9542].

Отметим, что для совместимости с прежними спецификациями здесь используется бит unicast/multicast, а не более корректный local/global, поскольку в сети возможны MAC-адреса с обоими значениями бита local/global. С битом unicast/multicast этого не происходит, поскольку узел не может иметь группового адреса.

Такие элементы, как имя компьютера или операционной системы не являются строго случайными, но могут помочь в различении результатов из разных систем.

Точный алгоритм генерации Node ID зависит от конкретной системы, поскольку доступные данные и функции очень часто зависят от системы. Базовый подход заключается в сборе как можно большего числа источников в буфер, создании дайджеста сообщения (например, SHA-256 или SHA-512 [FIPS180-4]), взятия из хера 6 произвольных байтов и установки бита multicast, как указано выше.

6.11. Сортировка

UUIDv6 м UUIDv7 устроены так, что реализации, которым нужна сортировка (например, индексов БД), могут обрабатывать идентификаторы как неразобранные (raw) байты без необходимости из разбора или анализа. Упорядоченные по времени монотонные UUID выигрывают от большей локальности индексов БД, поскольку новые значения индексов размещаются близко друг к другу. В результате объекты лучше группируются для повышения производительности. Реальные различия при таком подходе и случайной вставке данных могут составлять порядок величины и больше.

Форматы UUID, соответствующие этой спецификации, предназначены для лексической сортировки в текстовом представлении. UUID создаются с сетевым порядком байтов (big-endian). Если нужен обратный порядок (little-endian), можно использовать UUIDv8.

6.12. Непрозрачность

В общем случае рекомендуется избегать ненужного анализа значений UUID, используя их как «непрозрачные» (opaquely). Хотя задачи приложений могут требовать того или иного анализа (introspection), например, полей var (параграф 4.1) и ver (параграф 4.2) или временных меток UUID, рекомендуется избегать таких операций. Соблюдение этих рекомендаций упростит приложения, повысит их совместимость и производительность.

6.13. Вопросы БД и СУБД

Для многих приложений (например, БД) сохранение UUID в форме текста избыточно, поскольку требует 288 битов для представления 128-битовых значений UUID. По возможности, UUID для БД следует сохранять в 128-битовой двоичной форме. В других системах UUID можно хранить в двоичном или текстовом виде.

  • Двоичная форма обеспечивает экономию места и может ускорять доступ.

  • Текстовая форма занимает больше места, но требует меньше трансляций, что может упростить реализации.

Производителям систем управления базами данных (СУБД) рекомендуется обеспечивать функции генерации и хранения UUID в заданных здесь форматах для применения в качестве идентификаторов (или их части), таких как первичные ключи, суррогатные ключи для временных БД, внешние ключи для полиморфных отношений, ключи пар key-value в столбцах JSON и БД и т. п. В приложениях с монолитными БД созданные базой (а не клиентом) UUID могут быть более монотонными. UUID могут дополняться другими идентификаторами для обеспечения целостности и обратной связи.

Разработчикам БД рекомендуется не использовать UUID на основе имён (параграфы 5.3 и 5.5) в качестве первичных ключей таблиц. Основной проблемой при проектировании БД является допущение о неизменности определённых значений, которое на деле оказывается ошибкой. Почтовые индексы, номера лицензий и другие идентификационные номера и т. п. кажутся уникальными и неизменными в данный момент времени, а позднее возникают обстоятельства, требующие их замены. Изменение идентификатора, служившего вводом name для UUID на основе имени, может привести к аннулированию структуры БД. Для таких случаев отмечено, что использование UUID, не основанных на имени, будет приводить к тому, что рассматриваемое поле будет размещено там, где легче адаптироваться к изменениям (исключая первичные ключи). В общем случае с учётом отмеченных проблем рекомендуется избегать естественных ключей в виде UUID на основе имён и применять суррогатные ключи UUID на основе времени.

7. Взаимодействие с IANA

Все ссылки на [RFC4122] в реестрах IANA (за исключением созданных этим документом) заменены ссылками на этот документ, включая регистрацию пространства имён IANA URN [URNNamespaces] для UUID. Ссылки на параграф 4.1.2 в [RFC4122] заменены ссылками на раздел 4 данного документа.

Агентству IANA нужно отслеживать субтипы UUID и особые случаи Namespace IDs Values, как указано в параграфах 7.1 и 7.2 в реестре <https://www.iana.org/assignments/uuid>. При оценке запросов назначенным экспертам следует учитывать отклики сообщества, чёткость определения базовой спецификации и её требования. Значения, зависимые от производителя, приложения или конкретного внедрения, не регистрируются. Технические документы следует публиковать в стабильном виде с обеспечением свободного доступа (в идеале с указанием URL), но они не обязаны быть стандартами. Назначенные эксперты одобряют или отклоняют запрос на регистрацию и сообщают об этом в IANA. В отказ следует включать объяснение причин и, если это применимо, рекомендации по изменению.

7.1. Реестр IANA UUID Subtypes и регистрация в нём

Эта спецификация задаёт реестр UUID Subtypes для широко применяемых стандартов UUID.

Таблица 4. Субтипы IANA UUID.

 

Имя

ID

Субтип

Вариант

Документ

Gregorian Time-based

1

version

OSF DCE / IETF

[RFC4122], RFC 9562

DCE Security

2

version

OSF DCE / IETF

[C309], [C311]

MD5 Name-based

3

version

OSF DCE / IETF

[RFC4122], RFC 9562

Random

4

version

OSF DCE / IETF

[RFC4122], RFC 9562

SHA-1 Name-based

5

version

OSF DCE / IETF

[RFC4122], RFC 9562

Reordered Gregorian Time-based

6

version

OSF DCE / IETF

RFC 9562

Unix Time-based

7

version

OSF DCE / IETF

RFC 9562

Custom

8

version

OSF DCE / IETF

RFC 9562

 

Значения в реестр могут добавляться по процедуре Standards Action [RFC8126]. Требования указаны ниже.

  • Минимальное и максимальное значение ID для субтипа version варианта OSF DCE / IETF должно находиться в диапазоне от 0 до 15. Версии из таблицы 27 указанные как резервные или не используемые, не включаются в реестр IANA до подобающего определения.

  • В столбце «Субтип» содержится текст произвольной формы. На момент публикации этого документа были лишь два субтипа UUID — version и family. Субтип family относится к пространству вариантов Apollo NCS (выходит за рамки этой спецификации). Вариант Microsoft может иметь механизм субтипов, однако эти субтипы не известны и выходят за рамки спецификации. Варианты «Резерв для будущих определений» могут вносить новые субтипы в будущем. Значения идентификаторов (Subtype ID) могут перекрываться, например, ID может существовать в нескольких вариантах.

  • В столбце «Субтип» содержится текст произвольной формы. Вероятно будет применяться 4 значения: OSF DCE / IETF, Apollo NCS, Microsoft и значение, относящееся к варианту «Резерв для будущих определений». В будущем могут быть добавлены новые имена.

7.2. Реестр IANA UUID Namespace ID и регистрация в нём

Эта спецификация задаёт реестр UUID Namespace IDs для широко используемых значений Namespace ID. Детали регистрации, включая рекомендации для назначенных экспертов, приведены в параграфе 6.6.

8. Вопросы безопасности

Реализациям не следует предполагать сложность угадывания UUID. Например, недопустимо использовать UUID как средства защиты (идентификаторы для получения доступа). Наличие предсказуемости в источнике случайных чисел приведёт к появлению уязвимости. Реализациям недопустимо предполагать простоту обнаружения незначительных изменений UUID для перенаправления ссылки на другой объект. Человек не может проверить целостность UUID простым взглядом.

MAC-адресам присущи риски в части конфиденциальности (приватности), поэтому не следует применять их в UUID. Взамен следует брать данные CSPRNG из источника с достаточной энтропией, обеспечивающего уникальность при создании UUID (см. параграфы 6.9 и 6.10).

Метки времени в UUID открывают очень небольшой фронт атак. Метка времени в сочетании с встроенным счётчиком говорит о порядке создания UUID и соответствующих данных, но не раскрывает ничего о самих данных или приложении в целом. Если UUID нужны для операций защиты в контексте приложения в той или иной форме, следует применять UUIDv4 (параграф 5.4).

Вопросы безопасности для MD5 рассмотрены в [RFC6151], для SHA-1 — в [RFC6194].

9. Литература

9.1. Нормативные документы

[C309] X/Open Company Limited, «X/Open DCE: Remote Procedure Call», ISBN 1-85912-041-5, Open CAE Specification C309, August 1994, <https://pubs.opengroup.org/onlinepubs/9696999099/toc.pdf>.

[C311] The Open Group, «DCE 1.1: Authentication and Security Services», Open Group CAE Specification C311, August 1997, <https://pubs.opengroup.org/onlinepubs/9696989899/toc.pdf>.

[FIPS180-4] National Institute of Standards and Technology (NIST), «Secure Hash Standard (SHS)», FIPS PUB 180-4, DOI 10.6028/NIST.FIPS.180-4, August 2015, <https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf>.

[FIPS202] National Institute of Standards and Technology (NIST), «SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions», FIPS PUB 202, DOI 10.6028/NIST.FIPS.202, August 2015, <https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC8141] Saint-Andre, P. And J. Klensin, «Uniform Resource Names (URNs)», RFC 8141, DOI 10.17487/RFC8141, April 2017, <https://www.rfc-editor.org/info/rfc8141>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[X667] ITU-T, «Information technology — Open Systems Interconnection — Procedures for the operation of OSI Registration Authorities: Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 object identifier components», ISO/IEC 9834-8:2004, ITU-T Recommendation X.667, September 2004.

9.2. Дополнительная литература

[COMBGUID] «Creating sequential GUIDs in C# for MSSQL or PostgreSql», commit 2759820, December 2020, <https://github.com/richardtallent/RT.Comb>.

[CUID] «Collision-resistant ids optimized for horizontal scaling and performance.», commit 215b27b, October 2020, <https://github.com/ericelliott/cuid>.

[Elasticflake] Pearcy, P., «Sequential UUID / Flake ID generator pulled out of elasticsearch common», commit dd71c21, January 2015, <https://github.com/ppearcy/elasticflake>.

[Err1957] RFC Errata, Erratum ID 1957, RFC 4122, <https://www.rfc-editor.org/errata/eid1957>.

[Err3546] RFC Errata, Erratum ID 3546, RFC 4122, <https://www.rfc-editor.org/errata/eid3546>.

[Err4975] RFC Errata, Erratum ID 4975, RFC 4122, <https://www.rfc-editor.org/errata/eid4975>.

[Err4976] RFC Errata, Erratum ID 4976, RFC 4122, <https://www.rfc-editor.org/errata/eid4976>.

[Err5560] RFC Errata, Erratum ID 5560, RFC 4122, <https://www.rfc-editor.org/errata/eid5560>.

[Flake] Boundary, «Flake: A decentralized, k-ordered id generation service in Erlang», commit 15c933a, February 2017, <https://github.com/boundary/flake>.

[FlakeID] «Flake ID Generator», commit fcd6a2f, April 2020, <https://github.com/T-PWK/flake-idgen>.

[IBM_NCS] IBM, «uuid_gen Command (NCS)», March 2023, <https://www.ibm.com/docs/en/aix/7.1?topic=u-uuid-gen-command-ncs>.

[IEEE754] IEEE, «IEEE Standard for Floating-Point Arithmetic.», IEEE Std 754-2019, DOI 10.1109/IEEESTD.2019.8766229, July 2019, <https://standards.ieee.org/ieee/754/6210/>.

[IEEE802.11bh] IEEE, «IEEE Draft Standard for Information technology-Telecommunications and information exchange between systems Local and metropolitan area networks-Specific requirements — Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications Amendment: Enhancements for Extremely High Throughput (EHT)», Electronic ISBN 978-1-5044-9520-2, March 2023, <https://standards.ieee.org/ieee/802.11bh/10525/>.

[KSUID] Segment, «K-Sortable Globally Unique IDs», commit bf376a7, July 2020, <https://github.com/segmentio/ksuid>.

[LexicalUUID] Twitter, «Cassie», commit f6da4e0, November 2012, <https://github.com/twitter-archive/cassie>.

[Microsoft] Microsoft, «2.3.4.3 GUID — Curly Braced String Representation», April 2023, <https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/222af2d3-5c00-4899-bc87-ed4c6515e80d>.

[MS_COM_GUID] Chen, R., «Why does COM express GUIDs in a mix of big-endian and little-endian? Why can“t it just pick a side and stick with it?», September 2022, <https://devblogs.microsoft.com/oldnewthing/20220928-00/?p=107221>.

[ObjectID] MongoDB, «ObjectId», <https://docs.mongodb.com/manual/reference/method/ObjectId/>.

[orderedUuid] Cabrera, I. B., «Laravel: The mysterious «Ordered UUID»», January 2020, <https://itnext.io/laravel-the-mysterious-ordered-uuid-29e7500b4f8>.

[pushID] Lehenbauer, M., «The 2^120 Ways to Ensure Unique Identifiers», February 2015, <https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html>.

[Python] Python, «uuid — UUID objects according to RFC 4122», <https://docs.python.org/3/library/uuid.html>.

[RANDOM] Occil, P., «Random Number Generator Recommendations for Applications», June 2023, <https://peteroupc.github.io/random.html>.

[RFC1321] Rivest, R., «The MD5 Message-Digest Algorithm», RFC 1321, DOI 10.17487/RFC1321, April 1992, <https://www.rfc-editor.org/info/rfc1321>.

[RFC1738] Berners-Lee, T., Masinter, L., and M. McCahill, «Uniform Resource Locators (URL)», RFC 1738, DOI 10.17487/RFC1738, December 1994, <https://www.rfc-editor.org/info/rfc1738>.

[RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, «Randomness Requirements for Security», BCP 106, RFC 4086, DOI 10.17487/RFC4086, June 2005, <https://www.rfc-editor.org/info/rfc4086>.

[RFC4122] Leach, P., Mealling, M., and R. Salz, «A Universally Unique Identifier (UUID) URN Namespace», RFC 4122, DOI 10.17487/RFC4122, July 2005, <https://www.rfc-editor.org/info/rfc4122>.

[RFC5234] Crocker, D., Ed. And P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008, <https://www.rfc-editor.org/info/rfc5234>.

[RFC6151] Turner, S. and L. Chen, «Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms», RFC 6151, DOI 10.17487/RFC6151, March 2011, <https://www.rfc-editor.org/info/rfc6151>.

[RFC6194] Polk, T., Chen, L., Turner, S., and P. Hoffman, «Security Considerations for the SHA-0 and SHA-1 Message-Digest Algorithms», RFC 6194, DOI 10.17487/RFC6194, March 2011, <https://www.rfc-editor.org/info/rfc6194>.

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

[RFC8937] Cremers, C., Garratt, L., Smyshlyaev, S., Sullivan, N., and C. Wood, «Randomness Improvements for Security Protocols», RFC 8937, DOI 10.17487/RFC8937, October 2020, <https://www.rfc-editor.org/info/rfc8937>.

[RFC9499] Hoffman, P. And K. Fujiwara, «DNS Terminology», BCP 219, RFC 9499, DOI 10.17487/RFC9499, March 2024, <https://www.rfc-editor.org/info/rfc9499>.

[RFC9542] Eastlake 3rd, D., Abley, J., and Y. Li, «IANA Considerations and IETF Protocol and Documentation Usage for IEEE 802 Parameters», BCP 141, RFC 9542, DOI 10.17487/RFC9542, April 2024, <https://www.rfc-editor.org/info/rfc9542>.

[ShardingID] Instagram Engineering, «Sharding & IDs at Instagram», December 2012, <https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c>.

[SID] «sid : generate sortable identifiers», Commit 660e947, June 2019, <https://github.com/chilts/sid>.

[Snowflake] Twitter, «Snowflake is a network service for generating unique ID numbers at high scale with some simple guarantees.», commit ec40836, May 2014, <https://github.com/twitter-archive/snowflake>.

[Sonyflake] Sony, «A distributed unique ID generator inspired by Twitter“s Snowflake», commit 848d664, August 2020, <https://github.com/sony/sonyflake>.

[ULID] «Universally Unique Lexicographically Sortable Identifier», Commit d0c7170, May 2019, <https://github.com/ulid/spec>.

[URNNamespaces] IANA, «Uniform Resource Names (URN) Namespaces», <https://www.iana.org/assignments/urn-namespaces/>.

[X500] ITU-T, «Information technology — Open Systems Interconnection — The Directory: Overview of concepts, models and services», ISO/IEC 9594-1, ITU-T Recommendation X.500, October 2019.

[X660] ITU-T, «Information technology — Procedures for the operation of object identifier registration authorities: General procedures and top arcs of the international object identifier tree», ISO/IEC 9834-1, ITU-T Recommendation X.660, July 2011.

[X680] ITU-T, «Information Technology — Abstract Syntax Notation One (ASN.1) & ASN.1 encoding rules», ISO/IEC 8824-1:2021, ITU-T Recommendation X.680, February 2021.

[XID] «Globally Unique ID Generator», commit efa678f, October 2020, <https://github.com/rs/xid>.

Приложение A. Тестовые векторы

Тестовые векторы UUIDv1 и UUIDv6 используют одну и ту же 60-битовую метку времени: 0x1EC9414C232AB00 (138648505420000000) — вторник, 22 февраля, 2022 2:22:22.000000 PM GMT-05:00. Совпадают также значения clock_seq и node, сгенерированные из случайных данных. Для рандомизированного значения node в младшем бите первого октета устанавливается значение 1, как указано в параграфе 6.10. Это меняет начальное значение 0x9E6BDECED846 на 0x9F6BDECED846.

Псевдокод для преобразования 64-битовых меток Unix в 100-наносекундные метки сохранен в документе для справки.

# Gregorian-to-Unix Offset:
# The number of 100 ns intervals between the
# UUID Epoch 1582-10-15 00:00:00
# and the Unix Epoch 1970-01-01 00:00:00
# Greg_Unix_offset = 0x01b21dd213814000 or 122192928000000000

# Unix 64-bit Nanosecond Timestamp:
# Unix NS: Tuesday, February 22, 2022 2:22:22 PM GMT-05:00
# Unix_64_bit_ns = 0x16D6320C3D4DCC00 or 1645557742000000000

# Unix Nanosecond precision to Gregorian 100-nanosecond intervals
# Greg_100_ns = (Unix_64_bit_ns/100)+Greg_Unix_offset

# Work:
# Greg_100_ns = (1645557742000000000/100)+122192928000000000
# Unix_64_bit_ns = (138648505420000000-122192928000000000)*100

# Final:
# Greg_100_ns = 0x1EC9414C232AB00 or 138648505420000000

Рисунок 15. Псевдокод тестового вектора метки времени.


A.1. Пример значения UUIDv1

-------------------------------------------
поле      биты  значение
-------------------------------------------
time_low   32   0xC232AB00
time_mid   16   0x9414
ver         4   0x1
time_high  12   0x1EC
var         2   0b10
clock_seq  14   0b11, 0x3C8
node       48   0x9F6BDECED846
-------------------------------------------
total      128
-------------------------------------------
final: C232AB00-9414-11EC-B3C8-9F6BDECED846

Рисунок 16. Пример тестового вектора UUIDv1.


A.2. Пример значения UUIDv3

Расчёт MD5 для DNS Namespace ID и Name со значением www.example.com показан на рисунке 17. Сопоставления и значения полей приведены на рисунке 18, а пподстановка битов version и variant — на рисунке 19.


Namespace (DNS):  6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name:             www.example.com
------------------------------------------------------
MD5:              5df418813aed051548a72f4a814cf09e

Рисунок 17. Пример UUIDv3 MD5.


-------------------------------------------
поле     биты  значение
-------------------------------------------
md5_high  48   0x5df418813aed
ver        4   0x3
md5_mid   12   0x515
var        2   0b10
md5_low   62   0b00, 0x8a72f4a814cf09e
-------------------------------------------
total     128
-------------------------------------------
final: 5df41881-3aed-3515-88a7-2f4a814cf09e

Рисунок 18. Пример тестового вектора UUIDv3.

MD5 hex and dash:      5df41881-3aed-0515-48a7-2f4a814cf09e
Ver and Var Overwrite: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Final:                 5df41881-3aed-3515-88a7-2f4a814cf09e

Рисунок 19. Пример подстановки битов Ver/Var в UUIDv3.


A.3. Пример значения UUIDv4

-------------------------------------------
поле     биты  значение
-------------------------------------------
random_a  48   0x919108f752d1
ver        4   0x4
random_b  12   0x320
var        2   0b10
random_c  62   0b01, 0xbacf847db4148a8
-------------------------------------------
total     128
-------------------------------------------
final: 919108f7-52d1-4320-9bac-f847db4148a8

Рисунок 20. Пример тестового вектора UUIDv4.


Пример UUIDv4 создан путём генерации 16 случайных байтов со значением 919108F752D133205BACF847DB4148A8, которое применяется для заполнения полей (рисунок 20).

Подстановка битов version и variant показана на рисунке 21.

Random hex:            919108f752d133205bacf847db4148a8
Random hex and dash:   919108f7-52d1-3320-5bac-f847db4148a8
Ver and Var Overwrite: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Final:                 919108f7-52d1-4320-9bac-f847db4148a8

Рисунок 21. Пример UUIDv4 с подстановкой битов Ver/Var.


A.4. Пример значения UUIDv5

Расчёт SHA-1 для DNS Namespace ID и Name со значением www.example.com показан на рисунке 22. Сопоставления и значения полей приведены на рисунке 23, а подстановка битов version и variant, а также сохраняемая и отсекаемая часть — на рисунке 24.

Namespace (DNS):  6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name:             www.example.com
----------------------------------------------------------
SHA-1:            2ed6657de927468b55e12665a8aea6a22dee3e35

Рисунок 22. Пример UUIDv5 SHA-1.

-------------------------------------------
поле      биты  значение
-------------------------------------------
sha1_high  48   0x2ed6657de927
ver         4   0x5
sha1_mid   12   0x68b
var         2   0b10
sha1_low   62   0b01, 0x5e12665a8aea6a2
-------------------------------------------
total      128
-------------------------------------------
final: 2ed6657d-e927-568b-95e1-2665a8aea6a2

Рисунок 23. Пример тестового вектора UUIDv5.

SHA-1 hex and dash:    2ed6657d-e927-468b-55e1-2665a8aea6a2-2dee3e35
Ver and Var Overwrite: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Final:                 2ed6657d-e927-568b-95e1-2665a8aea6a2
Discarded:                                                 -2dee3e35

Рисунок 24. Пример UUIDv5 с подстановкой Ver/Var и отбрасыванием части SHA-1.


A.5. Пример значения UUIDv6

-------------------------------------------
поле       биты  значение
-------------------------------------------
time_high   32   0x1EC9414C
time_mid    16   0x232A
ver          4   0x6
time_high   12   0xB00
var          2   0b10
clock_seq   14   0b11, 0x3C8
node        48   0x9F6BDECED846
-------------------------------------------
total       128
-------------------------------------------
final: 1EC9414C-232A- 6B00-B3C8-9F6BDECED846

Рисунок 25. Пример тестового вектора UUIDv6.


A.6. Пример значения UUIDv7

В этом примере UUIDv7 тестовый вектор использует общеизвестную метку времени Unix Epoch с миллисекундной точностью для заполнения первых 48 битов, а rand_a и rand_b заполняются случайными данными. Метка времени: вторник 22февраля 2022 г. 2:22:22.00 PM GMT-05:00 имеет вид 0x017F22E279B0 или 1645557742000.

-------------------------------------------
поле       биты  значение
-------------------------------------------
unix_ts_ms  48   0x017F22E279B0
ver          4   0x7
rand_a      12   0xCC3
var          2   0b10
rand_b      62   0b01, 0x8C4DC0C0C07398F
-------------------------------------------
total       128
-------------------------------------------
final: 017F22E2-79B0-7CC3-98C4-DC0C0C07398F

Рисунок 26. Пример тестового вектора UUIDv7.


Приложение B. Иллюстративные примеры

В последующих параграфах приведены примеры для иллюстрации применения UUIDv8 (параграф 5.8) в фирменной и/или экспериментальной логике, основанной на приложении. Эти примеры не прошли столь же тщательного тестирования, создания прототипов и получения откликов, как другие алгоритмы в этом документе. Авторы рекомендуют разработчикам создавать свои алгоритмы для UUIDv8, а не использовать приведённые ниже.

B.1. Пример значения UUIDv8 на основе времени

В этом тестовом векторе UUIDv8 применяется общеизвестная 64-битовая временная метка Unix Epoch с разрешением 10 нсек, отсечённая справа до 60, для заполнения полей custom_a и custom_b, с установкой для битов ver между этими полями значения 8. Устанавливаются также биты var, а поле custom_c заполняется случайными данными.

Временная метка — вторник 22февраля 2022 г. 2:22:22.000000 PM GMT-05:00 — представлена как 0x2489E9AD2EE2E00 или 164555774200000000 (шаг 10 нсек).

-------------------------------------------
поле     биты  значение
-------------------------------------------
custom_a  48   0x2489E9AD2EE2
ver        4   0x8
custom_b  12   0xE00
var        2   0b10
custom_c  62   0b00, 0xEC932D5F69181C0
-------------------------------------------
total     128
-------------------------------------------
final: 2489E9AD-2EE2-8E00-8EC9-32D5F69181C0

Рисунок 27. Пример UUIDv8 на основе времени.


B.2. Пример значения UUIDv8 на основе имени

В соответствии с параграфом 5.5 UUID на основе имени с использованием современных алгоритмов хэширования должны создаваться в пространстве UUIDv8. Можно применять новые алгоритмы, такие как SHA-256 или SHA-512 [FIPS180-4], SHA-3 или SHAKE [FIPS202] и даже алгоритмы, которые ещё не определены.

Namespace (DNS):       6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name:                  www.example.com
----------------------------------------------------------------
SHA-256:
5c146b143c524afd938a375d0df1fbf6fe12a66b645f72f6158759387e51f3c8

Рисунок 28. Пример UUIDv8 SHA-256.


Вариант SHA-256 для расчёта SHA, показанный в Приложении A.4, приведён на рисунке 28 как иллюстративный пример. Создание основанного на имени UUIDv8 здесь выполняется по той же логике, которая описана в параграфе 5.5, но с использованием алгоритма SHA-256 вместо SHA-1.

Поля и их значения показаны на рисунке 29. Дополнительная иллюстрации подстановки битов ver и var, а также используемая и неиспользуемая части значения SHA-256 показаны на рисунке 30. Для алгоритмов защищённого хеширования, выдающих результат произвольного размера (например, SHAKE) важно подчеркнуть, что их выход должен быть не менее 128 битов.

-------------------------------------------
поле     биты  значение
-------------------------------------------
custom_a  48   0x5c146b143c52
ver        4   0x8
custom_b  12   0xafd
var        2   0b10
custom_c  62   0b01, 0x38a375d0df1fbf6
-------------------------------------------
total     128
-------------------------------------------
final: 5c146b14-3c52-8afd-938a-375d0df1fbf6

Рисунок 29. Пример UUIDv8 SHA-256 на основе имени.

A: 5c146b14-3c52-4afd-938a-375d0df1fbf6-fe12a66b645f72f6158759387e51f3c8
B: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
C: 5c146b14-3c52-8afd-938a-375d0df1fbf6
D:                                     -fe12a66b645f72f6158759387e51f3c8

Рисунок 30. Пример UUIDv8 с подстановкой Ver/Var и отбрасыванием сегмента SHA-256.


На рисунке 30:

  • строка A содержит полное значение SHA-256 в шестнадцатеричном формате с разделителями (0);

  • строка B показывает позиции полей ver и var, которые должны быть переписаны;

  • в строке C приведено значение после установки битов ver и var;

  • в строке D показана отбрасываемая часть битов исходного значения SHA-256.

Благодарности

Авторы с благодарностью отмечают вклад Rich Salz, Michael Mealling, Ben Campbell, Ben Ramsey, Fabio Lima, Gonzalo Salgueiro, Martin Thomson, Murray S. Kucherawy, Rick van Rein, Rob Wilton, Sean Leonard, Theodore Y. Ts“o, Robert Kieffer, Sergey Prokhorenko, LiosK, а также всех участников сообщества IETF и GitHub, участвовавших в обсуждении этого документа.

Документ в значительной степени основан на спецификации OSF DCE (Приложение A к [C309]) для UUID. Полезные замечания были получены от Ted Ts“o.

Спасибо Ralf S. Engelschall, John Larmouth, Paul Thorpe за внимательное прочтение и доработку материала. Профессор Larmouth внёс неоценимый вклад при согласовании с ISO/IEC.

Адреса авторов

Kyzer R. Davis

Cisco Systems

Email: kydavis@cisco.com

Brad G. Peabody

Uncloud

Email: brad@peabody.io

Paul J. Leach

University of Washington

Email: pjl7@uw.edu


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Media Access Control — управление доступом к среде.

4В оригинале ошибочно указано 0, см. https://www.rfc-editor.org/errata/eid7958. Прим. перев.

5В оригинале ошибочно сказано «младших», см. https://www.rfc-editor.org/errata/eid7955. Прим. перев.

6В оригинале ошибочно указано 5623, см. https://www.rfc-editor.org/errata/eid8288. Прим. перев.

7В оригинале ошибочно указана таблица 1, см. https://www.rfc-editor.org/errata/eid8695. Прим. перев.

Рубрика: RFC | Оставить комментарий