RFC 8080 Edwards-Curve Digital Security Algorithm (EdDSA) for DNSSEC

 

Internet Engineering Task Force (IETF)                           O. Sury
Request for Comments: 8080                                        CZ.NIC
Category: Standards Track                                     R. Edmonds
ISSN: 2070-1721                                                   Fastly
                                                           February 2017

Алгоритм EdDSA для DNSSEC

Edwards-Curve Digital Security Algorithm (EdDSA) for DNSSEC

PDF

Аннотация

В этом документе описано, как задать ключи и подписи EdDSA1 для защиты DNS (DNSSEC2). Алгоритм EdDSA может применяться с кривыми Ed25519 и Ed448.

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

Этот документ является проектом стандарта (Internet Standards Track).

Документ является результатом работы IETF3 и представляет собой согласованное мнение сообщества IETF. Документ был вынесен на публичное рассмотрение и одобрен для публикации IESG4. Дополнительная информация о документах BCP представлена в разделе 2 документа RFC 7841.

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

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

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

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

1. Введение

Механизмы DNSSEC, описанные в [RFC4033], [RFC4034] и [RFC4035], используют криптографические ключи и цифровые подписи для проверки подлинности данных DNS. В настоящее время наиболее популярным алгоритмом защиты является RSA. Стандартизована также заданная GOST [RFC5933] и NIST криптография на основе эллиптических кривых [RFC6605].

В [RFC8032] описана система подписи на основе эллиптических кривых (EdDSA) и рекомендованы две кривые — Ed25519 и Ed448.

В этом документе определяется использование в DNSSEC записей о ресурсах (RR5) DS, DNSKEY и RRSIG с новым алгоритмом подписи EdDSA и предложены на выбор две кривые — Ed25519 и Ed448.

2. Уровни требований

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

3. Записи DNSKEY

Открытый ключ Ed25519 представляет собой 32-октетное значение, помещаемое в поле Public Key записей DNSKEY в форме простой битовой строки. Генерация открытого ключа описана в параграфе 5.1.5 [RFC8032].

Открытый ключ Ed448 представляет собой 57-октетное значение, помещаемое в поле Public Key записей DNSKEY в форме простой битовой строки. Генерация открытого ключа описана в параграфе 5.1.5 [RFC8032].

4. Записи RRSIG

Подпись Ed25519 представляет собой 64-октетное значение, помещаемое в поле Signature записей RRSIG в форме простой битовой строки. Алгоритм и проверка подписи Ed25519 описаны в параграфах 5.1.6 и 5.1.7 [RFC8032], соответственно.

Подпись Ed448 представляет собой 114-октетное значение, помещаемое в поле Signature записей RRSIG в форме простой битовой строки. Алгоритм и проверка подписи Ed448 писаны в параграфах 5.1.6 и 5.1.7 [RFC8032], соответственно.

5. Номер алгоритма для записей DS, DNSKEY и RRSIG

Для алгоритма Ed25519 в записях DS, DNSKEY и RRSIG выделен номер 15. Для алгоритма Ed448 в записях DS, DNSKEY и RRSIG выделен номер 16. Эта регистрация полностью определена в разделе «Согласование с IANA».

6. Примеры

6.1. Примеры Ed25519

Private-key-format: v1.2
Algorithm: 15 (ED25519)
PrivateKey: ODIyNjAzODQ2MjgwODAxMjI2NDUxOTAyMDQxNDIyNjI=

example.com. 3600 IN DNSKEY 257 3 15 (
             l02Woi0iS8Aa25FQkUd9RMzZHJpBoRQwAQEX1SxZJA4= )

example.com. 3600 IN DS 3613 15 2 (
             3aa5ab37efce57f737fc1627013fee07bdf241bd10f3b1964ab55c78e79
             a304b )

example.com. 3600 IN MX 10 mail.example.com.

example.com. 3600 IN RRSIG MX 3 3600 (
             1440021600 1438207200 3613 example.com. (
             Edk+IB9KNNWg0HAjm7FazXyrd5m3Rk8zNZbvNpAcM+eysqcUOMIjWoevFkj
             H5GaMWeG96GUVZu6ECKOQmemHDg== )

Private-key-format: v1.2
Algorithm: 15 (ED25519)
PrivateKey: DSSF3o0s0f+ElWzj9E/Osxw8hLpk55chkmx0LYN5WiY=

example.com. 3600 IN DNSKEY 257 3 15 (
             zPnZ/QwEe7S8C5SPz2OfS5RR40ATk2/rYnE9xHIEijs= )

example.com. 3600 IN DS 35217 15 2 (
             401781b934e392de492ec77ae2e15d70f6575a1c0bc59c5275c04ebe80c
             6614c )

example.com. 3600 IN MX 10 mail.example.com.

example.com. 3600 IN RRSIG MX 3 3600 (
             1440021600 1438207200 35217 example.com. (
             5LL2obmzdqjWI+Xto5eP5adXt/T5tMhasWvwcyW4L3SzfcRawOle9bodhC+
             oip9ayUGjY9T/rL4rN3bOuESGDA== )

6.2. Примеры Ed448

Private-key-format: v1.2
Algorithm: 16 (ED448)
PrivateKey: xZ+5Cgm463xugtkY5B0Jx6erFTXp13rYegst0qRtNsOYnaVpMx0Z/c5EiA9x
            8wWbDDct/U3FhYWA

example.com. 3600 IN DNSKEY 257 3 16 (
             3kgROaDjrh0H2iuixWBrc8g2EpBBLCdGzHmn+G2MpTPhpj/OiBVHHSfPodx
             1FYYUcJKm1MDpJtIA )

example.com. 3600 IN DS 9713 16 2 (
             6ccf18d5bc5d7fc2fceb1d59d17321402f2aa8d368048db93dd811f5cb2
             b19c7 )

example.com. 3600 IN MX 10 mail.example.com.

example.com. 3600 IN RRSIG MX 3 3600 (
             1440021600 1438207200 9713 example.com. (
             Nmc0rgGKpr3GKYXcB1JmqqS4NYwhmechvJTqVzt3jR+Qy/lSLFoIk1L+9e3
             9GPL+5tVzDPN3f9kAwiu8KCuPPjtl227ayaCZtRKZuJax7n9NuYlZJIusX0
             SOIOKBGzG+yWYtz1/jjbzl5GGkWvREUCUA )

Private-key-format: v1.2
Algorithm: 16 (ED448)
PrivateKey: WEykD3ht3MHkU8iH4uVOLz8JLwtRBSqiBoM6fF72+Mrp/u5gjxuB1DV6NnPO
            2BlZdz4hdSTkOdOA

example.com. 3600 IN DNSKEY 257 3 16 (
             kkreGWoccSDmUBGAe7+zsbG6ZAFQp+syPmYUurBRQc3tDjeMCJcVMRDmgcN
             Lp5HlHAMy12VoISsA )

example.com. 3600 IN DS 38353 16 2 (
             645ff078b3568f5852b70cb60e8e696cc77b75bfaaffc118cf79cbda1ba
             28af4 )

example.com. 3600 IN MX 10 mail.example.com.

example.com. 3600 IN RRSIG MX 3 3600 (
             1440021600 1438207200 38353 example.com. (
             +JjANio/LIzp7osmMYE5XD3H/YES8kXs5Vb9H8MjPS8OAGZMD37+LsCIcjg
             5ivt0d4Om/UaqETEAsJjaYe56CEQP5lhRWuD2ivBqE0zfwJTyp4WqvpULbp
             vaukswvv/WNEFxzEYQEIm9+xDlXj4pMAMA )

7. Согласование с IANA

Этот документ обновляет реестр IANA Domain Name System Security (DNSSEC) Algorithm Numbers. В реестр добавляются две записи, показанные в таблице.

Номер

15

16

Описание

Ed25519

Ed448

Обозначение

ED25519

ED448

Подпись зоны

+

+

Защита транзакций

*

*

Документ

RFC 8080

RFC 8080

* Стандартизация использования этого алгоритма для защиты транзакций не определена

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

Вопросы безопасности, рассмотренные в [RFC8032] и [RFC7748], сохраняются для использования алгоритмов Ed25519 и Ed448 в DNSSEC.

Алгоритм Ed25519 предназначен для работы с уровнем защиты 128 битов, Ed448 — с уровнем защиты 224 бита. Взломать такую защиту способны достаточно большие квантовые компьютеры. Разумные оценки возможностей традиционных компьютеров говорят о полной безопасности Ed25519. Алгоритм Ed448 предназначен для приложений, где требования к производительности менее высоки и имеется желание обеспечить защиту от аналитических атак на эллиптические кривые.

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

Секретный ключ, используемый для зоны DNSSEC, недопустимо применять для каких-либо других целей. Иначе станут возможными кросс-протокольные и кросс-программные атаки.

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

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

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

[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, <http://www.rfc-editor.org/info/rfc4033>.

[RFC4034] Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, «Resource Records for the DNS Security Extensions», RFC 4034, DOI 10.17487/RFC4034, March 2005, <http://www.rfc-editor.org/info/rfc4034>.

[RFC4035] Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, «Protocol Modifications for the DNS Security Extensions», RFC 4035, DOI 10.17487/RFC4035, March 2005, <http://www.rfc-editor.org/info/rfc4035>.

[RFC7748] Langley, A., Hamburg, M., and S. Turner, «Elliptic Curves for Security», RFC 7748, DOI 10.17487/RFC7748, January 2016, <http://www.rfc-editor.org/info/rfc7748>.

[RFC8032] Josefsson, S. and I. Liusvaara, «Edwards-Curve Digital Signature Algorithm (EdDSA)», RFC 8032, DOI 10.17487/RFC8032, January 2017, <http://www.rfc-editor.org/info/rfc8032>.

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

[RFC5933] Dolmatov, V., Ed., Chuprina, A., and I. Ustinov, «Use of GOST Signature Algorithms in DNSKEY and RRSIG Resource Records for DNSSEC», RFC 5933, DOI 10.17487/RFC5933, July 2010, <http://www.rfc-editor.org/info/rfc5933>.

[RFC6605] Hoffman, P. and W. Wijngaards, «Elliptic Curve Digital Signature Algorithm (DSA) for DNSSEC», RFC 6605, DOI 10.17487/RFC6605, April 2012, <http://www.rfc-editor.org/info/rfc6605>.


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

Some of the material in this document is copied liberally from [RFC6605].

The authors of this document wish to thank Jan Vcelak, Pieter Lexis, Kees Monshouwer, Simon Josefsson, Paul Hoffman, and others for a review of this document.

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


Ondrej Sury

CZ.NIC

Milesovska 1136/5

Praha 130 00

Czech Republic

Email: ondrej.sury@nic.cz

Robert Edmonds

Fastly

Atlanta, Georgia

United States of America

Email: edmonds@mycre.ws


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

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

nmalykh@gmail.com

1Edwards-curve Digital Security Algorithm.

2DNS Security.

3Internet Engineering Task Force.

4Internet Engineering Steering Group.

5Resource record.

Рубрика: RFC | Комментарии к записи RFC 8080 Edwards-Curve Digital Security Algorithm (EdDSA) for DNSSEC отключены

RFC 8013 Forwarding and Control Element Separation (ForCES) Inter-FE Logical Functional Block (LFB)

Internet Engineering Task Force (IETF)                  D. Joachimpillai
Request for Comments: 8013                                       Verizon
Category: Standards Track                                  J. Hadi Salim
ISSN: 2070-1721                                        Mojatatu Networks
                                                           February 2017

Протокол ForCES — логические функциональные блоки между FE

Forwarding and Control Element Separation (ForCES) Inter-FE Logical Functional Block (LFB)

PDF

Аннотация

В этом документе описано, как расширить топологию логического функционального блока (LFB1) ForCES2 за пределы элемента пересылки (FE3) путем определения класса inter-FE LFB. Этот класс обеспечивает возможность передачи данных и метаданных через FE без изменения спецификации ForCES. Документ фокусируется на сетях Ethernet.

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

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

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

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

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

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

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

1. Введение

В архитектуре ForCES обслуживание пакетов можно смоделировать путем построения графа одного или множества экземпляров LFB. Подробности этого можно найти в спецификации модели ForCES [RFC5812].

Модель ForCES описывает обработку внутри одного элемента пересылки (FE) в терминах логических функциональных блоков (LFB), включая обеспечение элемента управления (CE6) для организации и изменения последовательности обработки и параметров отдельных LFB.

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

С учетом того, что архитектура ForCES inter-LFB требует возможности передавать метаданные между LFB, необходимо определить механизмы расширения имеющихся возможностей и обеспечения передачи метаданных между LFB в разных элементах FE.

В этом документе описано как расширить топологию LFB за пределы элемента FE, т. е. организовать связность между FE без изменения определений ForCES. В качестве среды для соединения элементов FE рассматривается Ethernet.

2. Термины и соглашения

2.1. Уровни требований

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

2.2. Определения

Этот документ использует перечисленные ниже термины, которые определены в нескольких документах ForCES — [RFC3746], [RFC5810], [RFC5811], [RFC5812], [RFC7391], [RFC7408].

Control Element (CE) — элемент управления;
Forwarding Element (FE) — элемент пересылки;
FE Model — модель FE;
LFB (Logical Functional Block) Class — класс (или тип) LFB;
LFB Instance — экземпляр LFB;
LFB Model — модель LFB;
LFB Metadata — метаданные LFB;
ForCES Component — компонента ForCES;
LFB Component — компонента LFB;
ForCES Protocol Layer (ForCES PL) — уровень протокола ForCES;
ForCES Protocol Transport Mapping Layer (ForCES TML) — уровень транспортного отображения ForCES.

3. Проблема и примеры ее проявления

Назначением этого документа является решение вопроса передачи определенных протоколом ForCES метаданных вместе с данными пакета между физическими или виртуальными элементами FE для распределенной обработки LFB.

3.1. Допущения

  • Элементы FE, вовлеченные в inter-FE LFB, относятся к одному элементу сети (NE7) и находятся в одной административно частной сети, что означает их близость.

  • Элементы FE уже соединены между собой через сеть Ethernet. Этот выбор обусловлен широким распространением технологии Ethernet для организации соединений между FE. Для передачи данных и метаданных может быть определен другой транспорт вышележащего (типа UDP over IP) или нижележащего уровня, но эти случаи не рассматриваются в данном документе.

3.2. Простые случаи применения

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

3.2.1. Базовый маршрутизатор IPv4

Образец топологии LFB, представленный на рисунке 1, показывает граф обслуживания для базового сервиса пересылки IPv4 в рамках одного FE. На рисунке в качестве узлов графа показаны классы LFB, а не множество экземпляров класса LFB.

Поскольку целью рисунка 1 является демонстрация передачи данных и метаданных в нисходящем и восходящем направлении на графе экземпляров LFB, на нем не показаны какие-либо порты и упоминаются лишь базовые входные и выходные LFB, а также не указаны исключительные случаи и передача ошибок. Оставлены без внимания и детали Reverse Path Filtering, ECMP, обработки группового трафика и т. п. Иными словами, это не является полной иллюстрацией приложения для пересылки IPv4, более полное описание можно найти в документе, посвященном LFBLibrary [RFC6956].

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

Как только проверка пакетов (например, пригодность значений TTL) валидатором IPv4 закончится, он передает пакеты в IPv4 unicast LPM8 LFB.

                 +----+
                 |    |
      Пакет IPv4 |    | Пакет IPv4   +-----+             +---+
  +------------->|    +------------->|     |             |   |
  |  + входные   |    | + входные    |IPv4 | Пакет IPv4  |   |
  |  метаданные  |    | метаданные   |Ucast+------------>|   +--+
  |              +----+              |LPM  |  + входные  |   |  |
+-+-+             IPv4               +-----+  метаданные +---+  |
|   |             Validator                   + NHinfo   IPv4   |
|   |             LFB                                   NextHop |
|   |                                                     LFB   |
|   |                                                           |
|   |                                                Пакет IPv4 |
|   |                                               + {входные  |
+---+                                               + NHdetails}|
Входной                                               метаданные|
 LFB                                +--------+                  |
                                    |Выходной|                  |
                                 <--+        |<-----------------+
                                    |  LFB   |
                                    +--------+

Рисунок 1: Топология LFB базового обслуживания пакетов IPv4.

Блок IPv4 unicast LPM LFB выполняет поиск LPM в таблице IPv4 FIB, используя IP-адрес получателя в качестве ключа поиска. Результатом обычно является селектор следующего интервала пересылки (next-hop) который передается в нисходящем направлении как метаданные.

Блок NextHop LFB получает пакет IPv4 со связанными с ним метаданными данными о следующем интервале NH9. Блок NextHop LFB принимает метаданные NH и выводит из них индекс для поиска в таблице next-hop с целью нахождения нужной информации о выходе. Результат поиска используется для определения деталей next-hop, которые будут применяться в нисходящем направлении на выходе. Эти данные могут включать любую информацию об отправителе и получателе (в нашем случае адреса MAC10), а также выходной порт11.

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

3.2.1.1. Распределенный базовый маршрутизатор IPv4

На рисунке 2 показано, что топологию LFB маршрутизатора с рисунка 1 можно разделить между двумя элементами FE (например, два контроллера ASIC12). На рисунке 2 изображена топология LFB разделенная между двумя FE после IPv4 unicast LPM LFB.

Некоторые фирменные технологии организации соединений (например, Broadcom HiGig over XAUI [brcm-higig]) позволяют передавать пакет IPv4 и связанные с ним метаданные между IPv4 Unicast LFB и IPv4NextHop LFB через два FE.

Этот документ определяет inter-FE LFB — стандартный механизм для инкапсуляции, генерации, приема и декапсуляции пакетов и связанных с ними метаданных FE через соединения Ethernet.

  FE1
+-------------------------------------------------------------+
|                            +----+                           |
| +----------+               |    |                           |
| | Входной  | Пакет IPv4    |    | Пакет IPv4   +-----+      |
| |  LFB     +-------------->|    +------------->|     |      |
| |          |  + входные    |    | + входные    |IPv4 |      |
| +----------+    метаданные |    |   метаданные |Ucast|      |
|      ^                     +----+              |LPM  |      |
|      |                      IPv4               +--+--+      |
|      |                     Validator              |         |
|                             LFB                   |         |
+---------------------------------------------------|---------+
                                                    |
                                               Пакет IPv4 +
                                            {выходные + NHinfo}
                                                 метаданные
  FE2                                               |
+---------------------------------------------------|---------+
|                                                   V         |
|             +--------+                       +--------+     |
|             | Egress |     Пакет IPv4        | IPv4   |     |
|       <-----+  LFB   |<----------------------+NextHop |     |
|             |        | {входные + NHdetails} | LFB    |     |
|             +--------+     метаданные        +--------+     |
+-------------------------------------------------------------+

Рисунок 2. Расщепление топологии LFB для обслуживания пакетов IPv4.

3.2.2. Произвольная сетевая функция

В этом параграфе будет показан пример произвольной сетевой функции NF13 без какой-либо детализации. Каждая такая функция может включать более одного блока LFB.

  FE1
+-------------------------------------------------------------+
|                            +----+                           |
| +----------+               |    |                           |
| | Network  |   пакет       |NF2 |   пакет      +-----+      |
| | Function +-------------->|    +------------->|     |      |
| |    1     | + метаданные  |    | + метаданные |NF3  |      |
| +----------+   NF1         |    |   NF1/2      |     |      |
|      ^                     +----+              |     |      |
|      |                                         +--+--+      |
|      |                                            |         |
|                                                   |         |
+---------------------------------------------------|---------+
                                                    V

Рисунок 3. Цепочка сетевых функций внутри одного FE.


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

3.2.2.1. Распределенная произвольная сетевая функция

Цепочку функций на рисунке 3 можно разделить между тремя FE как показано на рисунке 4. Мотивом такого разделения может быть масштабирование или реализация функций в устройствах разных производителей. Конечным результатом будет однотипное обслуживание пакетов разных потоков, проходящих через цепочку.

FE1                        FE2
+----------+               +----+               FE3
| Network  |  пакет        |NF2 |   пакет      +-----+
| Function +-------------->|    +------------->|     |
|    1     |  + метаданные |    | + метаданные |NF3  |
+----------+    NF1        |    |   NF1/2      |     |
     ^                     +----+              |     |
     |                                         +--+--+
                                                  |
                                                  V

Рисунок 4. Цепочка сетевых функций в нескольких FE.

4. Обзор Inter-FE LFB

Требования связности между FE выполняются с помощью определения класса inter-FE LFB. Использование определения стандартного класса LFB предполагает отсутствие изменений, вносимых в архитектуру ForCES в части базовых LFB (FE Protocol или Object LFB). Это решение было принято после рассмотрения альтернативного варианта, который требовал изменения возможностей FE Object (SupportedLFBs) и компоненты LFBTopology для описания возможностей связности между FE, а также рабочей топологии экземпляров LFB.

4.1. Вставка Inter-FE LFB ne 15

Топология распределенного блока LFB, показанная на рисунке 2, заново представлена на рисунке 5 для демонстрации inter-FE LFB.

Как можно видеть на рисунке 5, та же информация передается между IPv4 unicast LPM LFB и IPv4 NH LFB на выходную сторону inter-FE LFB. Эта информация представлена как множество вводов в выходной экземпляр inter-FE LFB. Каждый ввод представляет уникальный набор информации о выборе.

 FE1
+-------------------------------------------------------------+
| +----------+               +----+                           |
| | Входной  |  Пакет IPv4   |    |  Пакет IPv4  +-----+      |
| |  LFB     +-------------->|    +------------->|     |      |
| |          |  + входные    |    | + входные    |IPv4 |      |
| +----------+    метаданные |    |   метаданные |Ucast|      |
|      ^                     +----+              |LPM  |      |
|      |                      IPv4               +--+--+      |
|      |                     Validator              |         |
|      |                      LFB                   |         |
|      |                              Пакет IPv4 + метаданные |
|      |                                   {ingress + NHinfo} |
|      |                                            |         |
|      |                                       +..--+..+      |
|      |                                       |..| |  |      |
|                                            +-V--V-V--V-+    |
|                                            |  Выходной |    |
|                                            |  Inter-FE |    |
|                                            |   LFB     |    |
|                                            +------+----+    |
+---------------------------------------------------|---------+
                                                    |
                            Кадр Ethernet с         |
                            пакетом IPv4 и метаданными
                            {ingress + NHinfo + Inter-FE info}
 FE2                                                |
+---------------------------------------------------|---------+
|                                                +..+.+..+    |
|                                                |..|.|..|    |
|                                              +-V--V-V--V-+  |
|                                              | Входной   |  |
|                                              | Inter-FE  |  |
|                                              |   LFB     |  |
|                                              +----+------+  |
|                                                   |         |
|                                     Пакет IPv4 + метаданные |
|                                          {ingress + NHinfo} |
|                                                   |         |
|             +--------+                       +----V---+     |
|             |Выходной|     Пакет IPv4        | IPv4   |     |
|       <-----+  LFB   |<----------------------+ NextHop|     |
|             |        |     метаданные        | LFB    |     |
|             +--------+  {ingress+NHdetails}  +--------+     |
+-------------------------------------------------------------+

Рисунок 5. Расщепление сервиса пересылки IPv4 с помощью Inter-FE LFB.

На выходе inter-FE LFB принятый пакет и метаданные используются для выбора деталей инкапсуляции при передаче сообщений в направлении выбранного соседнего FE. Эти детали включают включают в себя указание передающего и принимающего FE (абстрагируются как адреса MAC в соответствии с параграфом 5.2), могут передаваться также метаданные, пришедшие вместе с исходным пакетом IPv4.

На входной стороне inter-FE LFB полученный пакет и связанные с ним метаданные служат для того, чтобы определить продолжение графа. Это включает выбор исходных метаданных и следующего экземпляра класса LFB для продолжения обработки. На рисунке 5 выбран экземпляр IPv4NextHop LFB и метаданные для передачи этому блоку.

Входная сторона inter-FE LFB использует часть переданной информации и передает пакет IPv4 вместе с входными метаданными и NHinfo блоку IPv4NextHop LFB как это делалось раньше на рисунках 1 и 2.

5. Связность Inter-FE Ethernet

В параграфе 5.1 рассмотрены некоторые вопросы, связанные с использованием Ethernet в качестве транспорта, и способы смягчения проблем.

В параграфе 5.2 определен формат данных для передачи через Ethernet. Имеющиеся реализации данной спецификации, работающие на основе Linux Traffic Control [linux-tc], описаны в [tc-ife].

5.1. Проблемы связности Inter-FE Ethernet

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

5.1.1. Проблема MTU

В результате добавления данных к существующим кадрам Ethernet может возникать проблема MTU. Меры предотвращения приведены ниже.

  • Использование больших MTU когда это возможно (например, кадров jumbo).

  • Ограничения объема метаданных, которые могут быть переданы. Наше определение позволяет фильтровать выбранные метаданные для инкапсуляции в кадр, как описано в разделе 6. Рекомендуется определять размер MTU выходного порта так, чтобы обеспечить включение метаданных максимального размера для передачи между FE. В такой конфигурации порт настраивается на «обман» вышележащих уровней путем заявления им значения MTU, которое меньше реального. Установка MTU может быть выполнена с помощью управления ForCES для LFB порта (или иным способом). Фактически при явном определении уровнем управления значения MTU для выходного порта неявно задается объем метаданных, которые можно будет передать. При выборе значения MTU следует быть осторожным — для пакетов IPv4 минимальный размер составляет 64 октета [RFC791], а для IPv6 — 1280 октетов [RFC2460].

5.1.2. Вопросы качества обслуживания

Необработанный (raw) пакет, прибывающий на интерфейс inter-FE LFB (от экземпляра восходящего LFB) может иметь метаданные класса обслуживания (CoS15) показывающие, как следует трактовать пакет с точки зрения качества обслуживания (QoS16).

Результирующий кадр Ethernet будет в конечном итоге (предпочтительно) трактоваться нисходящим LFB (обычно экземпляр LFB для порта) и его маркировка CoS будет выполняться с точки зрения приоритета. Иными словами, наличие inter-FE LFB не меняет семантики CoS.

5.1.3. Проблемы перегрузок

Предполагается, что большая часть проходящего через FE трафика, который использует inter-FE LFB, будет относиться к протоколу IP и в общем случае для него будет поддерживаться контроль насыщения [UDP-GUIDE]. Например, если перегрузка вызовет отбрасывание пакета TCP с дополнительными метаданными ForCES между элементами FE, можно надеяться, что передающий узел TCP отреагирует на это так же, как при отбрасывании пакета в другой точке, где не используется протокол ForCES. Поэтому дополнительные механизмы контроля насыщения между элементами FE не задаются.

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

Кроме того, блоки inter-FE LFB должны разворачиваться только в рамках одной сети (с одним оператором) или в сетях смежных взаимодействующих операторов, где обеспечивается совместное предотвращение перегрузок. Это считается управляемой средой (Controlled Environment) в соответствии с определением параграфа 3.6 [UDP-GUIDE]. Следует принимать дополнительные меры по ограничению влияния трафика с инкапсуляцией inter-FE на иной трафик типа перечисленных ниже:

  • ограничение скорости всего трафика inter-FE LFB на восходящем LFB;

  • управление прерыванием цепей [circuit-b];

  • изоляция трафика inter-FE с помощью выделенных интерфейсов или VLAN.

5.2. Инкапсуляция Inter-FE Ethernet

Инкапсуляция в линии Ethernet показана на рисунке 6, а приводящий к ней процесс описан в разделе 6. Кадр выравнивается по 32-битовой границе.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination MAC Address                                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination MAC Address       |   Source MAC Address          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source MAC Address                                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Inter-FE ethertype            | Metadata length               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TLV encoded Metadata ~~~..............~~                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TLV encoded Metadata ~~~..............~~                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Данные исходного пакета ~~............~~                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 6. Формат пакета.


Назначение полей заголовка Ethernet (рисунок 6) кратко описано ниже.

  • Destination MAC Address используется для указания Destination FEID по политике CE (см. раздел 6).

  • The Source MAC Address используется для указания Source FEID по политике CE ( см. раздел 6).

  • Поле ethertype служит для идентификации кадра как inter-FE LFB (шестнадцатеричное значение ED3E).

  • 16-битовое поле Metadata length указывает общий размер метаданных (включая само поле размера).

  • Один или множество 16-битовых блоков TLV с метаданными следуют за полем Metadata length. Тип TLV указывает идентификатор метаданных. Будут использоваться идентификаторы метаданных ForCES, зарегистрированные в IANA. Все TLV выравниваются по 32-битовой границе. Понятно, что применение 16-битовых TLV ограничивает размер идентификаторов метаданных 16 битами вместо определенных в ForCES 32 битовых идентификаторов компонент при использовании ILV17. Однако на момент публикации этого документа 16-битовое пространство кажется достаточным, а модель TLV выбрана благодаря обеспечиваемой ею экономии 4 байтов на единицу метаданных по сравнению с использованием ILV.

  • Данные исходного пакета размещаются после метаданных, как показано на рисунке 6.

6. Подробное описание Ethernet Inter-FE LFB

Ethernet inter-FE LFB имеет два блока LFB для групп входных портов и три LFB выходных портов (см. рисунок 7).

Блок inter-FE LFB определяет две компоненты, поддерживающие обработку, описанную в параграфе 6.1.

                 +-----------------+
Инкапсулированный|                 |
Inter-FE LFB     |             OUT2+--> Декапсулированный 
---------------->|IngressInGroup   |    пакет + метаданные
Кадр Ethernet    |                 |
                 |                 |
raw-пакет +      |             OUT1+--> Инкапсулированный 
---------------->|EgressInGroup    |    кадр Ethernet
метаданные       |                 |
                 |    EXCEPTIONOUT +--> ExceptionID, пакет
                 |                 |    + метаданные
                 +-----------------+

Рисунок 7. Inter-FE LFB.


6.1. Обработка данных

Экземпляр inter-FE LFB может быть размешен на выходе FE-источника. На рисунке 5 показан пример FE-источника FE1. В таком случае экземпляр inter-FE LFB получает через группу портов EgressInGroup необработанный пакет и связанные с ним метаданные от предшествующих экземпляров LFB. Входная информация служит для выбора способа генерации и инкапсуляции нового кадра. Набор всех вариантов хранится в LFB-компоненте IFETable, описанной ниже. Обработанный инкапсулированный кадр Ethernet передается через OUT1 нисходящему экземпляру LFB при завершении обработки или в порт EXCEPTIONOUT при возникновении отказа.

Экземпляр inter-FE LFB может быть размешен на входе принимающего FE. На рисунке 5 показан пример FE-получателя FE218. В таком случае inter-FE LFB получает через порт LFB в группе IngressInGroup инкапсулированный кадр Ethernet. Успешная обработка пакета будет приводить к отправке raw-пакета и связанных с ним метаданных блоку LFB, подключенному к порту OUT2. При отказе данные передаются в EXCEPTIONOUT.

6.1.1. Выходная обработка

Выходной блок inter-FE LFB получает пакет и связанные с ним метаданные на порту LFB группы входных портов экземпляра LFB, помеченной EgressInGroup.

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

Если поиск завершился успехом, соответствующая строка таблицы с данными IFEInfo извлекается в форме кортежа (необязательные IFETYPE и StatId, DSTFE19, SRCFE 20 и необязательные метафильтры). Списки метафильтров определяют «белый» список метаданных для передачи соседнему FE. Блок inter-FE LFB будет выполнять с помощью полученного кортежа перечисленные ниже действия.

  • Увеличение значений счетчиков пакетов и байтов в соответствующей записи IFEStats.

  • При наличии MetaFilterList применяются фильтры ко всем полученным метаданным. Если подходящих данных для передачи в нисходящем направлении не найдено, обработка завершается и пакет вместе с метаданными передается в порт EXCEPTIONOUT с exceptionID = EncapTableLookupFailed [RFC6956].

  • Проверка размера дополнительных данных в заголовке кадре Ethernet и инкапсулированных данных на предмет соответствия MTU. Если размер превышен, увеличивается значение счетчика пакетов с ошибками, а пакет и метаданные передаются в порт EXCEPTIONOUT с exceptionID = EncapTableLookupFailed [RFC6956].

  • Создание заголовка Ethernet.

  • Установка адреса Destination MAC в заголовке Ethernet в соответствии со значением поля DSTFE.

  • Установка адреса Source MAC в заголовке Ethernet в соответствии со значением поля SRCFE.

  • При наличии поля IFETYPE установка для поля ethertype значения из IFETYPE. При отсутствии IFETYPE используется стандартное для inter-FE LFB шестнадцатеричное значение ethertype ED3E.

  • Инкапсуляция всех разрешенных метаданных в TLV с использованием metaID в качестве поля типа в заголовке TLV. Блоки TLV следует выравнивать по 32-битовым границам путем добавления нулей в конце.

  • Обновление размера метаданных с учетом суммарного размера TLV + 2 байта (размер поля Metadata length).

Полученный пакет передается следующему экземпляру LFB, подключенному к LFB-порту OUT1.

Если поиск не дал результата, исходный пакет и связанные с ним метаданные передаются в порт EXCEPTIONOUT с exceptionID = EncapTableLookupFailed [RFC6956]. Отметим, что порт EXCEPTIONOUT LFB является абстракцией и реализация может просто отбрасывать соответствующие пакеты.

6.1.2. Входная обработка

Входящий пакет inter-FE LFB распознается по полю ethertype и опционально по MAC-адресам отправителя и получателя. Соответствующие пакеты отображаются на порт экземпляра LFB в группе IngressInGroup. Запись таблицы IFETable, соответствующая порту экземпляра LFB, может иметь фильтры метаданных. В таком случае входная обработка должна применять эти фильтры в качестве «белого» списка для выделения разрешенных метаданных.

  • Увеличение значений счетчиков пакетов и байтов.

  • В соответствии со значением поля Metadata length извлекаются значения метаданных из TLV. Для каждого блока при наличии фильтров значение metaID сравнивается со списком соответствующей строки IFETable. Если фильтр разрешает метаданные, устанавливается соответствующее поле метаданных. Если встречается неизвестный идентификатор метаданных или фильтр не разрешает metaID, предполагается, что реализация игнорирует их, увеличивает значение счетчика пакетов с ошибками и обрабатывает другие метаданные.

  • По завершении обработки всех метаданных экземпляр inter-FE LFB переходит к данным исходного пакета (пропускает заголовок IFE). В этот момент восстанавливается исходный пакет, переданный выходному inter-FE LFB в FE-источнике. Этот пакет вместе с восстановленными метаданными передается в нисходящем направлении следующему экземпляру LFB на графе.

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

6.2. Компоненты

Имеется две компоненты LFB, к которым обращается CE (см. определения в разделе 8).

Первой компонентой, которая заполняется элементом CE, является массив, называемый таблицей IFETable. Строки массива являются структурами IFEInfo. Каждая структура IFEInfo включает необязательные поля IFETYPE и StatId, MAC-адрес получателя (DSTFE), MAC-адрес отправителя (SRCFE) и необязательный массив разрешенных metaID (MetaFilterList).

Вторая компонента (ID 2) заполняется элементом FE и считывается CE — это индексированный массив, называемый таблицей IFEStats. Каждая строка IFEStats содержит статистические данные в структуре bstats.

Отметим, что StatId указывает связи между IFETable и IFEStats — реализация может создать отображение между строками IFETable и IFEStats, используя поле StatId в соответствующей строке IFETable. В этом случае в строке IFETable должно присутствовать поле StatId. Другие реализации могут отображать строки IFETable на строки IFEStats во время подготовки. Еще одним вариантом реализации является отказ от указания StatId в IFETable и использование строки IFETable в качестве индекса IFEStats. Поэтому поле StatId является необязательным.

6.3. Модель XML для Inter-FE LFB

  <LFBLibrary xmlns="urn:ietf:params:xml:ns:forces:lfbmodel:1.1"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         provides="IFE">
    <frameDefs>
       <frameDef>
           <name>PacketAny</name>
            <synopsis>Произвольный пакет</synopsis>
       </frameDef>
       <frameDef>
           <name>InterFEFrame</name>
           <synopsis>Кадр Ethernet с инкапсулированными данными IFE</synopsis>
       </frameDef>
    </frameDefs>

    <dataTypeDefs>
      <dataTypeDef>
         <name>bstats</name>
         <synopsis>Базовая статистика</synopsis>
      <struct>
          <component componentID="1">
           <name>bytes</name>
           <synopsis>Общее число просмотренных байтов</synopsis>
           <typeRef>uint64</typeRef>
          </component>

          <component componentID="2">
           <name>packets</name>
           <synopsis>Общее число просмотренных пакетов</synopsis>
           <typeRef>uint32</typeRef>
          </component>

          <component componentID="3">
           <name>errors</name>
           <synopsis>Общее число пакетов с ошибками</synopsis>
           <typeRef>uint32</typeRef>
          </component>
      </struct>
     </dataTypeDef>

       <dataTypeDef>
          <name>IFEInfo</name>
          <synopsis>Описание информации строки таблицы IFE</synopsis>
          <struct>
             <component componentID="1">
               <name>IFETYPE</name>
               <synopsis>ethertype для исходящего кадра IFE</synopsis>
               <optional/>
               <typeRef>uint16</typeRef>
             </component>
             <component componentID="2">
               <name>StatId</name>
               <synopsis>Индекс таблицы статистики</synopsis>
               <optional/>
               <typeRef>uint32</typeRef>
             </component>
             <component componentID="3">
               <name>DSTFE</name>
               <synopsis>MAC-адрес получателя целевого FE</synopsis>
               <typeRef>byte[6]</typeRef>
             </component>
             <component componentID="4">
               <name>SRCFE</name>
               <synopsis>MAC-адрес отправителя FE-источника</synopsis>
               <typeRef>byte[6]</typeRef>
             </component>
             <component componentID="5">
               <name>MetaFilterList</name>
               <synopsis>Таблица фильтров разрешенных метаданных</synopsis>
               <optional/>
               <array type="variable-size">
                 <typeRef>uint32</typeRef>
               </array>
              </component>
          </struct>
       </dataTypeDef>
    </dataTypeDefs>

    <LFBClassDefs>
      <LFBClassDef LFBClassID="18">
        <name>IFE</name>
        <synopsis>Этот LFB описывает параметры связности IFE</synopsis>
        <version>1.0</version>

          <inputPorts>
            <inputPort group="true">
             <name>EgressInGroup</name>
             <synopsis>
                     Группа входных портов на выходной стороне.
                     Она ожидает кадры Ethernet любого типа.
             </synopsis>
             <expectation>
                  <frameExpected>
                  <ref>PacketAny</ref>
                  </frameExpected>
             </expectation>
            </inputPort>

            <inputPort  group="true">
             <name>IngressInGroup</name>
             <synopsis>
                     Группа входных портов на входной стороне.
                     Она ожидает кадры Ethernet с инкапсуляцией interFE.
              </synopsis>
             <expectation>
                  <frameExpected>
                  <ref>InterFEFrame</ref>
                  </frameExpected>
             </expectation>
          </inputPort>
         </inputPorts>

         <outputPorts>
           <outputPort>
             <name>OUT1</name>
             <synopsis>Выходной порт на выходной стороне</synopsis>

             <product>
                <frameProduced>
                  <ref>InterFEFrame</ref>
                </frameProduced>
             </product>
          </outputPort>

          <outputPort>
            <name>OUT2</name>
             <synopsis>Выходной порт на входной стороне</synopsis>
            <product>
               <frameProduced>
                 <ref>PacketAny</ref>
               </frameProduced>
            </product>
         </outputPort>

         <outputPort>
           <name>EXCEPTIONOUT</name>
           <synopsis>Путь обработки исключений</synopsis>
           <product>
              <frameProduced>
                <ref>PacketAny</ref>
              </frameProduced>
              <metadataProduced>
                <ref>ExceptionID</ref>
              </metadataProduced>
           </product>
        </outputPort>
     </outputPorts>

     <components>
        <component componentID="1" access="read-write">
           <name>IFETable</name>
           <synopsis>Таблица всех связей inter-FE</synopsis>
           <array type="variable-size">
              <typeRef>IFEInfo</typeRef>
           </array>
        </component>

       <component componentID="2" access="read-only">
         <name>IFEStats</name>
         <synopsis>Статистика, соответствующая таблице IFETable</synopsis>
         <typeRef>bstats</typeRef>
       </component>
    </components>
   </LFBClassDef>
  </LFBClassDefs>

  </LFBLibrary>

Рисунок 8. Inter-FE LFB XML.

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

Агентство IANA зарегистрировало приведенное в таблице имя класса LFB в субреестре Logical Functional Block (LFB) Class Names and Class Identifiers реестра Forwarding and Control Element Separation (ForCES) <https://www.iana.org/assignments/forces>.

Имя и идентификатор класса LFB

Идентификатор класса LFB

Имя класса LFB

Версия LFB

Описание

Документ

18

IFE

1.0

Блок IFE LFB служит для стандартизации inter-FE LFB в сетевых элементах ForCES

RFC 8013

8. Взаимодействие с IEEE

Этот документ включает запрос на выделение нового значения протокола Ethernet, как указано в параграфе 5.2.

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

Элементы FE, вовлеченные в inter-FE LFB, относятся к одному NE и находятся в частной ЛВС Ethernet с единым администрированием. Несмотря на наличие доверия к политике управления и ее трактовке в пути данных, реализациям inter-FE LFB следует поддерживать услуги защиты, обеспечиваемые MACsec21 [ieee8021ae]. Методы MACsec пока недостаточно распространены в традиционном оборудовании для обработки пакетов, хотя они имеются в новых версиях ядра Linux kernel (распространенного достаточно широко) [linux-macsec]. Ожидается, что со временем большинство FE будут поддерживать MACsec.

MACsec обеспечивает услуги защиты типа аутентификации сообщений и необязательной защиты конфиденциальности. Эти услуги можно настраивать вручную или автоматически с помощью MKA22 на основе модели IEEE 802.1x [ieee8021x] EAP23. Ожидается, что реализации FE начнут с использования на уровне управления общих ключей, а затем перейдут к автоматическому управления ключами.

Ниже перечислены механизмы MACsec, которые нужны для inter-FE LFB.

  • Механизмы защиты в масштабе NE для всех элементов FE. После включения защиты в зависимости от выбранного уровня (например, аутентификация и конфиденциальность) эти услуги будут действовать для inter-FE LFB в течение всей сессии.

  • Операторам следует задавать одинаковые правила безопасности для всех участвующих элементов FE в кластере NE. Это обеспечит единообразие действий и позволит избавиться от ненужных сложностей при настройке политики. Иными словами, ключи SAK24 следует распространять заранее. При использовании MKA элементы FE должны идентифицировать себя с помощью ключей CAK25 и их имен CKN26. В качестве метода EAP следует использовать EAP-TLS.

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

Следует отметить, что с учетом приведенных выше вариантов компрометация FE позволит объекту, работающему в этом FE, создавать обманные inter-FE или менять их содержимое, что приведет к нежелательным результатам.

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

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

[ieee8021ae] IEEE, «IEEE Standard for Local and metropolitan area networks Media Access Control (MAC) Security», IEEE 802.1AE-2006, DOI 10.1109/IEEESTD.2006.245590, <http://ieeexplore.ieee.org/document/1678345/>.

[ieee8021x] IEEE, «IEEE Standard for Local and metropolitan area networks — Port-Based Network Access Control.», IEEE 802.1X-2010, DOI 10.1109/IEEESTD.2010.5409813, <http://ieeexplore.ieee.org/document/5409813/>.

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

[RFC5810] Doria, A., Ed., Hadi Salim, J., Ed., Haas, R., Ed., Khosravi, H., Ed., Wang, W., Ed., Dong, L., Gopal, R., and J. Halpern, «Forwarding and Control Element Separation (ForCES) Protocol Specification», RFC 5810, DOI 10.17487/RFC5810, March 2010, <http://www.rfc-editor.org/info/rfc5810>.

[RFC5811] Hadi Salim, J. and K. Ogawa, «SCTP-Based Transport Mapping Layer (TML) for the Forwarding and Control Element Separation (ForCES) Protocol», RFC 5811, DOI 10.17487/RFC5811, March 2010, <http://www.rfc-editor.org/info/rfc5811>.

[RFC5812] Halpern, J. and J. Hadi Salim, «Forwarding and Control Element Separation (ForCES) Forwarding Element Model», RFC 5812, DOI 10.17487/RFC5812, March 2010, <http://www.rfc-editor.org/info/rfc5812>.

[RFC7391] Hadi Salim, J., «Forwarding and Control Element Separation (ForCES) Protocol Extensions», RFC 7391, DOI 10.17487/RFC7391, October 2014, <http://www.rfc-editor.org/info/rfc7391>.

[RFC7408] Haleplidis, E., «Forwarding and Control Element Separation (ForCES) Model Extension», RFC 7408, DOI 10.17487/RFC7408, November 2014, <http://www.rfc-editor.org/info/rfc7408>.

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

[brcm-higig] Broadcom, «HiGig», <http://www.broadcom.com/products/ethernet-communication-and-switching/switching/bcm56720>.

[circuit-b] Fairhurst, G., «Network Transport Circuit Breakers», Work in Progress, draft-ietf-tsvwg-circuit-breaker-1527, April 2016.

[linux-macsec] Dubroca, S., «MACsec: Encryption for the wired LAN»28, Netdev 11, Feb 2016.

[linux-tc] Hadi Salim, J., «Linux Traffic Control Classifier-Action Subsystem Architecture»29, Netdev 01, Feb 2015.

[RFC791] Postel, J., «Internet Protocol», STD 5, RFC 791, DOI 10.17487/RFC0791, September 1981, <http://www.rfc-editor.org/info/rfc791>.

[RFC2460] Deering, S. and R. Hinden, «Internet Protocol, Version 6 (IPv6) Specification», RFC 246030, DOI 10.17487/RFC2460, December 1998, <http://www.rfc-editor.org/info/rfc2460>.

[RFC3746] Yang, L., Dantu, R., Anderson, T., and R. Gopal, «Forwarding and Control Element Separation (ForCES) Framework», RFC 3746, DOI 10.17487/RFC3746, April 2004, <http://www.rfc-editor.org/info/rfc3746>.

[RFC6956] Wang, W., Haleplidis, E., Ogawa, K., Li, C., and J. Halpern, «Forwarding and Control Element Separation (ForCES) Logical Function Block (LFB) Library», RFC 6956, DOI 10.17487/RFC6956, June 2013, <http://www.rfc-editor.org/info/rfc6956>.

[tc-ife] Hadi Salim, J. and D. Joachimpillai, «Distributing Linux Traffic Control Classifier-Action Subsystem»31, Netdev 01, Feb 2015.

[UDP-GUIDE] Eggert, L., Fairhurst, G., and G. Shepherd, «UDP Usage Guidelines», Work in Progress32, draft-ietf-tsvwg-rfc5405bis-19, October 2016.

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

Авторы благодарны Joel Halpern и Dave Hood за плодотворные дискуссии. Evangelos Haleplidis много сделал для улучшения этого документа. Alia Atlas был AD-спонсором этого документа и внес множество критических замечаний. Авторы признательны Joel Halpern и Sue Hares, которые в роли рецензентов от Routing Area помогли сформировать содержимое этого документа. David Black приложил значительные усилия по проверке разумности решения в части контроля перегрузок. Russ Housley подготовил обзор Gen-ART, Joe Touch — обзор TSV, а Shucheng LIU (Will) — обзор OPS. Suresh Krishnan помог при рецензировании IESG. Авторы благодарны Stephen Farrell за его усилия по подготовке раздела, посвященного безопасности.

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

Damascane M. Joachimpillai

Verizon

60 Sylvan Rd

Waltham, MA 02451

United States of America

Email: damascene.joachimpillai@verizon.com

Jamal Hadi Salim

Mojatatu Networks

Suite 200, 15 Fitzgerald Rd.

Ottawa, Ontario K2H 9G1

Canada

Email: hadi@mojatatu.com


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

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

nmalykh@gmail.com

1Logical Functional Block.

2Forwarding and Control Element Separation — разделение элементов пересылки и управления.

3Forwarding Element.

4Internet Engineering Task Force.

5Internet Engineering Steering Group.

6Control Element.

7Network Elementю

8Longest-Prefix-Matching — максимальный размер соответствия префикса.

9Next-hop.

10Media Access Control — управление доступом к среде передачи.

11В этом LFB обычно выполняется также декрементирование TTL и пересчет контрольной суммы IP.

12Application-Specific Integrated Circuit — специализированная микросхема.

13Network Function.

14Deep packet inspection.

15Class-of-Service.

16Quality-of-Service.

17Index-Length-Value.

18В оригинале ошибочно сказано FE1, см. http://www.rfc-editor.org/errata/eid5358. Прим. перев.

19Destination MAC address.

20Source MAC address.

21Media Access Control Security.

22MACsec Key Agreement — согласование ключей MACsec.

23Extensible Authentication Protocol — расширяемый протокол аутентификации.

24Security Association Key — ключ защищенной связи.

25Connectivity Association Key — ключ ассоциации связности.

26Connectivity Association Key Name — имя ключа ассоциации связности.

27Работа опубликована в RFC 8084. Прим. перев.

28Статья доступна по ссылке. Прим. перев.

29Статья доступна по ссылке. Прим. перев.

30Этот документ отменен RFC 8200. Прим. перев.

31Статья доступна по ссылке. Прим. перев.

32Работа опубликована в RFC 8085. Прим. перев.

Рубрика: RFC | Комментарии к записи RFC 8013 Forwarding and Control Element Separation (ForCES) Inter-FE Logical Functional Block (LFB) отключены

RFC 8072 YANG Patch Media Type

Internet Engineering Task Force (IETF)                        A. Bierman
Request for Comments: 8072                                     YumaWorks
Category: Standards Track                                   M. Bjorklund
ISSN: 2070-1721                                           Tail-f Systems
                                                               K. Watsen
                                                        Juniper Networks
                                                           February 2017

YANG Patch Media Type

Media-тип YANG Patch

PDF

Аннотация

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

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

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

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

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

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

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

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

1. Введение

Нужны стандартные механизмы для наложения правок (patch) в хранилища данных [RFC6241], которые содержат концептуальные данные, соответствующие схеме YANG [RFC7950]. Требуется подход на основе упорядоченного списка правок (ordered ‘edit’ list), чтобы предоставить разработчикам клиентов RESTCONF более чёткий контроль клиентов RESTCONF за процедурой редактирования, нежели даёт механизм простого исправления (plain patch), заданный в [RFC8040].

В этом документе определён media-тип для механизма редактирования на основе YANG, который можно применять в методе HTTP PATCH [RFC5789]. Тип YANG Patch предназначен для поддержки протокола RESTCONF, заданного в [RFC8040]. Документ задаёт лишь применение типа YANG Patch с протоколом RESTCONF.

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

1.1. Терминология

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

1.1.1. NETCONF

Ниже приведены термины, определённые в [RFC6241].

  • configuration data — данные конфигурации;

  • datastore — хранилище данных;

  • configuration datastore — хранилище конфигурации;

  • protocol operation — операция протокола;

  • running configuration datastore — хранилище рабочей конфигурации;

  • state data — данные состояния;

  • user — пользователь.

1.1.2. HTTP

Ниже приведены термины, определённые в [RFC7230].

  • header field — поле заголовка;

  • message-body — тело сообщения;

  • query — запрос;

  • request URI — URI запроса.

Ниже приведены термины, определённые в [RFC7231].

  • method — метод;

  • request — запрос;

  • resource — ресурс.

1.1.3. YANG

Ниже приведены термины, определённые в [RFC7950].

  • container — контейнер;

  • data node — узел данных;

  • leaf — лист;

  • leaf-list — лист-список;

  • list — список.

1.1.4. RESTCONF

Ниже приведены термины, определённые в [RFC8040].

  • application/yang-data+xml;

  • application/yang-data+json;

  • data resource — ресурс данных;

  • datastore resource — ресурс хранилища данных;

  • patch — исправление;

  • RESTCONF capability — свойство RESTCONF;

  • target resource — целевой ресурс;

  • YANG data template — шаблон данных YANG.

1.1.5. YANG Patch

Ниже определены используемые в этом документе термины.

RESTCONF client — клиент RESTCONF

Клиент, реализующий протокол RESTCONF.

RESTCONF server — сервер RESTCONF

Сервер, реализующий протокол RESTCONF.

YANG Patch — исправление YANG

Концептуальный запрос редактирования с использованием шаблона yang-patch, определённого в разделе 3. В HTTP указывает метод PATCH, где представление использует тип носителя application/yang-patch+xml или application/yang-patch+json.

YANG Patch Status — статус исправления YANG

Концептуальный запрос статуса редактирования с использованием шаблона yang-patch-status, определённого в разделе 3. В HTTP указывает метод PATCH, где представление использует тип носителя application/yang-patch+xml или application/yang-patch+json.

YANG Patch template — шаблон исправления YANG

Похож на шаблон данных YANG, но представляется типом носителя application/yang-patch+xml или application/yang-patch+json.

1.1.6. Примеры

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

1.1.7. Обозначения в диаграмме дерева

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

  • Квадратные скобки [ ] служат для указания ключей списков.

  • В сокращениях перед узлами данных rw означает данные конфигурации (чтение и запись), ro — данные состояния (только чтение), x — операции (исполнение).

  • После имени узла данных символ ? означает необязательный узел, * — список (list) и лист-список (leaf-list).

  • В круглых скобках указываются варианты выбора и узлы case (последние указываются двоеточием :).

  • Многоточие «…» указывает содержимое субдерева, которое не показано.

2. YANG Patch

YANG Patch представляет собой упорядоченный список правок, которые нужно применить к целевому хранилищу данных на сервере RESTCONF. Конкретные поля определены в модуле YANG, приведённом в разделе 3.

Операция YANG Patch вызывается клиентом RESTCONF путём отправки запроса методом PATCH с представлением, использующим тип носителя (media-type) application/yang-patch+xml или application/yang-patch+json. Это тело сообщения, представляющее входные параметры YANG Patch, должно присутствовать.

YANG Patch имеет некоторые свойства, которые невозможно передать с помощью механизма plain-patch, определённого в RESTCONF [RFC8040]:

  • YANG Patch позволяет редактировать несколько субресурсов внутри одного метода PATCH;

  • YANG Patch позволяет более точно по сравнению с plain patch [RFC8040] задать операцию редактирования (поддерживается 7 операций: create, delete, insert, merge, move, replace, remove);

  • YANG Patch использует список edit с явным порядком выполнения, редактирование выполняется в заданном клиентом порядке и обработка ошибок может быть точной даже при возникновении нескольких ошибок в одном запросе.

YANG Patch patch-id может служить для отладки и этот идентификатор следует включать в журнальные записи аудита, создаваемые сервером RESTCONF для исправления.

Сервер RESTCONF должен возвращать поле заголовка Accept-Patch в отклике OPTIONS, как указано в [RFC5789], с типом носителя для YANG Patch. Это нужно клиенту для определения формата кодирования сообщений, поддерживаемого сервером (например, XML, JSON или оба). Заголовок Accept-Patch имеет вид

    Accept-Patch: application/yang-patch+xml,application/yang-patch+json

Отметим, что YANG Patch может редактировать лишь ресурсы данных и метод PATCH не может служить для замены ресурса хранилища данных. Хотя модуль YANG ietf-yang-patch написан с использованием YANG 1.1 [RFC7950], реализации YANG Patch можно применять для содержимого, заданного с использованием YANG версии 1 [RFC6020].

YANG Patch можно представить в формате XML в соответствии с [W3C.REC-xml-20081126], а также в формате JSON в соответствии с «JSON Encoding of Data Modeled with YANG» [RFC7951]. Если нужно передать метаданные в сообщении JSON, они кодируются в соответствии с документом «Defining and Using Metadata with YANG» [RFC7952].

2.1. Целевой ресурс

Операция YANG использует Patch URI целевого ресурса RESTCONF для указания изменяемого ресурса. Это может быть ресурс хранилища данных, т. е. «{+restconf}/data», для редактирования данных конфигурации верхнего уровня или ресурс данных конфигурации, например, «{+restconf}/data/ietf-interfaces:interfaces», для редактирования субресурсов внутри ресурса данных конфигурации верхнего уровня.

Цель должна указывать в точности 1 ресурс. Если идентифицировано несколько ресурсов, выполнять запрос недопустимо и сервер должен возвращать сообщение «400 Bad Request» (недопустимый запрос). Если целевой ресурс не соответствует ни одному имеющемуся экземпляру, выполнять запрос недопустимо и сервер должен передать сообщение об ошибке «404 Not Found» (не найдено).

Каждое редактирование (edit) в YANG Patch указывает целевой узел данных для редактирования (см. параграф 2.4).

2.2. Запрос yang-patch

YANG Patch указывается уникальным идентификатором patch-id и может иметь комментарий. Исправление (patch) представляет собой упорядоченный набор правок (edit), каждая из которых указывается идентификатором edit-id и включает операцию редактирования (create, delete, insert, merge, move, replace, remove), применяемую к целевому ресурсу. Каждая операция редактирования может применяться к субресурсу target внутри целевого ресурса. Для операций insert и move параметр where указывает узел, который вставляется или перемещается. Для значений before и after параметр point указывает место вставки данных.

Операции merge, replace, create, delete, remove имеют такие же значения, которые определены для атрибута operation в параграфе 7.2 [RFC6241].

Каждое редактирование (edit) внутри YANG Patch должно указывать в точности один экземпляр ресурса данных. При указании нескольких ресурсов выполнять запрос недопустимо и сервер должен возвращать сообщение «400 Bad Request» (недопустимый запрос). Если редактирование указано для отсутствующего ресурса и задана операция delete или move3, выполнять запрос недопустимо и сервер должен передать сообщение об ошибке «404 Not Found» (не найдено). Сервер должен передавать отклик yang-patch-status, указывающий недействительные операции редактирования.

YANG Patch не предоставляет доступа к каким-либо хранилищам. Способ редактирования на сервере, совмещённом с сервером NETCONF, который предоставляет доступ к отдельным хранилищам данных, остаётся за реализацией. Хранилище не может быть заменено полностью, как это предусмотрено для операции <copy-config>, заданной в параграфе 7.3 [RFC6241]. YANG Patch воздействует лишь на указанные узлы.

Тело сообщения, представляющее YANG Patch, передаётся клиентом RESTCONF для указания запроса операции редактирования. При использовании с методом HTTP PATCH эти данные указываются типом носителя YANG Patch.

Ниже приведена диаграмма дерева YANG для контейнера yang-patch.

     +---- yang-patch
           +---- patch-id    string
           +---- comment?    string
           +---- edit* [edit-id]
              +---- edit-id      string
              +---- operation    enumeration
              +---- target       target-resource-offset
              +---- point?       target-resource-offset
              +---- where?       enumeration
              +---- value?

2.3. Отклик yang-patch-status

Тело сообщения с YANG Patch Status возвращается клиенту RESTCONF для детального информирования о результатах операции редактирования. При использовании с методом HTTP PATCH эти данные указываются типом носителя YANG Patch Status, синтаксис которого описан в разделе 3.

Ниже приведена диаграмма дерева YANG для контейнера yang-patch-status.

     +---- yang-patch-status
           +---- patch-id       string
           +---- (global-status)?
           |  +--:(global-errors)
           |  |  +---- errors
           |  |     +---- error*
           |  |        +---- error-type       enumeration
           |  |        +---- error-tag        string
           |  |        +---- error-app-tag?   string
           |  |        +---- error-path?      instance-identifier
           |  |        +---- error-message?   string
           |  |        +---- error-info?
           |  +--:(ok)
           |     +---- ok?            empty
           +---- edit-status
              +---- edit* [edit-id]
                 +---- edit-id    string
                 +---- (edit-status-choice)?
                    +--:(ok)
                    |  +---- ok?        empty
                    +--:(errors)
                       +---- errors
                          +---- error*
                             +---- error-type       enumeration
                             +---- error-tag        string
                             +---- error-app-tag?   string
                             +---- error-path?      instance-identifier
                             +---- error-message?   string
                             +---- error-info?

2.4. Целевой узел данных

Целевой узел данных для каждой операции редактирования определяется значением целевого ресурса в запросе и листом target в каждой записи edit.

Если целевой ресурс в URI запроса указывает ресурс хранилища данных, строка пути в листе target считается выражением абсолютного пути, указывающим целевой узел данных для соответствующего редактирования. Первый узел листа target является узлом данных верхнего уровня в модуле YANG. Листу target недопустимо содержать лишь символ /, поскольку он будет указывать ресурс хранилища, а не ресурс данных.

Если целевой ресурс в URI запроса указывает ресурс данных конфигурации, строка пути в листе target считается выражением относительного пути. Первым узлом, указанным в листе target, является дочерний узел данных конфигурации узла, связанного с целевым ресурсом. Если лист target содержит лишь символ /, целевым узлом данных является целевой узел данных ресурса.

2.5. Операции редактирования

В YANG Patch каждое редактирование (edit) указывает одну операцию редактирования целевого узла данных. Набор операций содержит операции редактирования NETCONF, а также несколько новых операций.

Операции редактирования YANG Patch.

Операция

Описание

create

Создает новый ресурс данных, если такого ещё нет. При наличии ресурса возвращается ошибка.

delete

Удаляет имеющийся ресурс данных, а при отсутствии такового возвращает ошибку.

insert

Вставляет новый упорядоченный пользователем ресурс данных.

merge

Сливает значение edit с целевым ресурсом данных, создавая тот при отсутствии.

move

Перемещает (меняет порядок) целевой ресурс данных.

replace

Заменяет целевой ресурс данных значением edit.

remove

Удаляет ресурс данных, если он имеется.

2.6. Обработка отклика об успешном редактировании

Если применение YANG завершилось без ошибок, сервер RESTCONF должен вернуть клиенту сообщение yang-patch-status с установкой для global-status значения ok.

В Приложении A.1.2 приведён пример отклика об успехе YANG Patch.

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

При получении корректно сформированного в соответствии со схемой сообщения YANG Patch сервер RESTCONF будет выполнять предложенное редактирование в порядке указания (по возрастанию). При обработке списка edit может возникать несколько ошибок.

Если при выполнении YANG Patch случилась ошибка, серверу RESTCONF следует возвращать сообщение yang-patch-status. Возможно отклонение некорректного запроса до начала обработки YANG Patch (например, в распределенной реализации). В таких случаях сервер должен передавать соответствующее сообщение HTTP об ошибке.

Пример отклика об ошибке YANG Patch приведён в Приложении A.1.1.

2.8. Свойство RESTCONF «:yang-patch»

Пределен идентификатор URI для указания расширения YANG Patch базовому протоколу RESTCONF. Если сервер RESTCONF поддерживает тип носителя YANG Patch, свойство RESTCONF «:yang-patch», определённое в параграфе 4.3, должно быть указано в листе-списке capability модуля ietf-restconf-monitoring, определённого в [RFC8040].

3. Модуль YANG

Модуль ietf-yang-patch задаёт с помощью операторов расширения yang-data концептуальные определения, которые не предназначены для реализации в качестве содержимого хранилищ данных на серверах RESTCONF. Определение оператора расширения yang-data содержится в модуле ietf-restconf [RFC8040], используемом данным модулем.

   <CODE BEGINS>

   file "ietf-yang-patch@2017-02-22.yang"

   module ietf-yang-patch {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-yang-patch";
     prefix "ypatch";

     import ietf-restconf { prefix rc; }

     organization
       "IETF NETCONF (Network Configuration) Working Group";
     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netconf/> 
        WG List:  <mailto:netconf@ietf.org> 

        Author:   Andy Bierman
                  <mailto:andy@yumaworks.com> 

        Author:   Martin Bjorklund
                  <mailto:mbj@tail-f.com> 

        Author:   Kent Watsen
                  <mailto:kwatsen@juniper.net>"; 

     description
       "Этот модуль содержит концептуальные спецификации YANG для
        структур данных YANG Patch и YANG Patch Status.

        Отметим, что определения YANG в этом модуле не представляют
        каких-либо данных конфигурации. Оператор YANG grouping
        обеспечивает нормативный синтаксис для кодирования сообщений
        с использованием XML и JSON.

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

        Распространение и использование в исходной и двоичной форме
        с изменениями или без них разрешается в соответствии с условиями,
        указанными в упрощённой лицензии BSD, изложенной в разделе 4.c
        Правового положения IETF Trust применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC 8072, где
        правовые аспекты выражены более полно.";
     revision 2017-02-22 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8072: YANG Patch Media Type.";
     }

     typedef target-resource-offset {
       type string;
       description
         "Содержит строку идентификатора ресурса данных, представляющего
          субресурс целевого ресурса. Корнем документа для этого
          выражения служит целевой ресурс, указанный в операции 
          протокола (например, URI для запроса PATCH).

          Эта строка кодируется по тем же правилам, которые применяются
          для идентификаторов ресурсов данных в URI запроса RESTCONF.";
       reference
          "RFC 8040, Section 3.5.3.";
     }

     rc:yang-data "yang-patch" {
       uses yang-patch;
     }

     rc:yang-data "yang-patch-status" {
       uses yang-patch-status;
     }

     grouping yang-patch {

       description
         "Группировка, содержащая контейнер YANG, который представляет
          синтаксис и семантику сообщения с запросом YANG Patch edit.";

       container yang-patch {
         description
           "Представляет концептуальную последовательность операций 
            edit, вызываемых правкой (patch). Каждая правка получает
            заданный клиентом идентификатор. Операции редактирования
            ДОЛЖНЫ применяться в порядке роста идентификатора и все 
            редактирования ДОЛЖНЫ быть применены. При возникновении
            ошибки НЕДОПУСТИМО изменение целевого хранилища операцией
            YANG Patch.

            Возможно нарушение ограничений хранилища данных, связанное
            с любым узлом в хранилище, включая узлы, не затрагиваемые 
            списком edit. Все ошибки валидации ДОЛЖНЫ указываться
            в возвращаемом отклике.";

         reference
           "RFC 7950, Section 8.3.";

         leaf patch-id {
           type string;
           mandatory true;
           description
             "Произвольная строка, представляемая клиентом для указания
              правок (patch) в целом. Сообщения об ошибках, возвращаемые
              сервером при выполнении правок, будут содержать значение
              patch-id. Клиенту СЛЕДУЕТ пытаться создавать уникальные
              значения patch-id, чтобы различать транзакции разных
              клиентов в записях журнала аудита на сервере.";
         }

         leaf comment {
           type string;
           description
             "Произвольная строка, представляемая клиентом для описания
              правок (patch) в целом. Это значение СЛЕДУЕТ указывать во
              всех записях аудита, создаваемых сервером при правках.";
         }

         list edit {
           key edit-id;
           ordered-by user;

           description
             "Представляет правку (edit) в запросе YANG Patch. Список
              edit применяется, как указано ниже.
                - Первое редактирование концептуально применяется к
                  копии имеющегося целевого хранилища, например, 
                  хранилища рабочей конфигурации.
                - Каждое следующее редактирование применяется к
                  результату предыдущих редактирований (edit).
                - После успешного применения всех edit результат
                  проверяется в соответствии с ограничениями YANG.
                - В случае успеха сервер пытается применить результат
                  к целевому хранилищу данных.";

           leaf edit-id {
             type string;
             description
               "Произвольная строка, указывающая редактирование (edit).
                Возвращаемые сервером сообщения об ошибках, относящиеся
                к конкретному редактированию, указываются edit-id.";
           }

           leaf operation {
             type enumeration {
               enum create {
                 description
                   "Целевой узел данных, создаваемый с использованием 
                    представленного значения, если его ещё нет. Лист
                    target указывает создаваемый узел данных, а не
                    родительский узел.";
               }
               enum delete {
                 description
                   "Удаляет целевой узел, если ресурс данных уже
                    имеется. В ином случае возвращается ошибка.";
               }
               enum insert {
                 description
                   "Вставляет указанное значение в упорядоченную 
                    пользователем запись list или leaf-list. Целевой 
                    узел представляет новый ресурс данных. Если параметр
                    where имеет значение before или after, параметр
                    point указывает точку вставки для целевого узла.";
               }
               enum merge {
                 description
                   "Представленное значение объединяется (merge) с 
                    целевым узлом данных.";
               }
               enum move {
                 description
                   "Перемещает целевой узел, изменяя упорядоченный
                    пользователем list или leaf-list. Целевой узел должен
                    представлять имеющийся ресурс данных. Если параметр
                    where имеет значение before или after, параметр
                    point указывает точку вставки для целевого узла.";
               }
               enum replace {
                 description
                   "Представленное значение служит для замены целевого
                    узла данных.";
               }

               enum remove {
                 description
                   "Удаляет целевой узел при его наличии.";
               }
             }
             mandatory true;
             description
               "Операция, запрошенная для записи edit.";
           }

           leaf target {
             type target-resource-offset;
             mandatory true;
             description
               "Указывает целевой узел данных для операции edit. Если
                target имеет значение /, целевым узлом данных будет
                целевой ресурс. Целевым узлом ДОЛЖЕН быть ресурс данных,
                а не ресурс хранилища.";
           }

           leaf point {
             when "(../operation = 'insert' or ../operation = 'move')"
                + "and (../where = 'before' or ../where = 'after')" {
               description
                 "Этот лист применяется лишь для операций insert и move,
                  применяя её перед или после имеющейся записи.";
             }
             type target-resource-offset;
             description
               "URL абсолютного пути к узлу данных, используемый как
                точка вставки или переноса для этой записи edit.";
           }

           leaf where {
             when "../operation = 'insert' or ../operation = 'move'" {
               description
                 "Применяется лишь для операций insert и move.";
             }
             type enumeration {
               enum before {
                 description
                   "Указывает вставку или перенос узла данных в точку
                    перед ресурсом, указанным параметром point.";
               }
               enum after {
                 description
                   "Указывает вставку или перенос узла данных в точку
                    после ресурса, указанного параметром point.";
               }
               enum first {
                 description
                   "Указывает вставку или перенос узла данных в точку
                    в первую позицию.";
               }
               enum last {
                 description
                   "Указывает вставку или перенос узла данных в точку
                    в последнюю позицию.";
               }
             }
             default last;
             description
               "Указывают место размещения при добавлении или переносе
                ресурса. YANG разрешает эти операции лишь для узлов
                list и leaf-list, упорядоченных пользователем.";
           }

           anydata value {
             when "../operation = 'create' "
                + "or ../operation = 'merge' "
                + "or ../operation = 'replace' "
                + "or ../operation = 'insert'" {
               description
                 "Применяется лишь с операциями create, merge, replace
                  и insert.";
             }
             description
               "Значение, применяемое для операции. Параметр value
                содержит целевой ресурс, связанный с листом target.

                Предположим, например, что узлом target служит контейнер
                YANG с именем foo
                    container foo {
                      leaf a { type string; }
                      leaf b { type int32; }
                    }
                Узел value содержит экземпляр foo
                    <value>
                       <foo xmlns='example-foo-namespace'>
                          <a>Значение</a>
                          <b>42</b>
                       </foo>
                    </value>
                 ";
           }
         }
       }

     } // Группировка yang-patch

     grouping yang-patch-status {
       description
         "Группировка, содержащая контейнер YANG с описанием синтаксиса
          и семантики отклика YANG Patch Status.";

       container yang-patch-status {
         description
           "Контейнер, представляющий отклик, передаваемый сервером
            после обработки запроса на редактирование YANG Patch.";

         leaf patch-id {
           type string;
           mandatory true;
           description
             "Значение patch-id, использованное в запросе.";
         }

         choice global-status {
           description
             "Сообщает об ошибке или успехе операции. Если вариант не
              выбран, сообщается об ошибке из контейнера edit-status.";

           case global-errors {
             uses rc:errors;
             description
               "Этот контейнер представляется при глобальной ошибке, не
                связанной с определенным редактированием.";
           }
           leaf ok {
             type empty;
             description
               "Этот лист представляется при успешном выполнении и
                отсутствие ошибок из контейнера edit-status.";
           }
         }

         container edit-status {
           description
             "Этот контейнер представляется при наличии откликов о 
              статусе конкретного редактирования. Если все операции
              edit успешны и global-status возвращает ok, сервер
              МОЖЕТ опускать этот контейнер.";

           list edit {
             key edit-id;

             description
               "Представляет список откликов со статусом операций edit
                из запроса YANG Patch. Если запись edit была пропущена,
                или сервер не дошёл до неё, список не будет содержать
                записи для этой операции edit.";

             leaf edit-id {
               type string;
                description
                  "Отклик со статусом записи списка edit с данным 
                   edit-id.";
             }

             choice edit-status-choice {
               description
                 "Выбор типа отклика о статусе для каждой записи edit.";
               leaf ok {
                 type empty;
                 description
                   "Запись edit была выполнена без возникновения на 
                    сервере связанных с ней ошибок.";
               }
               case errors {
                 uses rc:errors;
                 description
                   "Сервер обнаружил ошибку при редактировании для 
                    этого значения edit-id.";
               }
             }
           }
         }
       }
     }  // Группировка yang-patch-status

   }

   <CODE ENDS>

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

4.1. Регистрация нового URI и модуля YANG

Этот документ регистрирует URI как пространство имён в IETF XML Registry [RFC3688] (в формате RFC 3688).

      URI: urn:ietf:params:xml:ns:yang:ietf-yang-patch
      Registrant Contact: The IESG.
      XML: N/A; the requested URI is an XML namespace.

Документ регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

      name:         ietf-yang-patch
      namespace:    urn:ietf:params:xml:ns:yang:ietf-yang-patch
      prefix:       ypatch
      reference:    RFC 8072

4.2. Типы носителя

4.2.1. application/yang-patch+xml

Имя типа

application

Имя субтипа

yang-patch+xml

Требуемые параметры

Нет

Необязательные параметры

Нет

Кодировка

8 битов
Для этого типа всегда применяется кодировка utf-8. Каждый концептуальный узел данных YANG представляется в соответствии с XML Encoding Rules and Canonical Format для конкретного типа данных YANG, заданного в [RFC7950]. Дополнительно шаблон yang-patch из RFC 8072 задаёт структуру запроса YANG Patch.

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

Вопросы безопасности, связанные с генерацией и применением сообщений RESTCONF, рассмотрены в разделе 5 RFC 8072. Дополнительные соображения безопасности связаны с семантикой конкретных моделей данных YANG. Предполагается, что для каждого модуля YANG будут рассматриваться вопросы безопасности, связанные с определёнными в модуле узлами данных YANG.

Вопросы взаимодействия (совместимости)

В RFC 8072 задан формат сообщений и их интерпретация.

Опубликованная спецификация

RFC 8072

Использующие тип приложения

Синтаксические анализаторы экземпляра данных документа используемые протоколом или средством автоматизации, применяющим структуру данных YANG Patch.

Идентификаторы фрагментов

Синтаксис и семантика идентификаторов фрагментов совпадают с заданными для типа носителя application/xml.

Дополнительные сведения

Отменённые псевдонимы имени для этого типа — не применимо.
Magic number(s) — не применимо.
Расширения имён файлов — нет.
Коды типа файлов Macintosh — TEXT.

Контактные данные

См. раздел «Адреса авторов» в RFC 8072.

Предполагаемое использование

Общего назначения.

Ограничения на использование

Не применимы

Автор

См. раздел «Адреса авторов» в RFC 8072.

Контролёр изменений

Internet Engineering Task Force (iesg@ietf.org).

Временная регистрация? (только для дерева стандартов)

Нет

4.2.2. application/yang-patch+json

Имя типа

application

Имя субтипа

yang-patch+json

Требуемые параметры

Нет

Необязательные параметры

Нет

Кодировка

8 битов
Для этого типа всегда применяется кодировка utf-8. Каждый концептуальный узел данных YANG представляется в соответствии с RFC 7951. Аннотации метаданных кодируются в соответствии с RFC 7952. В дополнение к этому шаблон yang-patch в RFC 8072 задаёт структуру запроса YANG Patch.

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

Вопросы безопасности, связанные с генерацией и применением сообщений RESTCONF, рассмотрены в разделе 5 RFC 8072. Дополнительные соображения безопасности связаны с семантикой конкретных моделей данных YANG. Предполагается, что для каждого модуля YANG будут рассматриваться вопросы безопасности, связанные с определёнными в модуле узлами данных YANG.

Вопросы взаимодействия (совместимости)

В RFC 8072 задан формат сообщений и их интерпретация.

Опубликованная спецификация

RFC 8072

Использующие тип приложения

Синтаксические анализаторы экземпляра данных документа используемые протоколом или средством автоматизации, применяющим структуру данных YANG Patch.

Идентификаторы фрагментов

Синтаксис и семантика идентификаторов фрагментов совпадают с заданными для типа носителя application/json.

Дополнительные сведения

Отменённые псевдонимы имени для этого типа — не применимо.
Magic number(s) — не применимо.
Расширения имён файлов — нет.
Коды типа файлов Macintosh — TEXT.

Контактные данные

См. раздел «Адреса авторов» в RFC 8072.

Предполагаемое использование

Общего назначения.

Ограничения на использование

Не применимы

Автор

См. раздел «Адреса авторов» в RFC 8072.

Контролёр изменений

Internet Engineering Task Force (iesg@ietf.org).

Временная регистрация? (только для дерева стандартов)

Нет

4.3. RESTCONF Capability URN

Этот документ задаёт один идентификатор возможности в реестре RESTCONF Capability URNs [RFC8040]. Для этого реестра применяется процедура IETF Review [RFC5226].

Индекс

Идентификатор возможности

:yang-patch
urn:ietf:params:restconf:capability:yang-patch:1.0

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

Тип носителя YANG Patch не вносит каких-либо значимых угроз безопасности в дополнение к описанным в [RFC8040]. Этот документ задаёт инструкции по обработке редактирования для варианта метода PATCH, используемого в протоколе RESTCONF. Целостность сообщений обеспечивает протокол RESTCONF и дополнительных возможностей проверки неизменности правок (patch) не предоставляется.

Возможно применение YANG Patch с протоколами, отличными от RESTCONF, но это выходит за рамки документа.

Для RESTCONF клиент и сервер должны быть аутентифицированы в соответствии с разделом 2 [RFC8040]. Для реализаций серверов RESTCONF важно тщательно проверять пригодность всех параметров запроса на редактирование тем или иным способом. Если запрос YANG Patch не может быть выполнен целиком, в конфигурацию системы изменения не вносятся. Запрос PATCH должен применяться автоматически в соответствии с разделом 2 в [RFC5789].

Реализациям сервера RESTCONF следует пытаться предотвратить нарушения работы системы в результате инкрементной обработки списков YANG Patch edit. Возможна организация атак на серверы RESTCONF, основанных на порядке обработки, заданном в YANG Patch. Серверам следует применять в системах только полностью проверенную конфигурацию. Например, список edit, который удаляет интерфейс, затем создаёт его заново, может вызвать нарушение работы системы при инкрементном (поэтапном) применении правок.

Реализациям серверов RESTCONF следует пытаться предотвратить нарушения работы системы в результате чрезмерного расхода ресурсов при выполнении запросов редактирования YANG Patch. Иначе станут возможными атаки с попытками занять всю память или исчерпать иные ресурсы.

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

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

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

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <http://www.rfc-editor.org/info/rfc3688>.

[RFC5789] Dusseault, L. and J. Snell, «PATCH Method for HTTP», RFC 5789, DOI 10.17487/RFC5789, March 2010, <http://www.rfc-editor.org/info/rfc5789>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <http://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, <http://www.rfc-editor.org/info/rfc6241>.

[RFC7159] Bray, T., Ed., «The JavaScript Object Notation (JSON) Data Interchange Format», RFC 7159, DOI 10.17487/RFC7159, March 2014, <http://www.rfc-editor.org/info/rfc7159>.

[RFC7230] Fielding, R., Ed., and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing», RFC 7230, DOI 10.17487/RFC7230, June 2014, <http://www.rfc-editor.org/info/rfc7230>.

[RFC7231] Fielding, R., Ed., and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content», RFC 7231, DOI 10.17487/RFC7231, June 2014, <http://www.rfc-editor.org/info/rfc7231>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <http://www.rfc-editor.org/info/rfc7950>.

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <http://www.rfc-editor.org/info/rfc7951>.

[RFC7952] Lhotka, L., «Defining and Using Metadata with YANG», RFC 7952, DOI 10.17487/RFC7952, August 2016, <http://www.rfc-editor.org/info/rfc7952>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <http://www.rfc-editor.org/info/rfc8040>.

[W3C.REC-xml-20081126] Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and F. Yergeau, «Extensible Markup Language (XML) 1.0 (Fifth Edition)», World Wide Web Consortium Recommendation REC-xml-20081126, November 2008, <http://www.w3.org/TR/2008/REC-xml-20081126>.

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

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, DOI 10.17487/RFC5226, May 2008, <http://www.rfc-editor.org/info/rfc5226>.

Приложение A. Пример модуля YANG

Ниже рассматривается пример модуля YANG для простого интерфейса аудиопроигрывателя (jukebox). Модуль example-jukebox описан в [RFC8040].

Диаграмма дерева YANG для модуля example-jukebox показана ниже.

      +--rw jukebox!
         +--rw library
         |  +--rw artist* [name]
         |  |  +--rw name     string
         |  |  +--rw album* [name]
         |  |     +--rw name     string
         |  |     +--rw genre?   identityref
         |  |     +--rw year?    uint16
         |  |     +--rw admin
         |  |     |  +--rw label?              string
         |  |     |  +--rw catalogue-number?   string
         |  |     +--rw song* [name]
         |  |        +--rw name        string
         |  |        +--rw location    string
         |  |        +--rw format?     string
         |  |        +--rw length?     uint32
         |  +--ro artist-count?   uint32
         |  +--ro album-count?    uint32
         |  +--ro song-count?     uint32
         +--rw playlist* [name]
         |  +--rw name           string
         |  +--rw description?   string
         |  +--rw song* [index]
         |     +--rw index    uint32
         |     +--rw id       instance-identifier
         +--rw player
            +--rw gap?   decimal64

Процедуры RPC

      +---x play
         +--ro input
            +--ro playlist       string
            +--ro song-number    uint32

A.1. Примеры YANG Patch

В этом параграфе приведены примеры RESTCONF. В большинстве примеров используется представление JSON [RFC7159], а для некоторых приведено также представление XML [W3C.REC-xml-20081126].

A.1.1. Ошибка при добавлении ресурса

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

Запрос от клиента RESTCONF приведён ниже.

      PATCH /restconf/data/example-jukebox:jukebox/\
         library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml
      Content-Type: application/yang-patch+xml

      <yang-patch xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-patch">
        <patch-id>add-songs-patch</patch-id>
        <edit>
          <edit-id>edit1</edit-id>
          <operation>create</operation>
          <target>/song=Bridge%20Burning</target>
          <value>
            <song xmlns="http://example.com/ns/example-jukebox">
              <name>Bridge Burning</name>
              <location>/media/bridge_burning.mp3</location>
              <format>MP3</format>
              <length>288</length>
            </song>
          </value>
        </edit>

        <edit>
          <edit-id>edit2</edit-id>
          <operation>create</operation>
          <target>/song=Rope</target>
          <value>
            <song xmlns="http://example.com/ns/example-jukebox">
              <name>Rope</name>
              <location>/media/rope.mp3</location>
              <format>MP3</format>
              <length>259</length>
            </song>
          </value>
        </edit>
        <edit>
          <edit-id>edit3</edit-id>
          <operation>create</operation>
          <target>/song=Dear%20Rosemary</target>
          <value>
            <song xmlns="http://example.com/ns/example-jukebox">
              <name>Dear Rosemary</name>
              <location>/media/dear_rosemary.mp3</location>
              <format>MP3</format>
              <length>269</length>
            </song>
          </value>
        </edit>
      </yang-patch>

XML-отклик от сервера RESTCONF имеет показанный ниже формат.

      HTTP/1.1 409 Conflict
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      Content-Type: application/yang-data+xml

      <yang-patch-status
         xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-patch">
        <patch-id>add-songs-patch</patch-id>
        <edit-status>
          <edit>
             <edit-id>edit1</edit-id>
             <errors>
                <error>
                   <error-type>application</error-type>
                   <error-tag>data-exists</error-tag>
                   <error-path
                     xmlns:jb="http://example.com/ns/example-jukebox">
                     /jb:jukebox/jb:library
                     /jb:artist[jb:name='Foo Fighters']
                     /jb:album[jb:name='Wasting Light']
                     /jb:song[jb:name='Bridge Burning']
                   </error-path>
                   <error-message>
                     Data already exists; cannot be created
                   </error-message>
                </error>
             </errors>
          </edit>
       </edit-status>
     </yang-patch-status>

JSON-отклик от сервера RESTCONF показан ниже для иллюстрации различий в кодировании объекта error-path. Для JSON используется кодирование instance-identifier, описанное в [RFC7951].

      HTTP/1.1 409 Conflict
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      Content-Type: application/yang-data+json

      {
        "ietf-yang-patch:yang-patch-status" : {
          "patch-id" : "add-songs-patch",
          "edit-status" : {
            "edit" : [
              {
                "edit-id" : "edit1",
                "errors" : {
                  "error" : [
                    {
                      "error-type": "application",
                      "error-tag": "data-exists",
                      "error-path": "/example-jukebox:jukebox/library\
                         /artist[name='Foo Fighters']\
                         /album[name='Wasting Light']\
                         /song[name='Bridge Burning']",
                      "error-message":
                        "Data already exists; cannot be created"
                    }
                  ]
                }
              }
            ]
          }
        }
      }

A.1.2. Успешное добавление ресурсов

В приведённом ниже примере добавляется несколько песен в имеющийся альбом.

  • Каждое редактирование (edit) включает 1 строку.

  • Оба редактирования выполняются успешно и создаются новые субресурсы.

Ниже показан запрос клиента RESTCONF.

      PATCH /restconf/data/example-jukebox:jukebox/\
         library/artist=Foo%20Fighters/album=Wasting%20Light \
         HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json
      Content-Type: application/yang-patch+json

      {
        "ietf-yang-patch:yang-patch" : {
          "patch-id" : "add-songs-patch-2",
          "edit" : [
            {
              "edit-id" : "edit1",
              "operation" : "create",
              "target" : "/song=Rope",
              "value" : {
                "song" : [
                  {
                    "name" : "Rope",
                    "location" : "/media/rope.mp3",
                    "format" : "MP3",
                    "length" : 259
                  }
                ]
              }
            },

            {
              "edit-id" : "edit2",
              "operation" : "create",
              "target" : "/song=Dear%20Rosemary",
              "value" : {
                "song" : [
                  {
                    "name" : "Dear Rosemary",
                    "location" : "/media/dear_rosemary.mp3",
                    "format" : "MP3",
                    "length" : 269
                  }
                ]
              }
            }
          ]
        }
      }

Отклик от сервера RESTCONF показан ниже.

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      Content-Type: application/yang-data+json

      {
        "ietf-yang-patch:yang-patch-status" : {
          "patch-id" : "add-songs-patch-2",
          "ok" : [null]
        }
      }

A.1.3. Вставка списка

Приведённый ниже пример демонстрирует вставку песни в имеющийся список воспроизведения (playlist). Песня 6 помещается в список Foo-One после имеющейся в нем песни 5. Операция выполняется без ошибок и отклика об ошибке не возвращается.

Запрос от клиента RESTCONF имеет вид

      PATCH /restconf/data/example-jukebox:jukebox/\
        playlist=Foo-One HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json
      Content-Type: application/yang-patch+json

      {
        "ietf-yang-patch:yang-patch" : {
          "patch-id" : "insert-song-patch",
          "comment" : "Insert song 6 after song 5",
          "edit" : [
            {
              "edit-id" : "edit1",
              "operation" : "insert",
              "target" : "/song=6",
              "point" : "/song=5",
              "where" : "after",
              "value" : {
                "example-jukebox:song" : [
                  {
                    "index" : 6,
                    "id" : "/example-jukebox:jukebox/library\
                      /artist[name='Foo Fighters']\
                      /album[name='Wasting Light']\
                      /song[name='Bridge Burning']"
                  }
                ]
              }
            }
          ]
        }

Сервер RESTCONF передаёт показанный ниже отклик.

     HTTP/1.1 200 OK
     Date: Thu, 26 Jan 2017 20:56:30 GMT
     Server: example-server
     Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
     Content-Type: application/yang-data+json

     {
       "ietf-yang-patch:yang-patch-status" : {
         "patch-id" : "insert-song-patch",
         "ok" : [null]
       }
     }

A.1.4. Перемещение списка

В приведённом ниже примере показано перемещение песни в имеющемся списке воспроизведения. Песня 1 в списке Foo-One перемещается в позицию после песни 3. Отметим, что параметр value не нужен для операции move. Перемещение происходит успешно и сервер не возвращает сообщения об ошибке.

Ниже представлен запрос клиента RESTCONF.

      PATCH /restconf/data/example-jukebox:jukebox/\
        playlist=Foo-One HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json
      Content-Type: application/yang-patch+json

      {
        "ietf-yang-patch:yang-patch" : {
          "patch-id" : "move-song-patch",
          "comment" : "Move song 1 after song 3",
          "edit" : [
            {
              "edit-id" : "edit1",
              "operation" : "move",
              "target" : "/song=1",
              "point" : "/song=3",
              "where" : "after"
            }
          ]
        }
      }

Отклик сервера RESTCONF имеет вид

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      Content-Type: application/yang-data+json

      {
        "ietf-restconf:yang-patch-status" : {
          "patch-id" : "move-song-patch",
          "ok" : [null]
        }
      }

A.1.5. Редактирование ресурса хранилища данных

Ниже представлен пример одновременного редактирования 3 узлов данных верхнего уровня из разных модулей. Модуль foo определяет лист X, bar определяет контейнер Y с листьями A и B, baz определяет список Z с ключом C и дочерними листьями D и E.

Запрос клиента RESTCONF показан ниже.

      PATCH /restconf/data HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json
      Content-Type: application/yang-patch+json

      {
        "ietf-yang-patch:yang-patch" : {
          "patch-id" : "datastore-patch-1",
          "comment" : "Edit 3 top-level data nodes at once",
          "edit" : [
            {
              "edit-id" : "edit1",
              "operation" : "create",
              "target" : "/foo:X",
              "value" : {
                "foo:X" : 42
              }
            },

            {
              "edit-id" : "edit2",
              "operation" : "merge",
              "target" : "/bar:Y",
              "value" : {
                "bar:Y" : {
                  "A" : "test1",
                  "B" : 99
                }
              }
            },
            {
              "edit-id" : "edit3",
              "operation" : "replace",
              "target" : "/baz:Z=2",
              "value" : {
                "baz:Z" : [
                  {
                    "C" : 2,
                    "D" : 100,
                    "E" : false
                  }
                ]
              }
            }
          ]
        }
      }

Отклик сервера RESTCONF имеет вид

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:55:30 GMT
      Content-Type: application/yang-data+json

      {
        "ietf-yang-patch:yang-patch-status" : {
          "patch-id" : "datastore-patch-1",
          "ok" : [null]
        }
      }

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

Авторы признательны Rex Fernando за вклад в этот документ.

Вклад Andy Bierman основан на работе, поддерживаемой United States Army, Space & Terrestrial Communications Directorate (S&TCD) по контракту W15P7T-13-C-A616. Выраженные в этом документе мнения, выводы, заключения и рекомендации принадлежат авторам и могут не отражать точку зрения S&TCD.

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

Andy Bierman
YumaWorks
Email: andy@yumaworks.com
 
Martin Bjorklund
Tail-f Systems
Email: mbj@tail-f.com
 
Kent Watsen
Juniper Networks
Email: kwatsen@juniper.net

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

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

nmalykh@protokols.ru

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

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

3В оригинале ошибочно сказано «отличается от create», см. https://www.rfc-editor.org/errata/eid5131. Прим. перев.

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

RFC 8077 Pseudowire Setup and Maintenance Using the Label Distribution Protocol (LDP)

Internet Engineering Task Force (IETF)                   L. Martini, Ed.
Request for Comments: 8077                                 G. Heron, Ed.
STD: 84                                                            Cisco
Obsoletes: 4447, 6723                                      February 2017
Category: Standards Track
ISSN: 2070-1721

Организация и поддержка псевдопровода с использованием протокола LDP

Pseudowire Setup and Maintenance Using the Label Distribution Protocol (LDP)

PDF

Аннотация

Услуги канального уровня (типа Frame Relay, ATM1, Ethernet) можно эмулировать в опорных сетях MPLS путем инкапсуляции PDU2 канального уровня и передачи их через псевдопровода (PW3). Псевдопровода (ПП) можно также использовать для эмуляции низкоскоростных каналов TDM4 и SONET5 через сети с поддержкой MPLS. В этом документе описан протокол организации и поддержки псевдопроводов с использованием протокола LDP6. Процедуры инкапсуляции Layer 2 PDU описаны в отдельных документах.

Этот документ является заменой RFC 4447 для публикации в качестве стандарта Internet.

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

Этот документ является проектом стандарта (Internet Standards Track).

Документ является результатом работы IETF7 и представляет собой согласованное мнение сообщества IETF. Документ был вынесен на публичное рассмотрение и одобрен для публикации IESG8. Дополнительная информация о документах BCP представлена в разделе 2 документа RFC 7841.

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

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

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

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

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права, этот документ не может быть изменен вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

В [RFC4619], [RFC4717], [RFC4618] и [RFC4448] описана инкапсуляция PDU канального уровня для передачи через сети с поддержкой MPLS. Этот документ указывает добавление «заголовка псевдопровода», состоящего из поля демультиплексирования, перед инкапсулируемым PDU. Поле демультиплексора псевдопровода (ПП) добавляется перед отправкой пакета в ПП. Когда пакет приходит на удаленную сторону ПП, поле демультиплексирования позволяет получателю определить конкретный ПП, к которому относится пакет. При передаче пакета с одного конца ПП на другой этому пакету может потребоваться прохождение через туннель PSN9, для которого будет требоваться добавление перед пакетом дополнительного заголовка.

[RFC4842] и [RFC4553] задают два метода транспортировки цифровых сигналов (эмуляция устройств) TDM через ориентированные на работу с пакетами сети с поддержкой MPLS. Системой передачи для ориентированных на соединения (circuit-oriented) сигналов TDM является SONET[ANSI]/SDH10[ITUG]. Для поддержки трафика TDM, который включает голосовую связь, передачу данных и услуги выделенных линий ПП должны эмулировать характеристики устройств элементов (payload) SONET/SDH. Сигналы и данные TDM инкапсулируются для передачи через ПП. Демультиплексор ПП и заголовок туннеля PSN помещаются перед этими инкапсулированными данными.

В [RFC4553] описан метод транспортировки низкоскоростных цифровых сигналов TDM (эмуляция устройств TDM) через сети PSN, а в [RFC4842] приведено аналогичное описание для высокоскоростных устройств TDM (SONET/SDH). Для поддержки трафика TDM псевдопровода должны эмулировать характеристики устройств в оригинальных системах T1, E1, T3, E3, SONET или SDH. В [RFC4553] это выполняется путем инкапсуляции произвольного (по постоянного) объема данных TDM в каждый пакет, а также с использованием других методов инкапсуляции структур TDM.

      |<------------- Эмулируемая служба --------------->|
      |                                                  |
      |          |<------ Псевдопровод ------>|          |
      |          |                            |          |
      |Подключен.|    |<-- Туннель PSN ->|    |Подключен.|
      |устройствоV    V                  V    Vустройство|
      V   (AC)   +----+                  +----+   (AC)   V
+-----+    |     | PE1|==================| PE2|     |    +-----+
|     |----------|............PW1.............|----------|     |
| CE1 |    |     |    |                  |    |     |    | CE2 |
|     |----------|............PW2.............|----------|     |
+-----+  ^ |     |    |==================|    |     | ^  +-----+
      ^  |       +----+                  +----+     | |  ^
      |  | Граница провайдера 1  Граница провайдера 2 |  |
      |  |                                            |  |
Граница  |                                            |  Граница
польз. 1 |                                            |  польз. 2
         |                                            |
 Естественный сервис                          Естественный сервис

Рисунок 1. Эталонная модель PWE3

В этом документе задается использование протокола распространения меток MPLS (LDP11) [RFC5036] в качестве протокола для организации и поддержки псевдопроводов. В частности, определены новые TLV, элементы FEC12, параметры и коды для LDP, позволяющие идентифицировать ПП и сигнализировать их атрибуты. Задано использование конечными точками ПП этих TLV в протоколе LDP для привязки поля демультиплексирования к ПП и способ передачи информации об этой привязке удаленной конечной точке. Заданы также процедуры информирования о смене состояния ПП для передачи дополнительной информации о ПП и освобождения привязок. Эти процедуры предназначены для обеспечения независимости от версии протокола IP, используемого для сигнализации LDP.

В представленном здесь протоколе поле демультиплексирования ПП является меткой MPLS. Таким образом, пакеты, передающиеся с одного конца ПП на другой, являются пакетами MPLS, которые должны передаваться через туннель MPLS. Однако, если конечные точки ПП являются непосредственно смежными и на предпоследнем этапе используется «вталкивание» (popping), туннель MPLS становится не обязательным. Можно использовать туннель PSN любого типа, если через него возможна передача пакетов MPLS. Туннель PSN, сам по себе, может быть MPLS LSP или просто поддерживать передачу пакетов MPLS. Процедуры организации и поддержки туннелей MPLS выходят за рамки этого документа.

+------------------+                           +------------------+
|Эмулируемый сервис|                           |Эмулируемый сервис|
|(напр., TDM, ATM) |<=== Эмулируемый сервис ==>|(напр., TDM, ATM) |
+------------------+                           +------------------+
|  Инкапсуляция    |                           |  Инкапсуляция    |
|  данных          |<===== Псевдопровод ======>|  данных          |
+------------------+                           +------------------+
|PW Demultiplexer  |                           |PW Demultiplexer  |
|   PSN Tunnel,    |<====== Туннель PSN ======>|  PSN Tunnel,     |
| PSN и физический |                           | PSN и физический |
|     уровни       |                           |     уровни       |
+--------+---------+        ___________        +----------+-------+
         |                /             \                 |
         +===============/     PSN       \================+
                         \               /
                          \_____________/

Рисунок 2. Эталонная модель стека протоколов PWE3

Этот документ связан только с организацией и обслуживанием псевдопроводов типа «точка-точка». ПП типа «один со многими» (point-to-multipoint) или «многие с одним» (multipoint-to-point) не рассматриваются.

Связанные с QoS вопросы не рассматриваются в этом документе.

На рисунках 1 и 2 приведены эталонные модели, взятые из [RFC3985] и иллюстрирующие поддержку услуг эмуляции PW.

В этом документе PE113 будет определять, как входной маршрутизатор, а PE2 — как выходной. PDU канального уровня могут приниматься на PE1, инкапсулироваться там, транспортироваться и декапсулироваться на PE2, а потом передаваться PE2.

2. Отличия от RFC 4447

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

Кроме того, был добавлен параграф 7.3. Повторное согласование управляющего слова с помощью Label Request, отменяющий документ [RFC6723]. Диаграмма с процедурами обработки биты C также была удалена. В параграфе 6.3.2 добавлено примечание, уточняющее принадлежность бита C к упреждающему контролю ошибок FEC.

Добавлена ссылка на [RFC7358] для индикации использования нисходящего режима без запроса (downstream unsolicited mode) для распространения привязок меток PW FEC, независимо от согласованного режима анонсирования меток для сессии LDP.

3. Уровни требований

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

4. Метка PW

Предположим, что нужно транспортировать L2 PDU со входа LSR PE1 на выход LSR PE2 через сеть с поддержкой MPLS и имеется туннель MPLS от PE1 до PE2. Т. е., предполагается, что PE1 может организовать доставку пакета PE2, инкапсулируя его в «заголовок туннеля MPLS» и передавая полученный в результате пакет одному из своих соседей. Туннель MPLS представляет собой MPLS LSP14, поэтому инкапсуляция в туннель MPLS является способом «вталкивания» метки MPLS.

Предполагается, что через один туннель MPLS может быть организовано множество ПП и это требует поддержки в ядре сети состояния для отдельного псевдопровода. Не предполагается, что туннель MPLS относится с типу «точка-точка», хотя ПП являются именно такими соединениями. Тем не менее, туннель MPLS может быть организован в одну точку из множества других (multipoint to point). Не предполагается, что PE2 может определить туннель MPLS, из которого был передан полученный пакет (например, если туннель MPLS является LSP и используется «выталкивание на предпоследнем интервале» (penultimate hop popping), прибывший на PE2 пакет не содержит информации, идентифицирующей туннель).

Когда устройство PE2 получает пакет через ПП, оно должно быть способно определить, что этот пакет фактически был принят через псевдопровод и связать его с конкретным ПП. PE2 может сделать это, проверяя метку MPLS, которая указана в поле демультиплексирования псевдопровода, как показано на рисунке 2. Назовем ее «меткой PW».

Когда устройство PE1 передает L2 PDU устройству PE2, оно создает пакет MPLS, добавляя в него метку PW и затем создавая первый элемент в стеке меток. Если туннель PSN представляет собой MPLS LSP, устройство PE1 «вталкивает» в пакет другую метку (метка туннеля) в качестве второго элемента стека меток. Метка PW не видна, пока пакет MPLS не достигнет PE2. Устройство PE2 размещает пакет в соответствии с меткой PW.

Если данные в пакете MPLS представляют собой, например, AAL515 PDU, метка PW будет в общем случае соответствовать конкретному виртуальному каналу ATM VC16 на PE2. Т. е.. устройство PE2 должно иметь возможность определить по метке PW выходной интерфейс и значение VPI/VCI17 для AAL5 PDU. Если данные представляют собой Frame Relay PDU, устройство PE2 должно иметь возможность определить по метке PW выходной интерфейс и значение DLCI18. Если данные являются кадром Ethernet, устройство PE2 должно иметь возможность определить по метке PW выходной интерфейс и, возможно, идентификатор VLAN. Эти процессы являются односторонними и будут повторяться независимо для двухстороннего режима. При использовании элемента PWid FEC Element требуется выделять одинаковые PW ID и тип PW для обоих направления данного канала. Недопустимо требовать совпадения Group ID (см. ниже) для обоих направления. Транспортируемый кадр может быть изменен при попадании на выходной маршрутизатор. Если заголовок транспортируемого кадра L2 изменяется, такое изменение должно выполняться только на выходном LSR. Отметим, что метка PW всегда должна быть на дне стека меток пакета и метки должны выделяться из пространства меток платформы.

Этот документ не задает метод распространения меток туннеля MPLS и других меток, которые могут присутствовать в стеке над меткой PW. Это может обеспечить любой подходящий метод распространения меток MPLS. Документ задает метод выделения и распространения меток PW. Этот протокол представляет собой LDP, расширенный в соответствии с приведенным ниже описанием. Между конечными точками ПП должна быть организована сессия LDP. Протокол LDP должен обмениваться привязками меток PW FEC в нисходящем направлении без запроса, независимо от согласованного режима анонсирования меток в сессии LDP согласно спецификации [RFC7358]. Следует применять «либеральный режим удержания меток» (liberal label retention) LDP. Однако все процедуры LDP, указанные в [RFC5036] и применимые к данному протоколу, должны быть реализованы.

В соответствии с этим документом принимающий маршрутизатор LSR должен отвечать на сообщение Label Request сообщением Label Mapping для запрошенной метки или сообщением Notification, указывающим причину отказа. Эти процедуры описаны в [RFC5036] (параграфы «3.5.7. Сообщение Label Mapping» и «3.5.8. Сообщение Label Request»). Отметим, что отправка таких откликов является более жестким требованием, чем задано в [RFC5036] и эти отклики требуются для обеспечения корректной работы протокола.

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

Этот документ задает все процедуры, требуемые для организации и поддержки псевдопроводов, которые нужны для предоставления «некоммутируемых» услуг типа «точка-точка», где каждая конечная точка имеет отождествление конечной точки на другом конце ПП. Здесь также заданы механизмы, которые могут применяться для предоставления коммутируемых услуг и поддержки других моделей обслуживания. Однако использование протокольных механизмов для поддержки других моделей и услуг не рассматривается в этом документе.

5. Детали конкретных эмулируемых служб

5.1. Транспорт IP L2

В этом режиме через ПП передаются пакеты IP, инкапсулируемые в соответствии с [RFC3032]. Управляющее слово PW может помещаться между стеком меток MPLS и данными IP. Инкапсуляция пакетов IP для пересылки на устройство присоединения (AC19) зависит от реализации в части функции естественного обслуживания (NSP20) [RFC3985] и выходит за рамки этого документа.

6. LDP

Привязка метки PW распространяется с использованием нисходящего режима LDP без запроса, описанного в [RFC5036]. Устройства PE будут организовывать сессию LDP, используя механизм Extended Discovery, описанный в параграфах 2.4.2 и 2.5 [RFC5036].

Сообщение LDP Label Mapping содержит FEC TLV, Label TLV и может также включать TLV дополнительных параметров.

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

LDP позволяет включать в каждый набор FEC TLV множество элементов FEC. Для организации и поддержки ПП каждый набор FEC TLV должен включать в точности один элемент FEC.

Базовая спецификация LDP поддерживает несколько типов TLV для меток, включая Generic Label TLV, как описано в параграфе 3.4.2.1 [RFC5036]. Для организации и поддержки ПП должны применяться Generic Label TLV.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  PWid (0x80)  |C|         PW type             |PW info length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Group ID                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           PW ID                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                Interface Parameter Sub-TLV                    |
|                              "                                |
|                              "                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

6.1. Элемент PWid FEC

Элемент PWid FEC может использоваться в тех случаях, когда оба конца псевдопровода снабжены одним 32-битовым идентификатором для этого ПП.

Для этих целей определен новый тип элемента FEC с идентификатором типа 0x80, показанный на рисунке.

Control word bit (C)

Бит C является флагом наличия управляющего слова:

C = 1 — управляющее слово присутствует для этого PW;

C = 0 — PW не имеет управляющего слова.

Дополнительная информация приведена в разделе 7. Управляющее слово.

PW type

15-битовое поле, значение которого представляет тип PW. Выделенные значения представлены в документе «IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3)» [RFC4446].

PW info length

Размер полей PW ID и Interface Parameter Sub-TLV в октетах. Нулевое значение представляет все PW, использующие указанный Group ID и говорит об отсутствии PW ID и каких-либо Parameter Sub-TLV.

Group ID

Произвольное 32-битовое значение, представляющее группу PW, использованных для создания групп в пространстве PW. Идентификатор группы (Group ID) предназначен для использования в качестве индекса порта или виртуального туннеля. Для упрощения конфигурации Group ID конкретного PW на входе может быть частью Group ID, выделенного для виртуального туннеля, служащего для транспортировки к выходному маршрутизатору. Идентификаторы групп Group ID очень полезны при передаче шаблонных отзывов меток или шаблонных сообщений Notification удаленным PE при физическом отказе порта.

PW ID

Отличный от нуля 32-битовый идентификатор соединения, который совместно с типом PW указывает конкретный PW. Отметим, что PW ID и тип PW должны совпадать на обеих сторонах ПП.

Interface Parameter Sub-TLV

Этот TLV переменного размера обеспечивает зависимые от интерфейса параметры типа Attachment Circuit MTU.

Отметим, что Interface Parameter Sub-TLV является частью FEC, правила LDP делают невозможным изменение параметров интерфейса после организации ПП. Таким образом, поле параметров интерфейса недопустимо использовать для передачи информации (типа данных о состоянии), которая может изменяться в процессе использования ПП. Для этого следует применять Optional parameter TLV.

Используя PWid FEC, каждая из двух оконечных точек ПП независимо инициирует создание одностороннего LSP. Исходящий и входящий LSP связываются в один псевдопровод, если у них совпадают значения PW ID и тип ПП.

6.2. Обобщенный элемент PWid FEC

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

Generalized PWid FEC Element представляет собой FEC типа 0x81.

Обобщенный элемент PWid FEC не содержит ничего, соответствующего Group ID элемента PWid FEC. Функциональность Group обеспечивается отдельным необязательным LDP TLV — PW Group ID TLV, описанным в параграфе 6.2.2.2. Поля параметров интерфейса элемента PWid FEC также отсутствуют, а их функциональность обеспечивается необязательным PW Interface Parameters TLV, описанным в параграфе 6.2.2.1.

6.2.1. Идентификаторы присоединения

Как сказано в [RFC3985], псевдопровод можно рассматривать, как соединение между двумя пересылающими узлами (forwarder). Протокол, используемый для организации псевдопровода, должен позволять узлу на одной стороне идентифицировать узел на другой стороне. Мы используем термин «идентификатор присоединения» или просто AI21 для обозначения поля, которое данный протокол применяет для идентификации узлов. В PWid FEC поле PWid служит в качестве AI. В этом параграфе будет описана более общая форма AI, которая структурирована и может менять размер.

С каждым пересылающим в PE должен быть связан AI путем задания в конфигурации или с помощью какого-либо алгоритма. Идентификатор присоединения должен быть уникален в контексте маршрутизатора PE, где размещается пересылающий (Forwarder). Комбинация <IP-адрес маршрутизатора PE, AI> должна быть уникальной в глобальном масштабе.

Зачастую удобно рассматривать множество Forwarder, как членов некой «группы», где PW могут организовываться только между членами этой группы. В таких случаях пересылающих удобно идентифицировать в рамках данной группы и разделять AI на идентификатор группы AGI22 и персональный идентификатор AII23.

Идентификатор группы можно рассматривать, как VPN-id или идентификатор VLAN — некий атрибут, присущий всем Attachment PW (или пулам), которым разрешено подключение.

Детали создания полей AGI и AII, указывающих конечные точки псевдопровода, выходят за рамки этой спецификации. Разные применения псевдопроводов и разные модели их предоставления будет требовать различных полей AGI и AII. Спецификация каждого такого приложения и/или модели должна включать правила создания полей AGI и AII.

Как отмечено выше, (двунаправленные) псевдопровода состоят из пары односторонних LSP (по одному для каждого направления). Если конкретный псевдопровод соединяет PE1 с PE2, направление PW от PE1 к PE2 можно обозначить

      <PE1, <AGI, AII1>, PE2, <AGI, AII2>>

а направление PW от PE2 к PE1

      <PE2, <AGI, AII2>, PE1, <AGI, AII1>>

Отметим, что значения AGI должны совпадать на обоих концах, а значения AII в общем случае будут различаться. Таким образом, с точки зрения конкретного PE каждый псевдопровод имеет локальный (Source AII) и удаленный (Target AII) идентификатор. Протокол организации псевдопровода может передавать три приведенных ниже значения:

  • идентификатор группы присоединения (AGI);

  • индивидуальный идентификатор присоединения источника (SAII24);

  • индивидуальный идентификатор присоединения точки назначения (TAII25).

Если AGI отличается от null, идентификатор SAI26 состоит из AGI и SAII, а TAI27 — из TAII вместе с AGI. Если AGI = null, SAII и TAII будут совпадать с SAI и TAI, соответственно.

Интерпретация SAI и TAI определяется локально соответствующей конечной точкой.

Связывание двух однонаправленных LSP в один двухсторонний псевдопровод зависит от SAI и TAI. Каждое приложение и/или модель предоставления, использующие обобщенный Pwid FEC, должны задавать правила для организации такой связи.

6.2.2. Представление обобщенного элемента PWid FEC

Используется элемент FEC типа 0x81, кодирование которого представлено ниже.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Gen PWid (0x81)|C|         PW Type             |PW info length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   AGI Type    |    Length     |      Value                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                    AGI  Value (продолж.)                      ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   AII Type    |    Length     |      Value                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                   SAII  Value (продолж.)                      ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   AII Type    |    Length     |      Value                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                   TAII Value (продолж.)                       ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

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

Значения SAII, TAII и AGI просто передаются в форме строк октетов. Байт Length задает размер поля Value. Для передачи пустой строки (null) может устанавливаться Length = 0. Если конкретному приложению не требуются все три элемента, оно должно передавать все три, устанавливая Length = 0 для ненужных элементов.

Поле PW information length учитывает размер элементов SAII, TAII и AGI в октетах. Нулевое значение указывает на все PW, использующие конкретное значение Group ID (указанное в PW Group ID TLV). В этом случае нет ни других полей элементов FEC (AGI, SAII и т. п.), ни PW Interface Parameters TLV.

Отметим, что трактовка конкретного поля, как AGI, SAII или TAII, зависит от порядка следования значений. Поле Type указывает тип AGI, SAII или TAII. При сравнении двух вхождений AGI (или SAII, TAII) значения считаются идентичными, если поля Type, Length и Value совпадают для обоих.

6.2.2.1. PW Interface Parameters TLV

Данный набор TLV должен применяться только при передаче Generalized PWid FEC и задает параметры конкретного интерфейса. Эти параметры (когда они применимы) должны применяться для проверки того, что устройства PE, а также входные и выходные порты на выходах устройств обладают требуемыми возможностями и совместимы друг с другом.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0|  PW Intf P. TLV (0x096B)  |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sub-TLV Type  |    Length     |    Variable Length Value      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Variable Length Value                 |
|                             "                                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Более подробное описание этого поля приведено в параграфе 6.4. Interface Parameter Sub-TLV.

6.2.2.2. PW Group ID TLV
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| PW Group ID TLV (0x096C)  |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Value                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

PW Group ID представляет собой произвольное 32-битовое значение, которое указывает произвольную группу PW. Это поле служит для создания группы PW — например, PW Group ID можно использовать в качестве индекса порта и назначать всем PW, ведущим в данный порт. Использование PW Group ID позволяет PE передать «шаблонные» отзывы меток или «шаблонные» сообщения Notification для удаления PE при физическом отказе портов.

Примечание. PW Group ID отличается от AGI и не связан с ним.

PW Group ID TLV не является частью FEC и не будет анонсироваться (за исключением анонсов PW FEC). Анонсирование PE может использовать семантику шаблонного отзыва, а удаленные PE должны реализовать поддержку шаблонных сообщений. Эти TLV должны использоваться только при передаче Generalized PWid FEC.

Для ввода шаблонной команду (статус или отзыв):

  • устанавливается PW Info Length = 0 в Generalized PWid FEC Element;

  • передается только PW Group ID TLV с FEC (без передачи AGI/SAII/TAII).

6.2.3. Сигнальные процедуры

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

Выходное устройство PE (PE1), которое знает о входе PE, инициирует организацию соединения путем отправки сообщения Label Mapping на входное устройство PE (PE2). Сообщение Label Mapping содержит FEC TLV с Generalized PWid FEC Element (тип 0x81), содержащий информацию AGI, SAII и TAII.

Затем, когда PE2 получает сообщение Label Mapping, устройство PE2 интерпретирует это сообщение, как запрос на организацию PW, конечная точка которого (в PE2) является пересылающим (Forwarder), указанным TAI. С точки зрения сигнального протокола способ отображения в PE2 значений AI на пересылающих (Forwarder) выбирается локально. В некоторых моделях предоставления VPWS28 значение TAI может быть, например, строкой, указывающей конкретное устройство присоединения (типа ATM3VPI4VCI5), или строкой, связанной в параметрах конфигурации с конкретным устройством присоединения (типа Fred). В VPLS29 значение AGI может быть идентификатором VPN-id, указывающим конкретный экземпляр VPLS.

Если PE2 не может отобразить TAI на одного из своих Forwarder, PE2 отправляет устройству PE1 сообщение Label Release с кодом состояния (Status Code) Unassigned/Unrecognized TAI и на этом обработка Label Mapping завершается.

FEC TLV в сообщении Label Release совпадает с FEC TLV, полученном в сообщении Label Mapping, которое будет «освобождено» (но без TLV с параметрами интерфейса). В общем случае FEC TLV одинаково во всех сообщениях LDP, относящихся к одному PW. В сообщении Label Release это означает, что SAII является AII удаленного партнера, а TAII — локальным AII отправителя.

Если сообщение Label Mapping имеет пригодный идентификатор TAI, устройство PE2 должно принять решение о восприятии этого сообщения. Процедуры принятия такого решения зависят от конкретного типа пересылающего (Forwarder), указанного TAI. Сообщение Label Mapping может быть отвергнуто по причине стандартных ошибок LDP, как описано в [RFC5036].

Если PE2 решает принять сообщение Label Mapping, это устройство должно быть уверено в том, что имеется PW LSP в обратном направлении (PE1—>PE2). Если сигнал о соответствующем PW LSP для этого направления уже был передан, ничего делать не нужно. В противном случае требуется начать такую сигнализацию путем передачи сообщения Label Mapping устройству PE1. Оно похоже на сообщение Label Mapping, полученное от PE2, но SAI и TAI меняются местами.

Таким образом, двухсторонний псевдопровод PW состоит из двух LSP, где FEC одного содержит SAII и TAII в порядке, обратном по сравнению с FEC в другом.

6.3. Сигнализация состояний псевдопровода

6.3.1. Использование сообщений отображения меток

Устройства PE должны передавать сообщения Label Mapping своим партнерам, как только PW настроен и включен административно, независимо от состояния устройства присоединения AC. Метку PW не следует отзывать, пока оператор не отключил псевдопровод административно (или не удалил полностью конфигурацию PW). С использованием описанных в этом параграфе процедур может также поддерживаться простой метод отзыва меток в качестве традиционной сигнализации о состоянии PW и AC. В любом случае при недоступности привязки метки к PW псевдопровод должен рассматриваться, как отключенный (down).

После завершения процедуры согласования статуса PW, если она приводит к использованию метода отзыва меток для обмена информацией о состоянии PW и этот метод не поддерживается одним из PE, данное устройство PE должно передать своему партнеру сообщение Label Release с ошибкой Label Withdraw PW Status Method Not Supported (метод отзыва меток не поддерживается).

Если метод отзыва меток для PW выбран, это приводит к тому, что сообщение Label Mapping будет анонсироваться только при активном устройстве присоединения (AC). Описанные в этом разделе сигнальные процедуры для состояния PW должны быть реализованы полностью.

6.3.2. Сигнализация состояния ПП

Устройства PE используют LDP TLV для индикации своего состояния удаленным партнерам. PW Status TLV содержит больше информации, нежели простое сообщение Label Withdraw.

Формат PW Status TLV показан ниже.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|0|     PW Status (0x096A)    |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Status Code                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Status Code представляет собой 4-октетное битовое поле, описанное в документе IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3) [RFC4446]. Поле Length указывает размер поля Status Code в октетах (4).

Каждый бит поля Status Code может устанавливаться индивидуально для индикации множества аспектов состояния в один прием. Каждый бит может сбрасываться путем отправки соответствующего сообщения Notification, в котором нужный бит сброшен. Младший бит (PW Not Forwarding) служит лишь индикатором общего отказа при возникновении события link-down (канал отключен), для которого ни один из остальных битов не подходит.

Status TLV доставляют удаленному партнеру PW в сообщении LDP Notification, как описано в [RFC5036]. Формат сообщения Notification с PW Status показан ниже.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|   Notification (0x0001)     |      Message Length           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Message ID                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Status (TLV)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      PW Status TLV                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           PWid FEC TLV или Generalized ID FEC TLV             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                PW Group ID TLV (необязательно)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

В Status TLV устанавливают код состояния 0x00000028 (PW status) для индикации последующего состояния PW. Поскольку такое уведомление не относится к какому-либо конкретному сообщению, в поле Message ID устанавливается 0.

В PW FEC TLV не следует включать Interface Parameter Sub-TLV, поскольку они игнорируются в контексте данного сообщения. Однако PW FEC TLV должен включать бит C, когда это применимо, в качестве части FEC. Когда устройство присоединения в PE сталкивается с ошибкой, использование сообщений PW Notification позволяет PE передать одно «шаблонное» (wildcard) сообщение о состоянии, используя PW FEC TLV лишь с Group ID для обозначения того, что данное изменение состояния относится ко всем соединениям затронутым PW. Такое сообщение о состоянии содержит PW FEC TLV только с Group ID или Generalized FEC TLV только с PW Group ID TLV.

Как упоминалось выше, поле Group ID в PWid FEC Element или PW Group ID TLV, используемое с Generalized PWid FEC Element, может служить для передачи уведомления о состоянии для всех произвольных наборов PW. Эта процедура является необязательной и, если она реализована, сообщению LDP Notification следует соответствовать приведенному далее описанию. Если используется PWid FEC Element, в поле размера информации PW устанавливается 0, поле PW ID отсутствует и Interface Parameter Sub-TLV не указываются. Если используется Generalized FEC Element, значение AGI, SAII и TAII отсутствуют, в поле размера информации PW указывается 0, включается PW Group ID TLV, а PW Interface Parameters TLV опускается. В данном документе это называется «шаблонной процедурой уведомления о состоянии PW» и от всех реализаций PE, использующих такое решение, требуется воспринимать такие сообщение Notification, но не требуется передавать их.

6.3.3. Процедуры согласования состояний ПП

При первоначальной организации PW устройства PE должны попытаться согласовать использование PW Status TLV. Для этого PE, поддерживающее PW Status TLV, должно его включить в начальное сообщение Label Mapping после PW FEC и Interface Parameter Sub-TLV. PW Status TLV будет использоваться в течение срока действия псевдопровода. Структура показана ниже.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                 PWid FEC или Generalized PWid FEC             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Interface Parameters                    |
|                              "                                |
|                              "                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Generic Label (0x0200)    |      Length                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Label                                                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|0|     PW Status (0x096A)    |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Status Code                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Если PW Status TLV включается в начальное сообщение Label Mapping для PW, а сообщение Label Mapping от удаленного PE для этого PW не включает PW Status TLV или удаленное устройство PE не поддерживает PW Status TLV, PW будет использовать отзыв меток для сигнализации смены состояний PW. Отметим, что если PW Status TLV не поддерживается удаленным партнером, тот будет автоматически игнорировать его, поскольку в TLV устанавливается бит I (игнорировать). Следовательно, PW Status TLV не будет присутствовать в соответствующих анонсах FEC от удаленного партнера LDP, что обеспечивает в точности описанное выше поведение.

Если PW Status TLV не присутствует после FEC TLV в начальном сообщении PW Label Mapping, полученном PE, значит PW Status TLV не будет использоваться и оба устройства PE, поддерживающих псевдопровод вернутся к процедуре отзыва меток для сигнализации об изменении состояния.

Если процесс согласования привел к использованию PW Status TLV, реальный статус PW определяется PW Status TLV переданным в начальном сообщении PW Label Mapping. Последующие изменения состояния PW будут отражаться в сообщениях Notification.

6.4. Interface Parameter Sub-TLV

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

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sub-TLV Type  |    Length     |    Variable Length Value      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Variable Length Value                 |
|                             "                                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

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

Значения Sub-TLV Type для параметров интерфейсов заданы в документе «IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3)» [RFC4446].

  • Тип Interface MTU

    2-октетное значение, указывающее MTU в октетах. Это максимальный размер блока (без учета издержек инкапсуляции) передаваемого выходным пакетным интерфейсом, который будет передавать декапсулированный PDU, полученный от сети с поддержкой MPLS. Это параметр относится только к PW, транспортирующим пакеты и требуется для PW этого типа. Если значения параметра для разных направлений конкретного PW не совпадают, включать такой PW недопустимо.

  • Тип Optional Interface Description

    Эта произвольная (и необязательная) строка описания интерфейса служит для передачи понятной человеку строки, описывающей интерфейс с удаленным PE. Параметр является необязательным и применим для всех типов PW. Размер строки описания может составлять от 0 до 80 октетов. Предназначенный для человека текст должен представляться в кодировке UTF-8 с использованием принятого по умолчанию языка (Default Language) [RFC2277].

6.5. Процедуры отзыва меток LDP

Как указано выше, поле Group ID в PWid FEC Element или PW Group ID TLV используемом с Generalized PWid FEC Element, может служить для отзыва всех меток PW связанных с конкретной группой PW. Эта процедура является необязательной и (если она реализована) для сообщения LDP Label Withdraw следует использовать приведенные ниже правила. Если используется PWid FEC Element в поле размера информации PW указывается значение 0, поле PW ID не присутствует, отсутствуют также Interface Parameter Sub-TLV и Label TLV. Если используется Generalized FEC Element, поля AGI, SAII и TAII не присутствуют, в поле размера информации PW устанавливается значение 0, включается PW Group ID TLV, а PW Interface Parameters TLV и Label TLV отсутствуют. В данном документе это называется «шаблонной процедурой отзыва» и от всех PE, реализующих такое решение, требуется воспринимать такие сообщения об отзыве, но не требуется передавать их. Отметим, что PW Group ID TLV применимо только для PW, использующих Generalized ID FEC Element, а Group ID применимо только для PWid FEC Element.

Interface Parameter Sub-TLV или TLV недопустимо включать в какие-либо сообщения LDP PW Label Withdraw или Label Release. Шаблонное сообщение Label Release должно включать только Group ID или PW Group ID TLV. Сообщение Label Release, инициируемое маршрутизатором PE, всегда должно включать PW ID.

7. Управляющее слово

7.1. Типы PW, для которых управляющее слово ТРЕБУЕТСЯ

В сообщениях Label Mapping, передаваемых для организации таких PW, должно устанавливаться C=1. При получении для одного из таких типов PW сообщения Label Mapping с C=0, должно передаваться сообщение Label Release с кодом состояния Illegal C-bit. В этом случае PW не будет включен (разрешен).

7.2. Типы PW, для которых управляющее слово НЕ обязательно

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

Если система не способна передавать и принимать управляющее слово в PW тех типов, для которых это слово не является обязательным, она ведет себя в точности так, будто она настроена использование управляющего слова NOT PREFERRED.

Если сообщение Label Mapping для PW уже получено, но для этого PW еще не было передано сообщения Label Mapping, выполняется приведенная ниже процедура.

  1. Если в полученном сообщении Label Mapping установлено C=0, передается сообщение Label Mapping с with C=0; управляющее слово не используется.

  2. Если в полученном сообщении Label Mapping установлено C=1 и PW локально настроен на предпочтение управляющего слова, передается сообщение Label Mapping с with C=1; используется управляющее слово.

  3. Если в полученном сообщении Label Mapping установлено C=1 и PW локально настроен так, что использование управляющего слова не является предпочтительным, полученное сообщение Label Mapping, по сути не принимается во внимание для PW (т. е., сразу выполняется следующий абзац).

Если сообщение Label Mapping для PW еще не было получено (или в полученном Label Mapping установлено C=1 и локальная конфигурация предпочитает не использовать управляющее слово или это слово не поддерживается), передается сообщение Label Mapping, в котором бит C соответствует локально настроенному режиму предпочтения для управляющего слова (т. е. C=1, если локально отдается предпочтение управляющему слову и C=0, если локальное предпочтение для управляющего слова не используется или управляющее слово не поддерживается).

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

  1. Сообщение Label Mapping с таким же значением бита C, какое было указано в переданном сообщении Label Mapping. Организация PW на этом завершается и применяется управляющее слово, если C=1.

  2. Сообщение Label Mapping с C=1, но переданное сообщение Label Mapping содержало C=0. В этом случае принятое сообщение Label Mapping игнорируется и продолжается ожидание следующего управляющего сообщения для данного PW.

  3. Сообщение Label Mapping с C=0, но в отправленном сообщении Label Mapping было указано C=1. В этом случае передается сообщение Label Withdraw с кодом состояния Wrong C-bit и вслед за ним — сообщение Label Mapping с C=0. Организация PW на этом завершается и управляющее слово не применяется.

  4. Сообщение Label Withdraw с кодом Wrong C-bit, которое трактуется, как обычное сообщение Label Withdraw, но без передачи отклика на него. Продолжается ожидание следующего управляющего сообщения для этого PW.

Если в любой момент после приема сообщения Label Mapping получено соответствующее сообщение Label Withdraw или Release, предпринимаются те же действия, что и при получении Label Withdraw или Release в любой другой момент.

Если обе точки хотят использовать управляющее слово, описанная процедура приведет к такому результату. Если любая из конечных точек не хочет или не поддерживает использование управляющего слова, процедура приведет к отказу от его применения. Если одна из точек предпочитает использовать управляющее слово, а другая нет, предпочитающая не использовать управляющее слово точка не имеет какого-либо дополнительного протокола для отказа — она просто передает сообщение Label Mapping с C=0.

7.3. Повторное согласование управляющего слова с помощью Label Request

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

  1. Если локальное устройство PE ранее передало сообщение Label Mapping, оно должно отправить сообщение Label Withdraw удаленному PE и ждать от того сообщения Label Release.

  2. Локальное устройство PE должно передать сообщение Label Release удаленному PE для конкретной метки, связанной с FEC, анонсированным для данного PW.

    Примечание. Два предшествующих этапа с сообщениями Label Release и Label Withdraw не требуется выполнять в каком-либо определенном порядке.

  3. Локальное устройство PE должно передать сообщение Label Request партнерскому PE а потом должно дождаться от того сообщения Label Mapping, содержащего текущие предпочтения удаленного PE в части использования управляющего слова.

После того, как удаленное устройство PE успешно обработало сообщения Label Withdraw и Label Release, оно будет сбрасывать состояние машины согласования бита C и использовать (или не использовать) управляющее слово в соответствии с локальным предпочтением.

С этого момента локальное и удаленное устройства PE будут следовать процедурам согласования бита C, описанным в предыдущем параграфе.

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

7.4. Дополнительные вопросы

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

7.4.1. Анонсы меток

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

Эта предосторожность нужна для предотвращения «перезапуска» маршрутизатором пересылки пакетов с нумерацией с 1 при получении сообщения Label Mapping , связывающего тот же FEC с той же меткой, если в сети еще остаются старые паркеты с номерами от 1 до 32768. Например, если имеется пакет с порядковым номером n из интервала [1, 32768], находящийся в сети, распределяющий (disposition) маршрутизатор может получить этот пакет уже после повторного анонса метки. Поскольку метка была освобождена другим (imposition) маршрутизатором, распределяющему маршрутизатору следует ожидать прибытия пакета с порядковым номером 1. Получение пакета с номером n будет приводить к возможности отбрасывания распределяющим маршрутизатором до n пакетов, пока не будет получен пакет с номером n+1. Возможным вариантом предотвращения таких ситуаций является анонсирование распределяющим маршрутизатором другой метки PW или достаточно продолжительное ожидание перед повторным анонсированием освобожденной ранее метки. Эта проблема возникает лишь при обработке входных номеров на распределяющем (выходном — disposition) маршрутизаторе.

7.4.2. Освобождение метки

В ситуации, когда входной (imposition) маршрутизатор ждет перезапуска рассылки пакетов с нумерацией с 1, маршрутизатору нужно 1) отправить распределяющему (disposition) маршрутизатору сообщение Label Release и 2) отправить ему же сообщение Label Request. При поддержке упорядочения анонсирование метки PW в отклике на сообщение Label Request должно также принимать во внимание вопросы, рассмотренные выше (параграф 7.4.1 «Анонсы меток»).

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

8.1. Тип LDP TLV

В этом документе задано несколько новых типов LDP TLV. Агентство IANA уже поддерживает реестр TLV Type Name Space, определенный в RFC 5036. Приведенные ниже значения были назначены из упомянутого реестра.

Тип TLV

Описание

0x096A

PW Status TLV

0x096B

PW Interface Parameters TLV

0x096C

PW Group ID TLV

8.2. Коды состояний LDP

В этом документе задано несколько новых кодов состояний LDP. Агентство IANA уже поддерживает реестр Status Code Name Space, определенный в RFC 5036. Ниже приведены значения новых кодов.

Диапазон/значение

E

Описание

Документ

0x00000024

0

Недопустимый бит C

[RFC8077]

0x00000025

0

Неверный бит C

[RFC8077]

0x00000026

0

Несовместимая скорость

[RFC8077]

0x00000027

0

Некорректная конфигурация CEP-TDM

[RFC8077]

0x00000028

0

Статус PW

[RFC8077]

0x00000029

0

Базовая конфигурационная ошибка

[RFC8077]

0x0000002A

0

Статус отзыва метки PW

[RFC8077]

0x0000002B

0

Метод не поддерживается

[RFC8077]

8.3. Пространство имен типов FEC

Этот документ использует два новых типа элементов FEC (0x80 и 0x81) из реестра Forwarding Equivalence Class (FEC) Type Name Space для протокола распространения меток (LDP) [RFC5036].

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

Этот документ задает расширения LDP, которые нужны для организации и поддержки псевдопроводов. Цель организации псевдопроводов состоит в обеспечении возможности инкапсуляции кадров канального уровня (Layer 2) в MPLS и передачи с одного конца псевдопровода на другой. Следовательно, вопросы безопасности должны принимать во внимание как уровень данных, так и уровень управления.

9.1. Безопасность данных

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

  • Проверка MPLS PDU;

  • подмена (обманка) MPLS PDU;

  • изменение MPLS PDU;

  • защита протокола MPLS PSN;

  • защита Access Circuit (устройство доступа);

  • предотвращение DoS-атак на маршрутизаторы PE.

Существует мнение, что при использовании MPLS PSN для обеспечения псевдопроводов защита должна быть не хуже обеспечиваемой естественными протоколами канального уровня, которые эмулируются с помощью комбинации MPLS/PW. Это означает, что сеть с поддержкой MPLS следует защитить (изолировать) от возможности внесения пакетов извне. Чтобы предотвратить возможность внесения нежелательных пакетов важно пресечь несанкционированный физический доступ к PSN, а также несанкционированный административный доступ к отдельным элементам сети.

Как отмечено выше, сетям с поддержкой MPLS не следует воспринимать пакеты MPLS со своих внешних интерфейсов (т. е. интерфейсов к устройствам CE или сетям других провайдеров), если метка верхнего уровня в пакете не распространялась правомерно в систему, из которой был получен пакет. Если интерфейс, с которого принят пакет, ведет в сеть другого сервис-провайдера (а не пользователя), требуется наличии соответствующих отношений доверия, включая доверие к тому, что этот провайдер также обеспечивает подобающие меры защиты.

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

9.2. Безопасность управления

Общее рассмотрение вопросов безопасности, связанных с использованием LDP, приведено в разделе 5 [RFC5036]. Это рассмотрение применимо и при использовании LDP для организации ПП.

Псевдопровод соединяет два устройства Attachment Circuits. Важно быть уверенным в том, что не принимаются соединения LDP из произвольных мест а к локальному устройству присоединения нет возможности подключиться с произвольного удаленного Attachment Circuit. Следовательно, входящие запросы сеансов LDP недопустимо воспринимать, пока нет уверенности в том, что IP-адрес отправителя является адресом «подходящего» партнера LDP. Множество подходящих партнеров может быть заранее указано в конфигурации (в виде списка адресов IP или комбинаций адрес-маска) или определено динамически с помощью доверенного протокола автоматического обнаружения (обычно при отсутствии должного доверия к протоколу автоматического обнаружения список найденных партнеров не может считаться доверенным).

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

Опция аутентификации LDP MD5, описанная в параграфе 2.9 [RFC5036], должна быть реализована и для повышения надежности защиты ее нужно использовать. Это обеспечит целостность и аутентификацию сообщений LDP, а также снизит вероятность использования подставных адресов отправителей. Применение опции MD5 не обеспечивает защиты конфиденциальности, но для управляющих сообщений LDP приватность обычно не имеет существенного значения. Опция MD5 на основе заранее известного общего ключа (pre-shared key) не обеспечивает достаточно защиты от атак с повторным использованием пакетов (replay attack). Кроме того, этот вариант использования опции может существенно усложнить развертывание системы в тех случаях, когда нужные партнеры определяются протоколом автоматического обнаружения.

При использовании Generalized PWid FEC Element возможны ситуации, когда отдельный партнер LDP может быть в списке подходящих, но при этом не иметь права на подключение к конкретному устройству присоединения (Attachment Circuit), указанному конкретным экземпляром Generalized PWid FEC Element. Однако, исходя из того, что этот партнер является одним из подходящих (см. выше), это будет приводить скорей к конфигурационным ошибкам, нежели к проблемам защиты. Тем не менее, для PE может оказаться целесообразным связать каждое из своих локальных устройств присоединения с набором подходящих партнеров, а не просто связывать таких партнеров с PE в целом.

10. Взаимодействие и развертывание

В параграфе 2.2 [RFC6410] заданы 4 требования, которым должны удовлетворять стандарты Internet. В этом разделе показано, насколько данный документ соответствует этим требованиям.

Технология псевдопроводов была развернута впервые в 2001 году и получила широкое распространение у множества операторов. В [RFC7079] приведены результаты исследования (опроса) реализаций PW с акцентом на применение управляющих слов. В [EANTC] приведены результаты открытого теста решений разных производителей оборудования MPLS и Carrier Ethernet, в котором проверялись псевдопровода Ethernet, ATM и TDM.

Найденные в [RFC4447] ошибки в основном являются редакционными и исправлены в настоящем документе.

Все возможности данной спецификации были реализованы множеством производителей.

IETF не было заявлено каких-либо претензий в части прав интеллектуальной собственности применительно к данному документу, RFC 4447, RFC 6723 и предварительным документам (Internet-Drafts), приведшим к RFC 4447 и RFC 6723.

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

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

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

[RFC5036] Andersson, L., Ed., Minei, I., Ed., and B. Thomas, Ed., «LDP Specification», RFC 5036, DOI 10.17487/RFC5036, October 2007, <http://www.rfc-editor.org/info/rfc5036>.

[RFC3032] Rosen, E., Tappan, D., Fedorkow, G., Rekhter, Y., Farinacci, D., Li, T., and A. Conta, «MPLS Label Stack Encoding», RFC 3032, DOI 10.17487/RFC3032, January 2001, <http://www.rfc-editor.org/info/rfc3032>.

[RFC4446] Martini, L., «IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3)», BCP 116, RFC 4446, DOI 10.17487/RFC4446, April 2006, <http://www.rfc-editor.org/info/rfc4446>.

[RFC7358] Raza, K., Boutros, S., Martini, L., and N. Leymann, «Label Advertisement Discipline for LDP Forwarding Equivalence Classes (FECs)», RFC 7358, DOI 10.17487/RFC7358, October 2014, <http://www.rfc-editor.org/info/rfc7358>.

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

[RFC2277] Alvestrand, H., «IETF Policy on Character Sets and Languages», BCP 18, RFC 2277, DOI 10.17487/RFC2277, January 1998, <http://www.rfc-editor.org/info/rfc2277>.

[RFC3985] Bryant, S., Ed., and P. Pate, Ed., «Pseudo Wire Emulation Edge-to-Edge (PWE3) Architecture», RFC 3985, DOI 10.17487/RFC3985, March 2005, <http://www.rfc-editor.org/info/rfc3985>.

[RFC4842] Malis, A., Pate, P., Cohen, R., Ed., and D. Zelig, «Synchronous Optical Network/Synchronous Digital Hierarchy (SONET/SDH) Circuit Emulation over Packet (CEP)», RFC 4842, DOI 10.17487/RFC4842, April 2007, <http://www.rfc-editor.org/info/rfc4842>.

[RFC4553] Vainshtein, A., Ed., and YJ. Stein, Ed., «Structure-Agnostic Time Division Multiplexing (TDM) over Packet (SAToP)», RFC 4553, DOI 10.17487/RFC4553, June 2006, <http://www.rfc-editor.org/info/rfc4553>.

[RFC4619] Martini, L., Ed., Kawa, C., Ed., and A. Malis, Ed., «Encapsulation Methods for Transport of Frame Relay over Multiprotocol Label Switching (MPLS) Networks», RFC 4619, DOI 10.17487/RFC4619, September 2006, <http://www.rfc-editor.org/info/rfc4619>.

[RFC4717] Martini, L., Jayakumar, J., Bocci, M., El-Aawar, N., Brayley, J., and G. Koleyni, «Encapsulation Methods for Transport of Asynchronous Transfer Mode (ATM) over MPLS Networks», RFC 4717, DOI 10.17487/RFC4717, December 2006, <http://www.rfc-editor.org/info/rfc4717>.

[RFC4618] Martini, L., Rosen, E., Heron, G., and A. Malis, «Encapsulation Methods for Transport of PPP/High-Level Data Link Control (HDLC) over MPLS Networks», RFC 4618, DOI 10.17487/RFC4618, September 2006, <http://www.rfc-editor.org/info/rfc4618>.

[RFC4448] Martini, L., Ed., Rosen, E., El-Aawar, N., and G. Heron, «Encapsulation Methods for Transport of Ethernet over MPLS Networks», RFC 4448, DOI 10.17487/RFC4448, April 2006, <http://www.rfc-editor.org/info/rfc4448>.

[RFC4447] Martini, L., Ed., Rosen, E., El-Aawar, N., Smith, T., and G. Heron, «Pseudowire Setup and Maintenance Using the Label Distribution Protocol (LDP)», RFC 4447, DOI 10.17487/RFC4447, April 2006, <http://www.rfc-editor.org/info/rfc4447>.

[RFC6410] Housley, R., Crocker, D., and E. Burger, «Reducing the Standards Track to Two Maturity Levels», BCP 9, RFC 6410, DOI 10.17487/RFC6410, October 2011, <http://www.rfc-editor.org/info/rfc6410>.

[RFC6723] Jin, L., Ed., Key, R., Ed., Delord, S., Nadeau, T., and S. Boutros, «Update of the Pseudowire Control-Word Negotiation Mechanism», RFC 6723, DOI 10.17487/RFC6723, September 2012, <http://www.rfc-editor.org/info/rfc6723>.

[RFC7079] Del Regno, N., Ed., and A. Malis, Ed., «The Pseudowire (PW) and Virtual Circuit Connectivity Verification (VCCV) Implementation Survey Results», RFC 7079, DOI 10.17487/RFC7079, November 2013, <http://www.rfc-editor.org/info/rfc7079>.

[ANSI] American National Standards Institute, «Telecommunications — Synchronous Optical Network (SONET) — Basic Description Including Multiplex Structures, Rates, and Formats», ANSI T1.105, October 1995.

[ITUG] International Telecommunications Union, «Network node interface for the synchronous digital hierarchy (SDH)», ITU-T Recommendation G.707, May 1996.

[EANTC] European Advanced Networking Test Center, «MPLS and Carrier Ethernet: Service — Connect — Transport. Public Multi-Vendor Interoperability Test», February 2009.

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

Авторы благодарят участников работы Vach Kompella, Vanson Lim, Wei Luo, Himanshu Shah и Nick Weeds. Авторы также выражают свою признательность разработчикам RFC 6723, чьи результаты были включены в этот документ, — Lizhong Jin, Raymond Key, Simon Delord, Tom Nadeau и Sami Boutros.

Участники работы

Ниже перечислены авторы и участники разработки RFC 4447. Они указаны здесь с целью отметить их вклад в подготовку данного документа.

Nasser El-Aawar

Level 3 Communications, LLC.

1025 Eldorado Blvd.

Broomfield, CO 80021

United States of America

Email: nna@level3.net

Eric C. Rosen

Cisco Systems, Inc.

1414 Massachusetts Avenue

Boxborough, MA 01719

United States of America

Email: erosen@cisco.com

Dan Tappan

Cisco Systems, Inc.

1414 Massachusetts Avenue

Boxborough, MA 01719

United States of America

Email: tappan@cisco.com

Toby Smith

Google

6425 Penn Ave. #700

Pittsburgh, PA 15206

United States of America

Email: tob@google.com

Dimitri Vlachos

Riverbed Technology

Email: dimitri@riverbed.com

Jayakumar Jayakumar

Cisco Systems Inc.

3800 Zanker Road, MS-SJ02/2

San Jose, CA 95134

United States of America

Email: jjayakum@cisco.com

Alex Hamilton,

Cisco Systems Inc.

485 East Tasman Drive, MS-SJC07/3

San Jose, CA 95134

United States of America

Email: tahamilt@cisco.com

Steve Vogelsang

ECI Telecom

Omega Corporate Center

1300 Omega Drive

Pittsburgh, PA 15205

United States of America

Email: stephen.vogelsang@ecitele.com

John Shirron

ECI Telecom

Omega Corporate Center

1300 Omega Drive

Pittsburgh, PA 15205

United States of America

Email: john.shirron@ecitele.com

Andrew G. Malis

Verizon

60 Sylvan Rd.

Waltham, MA 02451

United States of America

Email: andrew.g.malis@verizon.com

Vinai Sirkay

Reliance Infocomm

Dhirubai Ambani Knowledge City

Navi Mumbai 400 709

India

Email: vinai@sirkay.com

Vasile Radoaca

Nortel Networks

600 Technology Park

Billerica MA 01821

United States of America

Email: vasile@nortelnetworks.com

Chris Liljenstolpe

149 Santa Monica Way

San Francisco, CA 94127

United States of America

Email: ietf@cdl.asgaard.org

Dave Cooper

Global Crossing

960 Hamlin Court

Sunnyvale, CA 94089

United States of America

Email: dcooper@gblx.net

Kireeti Kompella

Juniper Networks

1194 N. Mathilda Ave

Sunnyvale, CA 94089

United States of America

Email: kireeti@juniper.net

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

Luca Martini (редактор)

Cisco Systems, Inc.

1899 Wynkoop Street, Suite 600

Denver, CO 80202

United States of America

Email: lmartini@monoski.com

Giles Heron (редактор)

Cisco Systems

10 New Square

Bedfont Lakes

Feltham

Middlesex

TW14 8HA

United Kingdom

Email: giheron@cisco.com


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

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

nmalykh@gmail.com

1Asynchronous Transfer Mode — асинхронный режим передачи.

2Protocol Data Unit — блок данных протокола.

3Pseudowire.

4Time-Division Multiplexing – мультиплексирование с разделением по времени.

5Synchronous Optical NETwork — синхронная оптическая сеть.

6Label Distribution Protocol — протокол распространения меток.

7Internet Engineering Task Force.

8Internet Engineering Steering Group.

9Packet Switched Network — сеть с коммутацией пакетов.

10Synchronous Digital Hierarchy — синхронная цифровая иерархия.

11Label Distribution Protocol.

12Forwarding Equivalence Class — класс эквивалентной пересылки.

13Provider Edge 1.

14Label Switched Path — путь с коммутацией по меткам.

15ATM Adaptation Layer 5 — уровень 5 адаптации ATM.

16Virtual Circuit — виртуальное устройство (канал).

17Virtual Path Identifier/Virtual Circuit Identifier — идентификатор виртуального пути/идентификатор виртуального канала.

18Data Link Connection Identifier — идентификатор соединения на канальном уровне.

19Attachment Circuit.

20Native service processing — естественная для сервиса обработка.

21Attachment Identifier.

22Attachment Group Identifier.

23Attachment Individual Identifier.

24Source Attachment Individual Identifier.

25Target Attachment Individual Identifier.

26Source AI.

27Target AI.

28Virtual Private Wire Service — услуги виртуальных частных проводов.

29Virtual Private LAN Service — услуги виртуальных частных ЛВС.

Рубрика: RFC | Комментарии к записи RFC 8077 Pseudowire Setup and Maintenance Using the Label Distribution Protocol (LDP) отключены

RFC 8093 Deprecation of BGP Path Attribute Values 30, 31, 129, 241, 242, and 243

Internet Engineering Task Force (IETF)                       J. Snijders
Request for Comments: 8093                                           NTT
Category: Standards Track                                  February 2017
ISSN: 2070-1721

Прекращение использования значений атрибута BGP Path 30, 31, 129, 241, 242 и 243

Deprecation of BGP Path Attribute Values 30, 31, 129, 241, 242, and 243

PDF

Аннотация

Этот документ запрашивает агентство IANA отметить атрибуты BGP path со значениями 30, 31, 129, 241, 242 и 243, как отмененные (Deprecated).

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

Этот документ является проектом стандарта (Internet Standards Track).

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

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

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

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

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

1. Введение

Было обнаружено, что некоторые значения BGP Path Attribute, используемые в развернутых реализациях BGP, не были выделены агентством IANA для такого применения. Использование незарегистрированных значений BGP Path Attribute может приводить к проблемам при развертывании новых технологий.

Использование незарегистрированных значений было отмечено, когда атрибуту BGP Large Communities [RFC8092] агентством IANA было выделено первоначальное значение 30. Впоследствии было обнаружено, что широко развернутая реализация BGP-4 [RFC4271] включает код, использующий атрибут пути 30, и этот атрибут применяется в стратегии «трактовать, как отозванный» (Treat-as-withdraw) [RFC7606] для маршрутов, содержащих корректный атрибут Large Community, поскольку в нем предполагается другая структура данных. Поскольку эти маршруты отбрасываются, результатом первоначального использования атрибута Large Community стала недоступность использующих его систем для части сети Internet. Для решения возникшей проблемы было запрошено новое значение (Early IANA Allocation).

«Самозахват» значений 30, 31, 129, 241, 242 и 243 был подтвержден разработчиками и анализом исходного кода.

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

Агентство IANA отметило значения 30, 31, 129, 241, 242 и 243, как отозванные (Deprecated) в субреестре BGP Path Attributes реестра Border Gateway Protocol (BGP) Parameters. Метка Deprecated означает, что эти значения не рекомендуется использовать ([IANA-GUIDELINES]).

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

С этим обновлением реестров не связано значимых последствий в части безопасности.

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

[IANA-GUIDELINES] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», Work in Progress1, draft-leiba-cotton-iana-5226bis-18, September 2016.

[RFC4271] Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., «A Border Gateway Protocol 4 (BGP-4)», RFC 4271, DOI 10.17487/RFC4271, January 2006, <http://www.rfc-editor.org/info/rfc4271>.

[RFC7606] Chen, E., Ed., Scudder, J., Ed., Mohapatra, P., and K. Patel, «Revised Error Handling for BGP UPDATE Messages», RFC 7606, DOI 10.17487/RFC7606, August 2015, <http://www.rfc-editor.org/info/rfc7606>.

[RFC8092] Heitz, J., Ed., Snijders, J., Ed., Patel, K., Bagdonas, I., and N. Hilliard, «BGP Large Communities Attribute», RFC 8092, DOI 10.17487/RFC8092, February 2017, <http://www.rfc-editor.org/info/rfc8092>.

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

Автор выражает свою признательность Marlien Vijfhuizen за помощь в обнаружении захвата значения 30 и Nick Hilliard за редакторские правки.

Адрес автора

Job Snijders

NTT Communications

Theodorus Majofskistraat 100

Amsterdam 1065 SZ

The Netherlands

Email: job@ntt.net


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

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

nmalykh@gmail.com

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

1Опубликовано в RFC 8126. Прим. перев.

Рубрика: RFC | Комментарии к записи RFC 8093 Deprecation of BGP Path Attribute Values 30, 31, 129, 241, 242, and 243 отключены

RFC 8092 BGP Large Communities Attribute

Internet Engineering Task Force (IETF)                     J. Heitz, Ed.
Request for Comments: 8092                                         Cisco
Category: Standards Track                               J. Snijders, Ed.
ISSN: 2070-1721                                                      NTT
                                                                K. Patel
                                                                  Arrcus
                                                             I. Bagdonas
                                                                 Equinix
                                                             N. Hilliard
                                                                    INEX
                                                           February 2017

Атрибут BGP Large Communities

BGP Large Communities Attribute

PDF

Аннотация

Этот документ описывает атрибут BGP Large Communities, расширяющий протокол BGP-4. Атрибут обеспечивает механизм передачи «непрозрачной» (opaque) информации внутри разных пространств имен с целью управления маршрутизацией. Атрибут подходит для всех номеров автономных систем (ASN1), включая 4-октетные ASN.

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

Этот документ является проектом стандарта (Internet Standards Track).

Документ является результатом работы IETF2 и представляет собой согласованное мнение сообщества IETF. Документ был вынесен на публичное рассмотрение и одобрен для публикации IESG3. Дополнительная информация о документах Internet Standard представлена в разделе 2 документа RFC 7841.

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

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

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

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

1. Введение

Реализации BGP [RFC4271] обычно поддерживают язык правил маршрутизации для управления распространением маршрутной информации. Сетевые операторы привязывают группы BGP (community) к маршрутам для связывания с маршрутом определенных свойств. Эти свойства могут включать информацию типа местоположения источника маршрута, спецификации действий правил маршрутизации, которые будут или были применены, и относятся ко всем маршрутам в сообщении BGP Update, включающем атрибут Communities. Поскольку атрибут BGP communities является необязательным переходным атрибутом BGP, группы BGP могут действовать или иным образом применяться в политике маршрутизации других автономных систем (AS) в сети Internet.

BGP Communities является атрибутом переменного размера, содержащим одно или множество четырехоктетных значений, каждое из которых указывает группу [RFC1997]. Общепринятое использование отдельных значения атрибута этого типа включает их разделение 32-битового значения на два 16-битовых слова. Старшее из этих слов трактуется, как номер автономной системы (ASN), а значение младшего определяется локальной политикой оператора AS, указанной старшим словом.

В результате принятия 4-октетных номеров AS [RFC6793] атрибут BGP Communities уже не может использовать описанное выше представление, поскольку 2-октетное слово не позволяет указать 4-октетный ASN. Атрибут BGP Extended Communities [RFC4360] также не подходит для этого. Шестиоктетный размер атрибута Extended Community вступает в противоречие с общепринятой практикой представления 4-октетных ASN в субполях Global Administrator и Local Administrator.

Для решения описанной проблемы данный документ определяет атрибут BGP Large Communities, представляемый в виде неупорядоченного списка из одного или множества 12-октетных значений, каждое из которых включает 4-октетное поле Global Administrator и два 4-октетных поля для определяемых оператором значений, каждое из которых может быть использовано для обозначения свойств или действий, имеющих смысл для оператора AS, присваивающего значения.

2. Уровни требований

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

3. Атрибут BGP Large Communities

Этот документ определяет атрибут BGP Large Communities, как необязательный, переходный атрибут пути с переменным размером. Все маршруты с атрибутом BGP Large Communities относятся к группам (communities), указанным в атрибуте.

Каждое значение BGP Large Community представляется 12 октетами, как показано на рисунке.

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Global Administrator                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Local Data Part 1                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Local Data Part 2                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Global Administrator

4-октетный идентификатор пространства имен.

Local Data Part 1

4-октетное значение, определенное оператором.

Local Data Part 2

4-октетное значение, определенное оператором.

Поле Global Administrator предназначено для того, чтобы в разных AS можно было определять BGP Large Communities без возникновения конфликтов. В этом поле следует указывать номер автономной системы (ASN), в которой компоненты Local Data Part будут интерпретироваться в соответствии с определением владельца ASN. Использование резервных значений ASN (0 [RFC7607], 65535 и 4294967295 [RFC7300]) в этом поле не рекомендуется.

Порядок размещения 12-октетных значений Large Community Attribute в атрибуте Large Communities не имеет значения и узел BGP может передавать их в любом порядке.

Дубликаты значений BGP Large Community передавать недопустимо. Принимающий узел должен отбрасывать без уведомления избыточные значения BGP Large Community из атрибута BGP Large Communities.

4. Агрегирование

При агрегировании маршрутов результату следует присваивать атрибут BGP Large Communities, который содержит атрибуты BGP Large Communities из всех агрегированных маршрутов.

5. Каноническое представление

Каноническим представлением атрибута BGP Large Communities являются три целых числа без знака в десятичном формате, указываемые в порядке Global Administrator, Local Data 1, Local Data 2. Использование нулей в начале целочисленных значений недопустимо; нулевое значение поля должно представляться одним символом 0. Числа отделяются одно от другого двоеточием — например, 64496:4294967295:2, 64496:0:0.

Атрибут BGP Large Communities следует задавать в каноническом представлении.

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

Обработка ошибок для атрибута BGP Large Communities показана ниже.

  • Атрибут BGP Large Communities нужно считать некорректно сформированным, если размер значения BGP Large Communities Attribute в октетах не кратен 12.

  • Атрибут BGP Large Communities не нужно считать некорректно сформированным по причине наличия в нем дубликатов значение Large Community.

  • Сообщения BGP UPDATE с некорректно сформированным атрибутом BGP Large Communities нужно обрабатывать с использованием модели «трактовать, как отзыв» (treat-as-withdraw), описанной в разделе 2 [RFC7606].

В атрибуте BGP Large Communities поле Global Administrator может содержать любое значение и атрибут BGP Large Communities недопустимо считать некорректно сформированным, если поле Global Administrator содержит невыделенное, нераспределенное или резервное значение ASN.

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

Этот документ не оказывает влияния на вопросы безопасности, связанные с любым другим механизмом BGP Communities. В частности, AS, полагающаяся на атрибут BGP Large Communities передаваемый в BGP, должна доверять всем другим AS в пути, поскольку любая промежуточная AS на пути может добавить, удалить или изменить атрибут BGP Large Communities. Рассмотрение механизмов такого доверия выходит за рамки этого документа.

BGP Large Communities не обеспечивает защиты целостности содержащихся в атрибуте значений. Операторам следует принимать во внимание узлы BGP могут менять значения BGP Large Community Attribute в сообщениях BGP Update. Защита целостности промежуточной обработки атрибутов BGP Large Community в соответствии с выраженной политикой маршрутизации BGP относится к сфере общей защиты BGP и не рассматривается здесь.

Администраторам сетей следует принимать во внимание рекомендации раздела 11 в «BGP Operations and Security» [RFC7454].

8. Согласование с IANA

Агентство IANA выделило значение 32 (LARGE_COMMUNITY) в субреестре BGP Path Attributes реестра Border Gateway Protocol (BGP) Parameters.

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

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

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

[RFC4271] Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., «A Border Gateway Protocol 4 (BGP-4)», RFC 4271, DOI 10.17487/RFC4271, January 2006, <http://www.rfc-editor.org/info/rfc4271>.

[RFC7606] Chen, E., Ed., Scudder, J., Ed., Mohapatra, P., and K. Patel, «Revised Error Handling for BGP UPDATE Messages», RFC 7606, DOI 10.17487/RFC7606, August 2015, <http://www.rfc-editor.org/info/rfc7606>.

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

[RFC1997] Chandra, R., Traina, P., and T. Li, «BGP Communities Attribute», RFC 1997, DOI 10.17487/RFC1997, August 1996, <http://www.rfc-editor.org/info/rfc1997>.

[RFC4360] Sangli, S., Tappan, D., and Y. Rekhter, «BGP Extended Communities Attribute», RFC 4360, DOI 10.17487/RFC4360, February 2006, <http://www.rfc-editor.org/info/rfc4360>.

[RFC6793] Vohra, Q. and E. Chen, «BGP Support for Four-Octet Autonomous System (AS) Number Space», RFC 6793, DOI 10.17487/RFC6793, December 2012, <http://www.rfc-editor.org/info/rfc6793>.

[RFC7300] Haas, J. and J. Mitchell, «Reservation of Last Autonomous System (AS) Numbers», BCP 6, RFC 7300, DOI 10.17487/RFC7300, July 2014, <http://www.rfc-editor.org/info/rfc7300>.

[RFC7454] Durand, J., Pepelnjak, I., and G. Doering, «BGP Operations and Security», BCP 194, RFC 7454, DOI 10.17487/RFC7454, February 2015, <http://www.rfc-editor.org/info/rfc7454>.

[RFC7607] Kumari, W., Bush, R., Schiller, H., and K. Patel, «Codification of AS 0 Processing», RFC 7607, DOI 10.17487/RFC7607, August 2015, <http://www.rfc-editor.org/info/rfc7607>.

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

Авторы выражают свою признательность Ruediger Volk, Russ White, Acee Lindem, Shyam Sethuram, Jared Mauch, Joel M. Halpern, Jeffrey Haas, Gunter van de Velde, Marco Marzetti, Eduardo Ascenco Reis, Mark Schouten, Paul Hoogsteder, Martijn Schmidt, Greg Hankins, Bertrand Duvivier, Barry O’Donovan, Grzegorz Janoszka, Linda Dunbar, Marco Davids, Gaurab Raj Upadhaya, Jeff Tantsura, Teun Vink, Adam Davenport, Theodore Baschak, Pier Carlo Chiodi, Nabeel Cocker, Ian Dickinson, Jan Baggen, Duncan Lockwood, David Farmer, Randy Bush, Wim Henderickx, Stefan Plug, Kay Rechthien, Rob Shakir, Warren Kumari, Gert Doering, Thomas King, Mikael Abrahamsson, Wesley Steehouwer, Sander Steffann, Brad Dreisbach, Martin Millnert, Christopher Morrow, Jay Borkenhagen, Arnold Nipper, Joe Provo, Niels Bakker, Bill Fenner, Tom Daly, Ben Maddison, Alexander Azimov, Brian Dickson, Peter van Dijk, Julian Seifert, Tom Petch, Tom Scholl, Arjen Zonneveld, Remco van Mook, Adam Chappell, Jussi Peltola, Kristian Larsson, Markus Hauschild, Richard Steenbergen, David Freedman, Richard Hartmann, Geoff Huston, Mach Chen и Alvaro Retana за поддержку, рецензирование и комментарии.

Участники работы

Ниже перечислены люди, внесшие существенный вклад в содержимое этого документа.

John Heasley

NTT Communications

Email: heas@shrubbery.net

Adam Simpson

Nokia

Email: adam.1.simpson@nokia.com

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

Jakob Heitz (редактор)

Cisco

170 West Tasman Drive

San Jose, CA 95054

United States of America

Email: jheitz@cisco.com

Job Snijders (редактор)

NTT Communications

Theodorus Majofskistraat 100

Amsterdam 1065 SZ

The Netherlands

Email: job@ntt.net

Keyur Patel

Arrcus, Inc.

Email: keyur@arrcus.com

Ignas Bagdonas

Equinix

80 Cheapside

London EC2V 6EE

United Kingdom

Email: ibagdona.ietf@gmail.com

Nick Hilliard

INEX

4027 Kingswood Road

Dublin 24

Ireland

Email: nick@inex.ie


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

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

nmalykh@gmail.com


1Autonomous System Number.

2Internet Engineering Task Force.

3Internet Engineering Steering Group.

Рубрика: RFC | Комментарии к записи RFC 8092 BGP Large Communities Attribute отключены

RFC 8040 RESTCONF Protocol

Internet Engineering Task Force (IETF)                        A. Bierman
Request for Comments: 8040                                     YumaWorks
Category: Standards Track                                   M. Bjorklund
ISSN: 2070-1721                                           Tail-f Systems
                                                               K. Watsen
                                                        Juniper Networks
                                                            January 2017

RESTCONF Protocol

Протокол RESTCONF

PDF

Аннотация

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

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

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

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

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

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

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

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

1. Введение

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

В этом документе определен основанный на HTTP [RFC7230] протокол RESTCONF, для работы с конфигурационными данными YANG версии 1 [RFC6020] или 1.1 [RFC7950] с использованием концепций протокола NETCONF5 [RFC6241].

NETCONF определяет хранилища конфигурации и набор операций для создания (Create), считывания (Read), обновления (Update) и удаления (Delete), сокращенно обозначаемых CRUD6, которые могут применяться для доступа к этим хранилищам. NETCONF также определяет протокол для вызова этих операций. Язык YANG определяет синтаксис и семантику содержимого хранилищ, конфигурации, данных состояния, операций RPC и уведомлений.

RESTCONF использует методы HTTP для выполнения операций CRUD на концептуальном хранилище данных YANG, которые совместимы с серверами, реализующими хранилища NETCONF.

Если сервер RESTCONF совмещен с сервером NETCONF, возникают протокольные взаимодействия с NETCONF, описанные в параграфе 1.4. Сервер RESTCONF может обеспечивать доступ к конкретным хранилищам, используя ресурсы операций, как описано в параграфе 3.6. Протокол RESTCONF не задает каких-либо обязательных ресурсов операций. Семантика каждой операции определяет возможность и способ доступа к хранилищам.

Данные конфигурации и состояния раскрываются как ресурсы, доступные с помощью метода GET. Ресурсы, представляющие данные конфигурации, можно изменить с помощью методов DELETE, PATCH, POST, PUT. Данные кодируются с использованием XML [W3C.REC-xml-20081126] или JSON [RFC7159].

Связанные с моделью данных операции RPC, определенные в операторах YANG rpc или action, могут быть вызваны с помощью метода POST. Доступны уведомления о связанных с моделью данных событиях, определенных в операторах YANG notification.

1.1. Терминология

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

1.1.1. NETCONF

Ниже перечислены термины, определенные в [RFC6241].

  • candidate configuration datastore — хранилище конфигурации-кандидата;

  • configuration data — данные конфигурации;

  • datastore — хранилище данных;

  • configuration datastore — хранилище конфигурации;

  • running configuration datastore — хранилище рабочей конфигурации;

  • startup configuration datastore — хранилище стартовой конфигурации;

  • state data — данные состояния;

  • user — пользователь.

1.1.2. HTTP

Ниже перечислены термины, определенные в [RFC3986].

  • fragment — фрагмент;

  • path — путь;

  • query — запрос.

Ниже перечислены термины, определенные в [RFC7230].

  • header field — поле заголовка;

  • message-body — тело сообщения;

  • request-line — строка запроса;

  • request URI — идентификатор запроса;

  • status-line — строка состояния.

Ниже перечислены термины, определенные в [RFC7231].

  • method — метод;

  • request — запрос;

  • resource — ресурс.

Ниже приведен термин, определенный в [RFC7232].

  • entity-tag — тег объекта (сущности, элемента).

1.1.3. YANG

Ниже перечислены термины, определенные в [RFC7950].

  • action — действие;

  • container — контейнер;

  • data node — узел данных;

  • key leaf — ключевой лист;

  • leaf — лист (дерева);

  • leaf-list — лист-список;

  • list — список;

  • mandatory node — обязательный узел;

  • ordered-by user — упорядочение пользователем;

  • presence container — контейнер присутствия;

  • RPC operation — операция RPC;

  • top-level data node — узел данных верхнего уровня.

1.1.4. Уведомления NETCONF

Ниже приведен термин, определенный в [RFC5277].

  • notification replay — повторное использование уведомления.

1.1.5. Определения терминов

Ниже приведены определения используемых в этом документе терминов.

API resource – ресурс API

Ресурс, моделирующий корневой ресурс RESTCONF и субресурсы для доступа к определенному в YANG содержимому. Определяется с помощью шаблона данных YANG yang-api в модуле ietf-restconf.

client — клиент

Клиент RESTCONF.

data resource – ресурс данных

Ресурс, моделирующий узел данных YANG. Определяется операторами определений YANG.

datastore resource – ресурс хранилища данных

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

edit operation – операция редактирования

Операция RESTCONF над ресурсом данных с использованием метода POST, PUT, PATCH или DELETE. Это отличается от операций редактирования NETCONF (т. е. одного из значений атрибута nc:operation — create, replace, merge, delete или remove).

event stream resource – ресурс потока событий

Ресурс, представляющий поток событий SSE7. Содержимое представляет собой текст, использующий тип носителя text/event-stream, как определено в спецификации SSE [W3C.REC-eventsource-20150203]. Содержимое потока событий описано в параграфе 3.8.

media type – тип носителя (среды)

HTTP использует типы носителей Internet (media type) [RFC2046] в полях заголовка Content-Type и Accept для указания и согласования типа.

NETCONF client – клиент NETCONF

Клиент, реализующий протокол NETCONF. В [RFC6241] называется просто клиентом.

NETCONF server – сервер NETCONF

Сервер, реализующий протокол NETCONF. В [RFC6241] называется просто сервером.

operation — операция

Концептуальная операция RESTCONF для сообщения с использованием метода HTTP, URI запроса, полей заголовка и тела сообщения (message-body).

operation resource – ресурс операции

Ресурс, моделирующий определяемую моделью данных операцию, которая в свою очередь определяется с помощью оператора YANG rpc или action. Вызывается с помощью метода POST.

patch – исправления, заплатка

Метод PATCH для целевого хранилища или ресурса данных. Тип носителя для содержимого message-body будет указывать используемый тип patch.

plain patch – простое исправление

Конкретный тип носителя (media type) для использования в методе PATCH (параграф 4.6.1). Этот тип может применяться для простой операции слияния (merge). Тип указывается в запросе полем Content-Type со значением application/yang-data+xml или application/yang-data+json.

query parameter – параметр запроса

Параметр (и его значение при наличии), закодированный в компоненте query идентификатора URI для запроса.

resource type – тип ресурса

Один из классов ресурсов RESTCONF, определенных в этом документе, — api, datastore, data, operation, schema или event stream.

RESTCONF capability – возможность (свойство) RESTCONF

Необязательная функция протокола RESTCONF, которая анонсируется конкретным сервером в случае ее поддержки. Возможности указываются зарегистрированными IANA идентификаторами NETCONF Capability URI и анонсируются записью в листе-списке capability, определенном в параграфе 9.3.

RESTCONF client – клиент RESTCONF

Клиент, реализующий протокол RESTCONF.

RESTCONF server – сервер RESTCONF

Сервер, реализующий протокол RESTCONF.

retrieval request – запрос на извлечение

Запрос с использованием метода GET или HEAD.

schema resource – ресурс схемы

Ресурс, используемый клиентом для получения схемы YANG с помощью метода GET. Представляется типом носителя application/yang.

server — сервер

Сервер RESTCONF.

«stream» list – список “потоков”

Набор экземпляров ресурсов данных, который описывает ресурсы потоков событий, доступные на сервер. Эта информация определяется в модуле ietf-restconf-monitoring как список stream и может быть получена с использованием целевого ресурса {+restconf}/data/ietf-restconf-monitoring:restconf-state/streams/stream. Список stream содержит информацию о каждом потоке, такую как URL для извлечения данных потока событий.

stream resource – ресурс потока

Ресурс потока событий.

target resource – целевой ресурс

Ресурс, связанный с отдельным сообщением, указываемый компонентом path в URI запроса.

yang-data extension – расширение yang-data

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

YANG data template – шаблон данных YANG

Схема для компонентов сообщения протокола моделирования как концептуальных структур данных, использующих YANG. Это позволяет определять сообщения независимо от их кодирования. Каждый шаблон данных YANG определяется с помощью расширения yang-data, описанного в разделе 8. Для YANG могут быть определены представления экземпляров, соответствующих определенному шаблону данных YANG. Представление XML определено в YANG версии 1.1 [RFC7950] и поддерживается с типом носителя application/yang-data+xml. Представление JSON определено в документе «JSON Encoding of Data Modeled with YANG» [RFC7951] и поддерживается с типом носителя application/yang-data+json.

1.1.6. Шаблон и примеры URI

В этом документе применяется синтаксис шаблона URI [RFC6570] {+restconf} для ссылок на корневой ресурс RESTCONF за пределами примера. Подробности приведены в параграфе 3.1.

Для простоты все примеры в документе используют /restconf в качестве «найденного» пути к корню RESTCONF API. Многие из приведенных в документе примеров основаны на модуле YANG example-jukebox, определенном в Приложении A.1.

Многие строки заголовков протокола и текста в message-body приведенных в документе примеров разбиты на несколько строк для наглядности. Строки, заканчивающиеся символом \ продолжаются следующей строкой документа. Т. е. строки объединяются с удалением символа \, за которым следует перевод строки и пробельных символов в начале следующей строки.

1.1.7. Диаграммы деревьев

В документе применяется упрощенное графическое представление моделей данных. Назначение символов описано ниже.

  • Ключи списков указываются в квадратных скобках [].

  • Сокращения перед именами узлов задают режим доступа — rw для данных конфигурации (чтение и запись), ro для данных состояния (только чтение).

  • Символ ? после узла данных указывает необязательный узел, ! — контейнер присутствия, * — список или лист-список.

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

  • Троеточие (…) указывает пропущенное содержимое субдерева.

1.2. Подмножество функций NETCONF

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

RESTCONF использует методы HTTP для реализации эквивалентов операций NETCONF, что позволяет выполнять базовые операции CRUD на иерархии концептуальных ресурсов.

Методы HTTP POST, PUT, PATCH и DELETE служат для редактирования ресурсов данных, представленных моделями YANG. Эти базовые операции редактирования позволяют менять рабочую конфигурацию из клиентов RESTCONF.

Протокол RESTCONF не предназначен для замены NETCONF и просто обеспечивает интерфейс HTTP, следующий принципам REST8 [REST-Dissertation] и совместимый с моделью хранилища данных NETCONF.

1.3. Управляемый моделью данных интерфейс API

RESTCONF объединяет простоту HTTP с предсказуемостью и возможностями автоматизации управляемых схемами API. Зная модули YANG, используемый сервером, клиент может вывести URL всех ресурсов управления, а также подходящую структуру всех запросов и откликов RESTCONF. Такая стратегия избавляет от необходимости включать в отклики сервера ссылки HATEOAS9, впервые описанные в докторской диссертации Roy Fielding [REST-Dissertation], поскольку клиент может определить нужные ему ссылки из модулей YANG.

RESTCONF использует библиотеку YANG [RFC7895] для предоставления клиентам возможности найти информацию л соответствии модуля YANG для на сервере, если клиент хочет применять ее.

Сервер может поддерживать извлечение используемых им модулей YANG из своей библиотеки. Подробности этого описаны в параграфе 3.7.

Идентификаторы URI для зависимых от модели данных операций RPC и содержимого хранилищ предсказуемы на основе определений в модуле YANG.

RESTCONF работает с концептуальным хранилищем данных, определенным на языке моделирования YANG. Сервер перечисляет все поддерживаемые модули YANG с использованием модуля ietf-yang-library, определенного в [RFC7895]. Сервер должен реализовать модуль ietf-yang-library, который должен указывать все используемые сервером модули YANG в списке modules-state/module. Содержимое концептуального хранилища данных, зависимые от модели операции RPC и уведомления о событиях тоже указываются этим набором модулей YANG.

Классификация данных как относящихся или не относящихся к конфигурационным выводится из оператора YANG config. Поведение, связанное с упорядочиванием данных, определяется оператором YANG ordered-by. Не относящиеся к конфигурации данные называют также данными состояния.

Модель редактирования хранилища данных в RESTCONF проста и прямолинейна, подобно поведению возможности :writable-running в NETCONF. Каждое редактирование RESTCONF ресурса данных в ресурсе хранилища активируется после успешного завершения редактирования.

1.4. Сосуществование с NETCONF

+--------------+           +-----------------+
|Web-приложение| <-------> |                 |
+--------------+  RESTCONF |     Сетевое     |
                           |   устройство    |
+--------------+           |   +-----------+ |
|Клиент NETCONF| <-------> |   | хранилище | |
|              |  NETCONF  |   |   данных  | |
+--------------+           |   +-----------+ |
                           +-----------------+


RESTCONF можно реализовать на устройстве, поддерживающем протокол NETCONF.

На рисунке представлены системные компоненты RESTCONF размещаемые на одном сервере с NETCONF.

Ниже показаны системные компоненты при реализации RESTCONF на устройстве, не являющемся сервером NETCONF.

+--------------+           +------------------+
|Web-приложение| <-------> |                  |
+--------------+  RESTCONF |Сетевое устройство|
                           |                  |
                           +------------------+


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

Если сервер NETCONF поддерживает возможность :writable-running, все операции по редактированию конфигурационных узлов {+restconf}/data выполняются в хранилище рабочей конфигурации. Шаблон URI {+restconf} определен в параграфе 1.1.6.

В противном случае, если устройство поддерживает хранилище :candidate, все операции редактирования конфигурационных узлов {+restconf}/data будут применяться к содержимому хранилища-кандидата. Конфигурация-кандидат должна автоматически фиксироваться сразу после успешного редактирования. Все операции редактирования хранилища-кандидата также должны фиксироваться. Если любым клиентом NETCONF выполняется процедура подтверждаемой фиксации (confirmed commit), любая новая фиксация будет служить подтверждающей (confirming commit). Если сервер NETCONF ждет параметр persist-id для завершения процедуры подтверждаемой фиксации, операция редактирования RESTCONF должна приводить к отказу с возвратом кода «409 Conflict». В таком случае возвращается тег ошибки in-use.

Если сервер NETCONF поддерживает :startup, сервер RESTCONF должен автоматически обновить энергонезависимое хранилище стартовой конфигурации после изменения рабочего (running) хранилища данных операцией редактирования RESTCONF.

Если на хранилище, изменяемом операцией редактирования RESTCONF, имеется активная блокировка от клиента NETCONF, операция редактирования RESTCONF должна приводить к отказу с кодом «409 Conflict». В таком случае возвращается тег ошибки in-use.

1.5. Расширяемость RESTCONF

В RESTCONF имеется два встроенных механизма расширяемости:

  • версия протокола;

  • дополнительные возможности.

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

Сервер будет анонсировать все поддерживаемые им версии протокола в своих данных host-meta.

В приведенном ниже примере сервер поддерживает RESTCONF версии 1 и фиктивной версии 2. Клиент может передать

      GET /.well-known/host-meta HTTP/1.1
      Host: example.com
      Accept: application/xrd+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Content-Type: application/xrd+xml
      Content-Length: nnn

      <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
          <Link rel='restconf' href='/restconf'/>
          <Link rel='restconf2' href='/restconf2'/>
      </XRD>

RESTCONF также поддерживает определяемый сервером список дополнительных возможностей, которые перечисляются сервером с использованием модуля ietf-restconf-monitoring, определенного в параграфе 9.3. Этот документ определяет несколько параметров запроса в параграфе 4.8. Каждый необязательный параметр имеет соответствующий идентификатор URI для возможности, определенный в параграфе 9.1.1, который анонсируется сервером в случае поддержки возможности.

Лист-список capability может указывать любые типы серверных расширений. В настоящее время этот механизм расширения служит для указания поддерживаемых необязательных параметров запроса, но не ограничивается решением этой задачи. Например, идентификатор URI defaults, описанный в параграфе 9.1.2, задает обязательное значение URI, указывающего принятое сервером по умолчанию поведение при обработке.

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

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

2.1. Целостность и конфиденциальность

HTTP [RFC7230] является протоколом прикладного уровня, который может работать на основе любого транспорта с гарантированной доставкой. Протокол RESTCONF работает на основе HTTP, но конфиденциальная природа передаваемой информации требует для RESTCONF транспортного протокола с защитой целостности и конфиденциальности данных. Сервер RESTCONF должен поддерживать протокол TLS10 [RFC5246] и придерживаться документа [RFC7525]. Протокол RESTCONF недопустимо использовать с HTTP без поддержки протокола TLS.

RESTCONF не требует определенной версии HTTP, однако рекомендуется поддерживать версию не ниже HTTP/1.1 [RFC7230] во всех реализациях.

2.2. HTTPS с сертификатами X.509v3

Учитывая повсеместное сегодня применение HTTP на основе TLS [RFC7230], реализации RESTCONF должны поддерживать схему URI https, для которой агентство IANA назначило используемый по умолчанию порт 443.

Серверы RESTCONF должны предоставлять сертификат на основе X.509v3 при организации соединения TLS с клиентом RESTCONF. Использование сертификатов X.509v3 согласуется с работой NETCONF на базе TLS [RFC7589].

2.3. Проверка сертификата

Клиент RESTCONF должен (1) использовать путь проверки сертификата X.509 [RFC5280] для контроля целостности сертификата TLS на сервере RESTCONF или (2) сравнивать полученный от сервера сертификат TLS с сертификатом, доставленным с помощью доверенного механизма (например, указанный на устройстве сертификат). Если путь проверки сертификата X.509 дает отказ и представленный сертификат X.509 не соответствует полученному с помощью доверенного механизма, соединение должно быть прервано, как описано в параграфе 7.2.1 [RFC5246].

2.4. Отождествление аутентифицированного сервера

Клиент RESTCONF должен проверить отождествление сервера в соответствии с параграфом 3.1 [RFC2818].

2.5. Отождествление аутентифицированного клиента

Сервер RESTCONF должен аутентифицировать доступ клиента к любому защищенному ресурсу. Если клиент RESTCONF не прошел проверку подлинности, серверу следует передать отклик HTTP с кодом «401 Unauthorized», как указано в параграфе 3.1 [RFC7235]. В таких случаях применяется тег ошибки access-denied.

Для проверки подлинности клиента серверу RESTCONF следует требовать аутентификацию на основе сертификата клиента TLS (параграф 7.4.6 [RFC5246]). Если аутентификация на основе сертификата не подходит (например, при невозможности организовать PKI для клиентов), можно воспользоваться аутентификацией HTTP. В этом случае должна применяться одна из схем аутентификации HTTP, определенных в реестре «Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry» (параграф 5.1 [RFC7235]).

Сервер может также поддерживать аутентификацию по сертификатам клиентов и аутентификацию HTTP, решение вопроса использования такой комбинации остается за реализацией.

Отождествление клиента RESTCONF, полученное от механизма аутентификации, далее будет называться именем пользователя RESTCONF и к нему применяется модель контроля доступа NACM11 [RFC6536]. Когда предоставляется сертификат клиента, имя пользователя RESTCONF должно выводиться с использованием механизма, определенного в разделе 7 [RFC7589]. Для остальных случаев, когда применяется аутентификация HTTP, имя пользователя RESTCONF должно предоставляться используемой схемой аутентификации HTTP.

3. Ресурсы

Протокол RESTCONF работает с иерархией ресурсов, начиная с ресурса API верхнего уровня (параграф 3.1). Каждый из ресурсов представляет управляемый компонент устройства.

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

Ресурс имеет представление, связанное с типом носителя, указанным полем заголовка Content-Type в отклике HTTP. Ресурс имеет одно или множество представления, каждое из которых связано с разным типом носителя. Когда представление ресурса передается в сообщении HTTP, связанный тип носителя указывается в заголовке Content-Type. Ресурс может (не обязательно) включать вложенные ресурсы. Ресурсы могут быть созданы или удалены независимо от родительского ресурса, пока тот сохраняется.

Доступ к ресурсам RESTCONF выполняется через набор идентификаторов URI, определенных в этом документе. Набор поддерживаемых сервером модулей YANG будет определять зависимые от модели данных операции RPC, узлы верхнего уровня и уведомления о событиях, поддерживаемые сервером.

Протокол RESTCONF не включает механизма обнаружения ресурсов данных. Вместо этого применяются анонсы сервера с определениями модулей YANG для создания операций RPC или идентификаторов ресурсов.

3.1. Обнаружение корневого ресурса

В соответствии с рекомендациями [RFC7320] протокол RESTCONF разрешает развернутым системам указывать местоположение RESTCONF API. При первом подключении к серверу RESTCONF клиент RESTCONF должен определить корень RESTCONF API. Должна быть в точности одна привязка restconf, возвращенная устройством.

Клиент находит это, получая ресурс /.well-known/host-meta ([RFC6415]) и используя элемент <Link>, содержащий атрибут restconf.

Например, для получения /restconf клиент может передать

      GET /.well-known/host-meta HTTP/1.1
      Host: example.com
      Accept: application/xrd+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Content-Type: application/xrd+xml
      Content-Length: nnn

      <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
          <Link rel='restconf' href='/restconf'/>
      </XRD>

После нахождения корня RESTCONF API клиент должен применять это значение в качестве начальной части пути в запросе URI при всех последующих запросах ресурсов RESTCONF.

В этом примере клиент будет применять путь /restconf в качестве корневого ресурса RESTCONF.

Для получения /top/restconf клиент может передать

      GET /.well-known/host-meta HTTP/1.1
      Host: example.com
      Accept: application/xrd+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Content-Type: application/xrd+xml
      Content-Length: nnn

      <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
          <Link rel='restconf' href='/top/restconf'/>
      </XRD>

В этом примере клиент будет применять путь /top/restconf как корневой ресурс RESTCONF.

Клиент может теперь определить ресурсы операций, поддерживаемые сервером. В приведенном ниже примере сервер поддерживает операцию play. Клиент может передать

      GET /top/restconf/operations HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Last-Modified: Thu, 26 Jan 2017 16:00:14 GMT
      Content-Type: application/yang-data+json

      { "operations" : { "example-jukebox:play" : [null] } }

Если дескриптор расширяемого ресурса XRD12 содержит более одной привязки, к данной спецификации будет относиться лишь привязка, названная restconf.

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

3.2. Типы носителей RESTCONF

Протокол RESTCONF определяет два зависимых от приложения типа носителя для указания представлений данных, которые соответствуют схеме для определенной конструкции YANG.

В этом документе определены два типа носителя для представления данных YANG в XML и JSON. Другие документы могут определяет иные типы носителей для представления данных YANG. Тип application/yang-data+xml определен в параграфе 11.3.1, application/yang-data+json — в параграфе 11.3.2.

3.3. Ресурс API

Ресурс API содержит корневой ресурс RESTCONF для хранилища данных RESTCONF и ресурсов операций. Он является ресурсом верхнего уровня, расположенным в {+restconf} и имеет тип носителя «application/yang-data+xml» или «application/yang-data+json».

Ниже представлена диаграмма дерева YANG для ресурса API.


+---- {+restconf}
      +---- data
      | ...
      +---- operations?
      | ...
      +--ro yang-library-version    string

Шаблон данных YANG yang-api определен с использованием расширения yang-data из модуля ietf-restconf, представленного в разделе 8. Он задает структуру и синтаксис концептуальных дочерних ресурсов в ресурсе API.

Ресурс API можно извлечь с помощью метода GET.

Имя корневого ресурса {+restconf} используется в откликах, представляющих корень модуля ietf-restconf, должно указывать модуль YANG ietf-restconf. Например, запрос GET для корневого ресурса /restconf в формате JSON будет возвращать представления ресурса API с именем ietf-restconf:restconf.

Потомки этого ресурса перечислены в таблице.

Ресурс RESTCONF API.

 

Дочерний ресурс

Описание

data

Содержит все ресурсы данных

operations

Определяемые моделью данных операции

yang-library-version

Дата модуля ietf-yang-library

 

3.3.1. Ресурс {+restconf}/data

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

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

      GET /restconf/data/example-jukebox:jukebox/library\
          ?content=nonconfig HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+xml

      <library xmlns="https://example.com/ns/example-jukebox">
        <artist-count>42</artist-count>
        <album-count>59</album-count>
        <song-count>374</song-count>
      </library>

3.3.2. Ресурс {+restconf}/operations

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

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

Точка доступа для каждой операции RPC представляется как пустой лист. Если ресурс операции найден, сервер возвращает представление пустого листа.

Ресурсы операций определены в параграфе 3.6.

3.3.3. Лист {+restconf}/yang-library-version

Этот обязательный лист указывает дату выпуска модуля YANG ietf-yang-library, реализованного этим сервером. В приведенном ниже примере используется дата выпуска модуля из [RFC7895].

      GET /restconf/yang-library-version HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+xml

      <yang-library-version
        xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">\
        2016-06-21</yang-library-version>

3.4. Ресурс хранилища данных

Субдерево {+restconf}/data представляет ресурс хранилища данных, которое содержит набор узлов данных конфигурации и состояния.

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

Управление транзакциями редактирования и сохранения конфигурации обслуживается сервером и клиент не контролирует этого. Запись в ресурс хранилища данных возможна напрямую с использованием методов POST и PATCH. Каждое редактирование RESTCONF сохраняется в энергонезависимой памяти ресурса хранилища, если сервер поддерживает такую память (параграф 1.4).

Если ресурс хранилища данных, представленный субдеревом {+restconf}/data, найден, хранилище и его содержимое возвращается сервером. Хранилище данных представляется узлом data в пространстве имен модуля ietf-restconf.

3.4.1. Предотвращение конфликтов при редактировании

В RESTCONF поддерживается два механизма детектирования и предотвращения конфликтов при одновременном редактировании — временная метка (timestamp) и тег объекта (entity-tag).При любом изменении ресурсов конфигурационных данных обновляются значения timestamp и entity-tag для ресурса хранилища. В дополнение к этому сервер RESTCONF должен возвращать ошибку, если хранилище заблокировано из другого источника (например, сервером NETCONF).

3.4.1.1. Временная метка

Поддерживается время последнего изменения и возвращается поле заголовка Last-Modified (параграф 2.2 [RFC7232]) в ответах на запросы извлечения. Поле заголовка If-Unmodified-Since (параграф 3.4 of [RFC7232]) может использоваться в запросах на операции редактирования для того, чтобы принудить сервер отвергать запрос на редактирование, если ресурс был изменен после указанного временной меткой момента.

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

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

3.4.1.2. Тег объекта

Сервер должен поддерживать уникальный тег объекта (entity-tag) для ресурса хранилища и должен возвращать этот тег в поле заголовка ETag (параграф 2.3 [RFC7232]) отклика на запрос извлечения. Клиент может использовать заголовок If-Match в запросах на операции редактирования, чтобы вынудить сервер отвергать запрос для ресурса, у которого тег объекта не соответствует указанному значению.

Сервер должен поддерживать тег объекта для ресурса верхнего уровня {+restconf}/data. На этот тег влияют лишь ресурсы данных конфигурации и его недопустимо обновлять при изменении не относящихся к конфигурации данных. Теги объекта для ресурсов данных рассмотрены в параграфе 3.5. Отметим, что для каждого представления (например, XML и JSON) требуется свой тег объекта.

Если сервер RESTCONF совмещен с сервером NETCONF, тег объекта должен относиться к рабочему (running) хранилищу. Отметим, что тег может меняться и в результате действий других протоколов, но этот вопрос выходит за рамки документа.

3.4.1.3. Процедура обновления

Изменение ресурса конфигурационных данных влияет на временную метку и тег объекта для этого ресурса, родительского ресурса и ресурса хранилища данных.

Например, редактирование с отключением интерфейса может быть выполнено путем установки значения false для листа /interfaces/interface/enabled. Узел данных enabled и его предки (экземпляр списка interface и контейнер interfaces) также считаются измененными. Хранилище считается обновленным при изменении любого узла конфигурационных данных верхнего уровня (например, interfaces).

3.5. Ресурс данных

Ресурс данных представляет узел данных YANG, являющийся потомком ресурса хранилища данных. Каждый определенный в YANG узел данных может быть однозначно указан строкой запроса в методе HTTP. Узлами данных являются контейнеры, листья, записи листьев-списков и списков, узлы anydata и anyxml.

Представление, поддерживаемое для каждого ресурса данных, является определенным в YANG субдеревом данного узла. Методы HTTP для ресурса данных относятся к целевому узлу и всем его потомкам, если он имеются.

Ресурс данных можно извлечь с помощью метода GET, используя идентификатор URI {+restconf}/data. Это субдерево применяется для извлечения и редактирования ресурсов данных.

3.5.1. Временная метка

Для ресурсов конфигурационных данных сервер может поддерживать временную метку последнего изменения ресурса и возвращать поле заголовка Last-Modified при извлечении ресурса методом GET или HEAD.

Полученное значение заголовка Last-Modified может применяться клиентом RESTCONF в последующих запросах в полях заголовка If-Modified-Since и If-Unmodified-Since последующих запросов.

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

На эту метку оказывает влияние лишь изменение конфигурационных данных и недопустимо менять метку в ответ на изменение не относящихся к конфигурации данных.

3.5.2. Тег объекта

Для каждого ресурса конфигурационных данных серверу следует поддерживать тег объекта и возвращать поле заголовка Etag при извлечении ресурса как цели с помощью метода GET или HEAD. При поддержке таких тегов они должны обновляться при изменении ресурса или любого из включенных в него конфигурационных ресурсов. Если такие теги не поддерживаются, взамен должен применяться тег объекта для хранилища конфигурации.

Полученное значение заголовка ETag может применяться клиентом RESTCONF в последующих запросах в полях заголовка If-Match и If-None-Match последующих запросов.

На этот тег оказывает влияние лишь изменение конфигурационных данных и недопустимо менять тег в ответ на изменение не относящихся к конфигурации данных. Если сервер RESTCONF совмещен с сервером NETCONF, тег объекта должен относиться к экземпляру в рабочем хранилище данных.

3.5.3. Кодирование идентификаторов ресурса данных в URI запроса

В YANG узлы данных могут указываться определенными в [XPath] абсолютными выражениями XPath, которые начинаются с корня документа для целевого ресурса. В RESTCONF применяются закодированные в URI выражения путей.

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

Идентификаторы ресурсов данных в RESTCONF кодируются слева направо, начиная с узла верхнего уровня, в соответствии с правилом api-path из параграфа 3.5.3.1. Имена узлов каждого предка узла целевого ресурса кодируются по порядку, заканчивая именем узла самого целевого ресурса. Если узел в пути определен в модуле, отличающемся от модуля предка, или предком является хранилище данных, перед именем узла в идентификаторе ресурса должно указываться имя модуля, заканчивающееся символом двоеточия (:). Подробности приведены в параграфе 3.5.3.1.

Если узлом данных в выражении пути является лист-список YANG, значение leaf-list должно кодироваться в соответствии с приведенными ниже правилами.

  • Идентификатор узла-списка должен кодироваться с использованием одного сегмента пути.

  • Сегмент пути создается из имени узла-списка, за которым следует символ = и значение узла списка (например, /restconf/data/top-leaflist=fred).

  • Значение узла-списка указывается строкой с использованием канонического представления для соответствующего типа данных YANG. Для всех зарезервированных символов должно применяться %-кодирования в соответствии с параграфами 2.1 и 2.5 [RFC3986].

  • YANG 1.1 позволяет дублирование значений leaf-list для данных, не относящихся к конфигурации. Для таких случаев нет механизма точного указания элемента листа-списка.

  • Для символа запятой (,) используется %-кодирование [RFC3986] даже в тех случаях, когда для leaf-list множественные значения невозможны. Это улучшается согласованность и избавляет от специальных правил обработки.

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

  • Значения ключевых листьев для ресурсов данных, представляющих список YANG должны кодироваться с использованием одного сегмента пути [RFC3986].

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

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

  • Значение ключа указывается строкой с использованием канонического представления для соответствующего типа данных YANG. Для всех зарезервированных символов должно применяться %-кодирования в соответствии с параграфами 2.1 и 2.5 [RFC3986]. Для символа запятой (,) используется %-кодирование [RFC3986], если в списке имеются запятые.

  • Кодироваться должны все компоненты оператора key. Частичные идентификаторы экземпляров не поддерживаются.

  • Пропуск значений ключей не допускается, поэтому две запятые подряд считаются запятой, за которой следует пустая строка и вторая запятая. Например, «list1=foo,,baz» будет интерпретироваться как список list1 с тремя ключами, из который второй является пустым.

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

  • Правило ABNF13 [RFC5234] list-instance, определенное в параграфе 3.5.3.1, представляет синтаксис идентификатора экземпляра списка.

      container top {
          list list1 {
              key "key1 key2 key3";
               ...
               list list2 {
                   key "key4 key5";
                   ...
                   leaf X { type string; }
               }
           }
           leaf-list Y {
             type uint32;
           }
       }

Например, в приведенном выше определении YANG контейнер top указан в модулей example-top, и идентификатор URI целевого ресурса X будет кодироваться в виде

       /restconf/data/example-top:top/list1=key1,key2,key3/\
          list2=key4,key5/X

А URI целевого ресурса для узла-списка Y будет иметь вид

       /restconf/data/example-top:top/Y=instance-value

Приведенный ниже пример показывает %-кодирование для зарезервированных символов в значении ключа. Значение key1 в этом примере содержит запятую, одинарную и двойную кавычку, двоеточие, двойную кавычку, пробел и символ обратной дробной черты (,'»:» /). Отметим, что символы двойных кавычек не являются зарезервированными, и не требуют %-кодирования. Значением key2 является пустая строка, а key3 — строка «foo».

      /restconf/data/example-top:top/list1=%2C%27"%3A"%20%2F,,foo
3.5.3.1. ABNF для идентификаторов ресурсов данных

Синтаксис ABNF [RFC5234] api-path используется для создания идентификаторов пути RESTCONF. Отметим, что этот синтаксис применяется для всех ресурсов и путь API начинается с корневого ресурса RESTCONF. Ресурсы данных должны указываться в субдереве {+restconf}/data.

Идентификаторы недопустимо начинать с последовательности символов XML (в любом регистре) в соответствии с правилами для идентификаторов YANG. Синтаксис api-identifier и key-value должен соответствовать правилам кодирования идентификаторов JSON из раздела 4 [RFC7951] — требуется путь к корневому ресурсу RESTCONF. Дополнительные субидентификаторы ресурсов являются не обязательны. Для символов в значениях ключей имеются ограничения и некоторые символы нужно указывать %-кодами, как описано в параграфе 3.5.3.

   api-path = root *("/" (api-identifier / list-instance))
   root = string  ;; замена строки {+restconf}
   api-identifier = [module-name ":"] identifier
   module-name = identifier
   list-instance = api-identifier "=" key-value *("," key-value)
   key-value = string  ;; зарезервированные символы указываются ;-кодом
   string = <an unquoted string>
   identifier = (ALPHA / "_")
                *(ALPHA / DIGIT / "_" / "-" / ".")

3.5.4. Принятая по умолчанию обработка

RESTCONF требует, чтобы сервер указывал принятый по умолчанию режим обработки (см. параграф 9.1.2). Если сервер поддерживает необязательный параметр with-defaults, клиент может применять его для управления извлечением принятых по умолчанию значений (параграф 4.8.9).

Если отсутствует лист или лист-список из конфигурации и есть принятое по умолчанию значение в определении YANG для этого ресурса данных, сервер должен использовать значение из определения YANG как заданное.

Если целью метода GET является узел данных, который представляет leaf или leaf-list с принятым по умолчанию значением, а экземпляр этого листа или листа-списка еще не создан, сервер должен возвращать принятое по умолчанию значение или значения, используемые сервером. В таких случаях сервер должен игнорировать параметр basic-mode, описанный в параграфе 4.8.9, и возвращать принятое по умолчанию значение.

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

3.6. Ресурсы операций

Ресурсы операций представляют операции RPC, определенные оператором YANG rpc, или зависящие от модели действия, определенные оператором YANG action. Они вызываются с помощью метода POST.

Операция RPC вызывается в форме

      POST {+restconf}/operations/<operation>

Поле <operation> указывает имя модуля и строку идентификатора rpc для желаемой операции.

Например, если module-A определяет операцию RPC reset, вызов этой операции будет иметь вид

      POST /restconf/operations/module-A:reset HTTP/1.1
      Server: example.com

Вызов действия (action) имеет вид

      POST {+restconf}/data/<data-resource-identifier>/<action>

где <data-resource-identifier> указывает путь к узлу данных, в котором определено действие, а <action> — имя действия.

Например, если module-A определяет действие reset-all в контейнере interfaces, вызов действия будет иметь вид

      POST /restconf/data/module-A:interfaces/reset-all HTTP/1.1
      Server: example.com

Если вызванная операция RPC не привела к ошибке, а оператор rpc или action не имеет раздела output, в сообщение с откликом недопустимо включать message-body, а вместо этого должна передаваться строка «204 No Content».

Все ресурсы операций, представляющие операции RPC, которые поддерживаются сервером, должны указываться в субдереве {+restconf}/operations, определенном в параграфе 3.3.2. Ресурсы операций, представляющие действия YANG, не указываются в этом субдереве, поскольку они вызываются с использованием URI в субдереве {+restconf}/data.

3.6.1. Кодирование входных параметров ресурса операции

Если оператор rpc или action имеет раздел input, экземпляры входных параметров кодируются с использованием пространства имен модуля, где определен оператор rpc или action, в элемент XML или объект JSON с именем input с использованием пространства имен модуля, где определен оператор rpc или action.

Если оператор rpc или action имеет раздел input и дерево объекта input содержит какие-либо дочерние узлы, которые считаются обязательными, клиент должен включить в запрос message-body.

Если оператор rpc или action имеет раздел input и дерево объекта input не содержит дочерних узлов, которые считаются обязательными, клиент может не включать message-body в запрос.

Если оператор rpc или action не имеет раздела input, включение message-body в запрос недопустимо.

Приведенный ниже модуль YANG используется здесь в качестве примера операции RPC.

   module example-ops {
     namespace "https://example.com/ns/example-ops";
     prefix "ops";

     organization "Example, Inc.";
     contact "support at example.com";
     description "Example Operations Data Model Module.";
     revision "2016-07-07" {
       description "Первый выпуск.";
       reference "example.com document 3-3373.";
     }

     rpc reboot {
       description "Операция перезагрузки.";
       input {
         leaf delay {
           type uint32;
           units "seconds";
           default 0;
           description
             "Число секунд ожидания перед операцией перезагрузки.";
         }
         leaf message {
           type string;
           description
             "Сообщение для вывода в начале перезагрузки.";
         }
         leaf language {
           type string;
           description "Строка идентификатора языка.";
           reference "RFC 5646.";
         }
       }
     }

     rpc get-reboot-info {
       description
         "Получение параметров, использованных при последней перезагрузке.";
       output {
         leaf reboot-time {
           type uint32;
           description
             "Параметр delay при последней перезагрузке.";
         }
         leaf message {
           type string;
           description
             "Параметр message при последней перезагрузке.";
         }
         leaf language {
           type string;
           description
             "Параметр language при последней перезагрузке.";
         }
       }
     }
   }

Приведенный ниже модуль YANG служит примером действия (action) YANG.

   module example-actions {
     yang-version 1.1;
     namespace "https://example.com/ns/example-actions";
     prefix "act";
     import ietf-yang-types { prefix yang; }

     organization "Example, Inc.";
     contact "support at example.com";
     description "Example Actions Data Model Module.";
     revision "2016-07-07" {
       description "Первый выпуск.";
       reference "example.com document 2-9973.";
     }

     container interfaces {
       description "Интерфейсы системы.";
       list interface {
         key name;
         description "Один интерфейс.";
         leaf name {
           type string;
           description "Имя интерфейса.";
         }

         action reset {
           description "Сброс интерфейса.";
           input {
             leaf delay {
               type uint32;
               units "seconds";
               default 0;
               description
                 "Число секунд ожидания перед сбросом интерфейса.";
             }
           }
         }

         action get-last-reset-time {
           description
             "Получение времени последнего сброса интерфейса.";
           output {
             leaf last-reset {
               type yang:date-and-time;
               mandatory true;
               description
                 "Дата и время последнего сброса интерфейса или 
                  время последней перезагрузки устройства.";
             }
           }
         }
       }
     }
   }

Клиент может передать сообщение с запросом POST для вызова операции RPC reboot.

      POST /restconf/operations/example-ops:reboot HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <input xmlns="https://example.com/ns/example-ops">
       <delay>600</delay>
       <message>Отключение системы для обслуживания</message>
       <language>ru-RU</language>
      </input>

Сервер может возвратить отклик

      HTTP/1.1 204 No Content
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server

Ниже приведен тот же пример с использованием кодирования JSON

      POST /restconf/operations/example-ops:reboot HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "example-ops:input" : {
          "delay" : 600,
          "message" : "Отключение системы для обслуживания",
          "language" : "ru-RU"
        }
      }

Клиент может передать сообщение с запросом POST для вызова действия reset.

      POST /restconf/data/example-actions:interfaces/\
         interface=eth0/reset HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <input xmlns="https://example.com/ns/example-actions">
        <delay>600</delay>
      </input>

Сервер может возвратить отклик

      HTTP/1.1 204 No Content
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server

Тот же пример запросного сообщения с кодированием JSON представлен ниже.

      POST /restconf/data/example-actions:interfaces/\
        interface=eth0/reset HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      { "example-actions:input" : {
          "delay" : 600
        }
      }

3.6.2. Кодирование выходных параметров ресурса операции

Если оператор rpc или action имеет раздел output, экземпляры этих выходных параметров кодируются с использованием пространства имен модуля, где определен оператор rpc или action, в элемент XML или объект JSON с именем input с использованием пространства имен модуля, где определен оператор rpc или action.

Если вызванная операция RPC завершилась без ошибок и оператор rpc или action имеет раздел output, а дерево объекта output содержит какие-либо дочерние узлы данных, которые считаются обязательными, сервер должен передать message в своем отклике.

Если вызванная операция RPC завершилась без ошибок и оператор rpc или action имеет раздел output, а дерево объекта output содержит каких-либо дочерних узлов данных, которые считаются обязательными, сервер может включить message-body в свой отклик.

Идентификатор URI для запроса не возвращается в отклике. Знание этого идентификатора может потребоваться для связывания вывода с конкретным оператором rpc или action, использованным в запросе.

В примере с использованием модуля YANG example-ops, определенного в параграфе 3.6.1, клиент может передать сообщение с запросом POST для вызова операции get-reboot-info.

      POST /restconf/operations/example-ops:get-reboot-info HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "example-ops:output" : {
          "reboot-time" : 30,
          "message" : "Отключение системы для обслуживания",
          "language" : "ru-RU"
        }
      }

Тот же отклик с использованием кодирования XML будет иметь вид

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+xml

      <output xmlns="https://example.com/ns/example-ops">
        <reboot-time>30</reboot-time>
        <message>Отключение системы для обслуживания</message>
        <language>ru-RU</language>
      </output>

В примере с использованием модуля YANG example-actions, определенного в параграфе 3.6.1, клиент может передать сообщение с запросом POST для вызова операции get-last-reset-time.

      POST /restconf/data/example-actions:interfaces/\
         interface=eth0/get-last-reset-time HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "example-actions:output" : {
          "last-reset" : "2015-10-10T02:14:11Z"
        }
      }

3.6.3. Кодирование ошибок ресурса операции

Если при попытке вызова операции или действия возникает какая-либо ошибка, возвращается тип носителя errors с соответствующим статусом ошибки.

Если (1) операция RPC недействительна или (2) операция RPC вызвана, но завершилась ошибкой, сервер должен передать сообщение с message-body с ресурсом errors, как определено в параграфе 3.9.

Для использования операции RPC reboot из примера в параграфе 3.6.1 клиент может передать запрос POST.

      POST /restconf/operations/example-ops:reboot HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <input xmlns="https://example.com/ns/example-ops">
        <delay>-33</delay>
        <message>Отключение системы для обслуживания</message>
        <language>ru-RU</language>
      </input>

Сервер может вернуть сообщение с ошибкой invalid-value

      HTTP/1.1 400 Bad Request
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+xml

      <errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
        <error>
          <error-type>protocol</error-type>
          <error-tag>invalid-value</error-tag>
          <error-path xmlns:ops="https://example.com/ns/example-ops">
            /ops:input/ops:delay
          </error-path>
          <error-message>Недействительный входной параметр</error-message>
        </error>
      </errors>

Тот же отклик при использовании кодирования JSON будет иметь вид

      HTTP/1.1 400 Bad Request
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      { "ietf-restconf:errors" : {
          "error" : [
            {
              "error-type" : "protocol",
              "error-tag" : "invalid-value",
              "error-path" : "/example-ops:input/delay",
              "error-message" : "Недействительный входной параметр"
            }
          ]
        }
      }

3.7. Ресурс схемы

Сервер может поддерживать извлечение применяемых им модулей YANG. Если такое извлечение поддерживается, должен присутствовать лист schema в связанной записи списка module, определенной в [RFC7895].

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

Клиент может передать сообщение с запросом GET

      GET /restconf/data/ietf-yang-library:modules-state/\
          module=example-jukebox,2016-08-15/schema HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "ietf-yang-library:schema" :
         "https://example.com/mymodules/example-jukebox/2016-08-15"
      }

Затем клиенту нужно извлечь актуальную схему YANG, для чего клиент может передать сообщение с запросом GET

      GET https://example.com/mymodules/example-jukebox/\
         2016-08-15 HTTP/1.1
      Host: example.com
      Accept: application/yang

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang
         // Содержимое модуля YANG в этом примере не показано.

3.8. Ресурс потока событий

Этот ресурс представляет собой источник генерируемых системой уведомлений о событиях. Каждый поток создается и изменяется только сервером. Клиент может найти ресурс потока или инициировать продолжительный опрос потока SSE [W3C.REC-eventsource-20150203] с использованием процедуры, описанной в параграфе 6.3.

Поток событий функционирует в соответствии со спецификацией уведомлений о событиях NETCONF [RFC5277]. Доступные потоки можно узнать из списка stream, который указывает синтаксис и семантику потоковых ресурсов.

3.9. Шаблон данных YANG errors

Шаблон данных YANG errors моделирует набор информации об ошибках, которые передаются в message-body откликов сервера при обработке запроса. Это не считается типом ресурсов, поскольку результаты не возвращаются с помощью запросов GET.

Модуль YANG ietf-restconf содержит шаблон данных yang-errors, который задает синтаксис и семантику контейнера errors в откликах RESTCONF. Поведение RESTCONF в части обработки ошибок описано в разделе 7.

4. Методы RESTCONF

RESTCONF использует методы HTTP для указания операций CRUD, запрашиваемых для конкретного ресурса.

В таблице показана связь между операциями протоколов RESTCONF и NETCONF.

Методы CRUD в RESTCONF.

 

RESTCONF

NETCONF

OPTIONS

нет

HEAD

<get-config>, <get>

GET

<get-config>, <get>

POST

<edit-config> (nc:operation=»create»)

POST

Вызов операции RPC

PUT

<copy-config> (PUT в хранилище данных)

PUT

<edit-config> (nc:operation=»create/replace»)

PATCH

<edit-config> (nc:operation зависит от содержимого PATCH)

DELETE

<edit-config> (nc:operation=»delete»)

 

Атрибут remove операции редактирования NETCONF <edit-config> не поддерживается методом HTTP DELETE. Ресурс должен существовать, иначе метод DELETE будет приводить к отказу. Метод PATCH эквивалентен операции редактирования merge при использовании протокола исправления (параграф 4.6.1), другие типы носителей могут обеспечивать более тонкое управление.

Для ограничения операций CRUD могут применяться механизмы контроля доступа. В частности, протокол RESTCONF совместим с моделью управления доступом NACM [RFC6536], поскольку имеются конкретные сопоставления между операциями RESTCONF и NETCONF. Пути к ресурсам сервер должен преобразовывать внутренними средствами в соответствующие идентификаторы экземпляров YANG. Используя эту информацию, сервер может применять правила контроля доступа NACM к сообщениям RESTCONF.

Серверу недопустимо разрешать какие-либо операции RESTCONF по отношению к любым ресурсам, для которых у клиента нет полномочий доступа.

Реализация всех методов (кроме PATCH [RFC5789]) определена в [RFC7231]. В этом разделе определено использование протокола RESTCONF с каждым из методов HTTP.

4.1. Метод OPTIONS

Метод OPTIONS передается клиентом для определения поддерживаемых сервером методов для конкретного ресурса (например, GET, POST, DELETE). Сервер должен реализовать этот метод.

Поле заголовка Accept-Patch должно поддерживаться и возвращаться в отклике на запрос OPTIONS, как указано в [RFC5789].

4.2. Метод HEAD

Сервер RESTCONF должен поддерживать метод HEAD, который применяется клиентами для извлечения лишь полей заголовков (которые содержат метаданные для ресурса), которые вернул бы и сравнимый метод GET, но без message-body в отклике. Это поддерживается для всех ресурсов, разрешающих метод GET.

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

Контроль доступа выполняется так же, как происходило бы для метода GET. Сервер должен давать такой же отклик, как при запросе GET (взамен HEAD), но без включения в отклик message-body.

4.3. Метод GET

Сервер RESTCONF должен поддерживать метод GET, который применяется клиентами для извлечения данных и метаданных ресурса. Запрос должен содержать идентификатор URI, который включает по меньшей мере корневой ресурс.

Серверу недопустимо возвращать какие-либо ресурсы данных, для которых у пользователя нет прав на чтение. Если пользователь не уполномочен читать целевой ресурс, следует возвращать отклик об ошибке со статусом «401 Unauthorized». В этом случае возвращается тег ошибки access-denied. Сервер может возвращать статус «404 Not Found», как описано в параграфе 6.5.4 [RFC7231]. В этом случае возвращается тег ошибки invalid-value.

Если пользователь имеет полномочия на чтение лишь части целевого ресурса, не разрешенные для этого пользователя компоненты исключаются из message-body в отклике и возвращается только разрешенная часть.

При возврате клиенту какого-либо содержимого сервер должен включить в отклик действительное тело сообщения. Недопустим возврат более одного элемента для кодирования XML. Если передается множество элементов в JSON message-body, они должны отправляться как массив JSON. В этом случае временная метка и тег объекта в отклике должны относиться к первому возвращаемому элементу.

Если запрос на извлечение ресурса данных, представляющего лист-список или список YANG дает более одного экземпляра и отклике применяется кодирование XML, сервер должен возвращать отклик об ошибке с кодом «400 Bad Request». В этом случае применяется тег ошибки invalid-value. Отметим, что список неконфигурационных данных не требуется для определения каких-либо ключей. В этом случае получение одного экземпляра списка невозможно.

Если запрос на извлечение ресурса данных представляет несуществующий экземпляр, сервер должен возвращать отклик об ошибке с кодом «404 Not Found». В этом случае возвращается тег ошибки invalid-value.

Если целевым ресурсом запроса на извлечение является ресурс операции, сервер должен возвращать статус «405 Method Not Allowed». В этом случае возвращается тег ошибки operation-not-supported.

Отметим, что способ контроля доступа к ресурсам данным не полностью совместим с кэшированием HTTP. Поля заголовка Last-Modified и Etag, поддерживаемые для ресурса данных, не меняются в результате смены правил доступа к этому ресурсу. Возможно, что представление ресурса данных для конкретного клиента будет изменено без отражения этого через поля Last-Modified и ETag.

Например, клиент может запросить поля заголовков отклика для XML-представления определенного ресурса album.

      GET /restconf/data/example-jukebox:jukebox/\
         library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+xml
      Cache-Control: no-cache
      ETag: "a74eefc993a2b"
      Last-Modified: Thu, 26 Jan 2017 14:02:14 GMT

      <album xmlns="http://example.com/ns/example-jukebox"
             xmlns:jbox="http://example.com/ns/example-jukebox">
        <name>Wasting Light</name>
        <genre>jbox:alternative</genre>
        <year>2011</year>
      </album>

Дополнительные примеры извлечения ресурсов представлены в Приложении B.1.

4.4. Метод POST

Сервер RESTCONF должен поддерживать метод POST, используемый клиентом для создания ресурсов данных и вызова ресурсов операций. Сервер определяет способ обработки запроса по типу целевого ресурса.

Типы ресурсов, поддерживающих метод POST.

 

Тип

Описание

Datastore

Создает ресурс конфигурационных данных верхнего уровня

Data

Создает дочерний ресурс конфигурационных данных

Operation

Вызывает операцию RPC

 

4.4.1. Режим создания ресурса

Если целевым является ресурс хранилища или данных, метод POST считается запросом на создание ресурса верхнего уровня или дочернего ресурса, соответственно. Предполагается, что message-body содержит дочерний ресурс для создания в родительском (целевом) ресурсе. Поле message-body должно содержать в точности один экземпляр ожидаемого типа ресурса. Моделью данных для дочернего дерева является субдерево, определенное в YANG для дочернего ресурса.

Параметры запроса insert (параграф 4.8.5) и point (параграф 4.8.6) должны поддерживаться методом POST для ресурсов хранилищ и данных. Эти параметры разрешены только для списков и листьев-списков, упорядочиваемых пользователем (ordered-by user).

При успешном выполнении метода POST возвращается отклик «201 Created» и сообщение не содержит message-body. Поле заголовка Location, указывающее созданный дочерний ресурс должно в этом случае присутствовать в отклике.

Если ресурс данных уже имеется, метод POST должен вызывать ошибку и возврат отклика с кодом «409 Conflict». В этом случае применяется тег ошибки resource-denied.

Если пользователь не имеет прав доступа к целевому ресурсу, следует возвращать статус ошибки «403 Forbidden». В этом случае применяется тег ошибки access-denied. Сервер может возвращать статус «404 Not Found», как описано в параграфе 6.5.4 [RFC7231]. В этом случае применяется тег ошибки invalid-value. Все прочие отклики об ошибках обрабатываются в соответствии с процедурами раздела 7.

Например, для создания нового ресурса jukebox клиент может передать запрос вида

      POST /restconf/data HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      { "example-jukebox:jukebox" : {} }

Если ресурс создан, сервер может возвратить отклик

      HTTP/1.1 201 Created
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Location: https://example.com/restconf/data/\
          example-jukebox:jukebox
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      ETag: "b3a3e673be2"

Дополнительные примеры создания ресурсов представлены в Приложении B.2.1.

4.4.2. Вызов режима операции

Если целевым является ресурс операции, метод POST считается запросом на вызов этой операции. Тело сообщения (если оно имеется) с запросом обрабатывается как входные параметры операции. Дополнительная информация о ресурсах операций представлена в параграфе 3.6.

Если запрос POST выполнен успешно, возвращается отклик «200 OK» при наличии message-body и «204 No Content» при отсутствии тела сообщения в отклике.

Если пользователь не имеет прав доступа к целевой операции, следует возвращать статус ошибки «403 Forbidden». В этом случае применяется тег ошибки access-denied. Сервер может возвращать статус «404 Not Found», как описано в параграфе 6.5.4 [RFC7231]. В этом случае применяется тег ошибки invalid-value. Все прочие отклики об ошибках обрабатываются в соответствии с процедурами раздела 7.

Например, клиент может вызвать операцию play, определенную в модуле YANG example-jukebox.

      POST /restconf/operations/example-jukebox:play HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "example-jukebox:input" : {
          "playlist" : "Foo-One",
          "song-number" : 2
        }
      }

Сервер может возвратить отклик

      HTTP/1.1 204 No Content
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server

4.5. Метод PUT

Сервер RESTCONF должен поддерживать метод PUT, с помощью которого клиент создает или заменяет ресурс данных. В запросе должно присутствовать поле message-body, представляющее новый ресурс данных, иначе сервер должен возвращать код состояния «400 Bad Request». В этом случае применяется тег ошибки invalid-value.

Для создания ресурса могут применяться методы POST и PUT. Различие состоит в том, что в методе POST клиент не указывает идентификатор для создаваемого ресурса, поскольку целевой ресурс метода POST является родителем для создаваемого ресурса. Для метода PUT целевым является создаваемый ресурс.

Метод PUT должен поддерживаться для ресурсов данных и хранилищ. PUT для хранилища данных служит для полной замены содержимого хранилища, а применительно к ресурсу данных PUT заменяет в хранилище лишь этот ресурс.

Параметры запроса insert (параграф 4.8.5) и point (параграф 4.8.6) должны поддерживаться методом PUT для ресурсов данных. Эти параметры разрешены только для списков и листьев-списков, упорядочиваемых пользователем (ordered-by user).

В соответствии с [RFC7231] при создании методом PUT нового ресурса возвращается статус «201 Created». Если же изменяется имеющийся ресурс, кодом возврата будет «204 No Content».

Если пользователь не имеет полномочий на создание или замену целевого ресурса, следует возвращать статус ошибки «403 Forbidden». В этом случае применяется тег ошибки access-denied.

Сервер может возвращать статус «404 Not Found», как описано в параграфе 6.5.4 [RFC7231]. В этом случае применяется тег ошибки invalid-value. Прочие отклики об ошибках обрабатываются в соответствии с процедурами раздела 7.

Если целевой ресурс представляет лист-список YANG, методу PUT недопустимо менять значение экземпляра leaf-list.

Если целевой ресурс представляет список YANG, значения ключевых листьев в представлении message-body должны совпадать со значениями ключевых листьев в URI запроса. Метод PUT недопустимо применять для смены значений ключевых листьев экземпляра ресурса данных.

Например, клиент может изменить дочерний ресурс album в модуле YANG example-jukebox или создать новый, если альбома еще нет. Для замены содержимого ресурса album клиент может передать запрос вила

      PUT /restconf/data/example-jukebox:jukebox/\
          library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "example-jukebox:album" : [
          {
            "name" : "Wasting Light",
            "genre" : "example-jukebox:alternative",
            "year" : 2011
          }
        ]
      }

Если ресурс обновлен, сервер может возвратить отклик

      HTTP/1.1 204 No Content
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      ETag: "b27480aeda4c"

Ниже приведен тот же запрос с использованием кодирования XML.

      PUT /restconf/data/example-jukebox:jukebox/\
          library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <album xmlns="http://example.com/ns/example-jukebox"
             xmlns:jbox="http://example.com/ns/example-jukebox">
        <name>Wasting Light</name>
        <genre>jbox:alternative</genre>
        <year>2011</year>
      </album>

Пример использования метода PUT для замены содержимого ресурса хранилища приведен в Приложении B.2.4.

4.6. Метод PATCH

Сервер RESTCONF должен поддерживать метод PATCH для простого исправления (plain patch) и может поддерживать другие типы носителей. Типы носителей для метода PATCH, поддерживаемые сервером, клиент может узнать, передав запрос OPTIONS и проверив в отклике поле заголовка Accept-Patch (параграф 4.1).

RESTCONF использует метод HTTP PATCH, определенный в [RFC5789], для реализации расширяемой схемы механизмов «наложения заплаток» (patching) на ресурсы. Каждый механизм должен иметь уникальный тип носителя.

В этом документе определен один механизм (параграф 4.6.1). Другой механизм — YANG Patch определен в [YANG-Patch]. Будущие спецификации могут определять дополнительные механизмы.

Если целевого экземпляра ресурса не существует, серверу недопустимо создавать его.

При успешном выполнении запроса PATCH возвращается отклик «200 OK» при наличии message-body и «204 No Content», если тела сообщения не передается.

Если пользователь не уполномочен изменять целевой ресурс, следует возвращать отклик об ошибке со статусом «403 Forbidden». Сервер может возвращать статус «404 Not Found», как описано в параграфе 6.5.4 [RFC7231]. В этом случае применяется тег ошибки invalid-value. Все прочие отклики об ошибках обрабатываются в соответствии с процедурами, определенными в разделе 7.

4.6.1. Механизм простого исправления

Механизм простого исправления (plain patch) объединяет тело сообщения с целевым ресурсом. Поле message-body должно присутствовать для простого исправления и должно иметь тип носителя application/yang-data+xml или application/yang-data+json.

Простое исправление можно применять для создания или обновления, но не для удаления дочернего ресурса внутри целевого. Поддержка другого типа носителя для возможности удаления дочерних ресурсов описана в [YANG-Patch]. Тип носителя YANG Patch позволяет выполнить множество субопераций (например, merge, delete) в одном запросе PATCH.

Если целевой ресурс представлен узлом YANG, методу PATCH недопустимо менять значение экземпляра leaf-list.

Если целевой ресурс представлен экземпляром YANG list, значения ключевых листьев в представлении message-body должны совпадать со значениями ключевых листьев в URI запроса. Метод PATCH недопустимо применять для изменения значений ключевых листьев для экземпляра ресурса данных.

После обработки простого исправления сервером клиенту будет возвращаться отклик, как описано в параграфе 4.6.

Например, для замены поля year в ресурсе album (вместо замены всего ресурса методом PUT) клиент может передать простое исправление

      PATCH /restconf/data/example-jukebox:jukebox/\
          library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com
      If-Match: "b8389233a4c"
      Content-Type: application/yang-data+xml

      <album xmlns="http://example.com/ns/example-jukebox">
       <year>2011</year>
      </album>

Если поле будет обновлено, сервер может вернуть отклик вида

      HTTP/1.1 204 No Content
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      ETag: "b2788923da4c"

4.7. Метод DELETE

Сервер RESTCONF должен поддерживать метод DELETE, используемый клиентом для удаления целевого ресурса. При успешном удалении возвращается статус «204 No Content».

Если пользователь не уполномочен удалять целевой ресурс, следует возвращать отклик об ошибке со статусом «403 Forbidden». Сервер может возвращать статус «404 Not Found», как описано в параграфе 6.5.4 [RFC7231]. В этом случае применяется тег ошибки invalid-value. Все прочие отклики об ошибках обрабатываются в соответствии с процедурами, определенными в разделе 7.

Если целевой узел представляет список или лист-список конфигурационных данных, он должен представлять один экземпляр листа списка или списка YANG. Серверу недопустимо использовать метод DELETE для удаления более одного такого экземпляра.

Например, для удаления ресурса album с ключом Wasting Light клиент может передать запрос вида

      DELETE /restconf/data/example-jukebox:jukebox/\
          library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com

Если ресурс удален, сервер может возвратить отклик

      HTTP/1.1 204 No Content
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server

4.8. Параметры запроса

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

  • Параметры запроса могут размещаться в любом порядке.

  • Каждый параметр может включаться в URI запроса не более одного раза.

  • при наличии в запросе более одного экземпляра параметра сервер должен возвращать статус «400 Bad Request». В этом случае применяется тег ошибки invalid-value.

  • При отсутствии параметра используется заданное по умолчанию значение.

  • Регистры символов в именах и значениях параметров принимаются во внимание.

  • Сервер должен возвращать статус «400 Bad Request» при получении неожиданного параметра в запросе. В этом случае применяется тег ошибки invalid-value.

Параметры запроса RESTCONF.

Имя

Методы

Описание

content

GET, HEAD

Выбирает ресурсы конфигурационных и/или неконфигурационных данных

depth

GET, HEAD

Запрашивает ограниченную глубину субдерева в содержимом отклика

fields

GET, HEAD

Запрашивает подмножество содержимого целевого ресурса

filter

GET, HEAD

Логический фильтр уведомлений для ресурса потока событий

insert

POST, PUT

Режим вставки для упорядочиваемых пользователем ресурсов данных

point

POST, PUT

Место вставки для упорядочиваемых пользователем ресурсов данных

start-time

GET, HEAD

Время начала в буфере воспроизведения для ресурса потока событий

stop-time

GET, HEAD

Время остановки в буфере воспроизведения для ресурса потока событий

with-defaults

GET, HEAD

Управляет извлечением принятых по умолчанию значений

Примеры использования параметров запросов приведены в Приложении B.3.

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

4.8.1. Параметр content

Параметр content управляет обработкой в отклике узлов-потомков запрашиваемого узла. Разрешенные значения приведены в таблице.

 

Значение

Описание

config

Возвращаются только конфигурационные узлы-потомки.

nonconfig

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

all

Возвращаются все узлы-потомки.

 

Этот параметр разрешен только для метода GET применительно к ресурсам данных и хранилищ. При использовании другого метода или типа ресурса возвращается отклик «400 Bad Request».

Если этот параметр запроса не указан, применяется значение all. Параметр должен поддерживаться сервером.

4.8.2. Параметр depth

Параметр запроса depth указывает глубину возвращаемого сервером субдерева. Узлы данных со значением глубины, превышающим параметр depth, не возвращаются в отклике на запрос с методом GET.

Запрошенный узел данных имеет глубину 1. Если применяется параметр fields (параграф 4.8.3) для выбора узлов-потомков, эти узлы и все их предки будут иметь «глубину» 1 (это эффект включения узлов, заданных полем fields, даже если значение depth меньше реальной глубины заданных полей). Все прочие дочерние узлы имеют глубину на 1 больше глубины для их родителя.

Параметр depth может принимать целочисленные значения от 1 до 65535 или строку «unbounded» (используется по умолчанию).

Этот параметр разрешен только для запросов GET к ресурсам API, хранилищ и данных. В остальных случаях будет возвращаться статус «400 Bad Request».

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

Если URI параметра запроса depth указан в листе списке capability, определенном в параграфе 9.3, это говорит о поддержке сервером параметра запроса depth.

4.8.3. Параметр fields

Параметр запроса fields опционально применяется для указания узлов данных в целевом ресурсе для извлечения методом GET. Клиент может использовать этот параметр для задания подмножества извлекаемых узлов ресурса.

Сервер будет возвращать тело сообщения, представляющее целевой ресурс, с узлами-потомками, «обрезанными» в соответствии со значением fields-expr. Сервер не возвращает отдельных субресурсов.

Значение параметра fields следует приведенному ниже правилу

    fields-expr = path "(" fields-expr ")" / path ";" fields-expr / path
    path = api-identifier [ "/" path ]

Идентификатор api-identifier определен в параграфе 3.5.3.1, символ «;» служит для выбора множества узлов. Например, для извлечение лишь жанра (genre) и года выпуска (year) альбома можно указать fields=genre;year.

Скобки служат для задания субселекторов узла. Отметим отсутствие символа-разделителя «/» между полем path и левой скобкой (.

Предположим, например, что целевым ресурсом является список album. Для извлечения только label и catalogue-number из контейнера admin в альбоме, можно использовать fields=admin(label;catalogue-number).

Символ / используется в пути для извлечения дочернего узла. Например, для извлечения лишь метки (label) альбома можно указать fields=admin/label.

Этот параметр разрешен только для запросов GET к ресурсам API, хранилищ и данных. В остальных случаях будет возвращаться статус «400 Bad Request».

Если URI параметра запроса fields указан в листе списке capability, определенном в параграфе 9.3, это говорит о поддержке сервером параметра запроса fields.

4.8.4. Параметр filter

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

Этот параметр разрешен только для запросов GET к ресурсам потока событий. В остальных случаях будет возвращаться статус «400 Bad Request».

Для этого параметра применяется формат выражений XPath 1.0 [XPath], которые вычисляются в описанном ниже контексте.

  • Набором деклараций пространств имен является набор пар префиксов и пространств имен для всех поддерживаемых модулей YANG, где префиксом является имя модуля YANG, а пространство имен определяется оператором namespace в модуле YANG.

  • Библиотекой функций служит библиотека функций ядра, определенная в XPath 1.0, с добавлением любых функций, определенных моделью данных.

  • Набор привязок переменных пуст.

  • Узлом контекста является корневой узел.

Параметр запроса filter применяется в соответствии с определением параграфа 3.6 в [RFC5277]. Если логическим результатом выражения для концептуального корня документа notification является true, уведомление о событии доставляется клиенту.

Если URI параметра запроса filter указан в листе списке capability, определенном в параграфе 9.3, это говорит о поддержке сервером параметра запроса filter.

4.8.5. Параметр insert

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

 

Значение

Описание

first

Вставка новых данных как первой записи.

last

Вставка новых данных как последней записи.

before

Вставка новых данных перед позицией, указанной параметром point.

after

Вставка новых данных после позиции, указанной параметром point.

 

По умолчанию применяется значение last.

Этот параметр поддерживается только для методов POST и PUT и лишь для целевых ресурсов, которые являются данными, представляющими список или лист-список YANG, упорядочиваемый пользователем (ordered-by user).

При использовании значения before или after должен указываться также параметр point. В противном случае будет возвращаться статус ошибки «400 Bad Request».

Сервер должен поддерживать параметр insert.

4.8.6. Параметр point

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

Значением параметра point является строка, указывающая путь для вставки объекта. Формат строки совпадает с форматом строки URI для целевого ресурса.

Этот параметр поддерживается только для методов POST и PUT и лишь для целевых ресурсов, которые являются данными, представляющими список или лист-список YANG, упорядочиваемый пользователем (ordered-by user).

Если в запросе не указан также параметр insert или он имеет значение, отличное от before и after, будет возвращаться статус ошибки «400 Bad Request».

Этот параметр содержит идентификатор экземпляра ресурса, служащего точкой вставки для метода POST или PUT.

Сервер должен поддерживать параметр point.

4.8.7. Параметр start-time

Параметр запроса start-time служит для инициирования функции воспроизведения уведомлений, определенной в [RFC5277], и указывает начальный момент для воспроизведения записанных уведомлений. Если сервер не поддерживает воспроизведения уведомлений согласно атрибуту replay-support, возвращенному записью списка stream для потокового ресурса, сервер должен возвращать статус «400 Bad Request».

Значение параметра start-time имеет тип date-and-time, определенный в модуле YANG ietf-yang-types [RFC6991].

Этот параметр разрешен только для запросов GET к ресурсам данных text/event-stream. В остальных случаях будет возвращаться статус «400 Bad Request».

Если этот параметр отсутствует, подписка на воспроизведение не запрашивается. Время начала воспроизведения, превышающее текущее время, будет недействительным. Если указано время начала раньше, чем имеется в записи, воспроизведение начнется с самого раннего из доступных уведомлений. Клиент может узнать текущее время сервера из поля заголовка Date, возвращаемого сервером в откликах в соответствии с [RFC7231].

Если этот параметр поддерживается сервером, идентификатор URI параметра запроса replay должен быть указан в листе-списке capability, определенном в параграфе 9.3, и сервер должен поддерживать также параметр stop-time.

Если лист replay-support в записи stream (параграф 9.3) имеет значение true, сервер должен поддерживать для этого потока параметры start-time и stop-time.

4.8.8. Параметр stop-time

Параметр запроса stop-time используется с функцией воспроизведения для указания последнего из интересующих уведомлений. Этот параметр должен использоваться вместе с параметром start-time и иметь большее значение.

Значение параметра stop-time имеет тип date-and-time, определенный в модуле YANG ietf-yang-types [RFC6991].

Этот параметр разрешен только для запросов GET к ресурсам данных text/event-stream. В остальных случаях будет возвращаться статус «400 Bad Request».

Если этот параметр отсутствует, уведомления будут воспроизводиться до завершения подписки. Допускается указание будущего времени.

Если этот параметр поддерживается сервером, идентификатор URI параметра запроса replay должен быть указан в листе-списке capability, определенном в параграфе 9.3, и сервер должен поддерживать также параметр start-time.

Если лист replay-support в записи stream (параграф 9.3) имеет значение true, сервер должен поддерживать для этого потока параметры start-time и stop-time.

4.8.9. Параметр with-defaults

Параметр запроса with-defaults служит для управления возвратом информации из узлов с принятыми по умолчанию значениями при запросах GET к ресурсам данных.

Если сервер поддерживает такую возможность, он должен реализовать поведение, описанное в параграфе 4.5.1 [RFC6243], применительно к операциям RESTCONF GET взамен операций NETCONF.

Значение

Описание

report-all

Возвращаются все узлы данных

trim

Узлы данных с принятыми по умолчанию значениями YANG не возвращаются

explicit

Узлы данных с принятыми по умолчанию значениями YANG возвращаются

report-all-tagged

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

Если для параметра with-defaults задано значение report-all, сервер должен придерживаться режима возврата принятых по умолчанию значений, определенного в параграфе 3.1 [RFC6243].

При with-defaults=trim сервер должен сервер должен придерживаться режима возврата принятых по умолчанию значений, определенного в параграфе 3.2 [RFC6243].

Для with-defaults=explicit сервер должен сервер должен придерживаться режима возврата принятых по умолчанию значений, определенного в параграфе 3.3 [RFC6243].

Если установлено with-defaults=report-all-tagged, сервер должен придерживаться режима возврата принятых по умолчанию значений, определенного в параграфе 3.4 [RFC6243]. Метаданные возвращаются сервером в соответствии с параграфом 5.3. XML-кодирование для атрибута default, передаваемого сервером для узлов с принятыми по умолчанию значениями, определено в разделе 6 [RFC6243]. Кодирование JSON для атрибута default должно использовать значения, определенные в [RFC6243], но с правилами кодирования [RFC7952]. Для атрибута default должно применяться имя модуля ietf-netconf-with-defaults.

Если параметр with-defaults не задан, сервер должен следовать при передаче принятых по умолчанию значений поведению, заданному параметром basic-mode для URI возможности defaults и описанному в параграфе 9.1.2.

Если сервер включает URI параметра запроса with-defaults в свой лист-список capability, определенный в параграфе 9.3, он должен поддерживать параметр запроса with-defaults.

Поскольку сервер не сообщает параметр also-supported, как описано в параграфе 4.3 [RFC6243], возможно, что некоторые значения параметра with-defaults не будут поддерживаться. Если сервер не поддерживает запрошенное значение with-defaults, он должен возвращать статус «400 Bad Request». В таких случаях применяется тег ошибки invalid-value.

5. Сообщения

Протокол RESTCONF использует сообщения HTTP. Одно сообщение HTTP соответствует одному методу протокола. Большинство сообщений может выполнять одну задачу с одним ресурсом, например, извлечение или редактирование ресурса. Исключением является метод PATCH, который позволяет одним сообщением выполнить множество операций редактирования хранилища данных.

5.1. Структура URI запроса

Ресурсы указываются идентификаторами URI, имеющими структуру базовых URI из [RFC3986].

Операции RESTCONF выводятся из метода HTTP и URI запроса с использованием приведенных ниже полей.

<OP> /<restconf>/<path>?<query>

  ^       ^        ^       ^
  |       |        |       |
method  entry  resource  query

  M       M        O        O

M=обязательно, O=не обязательно

<OP> — метод HTTP;

<restconf> — корневой ресурс RESTCONF;

<path> — URI целевого ресурса;

<query> — список параметров запроса.

  • method — метод HTTP, указывающий операцию RESTCONF, запрошенную клиентом, для выполнения применительно к целевому ресурсу, заданному в URI запроса. Подробное описание операций RESTCONF дано в разделе 4.

  • entry — корень RESTCONF API, заданного на этом сервере HTTP, определяемый из ресурса /.well-known/host-meta, как описано в параграфе 3.1.

  • resource — выражение пути, указывающее ресурс для доступа с помощью операции RESTCONF. Если это поле не указано, целевым ресурсом является интерфейс API, представленный шаблоном данных YANG с именем yang-api (раздел 8).

  • query — набор параметров, связанных с сообщением RESTCONF (см. параграф 3.4 в [RFC3986]). Параметры RESTCONF имеют форму пар name=value. Большинство параметров являются необязательными для реализации сервером и применения клиентами. Каждый необязательный параметр запроса указывается идентификатором URI. Сервер должен перечислять URI поддерживаемых параметров запроса в листе-списке capability, определенном в параграфе 9.3.

Определен конкретный набор параметров, хотя сервер может поддерживать параметры, не определенные в этом документе. Содержимое любого параметра запроса должно кодироваться в соответствии с параграфом 3.4 [RFC3986]. Для всех зарезервированных символов должно применяться %-кодирование в соответствии с параграфами 2.1 и 2.5 [RFC3986].

Отметим, что компонент фрагментов не используется протоколом RESTCONF и фрагмент исключается сервером из целевого URI, как описано в параграфе 5.1 [RFC7230].

При создании клиентом нового ресурса возвращается поле заголовка Location, который указывает путь для созданного ресурса. Клиент применяет именно этот идентификатор пути для доступа к ресурсу после его создания.

Целью операций RESTCONF являются ресурсы. Поле path в URI запроса представляет целевой ресурс для операции RESTCONF.

Примеры URI запросов RESTCONF представлены в Приложении B.

5.2. Кодирование сообщений

Сообщения RESTCONF кодируются в HTTP согласно [RFC7230] с использованием кодировки utf-8 для всех сообщений. Содержимое сообщения RESTCONF передается в теле сообщения HTTP.

Содержимое кодируется в формате JSON или XML. Сервер должен поддерживать один из этих форматов и может поддерживать оба. Клиенту нужно поддерживать XML и JSON для взаимодействия со всеми серверами RESTCONF.

Правила кодирования XML для узлов данных определены в [RFC7950] и применяются для всего содержимого XML. Правила кодирования JSON определены в [RFC7951], а дополнительные правила кодирования метаданных — в [RFC7952]. Это кодирование является корректным JSON, но применяет специальные правила для указания пространства имен модуля и обеспечения согласованного типа обработки данных YANG.

Формат кодирования входных данных запроса указывается полем заголовка Content-Type, которое должно присутствовать, если клиент передает message-body.

Сервер должен поддерживать поле заголовка Accept и код статуса «406 Not Acceptable», как указано в [RFC7231]. Формат кодирования содержимого выхода отклика , который клиент будет воспринимать, указывается полем Accept в заголовке запроса. Если поле не задано, следует использовать формат кодирования входных данных запроса или сервер может выбрать любой поддерживаемый формат кодирования содержимого.

Если запрос не имеет входных данных, по умолчанию применяется кодирование XML или JSON, в зависимости от предпочтений сервера. Расширения файлов, закодированные в запросе, не применяются для указания формата кодирования.

Клиент может определить, поддерживает ли сервер RESTCONF формат кодирования, передав запрос с указанием конкретного формата в поле Content-Type и/или Accept. Если сервер не поддерживает запрошенное кодирование ввода из запроса, он должен вернуть отклик с кодом «415 Unsupported Media Type». Если сервер не поддерживает ни один из запрошенных методов кодирования вывода, он должен вернуть отклик «406 Not Acceptable».

5.3. Метаданные RESTCONF

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

При кодировании XML метаданные представляются как атрибуты XML в соответствии с параграфом 3.3 [W3C.REC-xml-20081126], при кодировании JSON — в соответствии с [RFC7952].

Приведенные ниже примеры основаны на Приложении B.3.9. Режим report-all-tagged для параметра запроса with-defaults требует возврата атрибута default для узлов с принятыми по умолчанию значениями. В примерах этот атрибут используется для листа mtu.

5.3.1. Пример XML-кодирования метаданных

      GET /restconf/data/interfaces/interface=eth1
          ?with-defaults=report-all-tagged HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+xml

      <interface
        xmlns="urn:example.com:params:xml:ns:yang:example-interface">
        <name>eth1</name>
        <mtu xmlns:wd="urn:ietf:params:xml:ns:netconf:default:1.0"
          wd:default="true">1500</mtu>
        <status>up</status>
      </interface>

5.3.2. Пример JSON-кодирования метаданных

Отметим, что RFC 6243 определяет атрибут default с XSD14, а не YANG, поэтому имя модуля YANG указано напрямую, а не берется из модуля YANG. Значение ietf-netconf-with-defaults назначено для JSON-кодирования метаданных.

      GET /restconf/data/interfaces/interface=eth1\
          ?with-defaults=report-all-tagged HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "example:interface" : [
          {
            "name" : "eth1",
            "mtu" : 1500,
            "@mtu" : {
               "ietf-netconf-with-defaults:default" : true
            },
            "status" : "up"
          }
        ]
      }

5.4. Статус возврата

Каждое сообщение представляет тот или иной вариант доступа к ресурсу и для каждого запроса возвращается поле заголовка HTTP status-line. Если код статуса относится к группе 4xx, в отклике следует возвращать информацию об ошибке в соответствии с форматом, описанным в параграфе 7.1. Для кодов группы 5xx также может возвращаться информация об ошибке в описанном в параграфе 7.1 формате. Коды из групп 1xx, 2xx, 3xx не связаны с ошибками, поэтому для таких откликов недопустимо включать информацию об ошибке.

5.5. Кэширование сообщений

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

Вместо того чтобы полагаться на кэширование HTTP, клиенту следует контролировать поля заголовка Etag и/или Last-Modified, возвращаемые сервером для ресурса хранилища (или ресурса данных, если сервер поддерживает это). Запрос на извлечение ресурса может включать поля заголовка If-None-Match и/или If-Modified-Since, которые будут требовать от сервера возврата статуса «304 Not Modified», если ресурс не был изменен. Клиент может применять метод HEAD для извлечения только полей заголовков, в который следует включать поля Etag и Last-Modified, если для целевого ресурса поддерживаются метаданные.

Отметим, что для ресурсов данных может применяться контроль доступа, поэтому значения в полях заголовка Last-Modifiedи Etag, поддерживаемые для ресурса данных, могут оказаться ненадежными, как описано в параграфе 4.3.

6. Уведомления

Протокол RESTCONF поддерживает определенные в YANG уведомления о событиях. Решение сохраняет возможности уведомления о событиях протокола NETCONF [RFC5277] на основе транспортной стратегии SSE [W3C.REC-eventsource-20150203].

6.1. Поддержка на сервере

Сервер RESTCONF может поддерживать уведомления RESTCONF. Клиент может узнать о поддержке уведомлений RESTCONF с помощью метода HTTP OPTIONS, HEAD или GET из списка stream. Если сервер не поддерживает уведомлений RESTCONF, он будет возвращать код ошибки HTTP (например, статус «404 Not Found»).

6.2. Потоки событий

Сервер RESTCONF, поддерживающий уведомления, будет заполнять ресурс потока для каждой точки доступа к службе доставки уведомлений. Клиент RESTCONF может получить список поддерживаемых потоков событий от сервера RESTCONF, использовав метод GET для списка stream.

Определение контейнера restconf-state/streams в модуле ietf-restconf-monitoring (параграф 9.3) используется для задания синтаксиса и структуры концептуальных дочерних ресурсов в ресурсе streams.

Например, клиент может передать запрос вида

      GET /restconf/data/ietf-restconf-monitoring:restconf-state/\
          streams HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Content-Type: application/yang-data+xml

      <streams
        xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring">
         <stream>
            <name>NETCONF</name>
            <description>Принятый по умолчанию поток событий NETCONF</description>
            <replay-support>true</replay-support>
            <replay-log-creation-time>\
               2007-07-08T00:00:00Z\
            </replay-log-creation-time>
            <access>
               <encoding>xml</encoding>
               <location>https://example.com/streams/NETCONF\
               </location>
            </access>
            <access>
               <encoding>json</encoding>
               <location>https://example.com/streams/NETCONF-JSON\
               </location>
            </access>
         </stream>
         <stream>
            <name>SNMP</name>
            <description>Уведомления SNMP</description>
            <replay-support>false</replay-support>
            <access>
               <encoding>xml</encoding>
               <location>https://example.com/streams/SNMP</location>
            </access>
         </stream>
         <stream>
            <name>syslog-critical</name>
            <description>Критические и важные события</description>
            <replay-support>true</replay-support>
            <replay-log-creation-time>
               2007-07-01T00:00:00Z
            </replay-log-creation-time>
            <access>
               <encoding>xml</encoding>
               <location>\
                 https://example.com/streams/syslog-critical\
               </location>
            </access>
         </stream>
      </streams>

6.3. Подписка на уведомления

Клиенты RESTCONF могут определить URL для ресурса подписки (на уведомления) путем отправки запроса GET для листа location с элементом списка stream. Возвращенное значение можно использовать для подписки на уведомления.

Клиент будет передавать запрос HTTP GET для возвращенного сервером URL с Accept типа text/event-stream.

Сервер будет считать соединение потоком событий, используя транспортную стратегию SSE [W3C.REC-eventsource-20150203].

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

Например, клиент может передать запрос

      GET /restconf/data/ietf-restconf-monitoring:restconf-state/\
          streams/stream=NETCONF/access=xml/location HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может вернуть приведенный ниже отклик.

      HTTP/1.1 200 OK
      Content-Type: application/yang-data+xml

      <location
        xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring">\
        https://example.com/streams/NETCONF\
      </location>

Клиент RESTCONF может затем использовать URL для мониторинга потока уведомлений.

      GET /streams/NETCONF HTTP/1.1
      Host: example.com
      Accept: text/event-stream
      Cache-Control: no-cache
      Connection: keep-alive

Клиент RESTCONF может запросить у сервера сжатие событий с помощью поля в заголовке HTTP Accept-Encoding.

      GET /streams/NETCONF HTTP/1.1
      Host: example.com
      Accept: text/event-stream
      Cache-Control: no-cache
      Connection: keep-alive
      Accept-Encoding: gzip, deflate

6.3.1. Поток событий NETCONF

Серверам следует поддерживать поток событий NETCONF, определенный в параграфе 3.2.3 [RFC5277]. Уведомления для этого потока кодируются в XML.

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

Сервер может поддерживать параметры запросов start-time, stop-time и filter, определенные в параграфе 4.8. Примеры использования параметров представлены в Приложении B.3.6.

6.4. Прием потока событий

Уведомления RESTCONF кодируются в соответствии с определением потока событий.

Структура данных уведомления основана на определении элемента <notification> в разделе 4 [RFC5277]. Она должна соответствовать схеме для элемента <notification> из раздела 4 [RFC5277] с использованием пространства имен XML, определенного в XSD как показано ниже.

     urn:ietf:params:xml:ns:netconf:notification:1.0

При кодировании JSON именем модуля для элемента notification является ietf-restconf.

В контейнере notification предполагаются два дочерних узла, представляющих время события и его данные. Узел eventTime определен в том же пространстве имен XML, что и элемент <notification>. Для кодирования JSON используется пространство имен модуля ietf-restconf.

Имя и пространство имен элемента данных определяется модулем YANG, содержащим оператор notification-stmt, который представляет уведомления.

В приведенном ниже примере используется модуль YANG example-mod.

     module example-mod {
       namespace "http://example.com/event/1.0";
       prefix ex;

       organization "Example, Inc.";
       contact "support at example.com";
       description "Пример модуля модели данных уведомления.";
       revision "2016-07-07" {
         description "Первый выпуск.";
         reference "example.com document 2-9976.";
       }

       notification event {
         description "Пример уведомления о событии.";
         leaf event-class {
           type string;
           description "Идентификатор класса события.";
         }
         container reporting-entity {
           description "Информация для конкретного события.";
           leaf card {
             type string;
             description "Идентификатор линейной платы.";
           }
         }
         leaf severity {
           type string;
           description "Описание важности события.";
         }
       }
     }

Пример уведомления SSE для события в формате XML может иметь вид

      data: <notification
      data:    xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
      data:    <eventTime>2013-12-21T00:01:00Z</eventTime>
      data:    <event xmlns="http://example.com/event/1.0">
      data:       <event-class>fault</event-class>
      data:       <reporting-entity>
      data:           <card>Ethernet0</card>
      data:       </reporting-entity>
      data:       <severity>major</severity>
      data:     </event>
      data: </notification>

Пример уведомления SSE для события в формате JSON может иметь вид

      data: {
      data:   "ietf-restconf:notification" : {
      data:     "eventTime" : "2013-12-21T00:01:00Z",
      data:     "example-mod:event" : {
      data:       "event-class" : "fault",
      data:       "reporting-entity" : { "card" : "Ethernet0" },
      data:       "severity" : "major"
      data:     }
      data:   }
      data: }

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

XML

      data: <notification xmlns="urn:ietf:params:xml:ns:netconf:notif\
      ication:1.0"><eventTime>2013-12-21T00:01:00Z</eventTime><event \
      xmlns="http://example.com/event/1.0"><event-class>fault</event-\
      class><reportingEntity><card>Ethernet0</card></reporting-entity>\
      <severity>major</severity></event></notification>

JSON

      data: {"ietf-restconf:notification":{"eventTime":"2013-12-21\
      T00:01:00Z","example-mod:event":{"event-class": "fault","repor\
      tingEntity":{"card":"Ethernet0"},"severity":"major"}}}

Спецификация SSE поддерживает дополнительные поля event, id и retry. Сервер RESTCONF может передавать поле retry и в таких случаях клиентам RESTCONF следует применять его. Серверу RESTCONF не следует передавать поля event и id, поскольку нет осмысленных значений, которые могут использоваться для них, не дублируя содержимого самих уведомлений. Серверам RESTCONF, не передающим поле id, не требуется также поддержка поля заголовка HTTP Last-Event-ID [W3C.REC-eventsource-20150203]. Серверам RESTCONF, передающим поле id, следует поддерживать параметр start-time как предпочтительный способ задания клиентом точки воспроизведения потока событий.

7. Информация об ошибках

Для отчета об успехе или отказе операций RESTCONF используются коды статуса HTTP. Информация об ошибках, которую отклики NETCONF содержат в элементе <rpc-error>, адаптирована для применения в RESTCONF и информация дерева данных <errors> возвращается для кодов состояния 4xx и 5xx.

Поскольку ресурс операций определен с оператором YANG rpc, а ресурс действий — с оператором YANG action, требуется отображение значений NETCONF <error-tag> на коды состояния HTTP. Конкретные теги ошибок и коды отклика зависят от используемой модели и могут указываться в операторах YANG description для action и rpc.

Сопоставление <error-tag> и Status Code.

 

Тег ошибки

Код состояния

in-use

409

invalid-value

400, 404, 406

(запрос) too-big

413

(отклик) too-big

400

missing-attribute

400

bad-attribute

400

unknown-attribute

400

bad-element

400

unknown-element

400

unknown-namespace

400

access-denied

401 или 403

lock-denied

409

resource-denied

409

rollback-failed

500

data-exists

409

data-missing

409

operation-not-supported

405 или 501

operation-failed

412 или 500

partial-operation

500

malformed-message

400

 

7.1. Сообщения с откликом на ошибку

При возникновении ошибки для запросного сообщения к любому типу ресурса и возврате кода 4xx (кроме «403 Forbidden») серверу следует включать в отклик message-body с информацией, описанной шаблоном данных YANG yang-errors из модуля ietf-restconf, определенного в разделе 8. Поле Content-Type в таких откликах должно иметь значение application/yang-data и может включать суффикс имени структурированного синтаксиса.

Клиенту следует указать желаемое кодирование (можно несколько) откликов путем задания подходящих типов носителей в заголовке Accept. Если клиент не указал заголовок Accept, следует использовать суффикс имени структурированного синтаксиса из запроса или сервер может выбрать поддерживаемый вариант кодирования сообщений. Если сообщения с запросом нет, сервер должен выбрать предпочтительный для него вариант из application/yang-data+xml и application/yang-data+json. Во всех примерах этого документа, за исключением приведенного ниже, предполагается возврат в случае ошибки сообщений с кодированием XML.

Дерево YANG для данных <errors> показано ниже.

     +---- errors
           +---- error*
              +---- error-type       enumeration
              +---- error-tag        string
              +---- error-app-tag?   string
              +---- error-path?      instance-identifier
              +---- error-message?   string
              +---- error-info?

Семантика и синтаксис сообщений об ошибках RESTCONF определены в модуле YANG yang-errors (раздел 8).

Приведенный ниже пример показывает ошибку lock-denied, которая возникает, если клиент NETCONF уже заблокировал ресурс. Клиент RESTCONF пытается удалить ресурс данных. Отметим, что поле заголовка Accept здесь указывает желаемую кодировку для сообщения об ошибке. После успешной операции message-body не будет в отклике.

      DELETE /restconf/data/example-jukebox:jukebox/\
         library/artist=Foo%20Fighters/album=Wasting%20Light HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 409 Conflict
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "ietf-restconf:errors" : {
          "error" : [
            {
              "error-type" : "protocol",
              "error-tag" : "lock-denied",
              "error-message" : "Отказ в блокировке - уже заблокировано"
            }
          ]
        }
      }

Приведенный ниже пример показывает ошибку data-exists для ресурса данных. Ресурс jukebox уже имеется и не может быть создан по запросу клиента.

      POST /restconf/data/example-jukebox:jukebox HTTP/1.1
      Host: example.com

Сервер может возвратить отклик

      HTTP/1.1 409 Conflict
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+xml

      <errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
        <error>
          <error-type>protocol</error-type>
          <error-tag>data-exists</error-tag>
          <error-path
            xmlns:rc="urn:ietf:params:xml:ns:yang:ietf-restconf"
            xmlns:jbox="https://example.com/ns/example-jukebox">\
            /rc:restconf/rc:data/jbox:jukebox
          </error-path>
          <error-message>
            Данные уже имеются и создать новый ресурс нельзя
          </error-message>
        </error>
      </errors>

8. Модуль RESTCONF

Модуль ietf-restconf содержит концептуальные определения в расширении и двух группировках, которые не предназначены для реализации в качестве содержимого хранилища данных на сервере. Например, контейнер restconf не предназначен для реализации в качестве узла данных верхнего уровня (под /restconf/data URI).

Отметим, что модуль ietf-restconf не имеет доступных для протокола объектов, поэтому дерево YANG не приводится.

   <CODE BEGINS>

   file "ietf-restconf@2017-01-26.yang"

   module ietf-restconf {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-restconf";
     prefix "rc";

     organization
       "IETF NETCONF (Network Configuration) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netconf/> 
        WG List:  <mailto:netconf@ietf.org> 

        Author:   Andy Bierman <mailto:andy@yumaworks.com> 

        Author:   Martin Bjorklund <mailto:mbj@tail-f.com> 

        Author:   Kent Watsen <mailto:kwatsen@juniper.net>"; 

     description
       "Этот модуль содержит концептуальные спецификации YANG для
        определений базовых типов носителей RESTCONF, используемых
        в сообщениях протокола RESTCONF.

        Отметим, что определения YANG в этом модуле не представляют
        данных конфигурации. Оператор расширения restconf-media-type
        обеспечивает нормативный синтаксис для кодирования сообщений 
        с использованием XML и JSON.

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

        Распространение и использование в исходной и двоичной форме
        с изменениями или без них разрешается в соответствии с условиями,
        указанными в упрощенной лицензии BSD, изложенной в разделе 4.c
        Правового положения IETF Trust применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC 8040, где
        правовые аспекты выражены более полно.";

     revision 2017-01-26 {
       description
         "Первый выпуск.";
       reference
         "RFC 8040: RESTCONF Protocol.";
     }

     extension yang-data {
       argument name {
         yin-element true;
       }
       description
         "Это расширение служит для задания шаблона данных YANG, 
          представляющего концептуальные данные, определенные в YANG.
          Это предназначено для описания иерархических данных, 
          независимых от контекста протокола и формата кодирования
          сообщений. Операторы определения данных в yang-data задают
          базовый синтаксис для конкретного шаблона данных YANG,
          имя которого является аргументом оператора yang-data.

          Отметим, что это расширение не определяет тип носителя.
          Спецификация применения этого расширения ДОЛЖНА указывать
          правила кодирования сообщений, включая тип носителя.

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

          Это расширение игнорируется, если оно не указано в операторе
          верхнего уровня. Оно ДОЛЖНО содержать операторы определения
          данных, которые создают в точности одно определение узла-
          контейнера. Экземпляр шаблона данных YANG может транслироваться
          в экземпляр документа XML, чей элемент верхнего уровня 
          соответствует контейнеру верхнего уровня.

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

          Субоператоры в этом расширении ДОЛЖНЫ следовать правилу
          data-def-stmt в YANG ABNF.

          Корень документа XPath является самим оператором расширения, 
          так что дочерние узлы корня документа представляются 
          субоператорами data-def-stmt в этом расширении. Этот 
          концептуальный документ является контекстом для операторов:
            - must-stmt
            - when-stmt
            - path-stmt
            - min-elements-stmt
            - max-elements-stmt
            - mandatory-stmt
            - unique-stmt
            - ordered-by
            - instance-identifier data type

          Приведенные ниже субоператоры data-def-stmt ограничены при
          использовании в операторе расширения yang-data.
            - От list-stmt не требуется наличия определенного key-stmt.
            - if-feature-stmt игнорируется при наличии.
            - config-stmt игнорируется при наличии.
            - Доступные значения для identity любых листьев и листьев- 
              списков identityref ограничены модулем, содержащим
              этот оператор расширения и модулями, импортированными 
              в этот модуль.";
     }

     rc:yang-data yang-errors {
       uses errors;
     }

     rc:yang-data yang-api {
       uses restconf;
     }

     grouping errors {
       description
         "Группировка, содержащая контейнер YANG, представляющий
          синтаксис и семантику отчетов об ошибках YANG Patch в
          сообщениях с откликами.";

       container errors {
         description
           "Представляет отчет об ошибке, возвращаемый сервером,
            если запрос вызывает ошибку.";

         list error {
           description
             "Запись, содержащая информацию о конкретной ошибке
              при обработке запроса RESTCONF.";
           reference
             "RFC 6241, Section 4.3.";

           leaf error-type {
             type enumeration {
               enum transport {
                 description
                   "Транспортный уровень.";
               }
               enum rpc {
                 description
                   "Уровень rpc или notification.";
               }
               enum protocol {
                 description
                   "Уровень протокольных операций.";
               }
               enum application {
                 description
                   "Уровень серверного приложения.";
               }
             }
             mandatory true;
             description
               "Уровень протокола, где произошла ошибка.";
           }

           leaf error-tag {
             type string;
             mandatory true;
             description
               "Перечисляемое значение error-tag.";
           }

           leaf error-app-tag {
             type string;
             description
               "Связанное с приложением значение error-tag.";
           }

           leaf error-path {
             type instance-identifier;
             description
               "Идентификатор экземпляра YANG, связанного с узлом ошибки.";
           }

           leaf error-message {
             type string;
             description
               "Сообщение, описывающее ошибку.";
           }

           anydata error-info {
              description
                "Это значение anydata ДОЛЖНО представлять контейнер,
                 который может содержать узлы данных с дополнительными
                 сведениями об ошибке.";
           }
         }
       }
     }

     grouping restconf {
       description
         "Концептуальная группировка, представляющая корневой ресурс
          RESTCONF.";

       container restconf {
         description
           "Концептуальный контейнер, представляющий корневой ресурс
            RESTCONF.";

         container data {
           description
             "Контейнер, представляющий ресурс хранилища данных.
              Представляет концептуальный корень всех данных состояния
              и конфигурации, поддерживаемых сервером. Дочерними 
              узлами этого контейнера могут быть любые ресурсы данных,
              которые определены как узлы данных верхнего уровня, из
              модулей YANG, анонсируемых сервером в модуле 
              'ietf-yang-library'.";
         }

         container operations {
           description
             "Контейнер для всех ресурсов операций.

              Каждый ресурс представляется как пустой лист с именем
              операции RPC из оператора YANG 'rpc'.

              Например, операция RPC 'system-restart', определенная
              в модуле 'ietf-system', будет представлена как пустой
              лист в пространстве имен 'ietf-system'. Это
              концептуальный лист, который реально не будет найден
              в модуле:
                 module ietf-system {
                   leaf system-reset {
                     type empty;
                   }
                 }

              Для вызова операции RPC 'system-restart'
                 POST /restconf/operations/ietf-system:system-restart

              Для определения поддерживаемых сервером операций RPC
                 GET /restconf/operations

              В XML пространство имен YANG указывает модуль
                <system-restart
                   xmlns='urn:ietf:params:xml:ns:yang:ietf-system'/>

              В JSON имя модуля YANG указывает модуль
                { 'ietf-system:system-restart' : [null] }
             ";
         }

         leaf yang-library-version {
           type string {
             pattern '\d{4}-\d{2}-\d{2}';
           }
           config false;
           mandatory true;
           description
             "Указывает дату выпуска модуля 'ietf-yang-library',
              реализованного этим сервером RESTCONF. Указывает
              год, месяц и число в числовом формате YYYY-MM-DD.";
         }
       }
     }

   }

   <CODE ENDS>

9. Мониторинг RESTCONF

Модуль ietf-restconf-monitoring обеспечивает информацию о возможностях протокола RESTCONF и потоках событий, доступных на сервере. Сервер RESTCONF должен реализовать модуль ietf-restconf-monitoring.

Ниже приведено дерево YANG для модуля ietf-restconf-monitoring.

      +--ro restconf-state
         +--ro capabilities
         |  +--ro capability*   inet:uri
         +--ro streams
            +--ro stream* [name]
               +--ro name                        string
               +--ro description?                string
               +--ro replay-support?             boolean
               +--ro replay-log-creation-time?   yang:date-and-time
               +--ro access* [encoding]
                  +--ro encoding  string
                  +--ro location  inet:uri

9.1. Контейнер restconf-state/capabilities

Этот обязательный контейнер содержит идентификаторы URI поддерживаемых сервером возможностей протокола RESTCONF.

Сервер может поддерживать временную метку для последнего изменения этого контейнера и возвращать поле заголовка Last-Modified, когда этот узел данных извлекается с помощью метода GET или HEAD. Отметим, что изменения в этом субдереве не оказывают влияния на временную метку последнего изменения хранилища данных.

Серверу следует поддерживать entity-tag для этого контейнера и возвращать поле заголовка Etag, когда этот узел данных извлекается с помощью метода GET или HEAD. Отметим, что изменения в этом субдереве не меняют entity-tag для ресурса хранилища.

Сервер должен включать запись URI листа-списка capability для режима defaults, используемого сервером, как определено в параграфе 9.1.2.

Сервер должен включать запись URI листа-списка capability, указывающую каждую дополнительную возможность, поддерживаемую сервером. Это включает дополнительные параметры запросов и может включать URI других возможностей, не определенных в этом документе.

9.1.1. Идентификаторы URI для параметров запроса

Определен новый набор идентификаторов URI для RESTCONF, указывающих параметры запроса (параграф 4.8), поддерживаемые сервером.

Сервер должен включать запись листа-списка capability для каждого поддерживаемого им необязательного параметра.

URI параметров запроса RESTCONF.

 

Имя

Параграф

URI

depth

4.8.2

urn:ietf:params:restconf:capability:depth:1.0

fields

4.8.3

urn:ietf:params:restconf:capability:fields:1.0

filter

4.8.4

urn:ietf:params:restconf:capability:filter:1.0

replay

4.8.7

urn:ietf:params:restconf:capability:replay:1.0

with-defaults

4.8.9

urn:ietf:params:restconf:capability:with-defaults:1.0

 

9.1.2. Идентификатор URI для возможности defaults

Это значение URI указывает принятый по умолчанию режим basic-mode, используемый сервером для обработки заданных по умолчанию листьев в запросах для ресурсов данных. Этот идентификатор URI для возможности протокола должен поддерживаться сервером и должен указываться в листе-списке capability, определенном в параграфе 9.3.

URI для возможности defaults.

 

Имя

URI

defaults

urn:ietf:params:restconf:capability:defaults:1.0

 

Идентификатор URI должен содержать параметр запроса basic-mode с одним из приведенных в таблице значений.

 

Значение

Описание

report-all

Нет узлов данных, рассматриваемых по умолчанию

trim

По умолчанию рассматриваются значения, заданные YANG default-stmt

explicit

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

 

Определения basic-mode даны в документе «With-defaults Capability for NETCONF» [RFC6243].

При установке basic-mode=report-all сервер должен придерживаться режима принятой по умолчанию обработки, определенного в параграфе 2.1 [RFC6243].

При установке basic-mode=trim сервер должен придерживаться режима принятой по умолчанию обработки, определенного в параграфе 2.2 [RFC6243].

При установке basic-mode=explicit сервер должен придерживаться режима принятой по умолчанию обработки, определенного в параграфе 2.3 [RFC6243].

Ниже приведен пример запроса.

urn:ietf:params:restconf:capability:defaults:1.0?basic-mode=explicit

9.2. Контейнер restconf-state/streams

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

Сервер будет заполнять контейнер записями списка stream для каждого поддерживаемого типа потока. Каждый поток содержит лист events, в котором указывается идентификатор URI, представляющий ресурс потока событий.

Ресурсы потоков определены в параграфе 3.8, уведомления — в разделе 6.

9.3. Модуль мониторинга RESTCONF

Модуль ietf-restconf-monitoring определяет информацию мониторинга для протокола RESTCONF.

Модули ietf-yang-types и ietf-inet-types из [RFC6991] используются этим модулем для некоторых определений типов.

   <CODE BEGINS>

   file "ietf-restconf-monitoring@2017-01-26.yang"

   module ietf-restconf-monitoring {
     namespace "urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring";
     prefix "rcmon";

     import ietf-yang-types { prefix yang; }
     import ietf-inet-types { prefix inet; }

     organization
       "IETF NETCONF (Network Configuration) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netconf/> 
        WG List:  <mailto:netconf@ietf.org> 

        Author:   Andy Bierman <mailto:andy@yumaworks.com> 

        Author:   Martin Bjorklund <mailto:mbj@tail-f.com> 

        Author:   Kent Watsen <mailto:kwatsen@juniper.net>"; 

     description
       "Этот модуль содержит информацию мониторинга для протокола RESTCONF.

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

        Распространение и использование в исходной и двоичной форме
        с изменениями или без них разрешается в соответствии с условиями,
        указанными в упрощенной лицензии BSD, изложенной в разделе 4.c
        Правового положения IETF Trust применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC 8040, где
        правовые аспекты выражены более полно.";

     revision 2017-01-26 {
       description
         "Первая версия.";
       reference
         "RFC 8040: RESTCONF Protocol.";
     }

     container restconf-state {
       config false;
       description
         "Содержит информацию мониторинга для протокола RESTCONF.";

       container capabilities {
         description
           "Содержит список URI для возможностей протокола.";

         leaf-list capability {
           type inet:uri;
           description
             "Идентификатор URI протокольной возможности RESTCONF.";
         }
       }

       container streams {
         description
           "Контейнер, представляющий потоки уведомлений о событиях,
            поддерживаемых сервером.";
          reference
            "RFC 5277, Section 3.4, <streams> element.";

         list stream {
           key name;
           description
             "Каждая запись описывает поддерживаемый сервером поток
              событий.";

           leaf name {
             type string;
             description
               "Имя потока.";
             reference
               "RFC 5277, Section 3.4, <name> element.";
           }

           leaf description {
             type string;
             description
               "Описание содержимого потока.";
             reference
               "RFC 5277, Section 3.4, <description> element.";
           }

           leaf replay-support {
             type boolean;
             default false;
             description
               "Указывает поддерживается ли буфер повторного воспроизведения
                (replay) для этого потока. Значение true, говорит, что сервер 
                ДОЛЖЕН поддерживать параметры запроса 'start-time' и 'stop-time'
                для этого потока.";
             reference
               "RFC 5277, Section 3.4, <replaySupport> element.";
           }

           leaf replay-log-creation-time {
             when "../replay-support" {
               description
                 "Присутствует только при поддержке повтора уведомлений (replay.";
             }
             type yang:date-and-time;
             description
               "Указывает время создания журнала повторов для этого потока.";
             reference
               "RFC 5277, Section 3.4, <replayLogCreationTime> element.";
           }

           list access {
             key encoding;
             min-elements 1;
             description
               "Сервер будет создавать в этом списке запись для каждого формата
                кодирования, поддерживаемого для этого потока. Для всех потоков
                событий предполагается тип носителя text/event-stream. Этот
                список указывает субтипы, поддерживаемые для этого потока.";

             leaf encoding {
               type string;
               description
                 "Это вторичный формат кодирования внутри text/event-stream,
                  используемого всеми потоками. Тип xml поддерживается для 
                  кодирования XML, тип json - для кодирования JSON.";
             }

             leaf location {
               type inet:uri;
               mandatory true;
               description
                 "Содержит URL для представления точки входа при организации
                  уведомлений с помощью передаваемых сервером событий.";
             }
           }
         }
       }
     }

   }

   <CODE ENDS>

10. Библиотечный модуль YANG

Модуль ietf-yang-library, определенный в [RFC7895], обеспечивает информацию о модулях и субмодулях YANG, используемых сервером RESTCONF. Реализация этого модуля обязательна для серверов RESTCONF. Все модули и субмодули YANG, используемые сервером, должны быть указаны в библиотечном модуле YANG.

10.1. Список modules-state/module

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

Содержимого этого списка определено в операторе YANG module документа [RFC7895].

Отметим, что в модуле ietf-restconf нет доступных протоколу объектов для реализации, но сервер может указать модуль ietf-restconf в библиотеке YANG, если он импортируется (напрямую или опосредованно) реализованным модулем.

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

11.1. Тип связи restconf

Эта спецификация регистрирует тип связи restconf в реестре «Link Relation Types», определенном в [RFC5988].

      Relation Name: restconf
      Description: Указывает корень RESTCONF API на данном сервере
                   HTTP. Связь restconf задает корень API, определенного
                   в RFC 8040. Последующие выпуски RESTCONF будут
                   применять другие значения связи для поддержки версий.
      Reference: RFC 8040

11.2. Регистрации новых URI и модулей YANG

Этот документ регистрирует два идентификатора URI как пространства имен в реестре «IETF XML Registry» [RFC3688].

     URI: urn:ietf:params:xml:ns:yang:ietf-restconf
     Registrant Contact: The IESG.
     XML: неприменимо; the requested URI is an XML namespace.

     URI: urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring
     Registrant Contact: The IESG.
     XML: неприменимо; the requested URI is an XML namespace.

Документ регистрирует два модуля YANG в реестре «YANG Module Names» [RFC6020].

     name:         ietf-restconf
     namespace:    urn:ietf:params:xml:ns:yang:ietf-restconf
     prefix:       rc
     reference:    RFC 8040

     name:         ietf-restconf-monitoring
     namespace:    urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring
     prefix:       rcmon
     reference:    RFC 8040

11.3. Типы носителя

11.3.1. Тип application/yang-data+xml

Имя типа: application

Имя субтипа: yang-data+xml

Требуемые параметры: нет

Необязательные параметры: нет

Кодирование: 8 битов

Каждый концептуальный узел данных YANG кодируется в соответствии с правилами XML и каноническим форматом для конкретного типа узла YANG, определенным в [RFC7950].

Вопросы безопасности: Вопросы безопасности, связанные с генерацией и употреблением сообщений RESTCONF, рассмотрены в разделе 12 RFC 8040. С семантикой конкретных моделей YANG связаны дополнительные вопросы безопасности. Предполагается, что в каждом модуле YANG будут рассматриваться вопросы безопасности, связанные с определенными в этом модуле данными.

Вопросы взаимодействия: В RFC 8040 заданы форматы сообщение и их интерпретация.

Опубликованная спецификация: RFC 8040

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

Идентификация фрагментов: Идентификаторы фрагментов для этого типа не определены. Все узлы данных YANG доступны как ресурсы с использованием пути в URI запроса.

Дополнительная информация:

Запрещенные имена псевдонимов: неприменимо

«Магическое» значение: неприменимо

Расширения имен: нет

Коды типа файлов Macintosh: «TEXT»

Контактные данные: См. раздел «Адреса авторов» в RFC 8040

Предполагаемое применение: общего назначения

Ограничения на использование: неприменимо

Автор: См. раздел «Адреса авторов» в RFC 8040

Контроль изменений: Internet Engineering Task Force (mailto:iesg@ietf.org).

Предварительная регистрация (только дерево стандартов): нет

11.3.2. Тип application/yang-data+json

Имя типа: application

Имя субтипа: yang-data+json

Требуемые параметры: нет

Необязательные параметры: нет

Кодирование: 8 битов

Каждый концептуальный узел данных YANG кодируется в соответствии с [RFC7951]. Аннотации метаданных кодируются в соответствии с [RFC7952].

Вопросы безопасности: Вопросы безопасности, связанные с генерацией и употреблением сообщений RESTCONF, рассмотрены в разделе 12 RFC 8040. С семантикой конкретных моделей YANG связаны дополнительные вопросы безопасности. Предполагается, что в каждом модуле YANG будут рассматриваться вопросы безопасности, связанные с определенными в этом модуле данными.

Вопросы взаимодействия: В RFC 8040 заданы форматы сообщение и их интерпретация.

Опубликованная спецификация: RFC 8040

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

Идентификация фрагментов: Синтаксис и семантика фрагментов совпрадают с заданными для типа носителя application/json.

Дополнительная информация:

Запрещенные имена псевдонимов: неприменимо

«Магическое» значение: неприменимо

Расширения имен: нет

Коды типа файлов Macintosh: «TEXT»

Контактные данные: См. раздел «Адреса авторов» в RFC 8040

Предполагаемое применение: общего назначения

Ограничения на использование: неприменимо

Автор: См. раздел «Адреса авторов» в RFC 8040

Контроль изменений: Internet Engineering Task Force (mailto:iesg@ietf.org).

Предварительная регистрация (только дерево стандартов): нет

11.4. Реестр возможностей RESTCONF

Этот документ определяет реестр для идентификаторов возможностей RESTCONF с именем «RESTCONF Capability URNs». Значения в реестр вносятся по процедуре IETF Review [RFC5226]. Каждая запись реестра должна включать:

  • имя возможности RESTCONF — по соглашению имена начинаются с двоеточия (:);

  • идентификатор URN для возможности RESTCONF;

  • ссылку на документ, регистрирующий значение.

Этот документ регистрирует несколько идентификаторов возможностей в реестре «RESTCONF Capability URNs».

 

Индекс

Идентификатор возможности

:defaults

urn:ietf:params:restconf:capability:defaults:1.0

:depth

urn:ietf:params:restconf:capability:depth:1.0

:fields

urn:ietf:params:restconf:capability:fields:1.0

:filter

urn:ietf:params:restconf:capability:filter:1.0

:replay

urn:ietf:params:restconf:capability:replay:1.0

:with-defaults

urn:ietf:params:restconf:capability:with-defaults:1.0

 

11.5. Регистрация субпространства имен URN restconf

Агентство IANA зарегистрировало новое субпространство имен URN в реестре «IETF URN Sub-namespace for Registered Protocol Parameter Identifiers», заданном [RFC3553].

      Registry Name: restconf
      Specification: RFC 8040
      Repository: Реестр "RESTCONF Capability URNs" (параграф 11.4)
      Index value: Субпараметры ДОЛЖНЫ указываться в кодировке UTF-8
         с применением стандартного кодирования URI, когда это нужно.

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

В параграфе 2.1 сказано, что сервер RESTCONF должен поддерживать протокол TLS [RFC5246]. Это позволяет предположить возможность поддержки сервером RESTCONF будущих версий протокола TLS. В частности, TLS 1.3 [TLS1.3] добавляет поддержку согласования 0-RTT, которая может создавать проблемы безопасности для RESTCONF API, как описано в Приложении B.1 к документу TLS 1.3. Поэтому серверам RESTCONF рекомендуется не поддерживать 0-RTT совсем (даже для идемпотентных запросов) , пока обновление этого RFC не укажет иного.

В параграфе 2.5 рекомендуется аутентификация на основе клиентских сертификатов TLS, но разрешено применять любые схемы проверки подлинности, указанные в реестре «Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry». Разработчикам следует принимать во внимание, что строгость этих методов существенно различается, а некоторые методы могут быть экспериментальными. Выбирать любую из этих схем следует лишь после прочтения раздела «Вопросы безопасности» в RFC, связанном с соответствующей записью реестра.

Модуль YANG ietf-restconf-monitoring, определенный в этом документе, предназначен для доступа по протоколу NETCONF [RFC6241]. Нижним уровнем NETCONF является защищенный транспорт и обязательна реализация SSH15 [RFC6242]. Модель контроля доступа NETCONF [RFC6536] обеспечивает способы ограничения доступа для конкретных пользователей NETCONF к заранее заданному набору доступных протокольных операций и содержимого NETCONF.

Нижним уровнем RESTCONF является HTTPS с обязательной реализацией защищенного транспорта TLS [RFC5246]. Протокол RESTCONF использует модель контроля доступа NETCONF [RFC6536], которая позволяет ограничить доступ для конкретных пользователей RESTCONF к заранее заданному набору доступных протокольных операций и содержимого RESTCONF.

В этом разделе рассматриваются вопросы безопасности для ресурсов, определяемых протоколом RESTCONF. Вопросы безопасности HTTPS рассмотрены в [RFC7230]. RESTCONF не задает модулей YANG, которые сервер должен поддерживать, помимо модулей ietf-restconf-monitoring (раздел 9) и ietf-yang-library (раздел 10). Вопросы безопасности для других модулей, с которыми работает RESTCONF, будут рассмотрены в документах, определяющих эти модули YANG.

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

В разных средах права до и после аутентификации могут различаться. Когда для операции RESTCONF не предоставлено нужных полномочий, сервер RESTCONF должен возвращать статус «401 Unauthorized». Отметим, что обмен данными о полномочиях может происходить в форме параметров конфигурации, что является еще одним основанием для защиты соединения. Отметим, что клиент может обнаружить изменения конфигурации в ресурсах данных, к которым ему не предоставлен доступ, путем отслеживания изменений в полях заголовка Etag и Last-Modified, возвращаемых сервером для ресурса хранилища.

Реализациям сервера RESTCONF следует пытаться предотвратить нарушение работы системы в результате чрезмерного использования системных ресурсов при обработке запросов на редактирование с помощью методов POST, PUT и PATCH. Без этого возникает возможность атак с попыткой использовать всю доступную память и другие ресурсы системы.

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

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

[RFC2046] Freed, N. and N. Borenstein, «Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types», RFC 2046, DOI 10.17487/RFC2046, November 1996, <http://www.rfc-editor.org/info/rfc2046>.

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

[RFC3553] Mealling, M., Masinter, L., Hardie, T., and G. Klyne, «An IETF URN Sub-namespace for Registered Protocol Parameters», BCP 73, RFC 3553, DOI 10.17487/RFC3553, June 2003, <http://www.rfc-editor.org/info/rfc3553>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <http://www.rfc-editor.org/info/rfc3688>.

[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, «Uniform Resource Identifier (URI): Generic Syntax», STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, <http://www.rfc-editor.org/info/rfc3986>.

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

[RFC5246] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.2», RFC 5246, DOI 10.17487/RFC5246, August 2008, <http://www.rfc-editor.org/info/rfc5246>.

[RFC5277] Chisholm, S. and H. Trevino, «NETCONF Event Notifications», RFC 5277, DOI 10.17487/RFC5277, July 2008, <http://www.rfc-editor.org/info/rfc5277>.

[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, <http://www.rfc-editor.org/info/rfc5280>.

[RFC5789] Dusseault, L. and J. Snell, «PATCH Method for HTTP», RFC 5789, DOI 10.17487/RFC5789, March 2010, <http://www.rfc-editor.org/info/rfc5789>.

[RFC5988] Nottingham, M., «Web Linking», RFC 5988, DOI 10.17487/RFC5988, October 2010, <http://www.rfc-editor.org/info/rfc5988>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <http://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, <http://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, <http://www.rfc-editor.org/info/rfc6242>.

[RFC6243] Bierman, A. and B. Lengyel, «With-defaults Capability for NETCONF», RFC 6243, DOI 10.17487/RFC6243, June 2011, <http://www.rfc-editor.org/info/rfc6243>.

[RFC6415] Hammer-Lahav, E., Ed., and B. Cook, «Web Host Metadata», RFC 6415, DOI 10.17487/RFC6415, October 2011, <http://www.rfc-editor.org/info/rfc6415>.

[RFC6536] Bierman, A. and M. Bjorklund, «Network Configuration Protocol (NETCONF) Access Control Model», RFC 6536, DOI 10.17487/RFC6536, March 2012, <http://www.rfc-editor.org/info/rfc6536>.

[RFC6570] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., and D. Orchard, «URI Template», RFC 6570, DOI 10.17487/RFC6570, March 2012, <http://www.rfc-editor.org/info/rfc6570>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <http://www.rfc-editor.org/info/rfc6991>.

[RFC7159] Bray, T., Ed., «The JavaScript Object Notation (JSON) Data Interchange Format», RFC 7159, DOI 10.17487/RFC7159, March 2014, <http://www.rfc-editor.org/info/rfc7159>.

[RFC7230] Fielding, R., Ed., and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing», RFC 7230, DOI 10.17487/RFC7230, June 2014, <http://www.rfc-editor.org/info/rfc7230>.

[RFC7231] Fielding, R., Ed., and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content», RFC 7231, DOI 10.17487/RFC7231, June 2014, <http://www.rfc-editor.org/info/rfc7231>.

[RFC7232] Fielding, R., Ed., and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests», RFC 7232, DOI 10.17487/RFC7232, June 2014, <http://www.rfc-editor.org/info/rfc7232>.

[RFC7235] Fielding, R., Ed., and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Authentication», RFC 7235, DOI 10.17487/RFC7235, June 2014, <http://www.rfc-editor.org/info/rfc7235>.

[RFC7320] Nottingham, M., «URI Design and Ownership», BCP 190, RFC 7320, DOI 10.17487/RFC7320, July 2014, <http://www.rfc-editor.org/info/rfc7320>.

[RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre, «Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)», BCP 195, RFC 7525, DOI 10.17487/RFC7525, May 2015, <http://www.rfc-editor.org/info/rfc7525>.

[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, <http://www.rfc-editor.org/info/rfc7589>.

[RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, «YANG Module Library», RFC 7895, DOI 10.17487/RFC7895, June 2016, <http://www.rfc-editor.org/info/rfc7895>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <http://www.rfc-editor.org/info/rfc7950>.

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <http://www.rfc-editor.org/info/rfc7951>.

[RFC7952] Lhotka, L., «Defining and Using Metadata with YANG», RFC 7952, DOI 10.17487/RFC7952, August 2016, <http://www.rfc-editor.org/info/rfc7952>.

[W3C.REC-eventsource-20150203] Hickson, I., «Server-Sent Events», World Wide Web Consortium Recommendation REC-eventsource-20150203, February 2015, <http://www.w3.org/TR/2015/REC-eventsource-20150203>.

[W3C.REC-xml-20081126] Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and F. Yergeau, «Extensible Markup Language (XML) 1.0 (Fifth Edition)», World Wide Web Consortium Recommendation REC-xml-20081126, November 2008, <http://www.w3.org/TR/2008/REC-xml-20081126>.

[XPath] Clark, J. and S. DeRose, «XML Path Language (XPath) Version 1.0», World Wide Web Consortium Recommendation REC-xpath-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xpath-19991116>.

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

[REST-Dissertation] Fielding, R., «Architectural Styles and the Design of Network-based Software Architectures», 2000.

[RFC2818] Rescorla, E., «HTTP Over TLS», RFC 2818, DOI 10.17487/RFC2818, May 2000, <http://www.rfc-editor.org/info/rfc2818>.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, DOI 10.17487/RFC5226, May 2008, <http://www.rfc-editor.org/info/rfc5226>.

[TLS1.3] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», Work in Progress16, draft-ietf-tls-tls13-18, October 2016.

[YANG-Patch] Bierman, A., Bjorklund, M., and K. Watsen, «YANG Patch Media Type», Work in Progress17, draft-ietf-netconf-yang-patch-14, November 2016.

Приложение A. Пример модуля YANG

Пример модуля YANG, используемый в этом документе, представляет интерфейс с простым аудио-проигрывателем.

Ниже показано дерево YANG для модуля example-jukebox.

      +--rw jukebox!
         +--rw library
         |  +--rw artist* [name]
         |  |  +--rw name     string
         |  |  +--rw album* [name]
         |  |     +--rw name     string
         |  |     +--rw genre?   identityref
         |  |     +--rw year?    uint16
         |  |     +--rw admin
         |  |     |  +--rw label?              string
         |  |     |  +--rw catalogue-number?   string
         |  |     +--rw song* [name]
         |  |        +--rw name        string
         |  |        +--rw location    string
         |  |        +--rw format?     string
         |  |        +--rw length?     uint32
         |  +--ro artist-count?   uint32
         |  +--ro album-count?    uint32
         |  +--ro song-count?     uint32
         +--rw playlist* [name]
         |  +--rw name           string
         |  +--rw description?   string
         |  +--rw song* [index]
         |     +--rw index    uint32
         |     +--rw id       instance-identifier
         +--rw player
            +--rw gap?   decimal64

     rpcs:

     +---x play
         +--ro input
            +--ro playlist       string
            +--ro song-number    uint32

A.1. Модуль YANG example-jukebox

   module example-jukebox {

      namespace "http://example.com/ns/example-jukebox";
      prefix "jbox";

      organization "Example, Inc.";
      contact "support at example.com";
      description "Example Jukebox Data Model Module.";
      revision "2016-08-15" {
        description "Первый выпуск.";
        reference "example.com document 1-4673.";
      }

      identity genre {
        description
          "База для всех типов жанра.";
      }

      // Сокращенный список классификаций жанров
      identity alternative {
        base genre;
        description
          "Альтернативная музыка.";
      }
      identity blues {
        base genre;
        description
          "Блюзы.";
      }
      identity country {
        base genre;
        description
          "Народная музыка.";
      }
      identity jazz {
        base genre;
        description
          "Джаз.";
      }
      identity pop {
        base genre;
        description
          "Поп-музыка.";
      }
      identity rock {
        base genre;
        description
          "Рок.";
      }

      container jukebox {
        presence
          "Пустой контейнер, показывающий доступность проигрывателя.";

        description
          "Представляет ресурс jukebox с библиотекой, списками 
           воспроизведения и операцией play (проиграть).";

        container library {

          description
            "Представляет ресурс библиотеки jukebox.";

          list artist {
            key name;
            description
              "Представляет один ресурс artist в ресурсе библиотеки 
               jukebox.";

            leaf name {
              type string {
                length "1 .. max";
              }
              description
                "Имя исполнителя.";
            }

            list album {
              key name;
              description
                "Представляет один ресурс album внутри ресурса 
                 artist в библиотеке jukebox.";

              leaf name {
                type string {
                  length "1 .. max";
                }
                description
                  "Название альбома.";
              }
              leaf genre {
                type identityref { base genre; }
                description
                  "Жанр музыки в альбоме.";
              }

              leaf year {
                type uint16 {
                  range "1900 .. max";
                }
                description
                  "год выпуска альбома.";
              }

              container admin {
                description
                  "Административные данные для альбома.";

                leaf label {
                  type string;
                  description
                    "Метка выпущенного альбома.";
                }
                leaf catalogue-number {
                  type string;
                  description
                    "Каталожный номер альбома.";
                }
              }

              list song {
                key name;
                description
                  "Представляет ресурс song внутри ресурса album
                   в библиотеке jukebox.";

                leaf name {
                  type string {
                     length "1 .. max";
                  }
                  description
                    "Название песни.";
                }
                leaf location {
                  type string;
                  mandatory true;
                  description
                    "Строка размещения файла с песней.";
                }
                leaf format {
                  type string;
                  description
                    "Идентификатор строки типа носителя для файла,
                     связанного с листом location для этой записи.";
                }
                leaf length {
                  type uint32;
                  units "seconds";
                  description
                    "Продолжительность песни в секундах.";
                }
              }   // Конец списка song
            }   // Конец списка album
          }   // Конец списка artist

          leaf artist-count {
             type uint32;
             units "artists";
             config false;
             description
               "Число исполнителей в библиотеке.";
          }
          leaf album-count {
             type uint32;
             units "albums";
             config false;
             description
               "Число альбомов в библиотеке.";
          }
          leaf song-count {
             type uint32;
             units "songs";
             config false;
             description
               "Число песен в библиотеке.";
          }
        }  // Конец библиотеки

        list playlist {
          key name;
          description
            "Пример ресурса данных конфигурации.";

          leaf name {
            type string;
            description
              "Название списка воспроизведения.";
          }
          leaf description {
            type string;
            description
              "Комментарий с описанием списка воспроизведения.";
          }
          list song {
            key index;
            ordered-by user;

            description
              "Пример вложенного ресурса данных конфигурации.";

            leaf index {    // Реально не требуется
              type uint32;
              description
                "Произвольный целочисленный индекс песни в списке воспроизведения.";
            }
            leaf id {
              type instance-identifier;
              mandatory true;
              description
                "Идентификатор песни. Должен указывать экземпляр
                 /jukebox/library/artist/album/song/name.";
            }
          }
        }

        container player {
          description
            "Представляет ресурс проигрывателя jukebox.";

          leaf gap {
            type decimal64 {
              fraction-digits 1;
              range "0.0 .. 2.0";
            }
            units "tenths of seconds";
            description
              "Интервал между песнями.";
          }
        }
      }

      rpc play {
        description
          "Функция управления для проигрывателя jukebox.";
        input {
          leaf playlist {
            type string;
            mandatory true;
            description
              "Название списка воспроизведения.";
          }
          leaf song-number {
            type uint32;
            mandatory true;
            description
              "Номер песни в списке воспроизведения для проигрывания.";
          }
        }
      }
   }

Приложение B. Примеры сообщений RESTCONF

Примеры в этом документе используют нормативный модуль YANG ietf-restconf, определенный в разделе 8 и ненормативный пример модуля YANG example-jukebox, который определен в Приложении A.1.

В этом приложении приведены примеры некоторых типовых обменов сообщениями RESTCONF.

B.1. Примеры извлечения ресурсов

B.1.1. Извлечение ресурса API верхнего уровня

Клиент начинает извлечение корневого ресурса RESTCONF

      GET /.well-known/host-meta HTTP/1.1
      Host: example.com
      Accept: application/xrd+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Content-Type: application/xrd+xml
      Content-Length: nnn

      <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
          <Link rel='restconf' href='/restconf'/>
      </XRD>

Затем клиент может извлечь ресурс API верхнего уровня, используя корневой ресурс /restconf.

      GET /restconf HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "ietf-restconf:restconf" : {
          "data" : {},
          "operations" : {},
          "yang-library-version" : "2016-06-21"
        }
      }

Для запроса представления содержимого отклика в формате XML можно применить поле заголовка Accept.

      GET /restconf HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер будет возвращать те же данные, которые могут иметь вид

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+xml

      <restconf xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
        <data/>
        <operations/>
        <yang-library-version>2016-06-21</yang-library-version>
      </restconf>

B.1.2. Получение информации о модуле сервера

Возможно изменение модуля библиотеки YANG с течением времени. Клиент может узнать дату выпуска модуля ietf-yang-library, поддерживаемого сервером, из ресурса API, как описано в предыдущем параграфе.

В этом примере клиент извлекает информацию о модуле в формате JSON.

      GET /restconf/data/ietf-yang-library:modules-state HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Last-Modified: Thu, 26 Jan 2017 14:00:14 GMT
      Content-Type: application/yang-data+json

      {
        "ietf-yang-library:modules-state" : {
          "module-set-id" : "5479120c17a619545ea6aff7aa19838b036ebbd7",
          "module" : [
            {
              "name" : "foo",
              "revision" : "2012-01-02",
              "schema" : "https://example.com/modules/foo/2012-01-02",
              "namespace" : "http://example.com/ns/foo",
              "feature" : [ "feature1", "feature2" ],
              "deviation" : [
                {
                  "name" : "foo-dev",
                  "revision" : "2012-02-16"
                }
              ],
              "conformance-type" : "implement"
            },
            {
              "name" : "ietf-yang-library",
              "revision" : "2016-06-21",
              "schema" : "https://example.com/modules/\
                ietf-yang-library/2016-06-21",
              "namespace" :
                "urn:ietf:params:xml:ns:yang:ietf-yang-library",
              "conformance-type" : "implement"
            },
            {
              "name" : "foo-types",
              "revision" : "2012-01-05",
              "schema" :
                "https://example.com/modules/foo-types/2012-01-05",
              "namespace" : "http://example.com/ns/foo-types",
              "conformance-type" : "import"
            },

            {
              "name" : "bar",
              "revision" : "2012-11-05",
              "schema" : "https://example.com/modules/bar/2012-11-05",
              "namespace" : "http://example.com/ns/bar",
              "feature" : [ "bar-ext" ],
              "conformance-type" : "implement",
              "submodule" : [
                {
                  "name" : "bar-submod1",
                  "revision" : "2012-11-05",
                  "schema" :
                   "https://example.com/modules/bar-submod1/2012-11-05"
                },
                {
                  "name" : "bar-submod2",
                  "revision" : "2012-11-05",
                  "schema" :
                   "https://example.com/modules/bar-submod2/2012-11-05"
                }
              ]
            }
          ]
        }
      }

B.1.3. Извлечение данных о возможностях сервера

В этом примере клиент извлекает информацию о возможностях сервера в формате XML. Сервер поддерживает все параметры запросов RESTCONF и один фирменный параметр.

      GET /restconf/data/ietf-restconf-monitoring:restconf-state/\
          capabilities HTTP/1.1
      Host: example.com
      Accept: application/yang-data+xml

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Last-Modified: Thu, 26 Jan 2017 16:00:14 GMT
      Content-Type: application/yang-data+xml

      <capabilities
          xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring">
       <capability>\
        urn:ietf:params:restconf:capability:defaults:1.0?\
           basic-mode=explicit\
       </capability>
       <capability>\
        urn:ietf:params:restconf:capability:with-defaults:1.0\
       </capability>
       <capability>\
        urn:ietf:params:restconf:capability:depth:1.0\
       </capability>
       <capability>\
        urn:ietf:params:restconf:capability:fields:1.0\
       </capability>
       <capability>\
        urn:ietf:params:restconf:capability:filter:1.0\
       </capability>
       <capability>\
        urn:ietf:params:restconf:capability:start-time:1.0\
       </capability>
       <capability>\
        urn:ietf:params:restconf:capability:stop-time:1.0\
       </capability>
       <capability>\
        http://example.com/capabilities/myparam\
       </capability>
      </capabilities>

B.2. Примеры ресурсов данных и хранилища

B.2.1. Создание нового ресурса данных

Для создания нового ресурса artist в ресурсе library клиент может передать приведенный ниже запрос.

      POST /restconf/data/example-jukebox:jukebox/library HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "example-jukebox:artist" : [
          {
            "name" : "Foo Fighters"
          }
        ]
      }

Если ресурс создан, сервер может возвратить отклик

      HTTP/1.1 201 Created
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Location: https://example.com/restconf/data/\
          example-jukebox:jukebox/library/artist=Foo%20Fighters
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      ETag: "b3830f23a4c"

Чтобы создать новый ресурс album для этого исполнителя в ресурсе jukebox, клиент может передать запрос вида

      POST /restconf/data/example-jukebox:jukebox/\
          library/artist=Foo%20Fighters HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <album xmlns="http://example.com/ns/example-jukebox">
        <name>Wasting Light</name>
        <year>2011</year>
      </album>

Если ресурс создан, сервер может возвратить отклик

      HTTP/1.1 201 Created
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Location: https://example.com/restconf/data/\
          example-jukebox:jukebox/library/artist=Foo%20Fighters/\
          album=Wasting%20Light
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      ETag: "b8389233a4c"

B.2.2. Детектирование изменения тега объекта для хранилища

В этом примере сервер просто поддерживает временную метку последнего изменения хранилища данных. Предположим, что клиент кэшировал заголовок Last-Modified из отклика на предыдущий запрос. Это значение будет применяться как заголовок If-Unmodified-Since в следующем запросе для исправления (patch) записи списка album со значением ключа «Wasting Light». Обновляется лишь поле genre.

      PATCH /restconf/data/example-jukebox:jukebox/\
          library/artist=Foo%20Fighters/album=Wasting%20Light/\
          genre HTTP/1.1
      Host: example.com
      If-Unmodified-Since: Thu, 26 Jan 2017 20:56:30 GMT
      Content-Type: application/yang-data+json

      { "example-jukebox:genre" : "example-jukebox:alternative" }

В этом примере ресурс хранилища данных был изменен с момента, указанного в заголовке If-Unmodified-Since, поэтому отклик сервера может иметь вид

      HTTP/1.1 412 Precondition Failed
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 19:41:00 GMT
      ETag: "b34aed893a4c"

B.2.3. Редактирование ресурса хранилища

В этом примере предполагается наличие в модуле example-system ресурса данных верхнего уровня по имени system и наличие у этого контейнера дочернего листа enable-jukebox-streaming.

      container system {
        leaf enable-jukebox-streaming {
          type boolean;
        }
      }

В этом примере клиент применяет метод PATCH для изменения сразу двух ресурсов верхнего уровня с целью включения поддержки потоков и добавления субресурса album к каждому из двух ресурсов artist.

      PATCH /restconf/data HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <data xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
        <system xmlns="http://example.com/ns/example-system">
          <enable-jukebox-streaming>true</enable-jukebox-streaming>
        </system>
        <jukebox xmlns="http://example.com/ns/example-jukebox">
          <library>
            <artist>
              <name>Foo Fighters</name>
              <album>
                <name>One by One</name>
                <year>2012</year>
              </album>
            </artist>
            <artist>
              <name>Nick Cave and the Bad Seeds</name>
              <album>
                <name>Tender Prey</name>
                <year>1988</year>
              </album>
            </artist>
          </library>
        </jukebox>
      </data>

B.2.4. Замена ресурса хранилища

В этом примере меняется все содержимое хранилища данных. Все узлы, отсутствующие в элементе <data>, но имеющиеся на сервер, будут удалены.

      PUT /restconf/data HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <data xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
        <jukebox xmlns="http://example.com/ns/example-jukebox">
          <library>
            <artist>
              <name>Foo Fighters</name>
              <album>
                <name>One by One</name>
                <year>2012</year>
              </album>
            </artist>
            <artist>
              <name>Nick Cave and the Bad Seeds</name>
              <album>
                <name>Tender Prey</name>
                <year>1988</year>
              </album>
            </artist>
          </library>
        </jukebox>
      </data>

B.2.5. Редактирование ресурса данных

В этом примере клиент меняет один узел данных, добавляя субресурс album методом PATCH для ресурса данных.

      PATCH /restconf/data/example-jukebox:jukebox/library/\
         artist=Nick%20Cave%20and%20the%20Bad%20Seeds HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+xml

      <artist xmlns="http://example.com/ns/example-jukebox">
        <name>Nick Cave and the Bad Seeds</name>
        <album>
          <name>The Good Son</name>
          <year>1990</year>
        </album>
      </artist>

B.3. Примеры параметров запроса

B.3.1. Параметр content

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

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

     container events {
       list event {
         key name;
         leaf name { type string; }
         leaf description { type string; }
         leaf event-count {
           type uint32;
           config false;
         }
       }
     }

Пример 1: content=all

Для получения всех дочерних ресурсов указывается параметр content=all или этот параметр опускается. Клиент может передать запрос

      GET /restconf/data/example-events:events?\
          content=all HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+json

      {
        "example-events:events" : {
          "event" : [
            {
              "name" : "interface-up",
              "description" : "Счетчик уведомлений о включении интерфейса",
              "event-count" : 42
            },
            {
              "name" : "interface-down",
              "description" : "Счетчик уведомлений о выключении интерфейса",
              "event-count" : 4
            }
          ]
        }
      }

Пример 2: content=config

Для извлечения только конфигурационных дочерних ресурсов указывается content=config. Отметим, что в этом случае возвращаются лишь заголовки Etag и Last-Modified.

      GET /restconf/data/example-events:events?\
          content=config HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 16:45:20 GMT
      ETag: "eeeada438af"
      Cache-Control: no-cache
      Content-Type: application/yang-data+json

      {
        "example-events:events" : {
          "event" : [
            {
              "name" : "interface-up",
              "description" : "Счетчик уведомлений о включении интерфейса"
            },
            {
              "name" : "interface-down",
              "description" : "Счетчик уведомлений о выключении интерфейса"
            }
          ]
        }
      }

Пример 3: content=nonconfig

Для извлечения только не связанных с конфигурацией дочерних ресурсов указывается content=nonconfig. Отметим, что в этом случае возвращаются также конфигурационные предки и ключевые листья, если они имеются. Клиент может передать запрос

      GET /restconf/data/example-events:events?\
         content=nonconfig HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+json

      {
        "example-events:events" : {
          "event" : [
            {
              "name" : "interface-up",
              "event-count" : 42
            },
            {
              "name" : "interface-down",
              "event-count" : 4
            }
          ]
        }
      }

B.3.2. Параметр depth

Параметр depth служит для ограничения числа уровней дочерних ресурсов, возвращаемых сервером для запроса GET.

Счет уровней начинается с целевого ресурса, поэтому при depth=1 возвращается только этот ресурс, а при глубине 2 возвращается целевой уровень и его ближайшие потомки.

В примере показано влияние значения depth на содержимое, извлекаемое из ресурса верхнего уровня jukebox.

Пример 1: depth=unbounded

Для извлечения всех дочерних ресурсов параметр depth не указывается или имеет принятое по умолчанию значение unbounded.

      GET /restconf/data/example-jukebox:jukebox?\
          depth=unbounded HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+json

      {
        "example-jukebox:jukebox" : {
          "library" : {
            "artist" : [
              {
                "name" : "Foo Fighters",
                "album" : [
                  {
                    "name" : "Wasting Light",
                    "genre" : "example-jukebox:alternative",
                    "year" : 2011,
                    "song" : [
                      {
                        "name" : "Wasting Light",
                        "location" :
                          "/media/foo/a7/wasting-light.mp3",
                        "format" : "MP3",
                        "length" : 286
                      },
                      {
                        "name" : "Rope",
                        "location" : "/media/foo/a7/rope.mp3",
                        "format" : "MP3",
                        "length" : 259
                      }
                    ]
                  }
                ]
              }
            ]
          },
          "playlist" : [
            {
              "name" : "Foo-One",
              "description" : "Пример списка воспроизведения 1",
              "song" : [
                {
                  "index" : 1,
                  "id" : "/example-jukebox:jukebox/library\
                     /artist[name='Foo Fighters']\
                     /album[name='Wasting Light']\
                     /song[name='Rope']"
                },
                {
                  "index" : 2,
                  "id" : "/example-jukebox:jukebox/library\
                     /artist[name='Foo Fighters']\
                     /album[name='Wasting Light']\
                     /song[name='Bridge Burning']"
                }
              ]
            }
          ],
          "player" : {
            "gap" : 0.5
          }
        }
      }

Пример 2: depth=1

Для определения наличия одного или множества экземпляров ресурса для данной цели указывается глубина 1.

      GET /restconf/data/example-jukebox:jukebox?depth=1 HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+json

      {
        "example-jukebox:jukebox" : {}
      }

Пример 3: depth=3

Для ограничения глубины целевым ресурсом и двумя дочерними уровнями используется значение 3.

      GET /restconf/data/example-jukebox:jukebox?depth=3 HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Cache-Control: no-cache
      Content-Type: application/yang-data+json

      {
        "example-jukebox:jukebox" : {
          "library" : {
            "artist" : {}
          },
          "playlist" : [
            {
              "name" : "Foo-One",
              "description" : "Пример списка воспроизведения 1",
              "song" : {}
            }
          ],
          "player" : {
            "gap" : 0.5
          }
        }
      }

B.3.3. Параметр fields

В этом примере клиент извлекает ресурс хранилища данных в формате JSON, но нужен лишь список modules-state/module, из каждой записи которого берутся только узлы name и revision. Отметим, что верхний узел, возвращенный сервером, соответствует узлу целевого ресурса (data в этом примере). Лист module-set-id не возвращается, поскольку он не выбран в выражении fields.

      GET /restconf/data?fields=ietf-yang-library:modules-state/\
          module(name;revision) HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "ietf-restconf:data" : {
          "ietf-yang-library:modules-state" : {
            "module" : [
              {
                "name" : "example-jukebox",
                "revision" : "2016-08-15"
              },
              {
                "name" : "ietf-inet-types",
                "revision" : "2013-07-15"
              },
              {
                "name" : "ietf-restconf-monitoring",
                "revision" : "2017-01-26"
              },
              {
                "name" : "ietf-yang-library",
                "revision" : "2016-06-21"
              },
              {
                "name" : "ietf-yang-types",
                "revision" : "2013-07-15"
              }
            ]
          }
        }
      }

B.3.4. Параметр insert

В этом примере новая песня добавляется в начало списка воспроизведения Foo-One.

Запрос клиента

      POST /restconf/data/example-jukebox:jukebox/\
          playlist=Foo-One?insert=first HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "example-jukebox:song" : [
           {
             "index" : 1,
             "id" : "/example-jukebox:jukebox/library\
                /artist[name='Foo Fighters']\
                /album[name='Wasting Light']\
                /song[name='Rope']"
           }
         ]
      }

Отклик сервера

      HTTP/1.1 201 Created
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      Location: https://example.com/restconf/data/\
          example-jukebox:jukebox/playlist=Foo-One/song=1
      ETag: "eeeada438af"

B.3.5. Параметр point

В этом примере клиент вставляет запись для новой песни с список воспроизведения Foo-One после первой песни.

Запрос клиента

      POST /restconf/data/example-jukebox:jukebox/\
          playlist=Foo-One?insert=after&point=\
          %2Fexample-jukebox%3Ajukebox\
          %2Fplaylist%3DFoo-One%2Fsong%3D1 HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "example-jukebox:song" : [
           {
             "index" : 2,
             "id" : "/example-jukebox:jukebox/library\
                /artist[name='Foo Fighters']\
                /album[name='Wasting Light']\
                /song[name='Bridge Burning']"
           }
         ]
      }

Отклик сервера

      HTTP/1.1 201 Created
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Last-Modified: Thu, 26 Jan 2017 20:56:30 GMT
      Location: https://example.com/restconf/data/\
          example-jukebox:jukebox/playlist=Foo-One/song=2
      ETag: "abcada438af"

B.3.6. Параметр filter

Приведенные ниже идентификаторы URI показывают некоторые примеры задания фильтров уведомлений.

      // filter = /event/event-class='fault'
      GET /streams/NETCONF?filter=%2Fevent%2Fevent-class%3D'fault'

      // filter = /event/severity<=4
      GET /streams/NETCONF?filter=%2Fevent%2Fseverity%3C%3D4

      // filter = /linkUp|/linkDown
      GET /streams/SNMP?filter=%2FlinkUp%7C%2FlinkDown

      // filter = /*/reporting-entity/card!='Ethernet0'
      GET /streams/NETCONF?\
         filter=%2F*%2Freporting-entity%2Fcard%21%3D'Ethernet0'

      // filter = /*/email-addr[contains(.,'company.com')]
      GET /streams/critical-syslog?\
         filter=%2F*%2Femail-addr[contains(.%2C'company.com')]

      // Примечание. Имя модуля используется в качестве префикса.
      // filter = (/example-mod:event1/name='joe' and
      //           /example-mod:event1/status='online')
      GET /streams/NETCONF?\
        filter=(%2Fexample-mod%3Aevent1%2Fname%3D'joe'%20and\
                %20%2Fexample-mod%3Aevent1%2Fstatus%3D'online')

      // Для получения уведомлений из двух модулей (например, m1 + m2)
      // filter=(/m1:* or /m2:*)
      GET /streams/NETCONF?filter=(%2Fm1%3A*%20or%20%2Fm2%3A*)

B.3.7. Параметр start-time

Приведенный ниже идентификатор URI содержит пример параметра запроса start-time.

      // start-time = 2014-10-25T10:02:00Z
      GET /streams/NETCONF?start-time=2014-10-25T10%3A02%3A00Z

B.3.8. Параметр stop-time

Приведенный ниже идентификатор URI содержит пример параметра запроса stop-time.

      // start-time = 2014-10-25T10:02:00Z
      // stop-time = 2014-10-25T12:31:00Z
      GET /mystreams/NETCONF?start-time=2014-10-25T10%3A02%3A00Z\
         &stop-time=2014-10-25T12%3A31%3A00Z

B.3.9. Параметр with-defaults

Предположим, что сервер реализует модуль example, определенный в Приложении A.1 к [RFC6243], а хранилище сервера соответствует определенному в Приложении A.2 к [RFC6243].

Если параметр basic-mode в URI протокольной возможности defaults (параграф 9.1.2) имеет значение trim, запрос для интерфейса eth1 может иметь приведенный ниже вид.

Без параметра запроса

      GET /restconf/data/example:interfaces/interface=eth1 HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "example:interface" : [
          {
            "name" : "eth1",
            "status" : "up"
          }
        ]
      }

Отметим, что лист mtu не указан, поскольку он имеет принятое по умолчанию значение 1500, а для сервера установлено basic-mode=trim.

С параметром запроса

      GET /restconf/data/example:interfaces/interface=eth1\
          ?with-defaults=report-all HTTP/1.1
      Host: example.com
      Accept: application/yang-data+json

Сервер может возвратить отклик

      HTTP/1.1 200 OK
      Date: Thu, 26 Jan 2017 20:56:30 GMT
      Server: example-server
      Content-Type: application/yang-data+json

      {
        "example:interface" : [
          {
            "name" : "eth1",
            "mtu" : 1500,
            "status" : "up"
          }
        ]
      }

Отметим, что серверу следует возвращать лист mtu, поскольку для параметра with-defaults запрошен режим report-all.

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

Авторы благодарны за вклад в документ Ladislav Lhotka, Juergen Schoenwaelder, Rex Fernando, Robert Wilton и Jonathan Hansford. Спасибо также Mehmet Ersue, Mahesh Jethanandani, Qin Wu, Joe Clarke, Bert Wijnen, Ladislav Lhotka, Rodney Cummings, Frank Xialiang, Tom Petch, Robert Sparks, Balint Uveges, Randy Presuhn, Sue Hares, Mark Nottingham, Benoit Claise, Dale Worley и Lionel Morand за отличное техническое рецензирование документа.

Участие Andy Bierman в этой работе поддерживалось S&TCD18 в рамках контракта W15P7T-13-C-A616. Любые мнения, заключения и выводы в этом документе принадлежат автору (авторам) и могут не отражать точку зрения S&TCD.

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

Andy Bierman

YumaWorks

Email: andy@yumaworks.com

Martin Bjorklund

Tail-f Systems

Email: mbj@tail-f.com

Kent Watsen

Juniper Networks

Email: kwatsen@juniper.net

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

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

nmalykh@protokols.ru

1Network Configuration Protocol — протокол настройки конфигурации сети.

2Internet Engineering Task Force.

3Internet Engineering Steering Group.

4Remote Procedure Call — вызов удаленной процедуры.

5Network Configuration Protocol — протокол настройки конфигурации сети.

6Create, Read, Update, Delete.

7Server-Sent Events — передаваемые сервером события.

8Representational State Transfer — перенос репрезентативного состояния.

9Hypermedia as the Engine of Application State — гиперсреда как машина состояний приложения.

10Transport Layer Security — защита на транспортном уровне.

11NETCONF Access Control Model.

12Extensible Resource Descriptor.

13Augmented Backus-Naur Form — расширенная форма Бэкуса-Наура.

14XML Schema Definition — определение схемы XML.

15Secure Shell — защищенная оболочка.

16Работа опубликована в RFC 8446.

17Работа опубликована в RFC 8072.

18United States Army, Space & Terrestrial Communications Directorate.

Рубрика: RFC | Комментарии к записи RFC 8040 RESTCONF Protocol отключены

RFC 8022 A YANG Data Model for Routing Management

Internet Engineering Task Force (IETF)                         L. Lhotka
Request for Comments: 8022                                        CZ.NIC
Category: Standards Track                                      A. Lindem
ISSN: 2070-1721                                            Cisco Systems
                                                           November 2016

A YANG Data Model for Routing Management

Модель данных YANG для управления маршрутизацией

PDF

Аннотация

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

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

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

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

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

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

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

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

 

1. Введение

Этот документ содержит спецификации трёх модулей YANG.

  • Модуль ietf-routing содержит базовые компоненты модели данных маршрутизации.

  • Модуль ietf-ipv4-unicast-routing дополняет ietf-routing данными для индивидуального трафика IPv4.

  • Модуль ietf-ipv6-unicast-routing дополняет ietf-routing данными для индивидуального трафика IPv6, а его субмодуль ietf-ipv6-router-advertisements дополняет модули ietf-interfaces [RFC7223] и ietf-ip [RFC7277] переменными конфигурации маршрутизатора IPv6, требуемыми [RFC4861].

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

2. Термины и обозначения

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

Ниже указаны термины, определённые в [RFC6241]:

  • client — клиент;
  • message — сообщение;
  • protocol operation — протокольная операция;
  • server — сервер.

Ниже указаны термины, определённые в [RFC7950]:

  • action — действие;
  • augment — дополнение;
  • configuration data — данные конфигурации;
  • container — контейнер;
  • container with presence — контейнер с присутствием;
  • data model — модель данных;
  • data node — узел данных;
  • feature — свойство (функция);
  • leaf — лист;
  • list — список;
  • mandatory node — обязательный узел;
  • module — модуль;
  • schema tree — дерево схемы;
  • state data — данные состояния.
  • RPC (Remote Procedure Call) operation — операция вызова удалённой процедуры.

2.1. Глоссарий новых терминов

core routing data model — модель данных ядра маршрутизации

Модель данных YANG, состоящая из модулей ietf-routing, ietf-ipv4-unicast-routing и ietf-ipv6-unicast-routing.

direct route — прямой маршрут

Маршрут в подключенную непосредственно сеть.

Routing Information Base (RIB) — база маршрутной информации

Объект, содержащий список маршрутов и другие сведения (см. 5.2. База маршрутных данных (RIB)).

system-controlled entry — контролируемая системой сущность

Запись из списка данных состояния (config false), создаваемая системой независимо от того, что было настроено явно (см. 4.1. Управляемые системой и пользователем записи списков).

user-controlled entry — контролируемая пользователем сущность

Запись из списка данных состояния (config false), создаваемая и удаляемая в результате прямого воздействия операций настройки (см. 4.1. Управляемые системой и пользователем записи списков).

2.2. Диаграммы деревьев

Упрощённое графическое представление полного дерева данных дано в Приложении A, а фрагменты дерева приведены в тексте документа.

  • Квадратные скобки [ и ] содержат в себе ключи.

  • Фигурные скобки { и } содержат имена необязательных функций, делающие соответствующий узел условным.

  • В сокращениях перед именами узлов rw указывает данные конфигурации (read-write), ro — данные состояния (read-only), -x — операции RPC или действия, -n — уведомления.

  • После имени узла символ ? Указывает необязательный узел, ! — контейнер с присутствием, * — list или leaf-list.

  • Круглые скобки включают узлы choice и case, а узлы case помечаются также двоеточием (:).

  • Три точки (…) указывают пропущенное содержимое субдерева (ветви).

2.3. Префиксы в именах узлов данных

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

Таблица 1. Префиксы и соответствующие модули YANG.

 

Префикс

Модуль YANG

Документ

if

ietf-interfaces

[RFC7223]

ip

ietf-ip

[RFC7277]

rt

ietf-routing

Раздел 7

v4ur

ietf-ipv4-unicast-routing

Раздел 8

v6ur

ietf-ipv6-unicast-routing

Раздел 9

yang

ietf-yang-types

[RFC6991]

inet

ietf-inet-types

[RFC6991]

 

3. Цели

Исходные цели разработки разработки модуля данных ядра маршрутизации указаны ниже.

  • Модели следует подходит для базовых семейств адресов, в частности, IPv4 и IPv6, а также для индивидуальной и групповой (multicast) маршрутизации и многопротокольной коммутации по меткам (Multiprotocol Label Switching или MPLS).

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

  • Схема ядра маршрутизации должна допускать сложные реализации с множеством RIB и протоколов плоскости управления, а также контролируемым распространением маршрутной информации.

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

4. Устройство модели данных ядра маршрутизации

Модель данных ядра маршрутизации состоит из 3 модулей и 1 субмодуля. Первый модуль, ietf-routing, задаёт базовые компоненты системы маршрутизации, а два других, ietf-ipv4-unicast-routing и ietf-ipv6-unicast-routing, дополняют его узлами данных для индивидуальной маршрутизации IPv4 и IPv6. Субмодуль, ietf-ipv6-router-advertisements, дополняет модули ietf-interfaces [RFC7223] и ietf-ip [RFC7277] конфигурационными переменными для анонсов маршрутизаторов IPv6 в соответствии с [RFC4861]. На рисунках 1 и 2 приведены сокращённые формы иерархий данных конфигурации и состояния, а полные деревья представлены в Приложении A.

   +--rw routing
      +--rw router-id?
      +--rw control-plane-protocols
      |  +--rw control-plane-protocol* [type name]
      |     +--rw type
      |     +--rw name
      |     +--rw description?
      |     +--rw static-routes
      |        +--rw v6ur:ipv6
      |        |     ...
      |        +--rw v4ur:ipv4
      |              ...
      +--rw ribs
         +--rw rib* [name]
            +--rw name
            +--rw address-family?
            +--rw description?

Рисунок 1. Иерархия данных конфигурации.

   +--ro routing-state
      +--ro router-id?
      +--ro interfaces
      |  +--ro interface*
      +--ro control-plane-protocols
      |  +--ro control-plane-protocol* [type name]
      |     +--ro type
      |     +--ro name
      +--ro ribs
         +--ro rib* [name]
            +--ro name
            +--ro address-family
            +--ro default-rib?
            +--ro routes
            |  +--ro route*
            |        ...

Рисунок 2. Иерархия данных состояния.


На рисунках показаны несколько базовых компонентов, добавляемых в модель маршрутизации, — маршруты, базы RIB со списками маршрутов и протоколы плоскости управления (см. 5. Базовые блоки).

4.1. Управляемые системой и пользователем записи списков

Модель данных ядра маршрутизации определяет в дереве схемы несколько списков, таких как rib, которые в корректно работающем устройстве должны включать хотя бы по одной записи, а дополнительные записи может добавлять клиент. В этих списках сервер создаёт обязательный элемент — управляемую системой запись в данных состояния — в контейнере routing-state. В примере Приложения D список /routing-state/ribs/rib имеет две управляемые системой записи — ipv4-master и ipv6-master.

Дополнительные записи может вносить в конфигурацию клиент, например, по протоколу NETCONF. Такие записи называют управляемыми клиентом. Если сервер воспринимает запись от клиента, она появляется в списке версии данных состояния.

Соответствующие записи в списках данных конфигурации и состояния имеют одинаковые ключи списка.

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

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

5. Базовые блоки

В этом разделе описаны важные компоненты модели данных ядра маршрутизации.

5.1. Маршрут

Маршруты являются базовыми элементами системы маршрутизации. Модель данных ядра маршрутизации определяет лишь минимальный набор маршрутных атрибутов.

destination-prefix

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

route-preference

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

next-hop

Определяет выходной интерфейс или адрес(а) следующего узла пересылки (next-hop) или выполняемую для пакета специальную операцию.

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

5.2. База маршрутных данных (RIB)

Каждая реализация модели данных ядра маршрутизации управляет одной или множеством таблиц RIB, которые являются списками маршрутов, дополненных административными данными. Каждая таблица RIB содержит маршруты лишь для одного семейства адресов, которое представляется отождествлением, выведенным из rt:address-family.

В модели данных ядра маршрутизации таблицы RIB служат данными состояния, представленными записями списка /routing-state/ribs/rib. Содержимым RIB управляют и манипулируют операции протоколов плоскости управления, что может приводить к добавлению, изменению и удалению маршрутов. Это также включает манипуляции, выполняемые через псевдопротоколы static и direct (5.3.1. Псевдопротоколы маршрутизации).

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

Простые реализации маршрутизаторов, не анонсирующие свойство multiple-ribs, обычно создают управляемую системой RIB для каждого поддерживаемого семейства адресов и помечают её как default RIB. Более сложные маршрутизаторы с поддержкой multiple-ribs создают множество RIB для каждого семейства адресов, которые могут применяться для маршрутизации на основе правил и других целей. Для списка rib задано 1 действие (см. параграф 7.15 в [RFC7950]).

active-route

Возвращает активный маршрут RIB для адреса получателя, указанного входным параметром действия.

5.3. Протокол плоскости управления

Модель данных ядра маршрутизации обеспечивает открытую схему для задания нескольких экземпляров протоколов плоскости управления, например, протоколов маршрутизации L3. Каждому экземпляру протокола плоскости управления должен быть назначен тип, идентификатор которого выводится из rt:control-plane-protocol. Модель данных ядра маршрутизации определяет идентификаторы для псевдопротоколов direct и static (параграф 5.3.1). Можно настроить несколько экземпляров одного протокола плоскости управления.

5.3.1. Псевдопротоколы маршрутизации

Модель данных ядра маршрутизации задаёт два специальных типа протоколов маршрутизации — direct (прямое подключение) и static (статический маршрут). Оба фактически являются псевдопротоколами, т. е. ограничены локальным устройством и не обмениваются маршрутными данными с соседними маршрутизаторами. Каждая реализация модели данных ядра маршрутизации должна предоставлять в точности 1 экземпляр псевдопротокола direct, который является источником прямых маршрутов ко всем настроенным семействам адресов. Прямые маршруты обычно поддерживаются ядром ОС на основе адресов сетевых интерфейсов (6.2. ietf-ip.

Псевдопротокол static служит для задания маршрутов вручную. Можно (но не требуется) настроить множество экземпляров протокола, но обычно применяется один.

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

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

  • Должны определяться новые идентификаторы для протоколов плоскости управления, а из базовым идентификатором должен быть rt:control-plane-protocol или идентификатор, выведенный из него.

  • Могут определяться дополнительные атрибуты маршрутов, желательно в одном месте с использованием группировки YANG. Новые атрибуты добавляются путём дополнения узлов /rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route и /rt:routing-state/rt:ribs/rt:rib/rt:output/rt:route и, возможно других узлов в данных конфигурации и состояния, уведомлений и параметров ввода-вывода действий или операций RPC.

  • Параметры конфигурации и/или данные состояния для нового протокола могут определяться путём дополнения узла данных control-plane-protocol в /routing и /routing-state.

С помощью оператора when дополненные параметры конфигурации и данные состояния, связанные с новым протоколом, следует делать условными и действительными лишь при совпадении rt:type или rt:source-protocol с идентификатором нового протокола (или производным от него).

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

Описанные выше шаги реализованы в примере модуля YANG для протокола (RIP) в Приложении C.

5.4. Параметры анонсов маршрутизаторов IPv6

Модуль YANG ietf-ipv6-router-advertisements (параграф 9.1), являющийся субмодулем ietf-ipv6-unicast-routing, дополняет данные конфигурации и состояния интерфейсов IPv6 определениями указанных ниже переменных в соответствии с требованиями параграфа 6.2.1 в [RFC4861].

  • send-advertisements;
  • max-rtr-adv-interval;
  • min-rtr-adv-interval;
  • managed-flag;
  • other-config-flag;
  • link-mtu;
  • reachable-time;
  • retrans-timer;
  • cur-hop-limit;
  • default-lifetime;
  • prefix-list (список анонсируемых префиксов).

С каждым префиксом списка связан ряд параметров:

  • valid-lifetime;
  • on-link-flag;
  • preferred-lifetime;
  • autonomous-flag.

Примечания.

  1. Флаг IsRouter, который требует [RFC4861], реализован в модуле ietf-ip [RFC7277] (лист ip:forwarding).

  2. Исходная спецификация [RFC4861] позволяет реализациям решать, сохраняются параметры valid-lifetime и preferred-lifetime неизменными в последовательных анонсах или декрементируются в соответствии с временем. Однако декрементирование представляется проблематичным, поскольку значения могут снова быть сброшены к заданным конфигурацией (большим) после перезагрузки конфигурации. Более того, неизвестно ни одной реализации с декрементированием. Поэтому в субмодуле ietf-ipv6-router-advertisements сохранено прежнее поведение с постоянными значениями.

6. Взаимодействие с другими модулями YANG

Семантика модели данных ядра маршрутизации зависит от нескольких параметров конфигурации из других модулей YANG.

6.1. ietf-interfaces

В модуле YANG ietf-interfaces [RFC7223] определён логический параметр

/if:interfaces/if:interface/if:enabled

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

6.2. ietf-ip

В модуле YANG ietf-ip [RFC7277] определен логические параметры, указанные ниже.

/if:interfaces/if:interface/ip:ipv4/ip:enabled

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

/if:interfaces/if:interface/ip:ipv4/ip:forwarding

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

/if:interfaces/if:interface/ip:ipv6/ip:enabled

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

/if:interfaces/if:interface/ip:ipv6/ip:forwarding

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

Кроме того, модуль ietf-ip позволяет настраивать на интерфейсах сетевого уровня адреса IPv4 и IPv6, префиксы и маски сетей. Настройка этих параметров на включённом (enabled) интерфейсе должна незамедлительно приводить к созданию соответствующего прямого (direct) маршрута. Префикс получателей для маршрута устанавливается в соответствии с настроенным адресом IP, префиксом и маской сети, а интерфейс становится выходным для маршрута.

7. Модуль YANG для управления маршрутизацией

   <CODE BEGINS> file "ietf-routing@2016-11-04.yang"

   module ietf-routing {

     yang-version "1.1";

     namespace "urn:ietf:params:xml:ns:yang:ietf-routing";

     prefix "rt";

     import ietf-yang-types {
       prefix "yang";
     }

     import ietf-interfaces {
       prefix "if";
     }

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netmod/> 
        WG List:  <mailto:netmod@ietf.org> 

        WG Chair: Lou Berger
                  <mailto:lberger@labn.net> 

        WG Chair: Kent Watsen
                  <mailto:kwatsen@juniper.net> 

        Editor:   Ladislav Lhotka
                  <mailto:lhotka@nic.cz> 

        Editor:   Acee Lindem
                  <mailto:acee@cisco.com>"; 

     description
       "Этот модуль YANG задаёт важные компоненты управления подсистемой
        маршрутизации.

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

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 
 
        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        RFC 2119.

        Эта версия данного модуля YANG является частью RFC 8022, где
        правовые вопросы рассмотрены более полно.";

     revision 2016-11-04 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8022: A YANG Data Model for Routing Management";
     }

     /* Свойства (функции) */

     feature multiple-ribs {
       description
         "Указывает поддержку сервером пользовательских таблиц RIB. 

          Серверам, не анонсирующим это свойство, СЛЕДУЕТ поддерживать
          в точности 1 контролируемую системой таблицу RIB на 
          поддерживаемое семейство адресов и делать её default RIB. Эта
          таблица будет записью в списке /routing-state/ribs/rib.";
     }

     feature router-id {
       description
         "Указывает поддержку сервером настройки явных 32-битовых
          Router ID, применяемых некоторыми протоколами маршрутизации.

          Серверы, не анонсирующие это свойство, задают Router ID
          алгоритмически, обычно по настроенным адресам IPv4. Однако
          алгоритм зависит от реализации.";
     }

     /* Отождествления (идентификаторы) */

     identity address-family {
       description
         "Базовый идентификатор, из которого выводятся идентификаторы,
          описывающие семейства адресов.";
     }

     identity ipv4 {
       base address-family;
       description
         "Представляет семейство адресов IPv4.";
     }

     identity ipv6 {
       base address-family;
       description
         "Представляет семейство адресов IPv6.";
     }

     identity control-plane-protocol {
       description
         "Базовый идентификатор, из которого выводятся идентификаторы
          протоколов плоскости управления.";
     }

     identity routing-protocol {
       base control-plane-protocol;
       description
         "Идентификатор, из которого выводятся идентификаторы протоколов
          маршрутизации L3.";
     }

     identity direct {
       base routing-protocol;
       description
         "Псевдопротокол для маршрутов в подключённые напрямую сети.";
     }

     identity static {
       base routing-protocol;
       description
         "Псевдопротокол статической маршрутизации.";
     }

     /* Определение типа */

     typedef route-preference {
       type uint32;
       description
         "Тип для предпочтений маршрутов.";
     }

     /* Группировки */

     grouping address-family {
       description
         "Поддерживает листья, указывающие семейства адресов.";
       leaf address-family {
         type identityref {
           base address-family;
         }
         mandatory "true";
         description
           "Семейство адресов.";
       }
     }

     grouping router-id {
       description
         "Группировка для Router ID.";
       leaf router-id {
         type yang:dotted-quad;
         description
           "32-битовое число с разделением точками, применяемое в
            некоторых протоколах маршрутизации как идентификатор.";
         reference
           "RFC 2328: OSPF Version 2.";
       }
     }

     grouping special-next-hop {
       description
         "Обеспечивает листья с перечислением специальных next-hop.";
       leaf special-next-hop {
         type enumeration {
           enum blackhole {
             description
               "Отбрасывание пакетов без уведомления.";
           }
           enum unreachable {
             description
               "Отбрасывание пакетов с передачей отправителю сообщения
                об ошибке, указывающего недоступность хоста-адресата.";
           }
           enum prohibit {
             description
               "Отбрасывание пакетов с передачей отправителю сообщения
                об ошибке, указывающего административный запрет связи.";
           }
           enum receive {
             description
               "Пакет был получен локальной системой.";
           }
         }
         description
           "Опции для специальных next-hop.";
       }
     }

     grouping next-hop-content {
       description
         "Базовые параметры next-hop в статических маршрутах.";
       choice next-hop-options {
         mandatory "true";
         description
           "Опции next hop в статических маршрутах.

            Предполагается добавление case в будущих модулях.";
         case simple-next-hop {
           description
             "Простое указание next-hop адресом следующего узла и/или
              выходным интерфейсом.

              Модули для семейств адресов ДОЛЖНЫ дополнять этот вариант
              листом с адресом next-hop из этого семейства.";
           leaf outgoing-interface {
             type if:interface-ref;
             description
               "Имя выходного интерфейса.";
           }
         }
         case special-next-hop {
           uses special-next-hop;
         }
         case next-hop-list {
           container next-hop-list {
             description
               "Контейнер для множества next-hop.";
             list next-hop {
               key "index";
               description
                 "Запись списка next-hop. Модули для семейств адресов
                  ДОЛЖНЫ дополнять этот список листом с адресом
                  next-hop из этого семейства.";
               leaf index {
                 type string;
                 description
                   "Пользовательский идентификатор для однозначного
                    указания записи в списке next-hop. Значение не имеет
                    какой-либо дополнительной семантики.";
               }
               leaf outgoing-interface {
                 type if:interface-ref;
                 description
                   "Имя выходного интерфейса.";
               }
             }
           }
         }
       }
     }

     grouping next-hop-state-content {
       description
         "Базовые параметры next-hop в данных состояния.";
       choice next-hop-options {
         mandatory "true";
         description
           "Опции для next-hop в данных состояния. 

            Предполагается добавление case в других модулях,
            например, для рекурсивных next-hop.";
         case simple-next-hop {
           description
             "Простое указание next-hop адресом следующего узла и/или
              выходным интерфейсом.

              Модули для семейств адресов ДОЛЖНЫ дополнять этот вариант
              листом с адресом next-hop из этого семейства.";
           leaf outgoing-interface {
             type if:interface-state-ref;
             description
               "Имя выходного интерфейса.";
           }
         }
         case special-next-hop {
           uses special-next-hop;
         }
         case next-hop-list {
           container next-hop-list {
             description
               "Контейнер для множества next-hop.";
             list next-hop {
               description
                 "Запись списка next-hop. Модули для семейств адресов
                  ДОЛЖНЫ дополнять этот список листом с адресом
                  next-hop из этого семейства.";
               leaf outgoing-interface {
                 type if:interface-state-ref;
                 description
                   "Имя выходного интерфейса.";
               }
             }
           }
         }
       }
     }

     grouping route-metadata {
       description
         "Базовые метаданные маршрута.";
       leaf source-protocol {
         type identityref {
           base routing-protocol;
         }
         mandatory "true";
         description
           "Тип протокола маршрутизации, создавшего маршрут.";
       }
       leaf active {
         type empty;
         description
           "Наличие этого листа указывает, что маршрут является
            предпочтительным перед другими маршрутами таблицы RIB
            с тем же префиксом адресата.";
       }
       leaf last-updated {
         type yang:date-and-time;
         description
           "Метка времени последнего изменения маршрута. Если маршрут не
            менялся, это будет время вставки маршрута в таблицу RIB.";
       }
     }

     /* Данные состояния */

     container routing-state {
       config "false";
       description
         "Данные состояния подсистемы маршрутизации.";
       uses router-id {
         description
           "Глобальное значение Router ID. Может настраиваться или
            алгоритмически определяться реализацией.";
       }
       container interfaces {
         description
           "Интерфейсы сетевого уровня, служащие для маршрутизации.";
         leaf-list interface {
           type if:interface-state-ref;
           description
             "Каждая запись указывает имя настроенного интерфейса 
              сетевого уровня.";
         }
       }
       container control-plane-protocols {
         description
           "Контейнер для списка экземпляров протоколов маршрутизации.";
         list control-plane-protocol {
           key "type name";
           description
             "Данные состояния протокола плоскости управления.

              Реализация ДОЛЖНА обеспечивать в точности 1 управляемый
              системой экземпляр псевдопротокола direct. Конфигурация
              МОЖЕТ создавать другие экземпляры протоколов плоскости
              управления.";
           leaf type {
             type identityref {
               base control-plane-protocol;
             }
             description
               "Тип протокола плоскости управления.";
           }
           leaf name {
             type string;
             description
               "Имя экземпляра протокола плоскости управления. Для
                управляемых системой экземпляров это имя постоянно,
                т. е. его НЕ СЛЕДУЕТ менять при перезагрузке.";
           }
         }
       }
       container ribs {
         description
           "Контейнер для таблиц RIB.";
         list rib {
           key "name";
           min-elements "1";
           description
             "Каждая запись представляет RIB, указываемую ключом name.
              Все маршруты в таблице RIB ДОЛЖНЫ относиться к одному 
              семейству адресов. Реализации СЛЕДУЕТ обеспечивать 1
              управляемую системой default RIB для каждого
              поддерживаемого семейства адресов.";
           leaf name {
             type string;
             description
               "Имя таблицы RIB.";
           }
           uses address-family;
           leaf default-rib {
             if-feature "multiple-ribs";
             type boolean;
             default "true";
             description
               "Значение true устанавливается для таблицы, служащей 
                default RIB для этого семейства адресов. По умолчанию
                протоколы плоскости управления помещают свои маршруты
                в таблицы default RIB.";
           }
           container routes {
             description
               "Текущее содержимое RIB.";
             list route {
               description
                 "Маршрутная запись RIB. Этот узел данных ДОЛЖЕН 
                  дополняться сведениями о маршрутах для каждого 
                  семейства адресов.";
               leaf route-preference {
                 type route-preference;
                 description
                   "Атрибут маршрута (административная дистанция), 
                    позволяющий выбрать предпочтительный маршрут из
                    числа имеющихся для данного префикса получателя. 
                    Меньшее значение даёт более высокий приоритет.";
               }
               container next-hop {
                 description
                   "Атрибут next-hop для маршрута.";
                 uses next-hop-state-content;
               }
               uses route-metadata;
             }
           }
           action active-route {
             description
               "Возвращает активный маршрут RIB к префиксу получателя.

                Модули для семейств адресов ДОЛЖНЫ дополнять входные
                параметры листом destination-address.";
             output {
               container route {
                 description
                   "Активный маршрут RIB к заданному префиксу адресата.

                    Если в RIB нет маршрута, не возвращается ничего.

                    Модули для семейств адресов ДОЛЖНЫ дополнять этот
                    контейнер соответствующим содержимым маршрута.";
                 container next-hop {
                   description
                     "Атрибут next-hop для маршрута.";
                   uses next-hop-state-content;
                 }
                 uses route-metadata;
               }
             }
           }
         }
       }
     }

     /* Данные конфигурации */

     container routing {
       description
         "Параметры конфигурации подсистемы маршрутизации.";
       uses router-id {
         if-feature "router-id";
         description
           "Глобальное значение Router ID. Протоколы маршрутизации
            могут использовать этот параметр или переопределять его.";
       }
       container control-plane-protocols {
         description
           "Конфигурация экземпляров протокола плоскости управления.";
         list control-plane-protocol {
           key "type name";
           description
             "Каждая запись содержит конфигурацию экземпляра протокола
              плоскости управления.";
           leaf type {
             type identityref {
               base control-plane-protocol;
             }
             description
               "Тип протокола плоскости управления - идентификатор,
                выведенный из control-plane-protocol.";
           }
           leaf name {
             type string;
             description
               "Произвольное имя экземпляра протокола плоскости
                управления.";
           }
           leaf description {
             type string;
             description
               "Текстовое описание экземпляра протокола плоскости
                управления.";
           }
           container static-routes {
             when "derived-from-or-self(../type, 'rt:static')" {
               description
                 "Контейнер только для псевдопротокола static.";
             }
             description
               "Конфигурация псевдопротокола static.

                Модули для семейств адресов дополняют этот узел своими
                списками маршрутов.";
           }
         }
       }
       container ribs {
         description
           "Конфигурация таблиц RIB.";
         list rib {
           key "name";
           description
             "Каждая запись содержит конфигурация RIB, указанной ключом
              name. Записи с таким же ключом как в управляемой системой
              записи списка /routing-state/ribs/rib служат для 
              параметров конфигурации этой записи. Другие задают 
              управляемые пользователем таблицы RIB.";
           leaf name {
             type string;
             description
               "Имя таблицы RIB. Для управляемых системой записей 
                значение этого листа должно совпадать с именем 
                соответствующей записи в данных состояния. Для 
                пользовательских записей имя может быть любым.";
           }
           uses address-family {
             description
               "Семейство адресов в таблице RIB. Обязательно для
                пользовательских RIB и может отсутствовать для
                управляемых системой RIB. Должно соответствовать 
                семейству адресов в соответствующей записи состояния.";
             refine "address-family" {
               mandatory "false";
             }
           }
           leaf description {
             type string;
             description
               "Текстовое описание таблицы RIB.";
           }
         }
       }
     }
   }
   <CODE ENDS>

8. Модуль YANG для управления маршрутизацией IPv4 Unicast

   <CODE BEGINS> file "ietf-ipv4-unicast-routing@2016-11-04.yang"

   module ietf-ipv4-unicast-routing {

     yang-version "1.1";

     namespace "urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing";

     prefix "v4ur";

     import ietf-routing {
       prefix "rt";
     }

     import ietf-inet-types {
       prefix "inet";
     }

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netmod/> 
        WG List:  <mailto:netmod@ietf.org> 

        WG Chair: Lou Berger
                  <mailto:lberger@labn.net> 

        WG Chair: Kent Watsen
                  <mailto:kwatsen@juniper.net> 

        Editor:   Ladislav Lhotka
                  <mailto:lhotka@nic.cz> 

        Editor:   Acee Lindem
                  <mailto:acee@cisco.com>"; 

     description
       "Этот модуль YANG дополняет модуль ietf-routing базовыми данными
        конфигурации и состояния для индивидуальной маршрутизации IPv4.

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

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 
 
        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        RFC 2119.

        Эта версия данного модуля YANG является частью RFC 8022, где
        правовые вопросы рассмотрены более полно.";

     revision 2016-11-04 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8022: A YANG Data Model for Routing Management";
     }

     /* Идентификаторы (отождествления) */

     identity ipv4-unicast {
       base rt:ipv4;
       description
         "Представляет семейство индивидуальных адресов IPv4.";
     }

     /* State data */

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
       when "derived-from-or-self(../../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast.";
       }
       description
         "Этот лист дополняет маршрут IPv4 unicast.";
       leaf destination-prefix {
         type inet:ipv4-prefix;
         description
           "Префикс получателя IPv4.";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
           + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
       when "derived-from-or-self(../../../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast.";
       }
       description
         "Дополняет вариант simple-next-hop в маршрутах IPv4 unicast.";
       leaf next-hop-address {
         type inet:ipv4-address;
         description
           "Адрес IPv4 следующего узла (next-hop).";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
           + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/"
           + "rt:next-hop-list/rt:next-hop" {
       when "derived-from-or-self(../../../../../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast.";
       }
       description
         "Дополнение варианта next-hop-list в маршрутах IPv4 unicast.";
       leaf address {
         type inet:ipv4-address;
         description
           "Адрес IPv4 следующего узла (next-hop).";
       }
     }

     augment
       "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/rt:input" {
       when "derived-from-or-self(../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast RIB.";
       }
       description
         "Добавляет входной параметр действия active-route.";
       leaf destination-address {
         type inet:ipv4-address;
         description
           "Адрес получателя IPv4.";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route" {
       when "derived-from-or-self(../../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast.";
       }
       description
         "Добавляет префикс адресата в ответ для действия active-route.";
       leaf destination-prefix {
         type inet:ipv4-prefix;
         description
           "Адрес получателя IPv4.";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
           + "rt:simple-next-hop" {
       when "derived-from-or-self(../../../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast.";
       }
       description
         "Дополняет вариант simple-next-hop в ответе на active-route.";
       leaf next-hop-address {
         type inet:ipv4-address;
         description
           "Адрес IPv4 следующего узла (next-hop).";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
           + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
       when "derived-from-or-self(../../../../../rt:address-family, "
          + "'v4ur:ipv4-unicast')" {
         description
           "Дополнение, действительное лишь для IPv4 unicast.";
       }
       description
         "Дополняет вариант next-hop-list в ответе на active-route.";
       leaf next-hop-address {
         type inet:ipv4-address;
         description
           "Адрес IPv4 следующего узла (next-hop).";
       }
     }

     /* Данные конфигурации */

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/rt:static-routes" {
       description
         "Дополняет конфигурацию псевдопротокола static данными
          для IPv4 unicast.";
       container ipv4 {
         description
           "Конфигурация экземпляра псевдопротокола static состоит из
            списка маршрутов.";
         list route {
           key "destination-prefix";
           description
             "Список статических маршрутов.";
           leaf destination-prefix {
             type inet:ipv4-prefix;
             mandatory "true";
             description
               "Префикс адресата IPv4.";
           }
           leaf description {
             type string;
             description
               "Текстовое описание маршрута.";
           }
           container next-hop {
             description
               "Конфигурация next-hop.";
             uses rt:next-hop-content {
               augment "next-hop-options/simple-next-hop" {
                 description
                   "Дополнение варианта simple-next-hop в статических 
                    маршрутах IPv4.";
                 leaf next-hop-address {
                   type inet:ipv4-address;
                   description
                     "Адрес IPv4 следующего узла (next-hop).";
                 }
               }
               augment "next-hop-options/next-hop-list/next-hop-list/"
                     + "next-hop" {
                 description
                   "Дополнение варианта next-hop-list в статических 
                    маршрутах IPv4.";
                 leaf next-hop-address {
                   type inet:ipv4-address;
                   description
                     "Адрес IPv4 следующего узла (next-hop).";
                 }
               }
             }
           }
         }
       }
     }
   }
   <CODE ENDS>

9. Модуль YANG для управления маршрутизацией IPv6 Unicast

   <CODE BEGINS> file "ietf-ipv6-unicast-routing@2016-11-04.yang"

   module ietf-ipv6-unicast-routing {

     yang-version "1.1";

     namespace "urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing";

     prefix "v6ur";

     import ietf-routing {
       prefix "rt";
     }

     import ietf-inet-types {
       prefix "inet";
     }

     include ietf-ipv6-router-advertisements {
       revision-date 2016-11-04;
     }

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netmod/> 
        WG List:  <mailto:netmod@ietf.org> 

        WG Chair: Lou Berger
                  <mailto:lberger@labn.net> 

        WG Chair: Kent Watsen
                  <mailto:kwatsen@juniper.net> 

        Editor:   Ladislav Lhotka
                  <mailto:lhotka@nic.cz> 

        Editor:   Acee Lindem
                  <mailto:acee@cisco.com>"; 

     description
       "Этот модуль YANG дополняет модуль ietf-routing базовыми данными
        конфигурации и состояния для индивидуальной маршрутизации IPv6.

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

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 
 
        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        RFC 2119.

        Эта версия данного модуля YANG является частью RFC 8022, где
        правовые вопросы рассмотрены более полно.";

     revision 2016-11-04 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8022: A YANG Data Model for Routing Management";
     }

     /* Идентификаторы (отождествления) */

     identity ipv6-unicast {
       base rt:ipv6;
       description
         "Представляет семейство индивидуальных адресов IPv6.";
     }

     /* Данные состояния */

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
       when "derived-from-or-self(../../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Дополняет маршрут IPv6 unicast.";
       leaf destination-prefix {
         type inet:ipv6-prefix;
         description
           "Префикс адресата IPv6.";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
           + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
       when "derived-from-or-self(../../../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Augment 'simple-next-hop' case in IPv6 unicast routes.";
       leaf next-hop-address {
         type inet:ipv6-address;
         description
           "Адрес IPv6 следующего узла (next-hop).";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
           + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/"
           + "rt:next-hop-list/rt:next-hop" {
       when "derived-from-or-self(../../../../../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Дополняет вариант next-hop-list для маршрутов IPv6 unicast.";
       leaf address {
         type inet:ipv6-address;
         description
           "Адрес IPv6 следующего узла (next-hop).";
       }
     }

     augment
       "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/rt:input" {
       when "derived-from-or-self(../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Добавляет входной параметр действия active-route.";
       leaf destination-address {
         type inet:ipv6-address;
         description
           "Адрес получателя IPv6.";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route" {
       when "derived-from-or-self(../../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Добавляет префикс адресата в ответ на действие active-route.";
       leaf destination-prefix {
         type inet:ipv6-prefix;
         description
           "Префикс адресата IPv6.";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
           + "rt:simple-next-hop" {
       when "derived-from-or-self(../../../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Дополняет вариант simple-next-hop в ответе на active-route.";
       leaf next-hop-address {
         type inet:ipv6-address;
         description
           "Адрес IPv6 следующего узла (next-hop).";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
           + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
       when "derived-from-or-self(../../../../../rt:address-family, "
          + "'v6ur:ipv6-unicast')" {
         description
           "Дополнение, действительное лишь для IPv6 unicast.";
       }
       description
         "Дополняет вариант next-hop-list в ответе на active-route.";
       leaf next-hop-address {
         type inet:ipv6-address;
         description
           "Адрес IPv6 следующего узла (next-hop).";
       }
     }

     /* Данные конфигурации */

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol/rt:static-routes" {
       description
         "Дополняет конфигурацию псевдопротокола static данными
          для IPv6 unicast.";
       container ipv6 {
         description
           "Конфигурация экземпляра псевдопротокола static состоит из
            списка маршрутов.";
         list route {
           key "destination-prefix";
           description
             "Список статических маршрутов.";
           leaf destination-prefix {
             type inet:ipv6-prefix;
             mandatory "true";
             description
               "Префикс адресата IPv6.";
           }
           leaf description {
             type string;
             description
               "Текстовое описание маршрута.";
           }
           container next-hop {
             description
               "Конфигурация next-hop.";
             uses rt:next-hop-content {
               augment "next-hop-options/simple-next-hop" {
                 description
                   "Дополняет вариант simple-next-hop в статических
                    маршрутах IPv6.";
                 leaf next-hop-address {
                   type inet:ipv6-address;
                   description
                     "Адрес IPv6 следующего узла (next-hop).";
                 }
               }
               augment "next-hop-options/next-hop-list/next-hop-list/"
                     + "next-hop" {
                 description
                   "Дополняет вариант next-hop-list в статических
                    маршрутах IPv6.";
                 leaf next-hop-address {
                   type inet:ipv6-address;
                   description
                     "Адрес IPv6 следующего узла (next-hop).";
                 }
               }
             }
           }
         }
       }
     }
   }
   <CODE ENDS>

9.1. Субмодуль для анонсов маршрутизаторов IPv6

   <CODE BEGINS> file "ietf-ipv6-router-advertisements@2016-11-04.yang"

   submodule ietf-ipv6-router-advertisements {

     yang-version "1.1";

     belongs-to ietf-ipv6-unicast-routing {
       prefix "v6ur";
     }

     import ietf-inet-types {
       prefix "inet";
     }

     import ietf-interfaces {
       prefix "if";
     }

     import ietf-ip {
       prefix "ip";
     }

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netmod/> 
        WG List:  <mailto:netmod@ietf.org> 

        WG Chair: Lou Berger
                  <mailto:lberger@labn.net> 

        WG Chair: Kent Watsen
                  <mailto:kwatsen@juniper.net> 

        Editor:   Ladislav Lhotka
                  <mailto:lhotka@nic.cz> 

        Editor:   Acee Lindem
                  <mailto:acee@cisco.com>"; 

     description
       "Этот модуль дополняет ietf-ip данными конфигурации и состояния
        для анонсов маршрутизаторов IPv6.

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

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 
 
        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        RFC 2119.

        Эта версия данного модуля YANG является частью RFC 8022, где
        правовые вопросы рассмотрены более полно.";

     reference
       "RFC 4861: Neighbor Discovery for IP version 6 (IPv6).";

     revision 2016-11-04 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8022: A YANG Data Model for Routing Management";
     }

     /* данные состояния */

     augment "/if:interfaces-state/if:interface/ip:ipv6" {
       description
         "Дополняет данные состояния интерфейса параметрами анонсов
          маршрутизатора IPv6.";
       container ipv6-router-advertisements {
         description
           "Параметры анонсов маршрутизатора IPv6.";
         leaf send-advertisements {
           type boolean;
           description
             "Флаг, управляющий периодической отправкой сообщений
              Router Advertisement и откликов на Router Solicitation.";
         }
         leaf max-rtr-adv-interval {
           type uint16 {
             range "4..1800";
           }
           units "seconds";
           description
             "Максимальный интервал между отправкой незапрошенных
              групповых сообщений Router Advertisement с интерфейса.";
         }
         leaf min-rtr-adv-interval {
           type uint16 {
             range "3..1350";
           }
           units "seconds";
           description
             "Минимальный интервал между отправкой незапрошенных
              групповых сообщений Router Advertisement с интерфейса.";
         }
         leaf managed-flag {
           type boolean;
           description
             "Значение, помещаемое в поле флага Managed address
              configuration сообщений Router Advertisement.";
         }
         leaf other-config-flag {
           type boolean;
           description
             "Значение, помещаемое в поле флага Other configuration
              сообщений Router Advertisement.";
         }
         leaf link-mtu {
           type uint32;
           description
             "Значение, помещаемое в опции MTU, передаваемые 
              маршрутизатором. 0 указывает отсутствие опций MTU.";
         }
         leaf reachable-time {
           type uint32 {
             range "0..3600000";
           }
           units "milliseconds";
           description
             "Значение, помещаемое в поле Reachable Time сообщений
              Router Advertisement, передаваемых маршрутизатором. 
              0 говорит о незаданном (этим маршрутизатором) значении.";
         }
         leaf retrans-timer {
           type uint32;
           units "milliseconds";
           description
             "Значение, помещаемое в поле Retrans Timer сообщений
              Router Advertisement, передаваемых маршрутизатором. 
              0 говорит о незаданном (этим маршрутизатором) значении.";
         }

         leaf cur-hop-limit {
           type uint8;
           description
             "Значение, помещаемое в поле Cur Hop Limit сообщений
              Router Advertisement, передаваемых маршрутизатором. 
              0 говорит о незаданном (этим маршрутизатором) значении.";
         }
         leaf default-lifetime {
           type uint16 {
             range "0..9000";
           }
           units "seconds";
           description
             "Значение, помещаемое в поле Router Lifetime сообщений
              Router Advertisement, передаваемых с интерфейса. 
              0 говорит о том, что маршрутизатор не используется
              по умолчанию.";
         }
         container prefix-list {
           description
             "Значение, помещаемое в опции Prefix Information сообщений
              Router Advertisement, передаваемых с интерфейса. По
              умолчанию это все префиксы, которые маршрутизатор 
              анонсирует через протоколы маршрутизации как находящиеся
              на одном канале с передающим анонс интерфейсом.";
           list prefix {
             key "prefix-spec";
             description
               "Анонсируемая для префикса запись и её параметры.";
             leaf prefix-spec {
               type inet:ipv6-prefix;
               description
                 "Префикс IPv6.";
             }
             leaf valid-lifetime {
               type uint32;
               units "seconds";
               description
                 "Значение, помещаемое в поле Valid Lifetime опции
                  Prefix Information. Значение 0xffffffff (все 1)
                  представляет бесконечность.

                  Реализации СЛЕДУЕТ сохранять это значение постоянным
                  в последовательных анонсах за исключением случая его 
                  явного указания в конфигурации.";
             }
             leaf on-link-flag {
               type boolean;
               description
                 "Значение, помещаемое в поле флага L-bit опции
                  Prefix Information.";
             }
             leaf preferred-lifetime {
               type uint32;
               units "seconds";
               description
                 "Значение, помещаемое в поле Preferred Lifetime опции
                  Prefix Information (в секундах). Значение 0xffffffff 
                  (все 1) представляет бесконечность.

                  Реализации СЛЕДУЕТ сохранять это значение постоянным
                  в последовательных анонсах за исключением случая его 
                  явного указания в конфигурации.";
             }
             leaf autonomous-flag {
               type boolean;
               description
                 "Значение, помещаемое в поле Autonomous Flag опции
                  Prefix Information.";
             }
           }
         }
       }
     }

     /* Данные конфигурации */

     augment "/if:interfaces/if:interface/ip:ipv6" {
       description
         "Дополняет конфигурацию интерфейса параметрами анонсов
          маршрутизатора IPv6.";
       container ipv6-router-advertisements {
         description
           "Конфигурация IPv6 Router Advertisement.";
         leaf send-advertisements {
           type boolean;
           default "false";
           description
             "Флаг, управляющий периодической отправкой сообщений
              Router Advertisement и откликов на Router Solicitation.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvSendAdvertisements.";
         }
         leaf max-rtr-adv-interval {
           type uint16 {
             range "4..1800";
           }
           units "seconds";
           default "600";
           description
             "Максимальный интервал между отправкой незапрошенных
              групповых сообщений Router Advertisement с интерфейса.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              MaxRtrAdvInterval.";
         }
         leaf min-rtr-adv-interval {
           type uint16 {
             range "3..1350";
           }
           units "seconds";
           must ". <= 0.75 * ../max-rtr-adv-interval" {
             description
               "НЕДОПУСТИМЫ значения более 75% max-rtr-adv-interval.";
           }
           description
             "Минимальный интервал между отправкой незапрошенных
              групповых сообщений Router Advertisement с интерфейса.";

              Используемое по умолчанию значение определяется как
              указано ниже:

              - если max-rtr-adv-interval >= 9 секунд, по умолчанию
                принято 0.33 * max-rtr-adv-interval;

              - в иных случаях 0.75 * max-rtr-adv-interval.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              MinRtrAdvInterval.";
         }
         leaf managed-flag {
           type boolean;
           default "false";
           description
             "Значение, помещаемое в поле флага Managed address
              configuration сообщений Router Advertisement.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvManagedFlag.";
         }
         leaf other-config-flag {
           type boolean;
           default "false";
           description
             "Значение, помещаемое в поле флага Other configuration
              сообщений Router Advertisement.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvOtherConfigFlag.";
         }
         leaf link-mtu {
           type uint32;
           default "0";
           description
             "Значение, помещаемое в опции MTU, передаваемые 
              маршрутизатором. 0 указывает отсутствие опций MTU.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvLinkMTU.";
         }
         leaf reachable-time {
           type uint32 {
             range "0..3600000";
           }
           units "milliseconds";
           default "0";
           description
             "Значение, помещаемое в поле Reachable Time сообщений
              Router Advertisement, передаваемых маршрутизатором. 
              0 говорит о незаданном (этим маршрутизатором) значении.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvReachableTime.";
         }
         leaf retrans-timer {
           type uint32;
           units "milliseconds";
           default "0";
           description
             "Значение, помещаемое в поле Retrans Timer сообщений
              Router Advertisement, передаваемых маршрутизатором.
              0 говорит о незаданном (этим маршрутизатором) значении.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvRetransTimer.";
         }
         leaf cur-hop-limit {
           type uint8;
           description
             "Значение, помещаемое в поле Cur Hop Limit сообщений
              Router Advertisement, передаваемых маршрутизатором.
              0 говорит о незаданном (этим маршрутизатором) значении.";

              Если этот параметр не задан, устройству СЛЕДУЕТ применять
              значение из IANA Assigned Numbers на момент реализации.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvCurHopLimit.

              IANA: параметры IP,
              http://www.iana.org/assignments/ip-parameters"; 
         }
         leaf default-lifetime {
           type uint16 {
             range "0..9000";
           }
           units "seconds";
           description
             "Значение, помещаемое в поле Router Lifetime сообщений
              Router Advertisement, передаваемых с этого интерфейса
              (в секундах). Это ДОЛЖЕН быть 0 или значение из интервала
              max-rtr-adv-interval - 9000 секунд. 0 указывает, что
              маршрутизатор не применяется по умолчанию. Пределы могут
              быть переопределены документами, задающими работу IPv6
              на канальном уровне.

              По умолчанию устройству СЛЕДУЕТ использовать значение
              3 * max-rtr-adv-interval.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvDefaultLifeTime.";
         }
         container prefix-list {
           description
             "Конфигурация префиксов, помещаемых в опции Prefix
              Information сообщений Router Advertisement с этого
              интерфейса.

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

              Префикс link-local НЕ СЛЕДУЕТ включать в число 
              анонсируемых.";
           reference
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
              AdvPrefixList.";
           list prefix {
             key "prefix-spec";
             description
               "Конфигурация анонсируемой записи для префикса.";
             leaf prefix-spec {
               type inet:ipv6-prefix;
               description
                 "Префикс IPv6.";
             }
             choice control-adv-prefixes {
               default "advertise";
               description
                 "Любой префикс явно удаляется из числа анонсируемых или
                  указываются параметры, с которыми он анонсируется 
                  (принятый по умолчанию случай).";
               leaf no-advertise {
                 type empty;
                 description
                   "Префикс не будет анонсироваться. Это может служить
                    для удаления префикса из числа анонсируемых
                    по умолчанию.";
               }
               case advertise {
                 leaf valid-lifetime {
                   type uint32;
                   units "seconds";
                   default "2592000";
                   description
                     "Значение, помещаемое в поле Valid Lifetime опции
                      Prefix Information. Значение 0xffffffff (все 1)
                      представляет бесконечность.";
                   reference
                     "RFC 4861: Neighbor Discovery for IP version 6
                      (IPv6) - AdvValidLifetime.";
                 }
                 leaf on-link-flag {
                   type boolean;
                   default "true";
                   description
                     "Значение, помещаемое в поле флага L-bit опции
                      Prefix Information.";
                   reference
                     "RFC 4861: Neighbor Discovery for IP version 6
                      (IPv6) - AdvOnLinkFlag.";
                 }
                 leaf preferred-lifetime {
                   type uint32;
                   units "seconds";
                   must ". <= ../valid-lifetime" {
                     description
                       "НЕДОПУСТИМЫ значения больше valid-lifetime.";
                   }
                   default "604800";
                   description
                     "Значение, помещаемое в поле Preferred Lifetime
                      опции Prefix Information. Значение 0xffffffff 
                      (все 1) представляет бесконечность.";
                   reference
                     "RFC 4861: Neighbor Discovery for IP version 6
                      (IPv6) - AdvPreferredLifetime.";
                 }
                 leaf autonomous-flag {
                   type boolean;
                   default "true";
                   description
                     "Значение, помещаемое в поле Autonomous Flag
                      опции Prefix Information.";
                   reference
                     "RFC 4861: Neighbor Discovery for IP version 6
                      (IPv6) - AdvAutonomousFlag.";
                 }
               }
             }
           }
         }
       }
     }
   }
   <CODE ENDS>

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

Этот документ регистрирует URI пространств имён в реестре IETF XML Registry [RFC3688].

   URI: urn:ietf:params:xml:ns:yang:ietf-routing
   Registrant Contact: The IESG.
   XML: N/A; the requested URI is an XML namespace.

   URI: urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing
   Registrant Contact: The IESG.
   XML: N/A; the requested URI is an XML namespace.

   URI: urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing
   Registrant Contact: The IESG.
   XML: N/A; the requested URI is an XML namespace.

Этот документ регистрирует модули YANG в реестре YANG Module Names [RFC6020].

   Name:         ietf-routing
   Namespace:    urn:ietf:params:xml:ns:yang:ietf-routing
   Prefix:       rt
   Reference:    RFC 8022

   Name:         ietf-ipv4-unicast-routing
   Namespace:    urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing
   Prefix:       v4ur
   Reference:    RFC 8022

   Name:         ietf-ipv6-unicast-routing
   Namespace:    urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing
   Prefix:       v6ur
   Reference:    RFC 8022

Этот документ регистрирует субмодуль YANG в реестре YANG Module Names [RFC6020].

   Name:         ietf-ipv6-router-advertisements
   Module:       ietf-ipv6-unicast-routing
   Reference:    RFC 8022

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

Данные конфигурации и состояния модели данных ядра маршрутизации (определена в этом документе) предназначены для доступа через протоколы управления сетью, такие как NETCONF [RFC6241]. Модель управления доступом NETCONF [RFC6536] обеспечивает средства, позволяющие предоставить доступ лишь конкретным пользователям NETCONF control model [RFC6536] к предопределённому подмножеству доступных в NETCONF протокольных операций и содержимого.

Многие узлы данных конфигурации в этом модулей YANG, относящиеся к модели данных ядра маршрутизации, доступны для записи, создания, удаления (т. е. с принятым по умолчанию config true). Эти узлы могут быть чувствительными или уязвимыми в некоторых сетевых средах. Операции записи (например, edit-config в NETCONF) в такие узлы без подобающей защиты могут оказывать негативное влияние на работу сети.

Ниже показаны уязвимые параметры и ветви config true.

/routing/control-plane-protocols/control-plane-protocol

Этот список задаёт настроенные на устройстве протоколы плоскости управления.

/routing/ribs/rib

Этот список задаёт настроенные на устройстве таблицы RIB.

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

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

12.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>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman, «Neighbor Discovery for IP version 6 (IPv6)», RFC 4861, DOI 10.17487/RFC4861, September 2007, <http://www.rfc-editor.org/info/rfc4861>.

[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>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7223] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 7223, DOI 10.17487/RFC7223, May 2014, <http://www.rfc-editor.org/info/rfc7223>.

[RFC7277] Bjorklund, M., «A YANG Data Model for IP Management», RFC 7277, DOI 10.17487/RFC7277, June 2014, <http://www.rfc-editor.org/info/rfc7277>.

[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>.

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

[RFC6087] Bierman, A., «Guidelines for Authors and Reviewers of YANG Data Model Documents», RFC 6087, DOI 10.17487/RFC6087, January 2011, <http://www.rfc-editor.org/info/rfc6087>.

[RFC6536] Bierman, A. and M. Bjorklund, «Network Configuration Protocol (NETCONF) Access Control Model», RFC 6536, DOI 10.17487/RFC6536, March 2012, <http://www.rfc-editor.org/info/rfc6536>.

[RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, «YANG Module Library», RFC 7895, DOI 10.17487/RFC7895, June 2016, <http://www.rfc-editor.org/info/rfc7895>.

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <http://www.rfc-editor.org/info/rfc7951>.

Приложение A. Полные деревья данных

В этом приложении представлены полные деревья данных конфигурации и состояния для модели данных ядра маршрутизации. Описание применяемых символов данов в параграфе 2.2. Тип данных каждого листа указан в правой части строки.

A.1. Данные конфигурации

   +--rw routing
      +--rw router-id?                 yang:dotted-quad
      +--rw control-plane-protocols
      |  +--rw control-plane-protocol* [type name]
      |     +--rw type             identityref
      |     +--rw name             string
      |     +--rw description?     string
      |     +--rw static-routes
      |        +--rw v6ur:ipv6
      |        |  +--rw v6ur:route* [destination-prefix]
      |        |     +--rw v6ur:destination-prefix    inet:ipv6-prefix
      |        |     +--rw v6ur:description?          string
      |        |     +--rw v6ur:next-hop
      |        |        +--rw (v6ur:next-hop-options)
      |        |           +--:(v6ur:simple-next-hop)
      |        |           |  +--rw v6ur:outgoing-interface?
      |        |           |  +--rw v6ur:next-hop-address?
      |        |           +--:(v6ur:special-next-hop)
      |        |           |  +--rw v6ur:special-next-hop?   enumeration
      |        |           +--:(v6ur:next-hop-list)
      |        |              +--rw v6ur:next-hop-list
      |        |                 +--rw v6ur:next-hop* [index]
      |        |                    +--rw v6ur:index              string
      |        |                    +--rw v6ur:outgoing-interface?
      |        |                    +--rw v6ur:next-hop-address?
      |        +--rw v4ur:ipv4
      |           +--rw v4ur:route* [destination-prefix]
      |              +--rw v4ur:destination-prefix    inet:ipv4-prefix
      |              +--rw v4ur:description?          string
      |              +--rw v4ur:next-hop
      |                 +--rw (v4ur:next-hop-options)
      |                    +--:(v4ur:simple-next-hop)
      |                    |  +--rw v4ur:outgoing-interface?
      |                    |  +--rw v4ur:next-hop-address?
      |                    +--:(v4ur:special-next-hop)
      |                    |  +--rw v4ur:special-next-hop?   enumeration
      |                    +--:(v4ur:next-hop-list)
      |                       +--rw v4ur:next-hop-list
      |                          +--rw v4ur:next-hop* [index]
      |                             +--rw v4ur:index              string
      |                             +--rw v4ur:outgoing-interface?
      |                             +--rw v4ur:next-hop-address?
      +--rw ribs
         +--rw rib* [name]
            +--rw name              string
            +--rw address-family?   identityref
            +--rw description?      string

A.2. Данные состояния

      +--ro routing-state
      |  +--ro router-id?                 yang:dotted-quad
      |  +--ro interfaces
      |  |  +--ro interface*   if:interface-state-ref
      |  +--ro control-plane-protocols
      |  |  +--ro control-plane-protocol* [type name]
      |  |     +--ro type    identityref
      |  |     +--ro name    string
      |  +--ro ribs
      |     +--ro rib* [name]
      |        +--ro name              string
      |        +--ro address-family    identityref
      |        +--ro default-rib?      boolean {multiple-ribs}?
      |        +--ro routes
      |        |  +--ro route*
      |        |     +--ro route-preference?          route-preference
      |        |     +--ro next-hop
      |        |     |  +--ro (next-hop-options)
      |        |     |     +--:(simple-next-hop)
      |        |     |     |  +--ro outgoing-interface?
      |        |     |     |  +--ro v6ur:next-hop-address?
      |        |     |     |  +--ro v4ur:next-hop-address?
      |        |     |     +--:(special-next-hop)
      |        |     |     |  +--ro special-next-hop?        enumeration
      |        |     |     +--:(next-hop-list)
      |        |     |        +--ro next-hop-list
      |        |     |           +--ro next-hop*
      |        |     |              +--ro outgoing-interface?
      |        |     |              +--ro v6ur:address?
      |        |     |              +--ro v4ur:address?
      |        |     +--ro source-protocol            identityref
      |        |     +--ro active?                    empty
      |        |     +--ro last-updated?              yang:date-and-time
      |        |     +--ro v6ur:destination-prefix?   inet:ipv6-prefix
      |        |     +--ro v4ur:destination-prefix?   inet:ipv4-prefix
      |        +---x active-route
      |           +---w input
      |           |  +---w v6ur:destination-address?   inet:ipv6-address
      |           |  +---w v4ur:destination-address?   inet:ipv4-address
      |           +--ro output
      |              +--ro route
      |                 +--ro next-hop
      |                 |  +--ro (next-hop-options)
      |                 |     +--:(simple-next-hop)
      |                 |     |  +--ro outgoing-interface?
      |                 |     |  +--ro v6ur:next-hop-address?
      |                 |     |  +--ro v4ur:next-hop-address?
      |                 |     +--:(special-next-hop)
      |                 |     |  +--ro special-next-hop?     enumeration
      |                 |     +--:(next-hop-list)
      |                 |        +--ro next-hop-list
      |                 |           +--ro next-hop*
      |                 |              +--ro outgoing-interface?
      |                 |              +--ro v6ur:next-hop-address?
      |                 |              +--ro v4ur:next-hop-address?
      |                 +--ro source-protocol            identityref
      |                 +--ro active?                    empty
      |                 +--ro last-updated?           yang:date-and-time
      |                 +--ro v6ur:destination-prefix?  inet:ipv6-prefix
      |                 +--ro v4ur:destination-prefix?  inet:ipv4-prefix

Приложение B. Минимальная реализация

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

От минимальной реализации не требуется поддержка свойства multiple-ribs. Это означает, что для каждого поддерживаемого семейства адресов (IPv4, IPv6) доступна одна управляемая системой таблица RIB. Такие таблицы называют также default RIB. Пользовательские таблицы RIB не разрешены.

В дополнение у обязательному экземпляру псевдопротокола direct минимальным реализациям следует поддерживать настройку экземпляров псевдопротокола static.

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

Платформы с сильно ограниченными ресурсами могут использовать отклонения (deviation) для ограничения модели данных (например, ограничивая число экземпляров протокола плоскости управления static.

Приложение C. Пример добавления протокола плоскости управления

В этом приложении показано, как можно расширить модель данных ядра маршрутизации для поддержки нового протокола плоскости управления. Показанный ниже модуль YANG example-rip предназначен для иллюстрации, а не реального определения модели данных для протокола маршрутной информации (Routing Information Protocol или RIP). Для краткости в этом модуле не соблюдаются некоторые рекомендации [RFC6087]. См. также 5.3.2. Определение новых протоколов плоскости управления.

   module example-rip {

     yang-version "1.1";

     namespace "http://example.com/rip";

     prefix "rip";

     import ietf-interfaces {
       prefix "if";
     }

     import ietf-routing {
       prefix "rt";
     }

     identity rip {
       base rt:routing-protocol;
       description
         "Идентификатор для протокола RIP.";
     }

     typedef rip-metric {
       type uint8 {
         range "0..16";
       }
     }

     grouping route-content {
       description
         "Группировка определяет связанные с RIP атрибуты маршрутов.";
       leaf metric {
         type rip-metric;
       }
       leaf tag {
         type uint16;
         default "0";
         description
           "Может служить для передачи дополнительных сведений, например,
            номера автономной системы (AS).";
       }
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
       when "derived-from-or-self(rt:source-protocol, 'rip:rip')" {
         description
           "Это дополнение действительно лишь для маршрутов от RIP.";
       }
       description
         "Связанные с RIP атрибуты маршрута.";
       uses route-content;
     }

     augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
           + "rt:output/rt:route" {
       description
         "Связанные с RIP атрибуты маршрута в выводе active-route.";
       uses route-content;
     }

     augment "/rt:routing/rt:control-plane-protocols/"
           + "rt:control-plane-protocol" {
       when "derived-from-or-self(rt:type,'rip:rip')" {
         description
           "Это дополнение действительно лишь для экземпляра протокола
            маршрутизации типа rip.";
       }
       container rip {
         presence "Конфигурация RIP";
         description
           "Конфигурация экземпляра RIP.";
         container interfaces {
           description
             "Конфигурация RIP на интерфейс.";
           list interface {
             key "name";
             description
               "Протокол RIP включён на интерфейсах, имеющих запись в 
                этом списке, если для неё не задано enabled false.";
             leaf name {
               type if:interface-ref;
             }
             leaf enabled {
               type boolean;
               default "true";
             }
             leaf metric {
               type rip-metric;
               default "1";
             }
           }
         }
         leaf update-interval {
           type uint8 {
             range "10..60";
           }
           units "seconds";
           default "30";
           description
             "Интервал между периодическими обновлениями.";
         }
       }
     }
   }

Приложение D. Пример дерева данных

В этом приложении представлен пример экземпляра дерева данных в кодировке JSON [RFC7951], содержащего данные конфигурации и состояния. Данные соответствуют модели, определённой спецификацией указанной ниже библиотеки YANG [RFC7895].

   {
     "ietf-yang-library:modules-state": {
       "module-set-id": "c2e1f54169aa7f36e1a6e8d0865d441d3600f9c4",
       "module": [
         {
           "name": "ietf-routing",
           "revision": "2016-11-04",
           "feature": [
             "multiple-ribs",
             "router-id"
           ],
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ipv4-unicast-routing",
           "revision": "2016-11-04",
           "namespace":
             "urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ipv6-unicast-routing",
           "revision": "2016-11-04",
           "namespace":
             "urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-interfaces",
           "revision": "2014-05-08",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-inet-types",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
           "revision": "2013-07-15",
           "conformance-type": "import"
         },
         {
           "name": "ietf-yang-types",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
           "revision": "2013-07-15",
           "conformance-type": "import"
         },
         {
           "name": "iana-if-type",
           "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
           "revision": "",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ip",
           "revision": "2014-06-16",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
           "conformance-type": "implement"
         }
       ]
     }
   }

Предполагается простая сеть, показанная на рисунке 3. Маршрутизатор A использует статические маршруты по умолчанию с маршрутизатором ISP в качестве next hop. Анонсы маршрутизатора IPv6 настроены лишь на интерфейсе eth1 и запрещены на восходящем интерфейсе eth0.

+-----------------+
|                 |
|Маршрутизатор ISP|
|                 |
+--------+--------+
         |2001:db8:0:1::2
         |192.0.2.2
         |
         |
         |2001:db8:0:1::1
     eth0|192.0.2.1
+--------+--------+
|                 |
| Маршрутизатор A |
|                 |
+--------+--------+
     eth1|198.51.100.1
         |2001:db8:0:2::1
         |

Рисунок 3. Пример конфигурации сети.


Ниже приведено возможное представление дерева данных.

   {
     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "description": "Uplink to ISP.",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.1",
                 "prefix-length": 24
               }
             ],
             "forwarding": true
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "2001:0db8:0:1::1",
                 "prefix-length": 64
               }
             ],
             "forwarding": true,
             "autoconf": {
               "create-global-addresses": false
             }
           }
         },
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "description": "Интерфейс во внутреннюю сеть.",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "198.51.100.1",
                 "prefix-length": 24
               }
             ],
             "forwarding": true
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "2001:0db8:0:2::1",
                 "prefix-length": 64
               }
             ],
             "forwarding": true,
             "autoconf": {
               "create-global-addresses": false
             },
             "ietf-ipv6-unicast-routing:ipv6-router-advertisements": {
               "send-advertisements": true
             }
           }
         }
       ]
     },
     "ietf-interfaces:interfaces-state": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "phys-address": "00:0C:42:E5:B1:E9",
           "oper-status": "up",
           "statistics": {
             "discontinuity-time": "2015-10-24T17:11:27+02:00"
           },
           "ietf-ip:ipv4": {
             "forwarding": true,
             "mtu": 1500,
             "address": [
               {
                 "ip": "192.0.2.1",
                 "prefix-length": 24
               }
             ]
           },
           "ietf-ip:ipv6": {
             "forwarding": true,
             "mtu": 1500,
             "address": [
               {
                 "ip": "2001:0db8:0:1::1",
                 "prefix-length": 64
               }
             ],
             "ietf-ipv6-unicast-routing:ipv6-router-advertisements": {
               "send-advertisements": false
             }
           }
         },
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "phys-address": "00:0C:42:E5:B1:EA",
           "oper-status": "up",
           "statistics": {
             "discontinuity-time": "2015-10-24T17:11:29+02:00"
           },
           "ietf-ip:ipv4": {
             "forwarding": true,
             "mtu": 1500,
             "address": [
               {
                 "ip": "198.51.100.1",
                 "prefix-length": 24
               }
             ]
           },
           "ietf-ip:ipv6": {
             "forwarding": true,
             "mtu": 1500,
             "address": [
               {
                 "ip": "2001:0db8:0:2::1",
                 "prefix-length": 64
               }
             ],
             "ietf-ipv6-unicast-routing:ipv6-router-advertisements": {
               "send-advertisements": true,
               "prefix-list": {
                 "prefix": [
                   {
                     "prefix-spec": "2001:db8:0:2::/64"
                   }
                 ]
               }
             }
           }
         }
       ]
     },
     "ietf-routing:routing": {
       "router-id": "192.0.2.1",
       "control-plane-protocols": {
         "control-plane-protocol": [
           {
             "type": "ietf-routing:static",
             "name": "st0",
             "description":
               "Для внутренней сети применяется статическая маршрутизация.",
             "static-routes": {
               "ietf-ipv4-unicast-routing:ipv4": {
                 "route": [
                   {
                     "destination-prefix": "0.0.0.0/0",
                     "next-hop": {
                       "next-hop-address": "192.0.2.2"
                     }
                   }
                 ]
               },
               "ietf-ipv6-unicast-routing:ipv6": {
                 "route": [
                   {
                     "destination-prefix": "::/0",
                     "next-hop": {
                       "next-hop-address": "2001:db8:0:1::2"
                     }
                   }
                 ]
               }
             }
           }
         ]
       }
     },
     "ietf-routing:routing-state": {
       "interfaces": {
         "interface": [
           "eth0",
           "eth1"
         ]
       },
       "control-plane-protocols": {
         "control-plane-protocol": [
           {
             "type": "ietf-routing:static",
             "name": "st0"
           }
         ]
       },
       "ribs": {
         "rib": [
           {
             "name": "ipv4-master",
             "address-family":
               "ietf-ipv4-unicast-routing:ipv4-unicast",
             "default-rib": true,
             "routes": {
               "route": [
                 {
                   "ietf-ipv4-unicast-routing:destination-prefix":
                     "192.0.2.1/24",
                   "next-hop": {
                     "outgoing-interface": "eth0"
                   },
                   "route-preference": 0,
                   "source-protocol": "ietf-routing:direct",
                   "last-updated": "2015-10-24T17:11:27+02:00"
                 },
                 {
                   "ietf-ipv4-unicast-routing:destination-prefix":
                     "198.51.100.0/24",
                   "next-hop": {
                     "outgoing-interface": "eth1"
                   },
                   "source-protocol": "ietf-routing:direct",
                   "route-preference": 0,
                   "last-updated": "2015-10-24T17:11:27+02:00"
                 },
                 {
                   "ietf-ipv4-unicast-routing:destination-prefix":
                     "0.0.0.0/0",
                   "source-protocol": "ietf-routing:static",
                   "route-preference": 5,
                   "next-hop": {
                     "ietf-ipv4-unicast-routing:next-hop-address":
                       "192.0.2.2"
                   },
                   "last-updated": "2015-10-24T18:02:45+02:00"
                 }
               ]
             }
           },
           {
             "name": "ipv6-master",
             "address-family":
               "ietf-ipv6-unicast-routing:ipv6-unicast",
             "default-rib": true,
             "routes": {
               "route": [
                 {
                   "ietf-ipv6-unicast-routing:destination-prefix":
                     "2001:db8:0:1::/64",
                   "next-hop": {
                     "outgoing-interface": "eth0"
                   },
                   "source-protocol": "ietf-routing:direct",
                   "route-preference": 0,
                   "last-updated": "2015-10-24T17:11:27+02:00"
                 },
                 {
                   "ietf-ipv6-unicast-routing:destination-prefix":
                     "2001:db8:0:2::/64",
                   "next-hop": {
                     "outgoing-interface": "eth1"
                   },
                   "source-protocol": "ietf-routing:direct",
                   "route-preference": 0,
                   "last-updated": "2015-10-24T17:11:27+02:00"
                 },
                 {
                   "ietf-ipv6-unicast-routing:destination-prefix":
                     "::/0",
                   "next-hop": {
                     "ietf-ipv6-unicast-routing:next-hop-address":
                       "2001:db8:0:1::2"
                   },
                   "source-protocol": "ietf-routing:static",
                   "route-preference": 5,
                   "last-updated": "2015-10-24T18:02:45+02:00"
                 }
               ]
             }
           }
         ]
       }
     }
   }

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

Авторы благодарны Nitin Bahadur, Martin Bjorklund, Dean Bogdanovic, Jeff Haas, Joel Halpern, Wes Hardaker, Sriganesh Kini, David Lamparter, Andrew McGregor, Jan Medved, Xiang Li, Stephane Litkowski, Thomas Morin, Tom Petch, Yingzhen Qu, Bruno Rijsman, Juergen Schoenwaelder, Phil Shafer, Dave Thaler, Yi Yang, Derek Man-Kit Yeung и Jeffrey Zhang за полезные комментарии и предложения.

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

Ladislav Lhotka
CZ.NIC
Email: lhotka@nic.cz
 
Acee Lindem
Cisco Systems
Email: acee@cisco.com

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

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

nmalykh@protokols.ru

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

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

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

RFC 8005 Host Identity Protocol (HIP) Domain Name System (DNS) Extension

Internet Engineering Task Force (IETF)                       J. Laganier
Request for Comments: 8005                       Luminate Wireless, Inc.
Obsoletes: 5205                                             October 2016
Category: Standards Track
ISSN: 2070-1721

Host Identity Protocol (HIP) Domain Name System (DNS) Extension

Расширение DNS для протокола HIP

PDF

Аннотация

Этот документ задаёт запись о ресурсе (resource record или RR) для системы доменных имён (Domain Name System или DNS) и способ её использования в протоколе идентификации хостов (Host Identity Protocol или HIP). Эта запись RR позволяет узлу HIP сохранять в DNS своё отождествление (Host Identity или HI), открытый ключ асимметричной пары, тег отождествления хоста (Host Identity Tag или HIT), усечённое хэш-значение HI и доменные имена своих серверов встречи (rendezvous server или RVS). Документ отменяет действие RFC 5205.

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

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

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

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

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

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

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

1. Введение

Этот документ задаёт запись RR для DNS [RFC1034] и способ её использования с протоколом HIP [RFC7401]. Эта запись позволяет узлу HIP сохранить в DNS своё отождествление (Host Identity или HI), открытую часть пары асимметричных ключей, тег отождествления (Host Identity Tag или HIT), усечённый хэш своего идентификатора HI и доменные имена своих серверов встречи (rendezvous server или RVS) [RFC8004].

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

В HIP адреса IP предназначены для использования в основном для беспроводной связи, тогда как большинство протоколов верхнего уровня (Upper Layer Protocol или ULP) и приложений используют идентификаторы HI или теги HIT (ICMP может служить примером ULP, не использующего их). Поэтому нужны способы трансляции доменных имён в HI. Использование для этого DNS достаточно просто и для этого определяется запись HIP RR. При получении запроса от приложения или ULP для поиска сопоставления имени с адресом IP распознаватель дополнительно выполняет поиск сопоставления имени с HI и использует его для создания отображения HI на адрес IP (внутреннее для уровня HIP). Уровень HIP использует сопоставления HI-IP для трансляции HI и HIT в адреса IP и обратно.

Спецификация HIP [RFC7401] задаёт базовый обмен между инициатором (HIP Initiator) и ответчиком (HIP Responder) на основе обмена 4 пакетами HIP (I1, R1, I2, R2). Поскольку пакеты HIP включают теги HIT инициатора и ответчика, инициатору нужно знать HI и HIT ответчика до начала базового обмена (передача пакета I1).

Расширение HIP Rendezvous [RFC8004] позволяет достичь узла HIP по стороннему адресу IP (RVS узла). Инициатор, желающий организовать ассоциацию HIP с ответчиком, обслуживаемым сервером RVS, обычно будет инициировать базовый обмен HIP, передавая начальный пакет I1 по IP-адресу RVS, а не ответчика. Поэтому нужны средства определения имени RVS для данного имени хоста.

Документ вводит запись HIP DNS RR для хранения RVS, HI и HIT.

2. Уровни требований

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

3. Варианты применения

В этом разделе кратко описаны многочисленные варианты использования DNS в HIP.

При использовании HIP большинство приложений и ULP не знают адресов IP, используемых для передачи пакетов в линии. Поэтому узел HIP может использовать несколько адресов IP для отказоустойчивости, надёжности, мобильности или смены адресов (renumbering) так, что большинство ULP и приложений просто не заметят этого, поскольку они связаны с HI и не знают о смена адресов IP.

В таких ситуациях для обеспечения доступности узла по полному имени (Fully Qualified Domain Name или FQDN) в системе DNS следует хранить:

  • адреса IP в наборах записей (Resource Record Set или RRSet) A [RFC1035] и AAAA [RFC3596] [RFC2181];

  • HI, HIT и возможно набор серверов RVS в записях HIP RR.

Записи HIP RR не зависят от класса.

Когда узел HIP хочет взаимодействовать с другим узлом HIP, ему нужно сначала выполнить базовый обмен HIP для создания ассоциации HIP с партнёром. Хотя такой обмен можно инициировать, не зная HI ответчика, в этом случае для обоих хостов возникает риск вмешательства в обмен HIP (man-in-the-middle или MitM). Для предотвращения таких атак инициатору рекомендуется сначала узнать отождествление HI для ответчика, а затем начинать обмен. Это можно сделать, например, настройкой вручную или поиском в DNS. Для такого поиска предложена запись HIP RR.

Если узел HIP часто меняет свои адреса IP, естественная задержка распространения изменений через DNS может помешать публикации новых адресов IP в DNS. Для решения этой задачи в архитектуре HIP [RFC4423] служат серверы встречи (RVS) [RFC8004]. Хост HIP использует RVS как «точку встречи» для поддержки своей доступности для возможных инициаторов HIP при перемещениях [RFC5206]. Такой узел HIP будет публиковать в DNS доменное имя своих RVS в записях HIP RR, сохраняя на этих RVS фактические сведения о своих текущих адресах IP.

Если узел HIP хочет инициировать обмен HIP с ответчиком, он выполняет запросы к DNS, порядок которых может меняться в зависимости реализации. Например, реализации, применяющие HIT в интерфейсах прикладных программ (Application Programming Interface или API) обычно могут сначала запросить HIP RR по FQDN ответчика, а при использовании в API адресов IP обычно сначала выполняются запросы записей A и/или AAAA.

Далее предполагается, что инициатор сначала запрашивает HIP RR по FQDN ответчика.

Если на запрос для типа HIP служба DNS возвратила RCODE=3 (ошибка имени), это говорит об отсутствии в DNS сведений об ответчике и дополнительных запросов для того же имени владельца передавать не следует. Если запрос записей HIP в DNS возвращает RCODE=0 (нет ошибок) с пустым разделом ответов, это говорит об отсутствии данных HIP для имени ответчика. В таком случае при настройке ответчика на гибкое использование (opportunistic) HIP с инициированием без HI ответчика или работу по IP, он будет передавать дополнительные запросы для получения записей A и AAAA по FQDN ответчика.

В зависимости от комбинации откликов выполняются действия, описанные в параграфах 3.1 и 3.2.

Отметим, что хранение HIP RR в DNS по FQDN, назначенному узлу, не являющемуся HIP, может негативно влиять на его доступность для узлов HIP.

3.1. Простой конечный хост с одним статическим адресом

В дополнение к адресу IP или адресам (IP-R) узел HIP (R) с одним статическим подключением к сети, желающий обеспечить свою доступность по имени FQDN (www.example.com) в качестве ответчика, будет сохранять в DNS запись HIP RR со своим отождествлением Host Identity (HI-R) и тегом (HIT-R).

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

  • Запрос #1: QNAME=www.example.com, QTYPE=HIP

    (QCLASS=IN предполагается по умолчанию и не указывается в примерах)

    Этот запрос возвращает пакет DNS с RCODE=0 и одной или несколькими HIP RR с HIT и HI (например, HIT-R и HI-R) ответчика в разделе ответов (answer), но не возвращает RVS.

  • Запрос #2: QNAME=www.example.com, QTYPE=A

  • Запрос #3: QNAME=www.example.com, QTYPE=AAAA

    Эти запросы будут возвращать пакеты DNS с RCODE=0 и записями A или AAAA, содержащими IP-адреса ответчика (например, IP-R) в разделе ответов (answer).

Примечание. Далее в документе для простоты и лаконичности рисунков несколько запросов и откликов DNS представляются как одна транзакция, хотя в тексте указываются все запросы и отклики на ниже.

       [HIP? A?        ]
       [www.example.com]            +-----+
  +-------------------------------->|     |
  |                                 | DNS |
  | +-------------------------------|     |
  | |  [HIP? A?        ]            +-----+
  | |  [www.example.com]
  | |  [HIP HIT-R HI-R ]
  | |  [A IP-R         ]
  | v
+-----+                              +-----+
|     |--------------I1------------->|     |
|  I  |<-------------R1--------------|  R  |
|     |--------------I2------------->|     |
|     |<-------------R2--------------|     |
+-----+                              +-----+

Статический хост с одним адресом.


После этого инициатор будет отправлять пакет I1 по IP-адресам ответчика (IP-R).

3.2. Мобильный конечный хост

Мобильный узел HIP (R), желающий быть доступным по своему имени FQDN (www.example.com), будет сохранять в DNS в дополнение к адресам IP (IP-R) своё отождествление HI (HI-R), HIT (HIT-R) и доменные имена своих RVS (например, rvs.example.com) в записях HIP RR. Мобильному хосту HIP также требуется уведомлять свои RVS о смене адресов IP.

      [HIP?           ]
      [www.example.com]

      [A?             ]
      [rvs.example.com]                     +-----+
 +----------------------------------------->|     |
 |                                          | DNS |
 | +----------------------------------------|     |
 | |  [HIP?                          ]      +-----+
 | |  [www.example.com               ]
 | |  [HIP HIT-R HI-R rvs.example.com]
 | |
 | |  [A?             ]
 | |  [rvs.example.com]
 | |  [A IP-RVS       ]
 | |
 | |                +-----+
 | | +------I1----->| RVS |-----I1------+
 | | |              +-----+             |
 | | |                                  |
 | | |                                  |
 | v |                                  v
+-----+                              +-----+
|     |<---------------R1------------|     |
|  I  |----------------I2----------->|  R  |
|     |<---------------R2------------|     |
+-----+                              +-----+

Мобильный конечный хост.


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

  • Запрос #1: QNAME=www.example.com, QTYPE=HIP

    Возвращает пакет DNS с RCODE=0 и одну или несколько записей HIP RR с HIT, HI и доменными именами RVS (например, HIT-R, HI-R, rvs.example.com) для ответчика в разделе ответов (answer).

  • Запрос #2: QNAME=rvs.example.com, QTYPE=A

  • Запрос #3: QNAME=rvs.example.com, QTYPE=AAAA

    Эти запросы будут возвращать пакеты DNS с RCODE=0 и записями A или AAAA, содержащими IP-адреса RVS ответчика (например, IP-RVS) в разделе ответов (answer).

После этого инициатор будет отправлять пакет I1 по IP-адресу RVS (IP-RVS), а RVS будет транслировать пакет I1 мобильному узлу по его адресу IP (IP-R) для завершения обмена HIP.

4. Обзор использования DNS с HIP

4.1. Хранение HI, HIT и RVS в DNS

Для любого узла HIP его отождествление HI, связанный тег HIT и FQDN возможных серверов RVS могут сохраняться в записи DNS HIP RR. Любая соответствующая спецификации реализация может сохранять HI и связанный тег HIT в формате DNS HIP RDATA. HI и HIT определены в разделе 3 спецификации HIP [RFC7401].

После возврата HIP RR хост всегда должен рассчитывать тег HIT на основе HI для использования в обмене HIP, как указано в разделе 3 спецификации HIP [RFC7401], тогда как тег HIT из HIP RR следует применять лишь для оптимизации (например, при поиске в таблице).

Запись HIP RR может также включать доменные имена серверов RVS, которым могут отправляться пакеты HIP I1 для запуска создания ассоциации с объектом, указанным этой записью RR [RFC8004].

Поле Rendezvous Server из записи HIP RR, хранящейся для данного имени владельца, может включать это имя. Семантически эквивалентная ситуация возникает, когда RVS не включается в HIP RR, хранящуюся для этого имени владельца. Это возможно в двух случаях.

  • Хост является мобильным и записи A и/или AAAA RR, хранящиеся с его именем, содержат IP-адреса сервера RVS, а не самого хоста.

  • Хост является стационарным и доступен напрямую по адресам IP из записей A и/или AAAA RR, хранящихся с его именем. Это вырожденный случай службы встречи, где хост выступает в качестве своего сервера RVS.

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

4.2. Инициирование соединения по имени DNS

На узле HIP следует запускать обмен HIP всякий раз, когда ULP пытается взаимодействовать с объектом и запрос возвращает записи HIP RR.

С записями HIP RR связано поле срока действия (Time To Live или TTL). Когда число секунд с момент извлечения записи превышает значение TTL для этой записи, получивший запись объект должен считать её недействительной и удалять. Если доступ к записи требуется для инициирования взаимодействия с объектом, которому запись соответствует, должен передаваться новый запрос DNS для получения свежей копии записи.

С одним именем может быть связано несколько записей HIP RR. Выбор хостом записи из нескольких предоставленных выходит за рамки этой спецификации. Сведения об RVS могут копироваться и согласовываться для нескольких RR или содержаться отдельно для каждого сервера. При наличии нескольких серверов хост должен убедиться, что выбранный сервер RVS связан с используемым отождествлением HI.

5. Формат хранения HIP RR

RDATA для HIP RR включает PK Algorithm Type, HIT length, HIT, PK (т. е. HI) и может включать 1 или несколько RVS.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  HIT length   | PK algorithm  |          PK length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                           HIT                                 ~
|                                                               |
+                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     |                                         |
+-+-+-+-+-+-+-+-+-+-+-+                                         +
|                           Public Key                          |
~                                                               ~
|                                                               |
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                                                               |
~                       Rendezvous Servers                      ~
|                                                               |
+             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             |
+-+-+-+-+-+-+-+


Поля HIT length, PK algorithm, PK length, HIT, Public Key требуются , поле Rendezvous Server не обязательно.

5.1. Формат HIT Length

Поле HIT length указывает размер поля HIT в байтах 8-битовым целым числом без знака.

5.2. Формат PK Algorithm

Поле PK algorithm указывает криптографический алгоритм PK и подразумеваемый формат поля Public Key 8-битовым целым числом без знака. В документе используются значения, заданные для Algorithm Type в записи IPSECKEY RR [RFC4025].

Определённые в настоящий момент значения перечислены в разделе 9.

5.3. Формат PK Length

Поле PK указывает размер поля Public Key в байтах 16-битовым целым числом без знака.

5.4. Формат HIT

Тег HIT представляется двоичным значением с сетевым порядком байтов.

5.5. Формат открытого ключа

Два из заданных в этом документе типов PK (RSA и DSA) используют форматы PK из IPSECKEY RR [RFC4025].

Формат ключей DSA задан в RFC 2536 [RFC2536].

Формат ключей RSA задан RFC 3110 [RFC3110], а ограничение размера ключей RSA (4096 битов) смягчено в IPSECKEY RR [RFC4025].

В дополнение к этому данный документ определяет формат PK с алгоритмом подписи на основе эллиптических кривых (Elliptic Curve Digital Signature Algorithm или ECDSA) как зависимую от алгоритма часть DNSKEY RR RDATA для ECDSA [RFC6605], т. е. DNSKEY RR DATA после первых 4 октетов, что соответствует той же части записи DNSKEY RR, которая задана в документах, определяющих алгоритм DNSSEC.

5.6. Формат записей о серверах встречи

Поле Rendezvous Server указывает одно или несколько доменных имён в формате передачи в линию (wire-encoded) для одного или нескольких серверов RVS. Конкатенация и кодирование имён выполняются в соответствии с параграфом 3.3 в RFC 1035 [RFC1035]: «<domain-name> указывает доменное имя в форме последовательности меток, завершаемое меткой нулевого размера». Поскольку формат wire-encoded является самоописывающим, размер каждого доменного имени является неявным, а метка нулевого размера служит разделителем доменных имён RVS, объединяемых в поле Rendezvous Server одной записи HIP RR. Поскольку размер другой части RRDATA в записи RR известен, как и общий размер RDATA в RR (RDLENGTH), вся информация, требуемая для раздора HIP RR, доступна.

Доменные имена недопустимо сжимать. RVS или серверы указываются в порядке предпочтения (первый наиболее предпочтительней), задавая неявный порядок RVS в одной записи RR. При наличии нескольких HIP RR с одним именем недопустимо использовать этот неявный порядок RVS в записи RR для упорядочения RVS из разных RR.

6. Формат представления HIP RR

Этот раздел задаёт представление HIP RR в первичном файле зоны.

Поле HIT length не указывается, поскольку оно неявно задаётся представлением поля HIT.

Поле PK algorithm представляется целым числом без знака.

Поле HIT представляется в формате Base16 [RFC4648] (hex) для значения HIT. В представление недопустимо включать пробелы для того, чтобы отделить это поле от поля Public Key.

Поле Public Key представляется Base64-кодированием PK, как указано в разделе 4 [RFC4648]. В представление недопустимо включать пробелы для того, чтобы отделить это поле от поля Rendezvous Server.

Поле PK length не указывается, поскольку оно неявно задано представлением поля Public Key, не содержащим пробелов.

Поле Rendezvous Server содержит одно или несколько доменных имён, разделённых пробелами. Эти пробелы применяются лишь в формате представления HIP RR и отсутствуют при передаче HIP RR в линию).

Полное представление записи HIP имеет вид

   IN  HIP   ( pk-algorithm
               base16-encoded-hit
               base64-encoded-public-key
               rendezvous-server[1]
                       ...
               rendezvous-server[n] )

Если серверы RVS не присутствуют, запись HIP имеет вид

   IN  HIP   ( pk-algorithm
               base16-encoded-hit
               base64-encoded-public-key )

7. Примеры

В приведённых ниже примерах поле Public Key, не содержащее пробелов, разделено на несколько строк в соответствии с требованиями к форматированию документа.

Пример для узла с HI и HIT но без RVS

   www.example.com.      IN  HIP ( 2 200100107B1A74DF365639CC39F1D578
                                   AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cI
   vM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ry
   ra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXd
   XF5D )

Пример для узла с HI, HIT и одним именем RVS

   www.example.com.      IN  HIP ( 2 200100107B1A74DF365639CC39F1D578
                                   AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cI
   vM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ry
   ra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXd
   XF5D
                                   rvs.example.com. )

Пример для узла с HI, HIT и двумя RVS

   www.example.com.      IN  HIP ( 2 200100107B1A74DF365639CC39F1D578
                                   AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cI
   vM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ry
   ra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXd
   XF5D
                                   rvs1.example.com.
                                   rvs2.example.com. )

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

В этом разделе рассматриваются известные угрозы, связанные с использованием расширения HIP DNS.

Подобно IPSECKEY RR [RFC4025], расширение DNS Extension позволяет двум узлам HIP предоставить один другому открытый ключевой материал (HI). Эти отождествления HI будут затем использоваться при обмене ключами между партнёрами. Поэтому расширение HIP DNS, как и IPSECKEY RR, подвержено угрозам атак на незащищённые записи RR, как описано ниже.

Узлу HIP следует получать записи HIP RR от доверенной стороны по защищённому каналу, обеспечивающему целостность и подлинность RR. Такой защищённый канал обеспечивает DNSSEC [RFC4033] [RFC4034] [RFC4035]. Однако следует подчеркнуть, что DNSSEC обеспечивает защиту целостности и аутентификацию данных лишь для канала между публикующим зону сервером DNS и узлом HIP, не гарантируя доверия к объекту, публикующему зону. Поэтому RRSIG из HIP RRSet недопустимо считать сертификатом привязки HI и/или HIT к имени владельца.

При отсутствии подходящего защищённого канала обе стороны уязвимы для атак MitM и DoS (Denial-of-Service — отказ в обслуживании), а несвязанные стороны также могут подвергаться DoS-атакам. Эти угрозы рассмотрены ниже.

8.1. Вмешательство атакующего в незащищённую запись HIP RR

HIP RR содержит открытый ключевой материал в форме PK (HI) указанного именем партнёра и его защищённого хэша (HIT). Они нечувствительны к атакам, в которых злоумышленник может раскрыть содержимое. Однако злоумышленник, способный организовать активную атаку DNS, т. е. подменит HIP RR (например, путём подмены DNS), сможет организовать MitM-атаку на криптографическое ядро обмена HIP (переписать HIP RR ответчика).

HIP RR может включать доменное имя RVS, преобразованное в IP-адрес получателя, где указанный именем партнёр доступен для I1 в соответствии с расширением HIP Rendezvous [RFC8004]. Таким образом, атакующий, способный вмешаться в RR, сможет перенаправить пакеты I1, отправленные указанному именем партнёру, на выбранный адрес IP для атаки DoS или MitM. Отметим, что этот вид атак возможен не только для HIP и существует независимо от использования HIP и HIP RR. Такой злоумышленник может вмешаться и в записи A или AAAA RR.

Атакующий очевидно сможет использовать отмеченные атаки в комбинации, заменяя HI ответчика и IP-адрес RVS своими значениями в подменных пакетах DNS, передаваемых по HI инициатора, а затем перенаправив на него все пакеты обмена для организации MitM-атаки на HIP. В этом случае HIP не обеспечивает конфиденциальности и защиты HI инициатора от перехвата.

8.2. Конфликты хэш-значений и HIT

Как и в других криптографических алгоритмах, некоторые хэш-значения (например, SHA1, применяемые в HIP для создания HIT из HI) могут оказаться незащищёнными в результате обнаружения эксплойта, позволяющего злоумышленнику с достаточными вычислительными ресурсами нарушить одну из защитных функций хэша (например, его предполагаемую устойчивость к конфликтам — совпадениям). Поэтому реализациям конечного узла HIP не следует аутентифицировать своих партнёров HIP на основе лишь тега HIT, полученного от DNS, а следует выполнять проверку подлинности на основе отождествления HI.

8.3. DNSSEC

При отсутствии DNSSEC записи HIP RR подвержены угрозам, описанным в RFC 3833 [RFC3833].

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

В [RFC5205], отменённом этим документом, определено и зарезервировано указанное в таблице значение в субреестре Resource Record (RR) TYPEs реестра Domain Name System (DNS) Parameters.

 

Значение

Тип

55

HIP

 

В субреестре Resource Record (RR) TYPEs реестра Domain Name System (DNS) Parameters ссылка на [RFC5205] заменена ссылкой на данный документ.

Как и [RFC5205], данный документ использует Algorithm Type из [RFC4025] для записей IPSEC KEY RR. Для справки определённые к настоящему моменту значения приведены в таблице.

 

Значение

Описание

1

Присутствует ключ DSA в формате [RFC2536]

2

Присутствует ключ RSA в формате [RFC3110]

 

Агентство IANA Добавило указанное в таблице значение в субреестр Algorithm Type Field реестра IPSECKEY Resource Record Parameters [RFC4025].

 

Значение

Описание

1

Присутствует ключ ECDSA в формате [RFC6605]

 

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

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

[RFC1034] Mockapetris, P., «Domain names — concepts and facilities», STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, <http://www.rfc-editor.org/info/rfc1034>.

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, <http://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, <http://www.rfc-editor.org/info/rfc2119>.

[RFC2181] Elz, R. and R. Bush, «Clarifications to the DNS Specification», RFC 2181, DOI 10.17487/RFC2181, July 1997, <http://www.rfc-editor.org/info/rfc2181>.

[RFC3596] Thomson, S., Huitema, C., Ksinant, V., and M. Souissi, «DNS Extensions to Support IP Version 6», RFC 3596, DOI 10.17487/RFC3596, October 2003, <http://www.rfc-editor.org/info/rfc3596>.

[RFC4025] Richardson, M., «A Method for Storing IPsec Keying Material in DNS», RFC 4025, DOI 10.17487/RFC4025, March 2005, <http://www.rfc-editor.org/info/rfc4025>.

[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, <http://www.rfc-editor.org/info/rfc4033>.

[RFC4034] Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, «Resource Records for the DNS Security Extensions», RFC 4034, DOI 10.17487/RFC4034, March 2005, <http://www.rfc-editor.org/info/rfc4034>.

[RFC4035] Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, «Protocol Modifications for the DNS Security Extensions», RFC 4035, DOI 10.17487/RFC4035, March 2005, <http://www.rfc-editor.org/info/rfc4035>.

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

[RFC6605] Hoffman, P. and W. Wijngaards, «Elliptic Curve Digital Signature Algorithm (DSA) for DNSSEC», RFC 6605, DOI 10.17487/RFC6605, April 2012, <http://www.rfc-editor.org/info/rfc6605>.

[RFC7401] Moskowitz, R., Ed., Heer, T., Jokela, P., and T. Henderson, «Host Identity Protocol Version 2 (HIPv2)», RFC 7401, DOI 10.17487/RFC7401, April 2015, <http://www.rfc-editor.org/info/rfc7401>.

[RFC8004] Laganier, J. and L. Eggert, «Host Identity Protocol (HIP) Rendezvous Extension», RFC 8004, DOI 10.17487/RFC8004, October 2016, <http://www.rfc-editor.org/info/rfc8004>.

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

[RFC2536] Eastlake 3rd, D., «DSA KEYs and SIGs in the Domain Name System (DNS)», RFC 2536, DOI 10.17487/RFC2536, March 1999, <http://www.rfc-editor.org/info/rfc2536>.

[RFC3110] Eastlake 3rd, D., «RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)», RFC 3110, DOI 10.17487/RFC3110, May 2001, <http://www.rfc-editor.org/info/rfc3110>.

[RFC3833] Atkins, D. and R. Austein, «Threat Analysis of the Domain Name System (DNS)», RFC 3833, DOI 10.17487/RFC3833, August 2004, <http://www.rfc-editor.org/info/rfc3833>.

[RFC4423] Moskowitz, R. and P. Nikander, «Host Identity Protocol (HIP) Architecture», RFC 4423, DOI 10.17487/RFC4423, May 2006, <http://www.rfc-editor.org/info/rfc4423>.

[RFC5205] Nikander, P. and J. Laganier, «Host Identity Protocol (HIP) Domain Name System (DNS) Extensions», RFC 5205, DOI 10.17487/RFC5205, April 2008, <http://www.rfc-editor.org/info/rfc5205>.

[RFC5206] Nikander, P., Henderson, T., Ed., Vogt, C., and J. Arkko, «End-Host Mobility and Multihoming with the Host Identity Protocol», RFC 5206, DOI 10.17487/RFC5206, April 2008, <http://www.rfc-editor.org/info/rfc5206>.

Приложение A. Отличия от RFC 5205

  • Обновлены ссылки на HIP с указанием пересмотренных спецификаций протокола HIP.

  • Расширены записи DNS HIP RR для поддержки Host Identity на основе ECDSA.

  • Уточнено, что запрос должен повторяться после завершения срока действия (TTL) записи RR.

  • Добавлены разъяснения для случая нескольких HIP RR, связанных с одним именем.

  • Указано применение кодирования Base64 в соответствии с разделом 4 в [RFC4648].

  • Указан формат передачи (wire format) при включении нескольких RVS в одну запись RR.

  • Указано использование пробела (whitespace) в качестве разделителя для человеко-читаемого представления RR, но не для передачи в линию.

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

Как обычно в IETF, этот документ является результатом работы многих людей. Автор благодарен разработчику (Michael Richardson), участникам и рецензентам спецификации IPSECKEY RR [RFC4025], позволившей создать этот документ. Автор также признателен людям, которые предоставили вдумчивые и полезные комментарии и предложения, оказавшие помощь при подготовке документа: Jeff Ahrenholz, Rob Austein, Hannu Flinck, Olafur Gudmundsson, Tom Henderson, Peter Koch, Olaf Kolkman, Miika Komu, Andrew McGregor, Gabriel Montenegro, Erik Nordmark. Некоторые части этого документа заимствованы из спецификации HIP [RFC7401]. Спасибо также Sheng Jiang за рецензирование документа для Internet Area Directorate в процессе его публикации.

Участник работы

Teemu Koponen был соавтором ранней экспериментальной версии этой спецификации [RFC5205].

Адрес автора

Julien Laganier
Luminate Wireless, Inc.
Cupertino, CA
United States of America
Email: julien.ietf@gmail.com

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

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

nmalykh@protokols.ru

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

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

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

RFC 8004 Host Identity Protocol (HIP) Rendezvous Extension

Internet Engineering Task Force (IETF)                       J. Laganier
Request for Comments: 8004                       Luminate Wireless, Inc.
Obsoletes: 5204                                                L. Eggert
Category: Standards Track                                         NetApp
ISSN: 2070-1721                                             October 2016

Host Identity Protocol (HIP) Rendezvous Extension

Расширение «встречи» для протокола HIP

PDF

Аннотация

Этот документ определяет расширение rendezvous (встреча) для протокола идентификации хостов (Host Identity Protocol или HIP). Расширение rendezvous дополняет HIP и расширение HIP Registration для инициирования взаимодействия между узлами и серверами встречи HIP. Серверы встречи повышают уровень достижимости и работоспособности для мобильных и многоадресных (multihome) узлов HIP. Документ отменяет действие RFC 5204.

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

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

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

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

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

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

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

1. Введение

В документе «The Host Identity Protocol (HIP) Architecture» [HIP-ARCH] вводится механизм встречи (rendezvous), помогающий узлу HIP связаться с часто перемещающимся узлом HIP. Этот механизм включает сторонний (third party) сервер встречи (rendezvous server или RVS), который служит начальной точкой контакта (rendezvous point) для своих клиентов. Клиентами RVS являются узлы HIP, использующие расширение HIP Registration [RFC8003] для регистрации своего сопоставления HIT->IP-адрес на сервере RVS. После регистрации другие узлы HIP могут начать базовый обмен, используя IP-адрес RVS вместо текущего IP-адреса искомого узла. По сути, клиенты RVS становятся доступными по IP-адресу RVS. Партнёры могут начать базовый обмен HIP с IP-адресом RVS, который будет транслировать входящие коммуникации для успешного завершения базового обмена.

2. Терминология

В этом разделе определены термины, используемые в данном документе.

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

В дополнение к терминам, заданным в спецификации HIP [RFC7401] и HIP Registration Extension [RFC8003] этот документ определяет ещё несколько терминов.

Rendezvous Service — служба встречи

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

Rendezvous Server (RVS) — сервер встречи

Регистратор HIP обеспечивающий сервис встречи.

Rendezvous Client — клиент встречи

Заявитель HIP, регистрирующийся на RVS для службы встречи.

Rendezvous Registration — регистрация встречи

Регистрация HIP для службы встречи, организуемая между RVS и клиентом встречи.

3. Обзор работы сервера встречи

На рисунке 1 показан простой базовый обмен HIP без участия сервера RVS. Инициатор начинает обмен с ответчиком напрямую, передавая пакет I1 по IP-адресу ответчика, как указано в спецификации HIP [RFC7401].

+-----+                +-----+
|     |-------I1------>|     |
|  I  |<------R1-------|  R  |
|     |-------I2------>|     |
|     |<------R2-------|     |
+-----+                +-----+

Рисунок 1. Базовый обмен HIP без сервера встречи.


Расширение для мобильных и многодомных конечных хостов (End-Host Mobility and Multihoming) [HIP-HOST-MOB] позволяет узлу HIP уведомить своих партнёров об изменении своего набора адресов IP. Эта спецификация предполагает исходную доступность пары узлов друг для друга.

Однако узел HIP может также захотеть своей доступности для будущих партнёров, которые не знают о смене его местоположения. Документ HIP Architecture [HIP-ARCH] вводит серверы RVS, с помощью которых узел HIP может зарегистрировать свои теги HIT (Host Identity Tag) и текущие адреса IP. Сервер RVS ретранслирует пакеты HIP, приходящие для этих HIT, по зарегистрированным IP-адресам узла. Когда узел HIP зарегистрирован на RVS, ему следует внести IP-адрес своего RVS в свою запись DNS, используя запись ресурса HIP DNS, определённую в расширении HIP DNS [RFC8005].

            +-----+
   +--I1--->| RVS |---I1--+
   |        +-----+       |
   |                      v
+-----+                +-----+
|     |<------R1-------|     |
|  I  |-------I2------>|  R  |
|     |<------R2-------|     |
+-----+                +-----+

Рисунок 2. Базовый обмен HIP с сервером встречи.


На рисунке 2 показан базовый обмен HIP с участием RVS. Предполагается, что узел HIP R заранее зарегистрировал свои теги HIT и текущие адреса IP на сервере RVS с использованием расширения HIP Registration [RFC8003]. Когда инициатор I пытается организовать контакт с ответчиком R, он должен передать пакет базового обмена I1 по одному из IP-адресов хоста R (если они известны из DNS или иных источников) или одному из серверов RVS хоста R. В примере I получает IP-адрес сервера RVS для хоста R из записи DNS для этого хоста и передаёт пакет базового обмена HIP I1 серверу RVS. Сервер RVS видит, что HIT в полученном пакете I1 не принадлежит ему, и должен просмотреть свои текущие регистрации для решения вопроса о ретрансляции пакетов. В примере сервер видит, что HIT относится к хосту R и транслирует пакет I1 по зарегистрированному адресу IP. Хост R после этого завершает базовый обмен без участия RVS, передавая R1 напрямую по IP-адресу хоста I, найденному в пакете I1. В этос спецификации клиент RVS всегда является ответчиком. Однако в некоторых случаях (например, при работе через NAT или межсетевой экран) инициатор может начинать базовый обмен через свой сервер RVS. Спецификация не рассматривает этот вариант, которому следует посвятить отдельный документ.

3.1. Обозначения на рисунках

I, R

IP-адреса отправителя и получателя в заголовке IP.

HIT-I, HIT-R

Теги HIT инициатора и ответчика в пакет.

REG_REQ

Указывает наличие параметра REG_REQUEST в заголовке HIP.

REG_RES

Указывает наличие параметра REG_RESPONSE в заголовке HIP

FROM:I

Параметр FROM, содержащий IP-адрес I, если он присутствует в заголовке HIP.

RVS_HMAC

Указывает наличие параметра RVS_HMAC, содержащего хэшированный код аутентификации сообщения (Hashed Message Authentication Code или HMAC) с подходящим ключом регистрации, в заголовке HIP.

VIA:RVS

Указывает наличие параметра VIA_RVS, содержащего IP-адрес сервера встречи RVS, в заголовке HIP.

3.2. Регистрация клиента на сервере встречи

Перед тем, как RVS начнёт ретранслировать пакеты HIP клиенту rendezvous, этот клиент должен зарегистрироваться на RVS с использованием расширения HIP Registration [RFC8003], как показано на рисунке.

+-----+                            +-----+
|     |            I1              |     |
|     |--------------------------->|     |
|     |<---------------------------|     |
|  I  |         R1(REG_INFO)       | RVS |
|     |         I2(REG_REQ)        |     |
|     |--------------------------->|     |
|     |<---------------------------|     |
|     |         R2(REG_RES)        |     |
+-----+                            +-----+

Регистрация клиента на сервере встречи.


3.3. Трансляция базового обмена

Если узел HIP и один из его серверов RVS имеют rendezvous-регистрацию, RVS транслируют входящие пакеты I1 (содержащие один из клиентских тегов HIT), переписывая заголовок IP. При этом меняется IP-адрес получателя I1 на один из IP-адресов владельца HIT, т. е. клиента rendezvous. Должна также пересчитываться контрольная сумма IP.

Из-за входной фильтрации на пути от RVS к клиенту [RFC2827] [RFC3013] серверу HIP RVS следует заменить IP-адрес отправителя, т. е. I одним из своих адресов IP. Адрес IP для замены следует выбирать в соответствии с подходящей спецификацией IPv4 или IPv6 [RFC1122] [RFC6724]. Поскольку замена скрывает IP-адрес инициатора, RVS должен добавить в конце параметр FROM, содержащий исходный IP-адрес отправителя пакета. Для параметра FROM должна обеспечиваться защита целостности с помощью RVS_HMAC с ключом, соответствующим ключу целостности для регистрации встречи [RFC8003].

                                       I1(RVS, R, HIT-I, HIT-R
 I1(I, RVS, HIT-I, HIT-R) +---------+     FROM:I, RVS_HMAC)
 +----------------------->|         |--------------------+
 |                        |   RVS   |                    |
 |                        |         |                    |
 |                        +---------+                    |
 |                                                       V
+-----+        R1(R, I, HIT-R, HIT-I, VIA:RVS)       +-----+
|     |<---------------------------------------------|     |
|     |                                              |     |
|  I  |            I2(I, R, HIT-I, HIT-R)            |  R  |
|     |--------------------------------------------->|     |
|     |<---------------------------------------------|     |
+-----+             R2(R, I, HIT-R, HIT-I)           +-----+

Рисунок 3. Переписывание адреса IP сервером встречи.


Такое изменение пакетов HIP на RVS может вызывать проблемы, поскольку в HIP применяется контроль целостности. I1 не включает параметров HMAC и SIGNATURE, поэтому на сквозную проверку целостности действия RVS не влияют.

Серверу RVS следует проверять поле контрольной суммы в пакете I1 до изменения пакета. После изменений контрольная сумма должна рассчитываться заново с учётом изменения заголовка HIP, возможного включения параметров FROM и RVS_HMAC, а также псевдозаголовка с обновлёнными IP-адресами отправителя и получателя. Это позволит ответчику проверить контрольную сумму пакета I1 без необходимости анализировать параметры FROM.

4. Расширения сервера встречи

В этом разделе описаны расширения, дополняющие расширение HIP Registration [RFC8003] и позволяющие узлу HIP регистрироваться на RVS для службы встречи (rendezvous service) и уведомлять RVS об изменении своего текущего местоположения. Описано также расширение спецификации HIP [RFC7401], позволяющее организовывать ассоциации HIP через один или несколько серверов HIP RVS.

4.1. Тип регистрации RENDEZVOUS

Эта спецификация добавляет регистрацию в расширение HIP Registration [RFC8003], позволяющую регистрироваться на серверах RVS для «службы встречи» (rendezvous).

 

Номер

Тип регистрации

1

RENDEZVOUS

 

4.2. Формат и обработка параметров

4.2.1. Параметр RVS_HMAC

Параметр RVS_HMAC является некритическим и отличается от параметра HMAC из спецификации HIP [RFC7401] лишь кодом типа. Это изменение ведёт к тому, что параметр размещается после параметра FROM (в отличие от HMAC)

Type

65500

Length

Переменное значение, указывающее размер в октетах без учёта полей Type, Length, Padding.

HMAC

Код HMAC, рассчитанный для пакета HIP без учёта параметра RVS_HMAC и следующих за ним параметров. Для HMAC используется подходящий ключ защиты целостности HIP (HIP-lg или HIP-gl), созданный при регистрации rendezvous. При расчёте HMAC в поле HIP checksum должно устанавливаться значение 0, а размер заголовка HIP в базовом заголовке должен рассчитываться без учёта исключаемых параметров. Размером HMAC является размер естественного результата хэш-функции.

Чтобы клиент rendezvous и сервер RVS могли проверить целостность пакетов, передаваемых между ними, следует добавлять для защиты пакета параметр RVS_HMAC, рассчитываемый с ключом контроля целостности HIP-lg или HIP-gl, созданным при регистрации. Действительный код RVS_HMAC следует включать в каждый пакет, передаваемый между клиентом и сервером, и он должен присутствовать при обработке параметра FROM.

4.2.2. Параметр FROM

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Type              |             Length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                             Address                           |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Type

65498

Length

16

Address

Адрес IPv6 или IPv4 в формате IPv4-in-IPv6.

Сервер RVS должен добавлять параметр FROM с исходным IP-адресом отправителя пакета HIP при каждом переписывании IP-адреса отправителя в заголовке IP. Если в пакете уже имеется один или несколько параметров FROM, новый параметр должен размещаться сразу после них.

При каждой вставке параметра FROM сервером RVS, он должен вставлять параметр RVS_HMAC для защиты целостности пакета (главным образом, адрес IP, включённого в параметр FROM).

4.2.3. Параметр VIA_RVS

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Type              |             Length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                            Address                            |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
.                               .                               .
.                               .                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                            Address                            |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Type

65502

Length

Переменное значение.

Address

Адрес IPv6 или IPv4 в формате IPv4-in-IPv6.

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

4.3. Обработка изменённых пакетов

В следующих параграфах описаны отличия в обработке пакетов I1 и R1 при участии RVS в базовом обмене.

4.3.1. Обработка исходящих пакетов I1

Инициатору не следует передавать (opportunistic) I1 со значением NULL для HIT получателя по адресу IP, который заведомо принадлежит серверу встречи, если у него нет намерения создать ассоциацию HIP с RVS, не зная его HIT.

Когда RVS переписывает IP-адрес источника пакета I1 из-за выходной фильтрации, он должен добавить в I1 параметр FROM с IP-адресом инициатора. Этот параметр FROM должен быть учтён в RVS_HMAC с использованием ключа защиты целостности, заданного при регистрации встречи (rendezvous).

4.3.2. Обработка входящих пакетов I1

При получении сервером RVS пакета I1, в котором для адресата указан не его тег HIT, он обращается к своей базе данных для поиска регистрации в службе встречи владельца тега HIT. Если подходящая регистрация найдена, сервер транслирует пакет по зарегистрированному адресу IP. В ином случае пакет отбрасывается.

Серверу RVS следует считать входящие пакеты opportunistic I1 (т. е. I1 со значением NULL для HIT получателя) адресованными ему самому и не следует пытаться ретранслировать их одному из своих клиентов.

При получении rendezvous-клиентом пакета I1 он должен проверить в пакете параметр RVS_HMAC и следует отбросить пакет при неудачно проверке. Если проверка RVS_HMAC не прошла, а пакет содержит параметр FROM, этот пакет должен отбрасываться.

Клиенту rendezvous, выступающему как ответчик, следует отбрасывать пакеты opportunistic I1 с параметром FROM, поскольку этот параметр говорит о том, что пакет I1 был ретранслирован.

4.3.3. Обработка исходящих пакетов R1

Когда ответчик реагирует на пакет I1, транслированный RVS, он должен добавить в конец обычного заголовка R1 параметр VIA_RVS с IP-адресам серверов RVS, через которые прошёл пакет.

4.3.4. Обработка входящих пакетов R1

В соответствии со спецификацией HIP [RFC7401] система, получившая пакет R1, должна сначала убедиться, что она передавала пакет I1 отправителю R1 (т. е. находится в состоянии I1-SENT). Когда пакет R1 является откликом на ретранслированный пакет I1, эту проверку следует выполнять лишь по тегам HIT. Если проверяются и адреса IP, адрес отправителя должен сравниваться с IP-адресом из параметра VIA_RVS.

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

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

Сложно учесть весь спектр угроз, вносимых серверами RVS, поскольку их присутствие проявляется на уровнях IP и HIP. В частности, расширения могут разрешать атаки с перенаправлением, усилением и отражением на уровне IP, а также атаки на сам уровень HIP, например, перехват и изменение сообщений базового обмена HIP (man-in-the-middle).

Если инициатор заранее знает отождествление хоста ответчика при первом контакте с ним через RVS, у него есть возможность проверить подписи в базовом обмене HIP, что позволяет защититься от MiTM-атак (man-in-the-middle). Если инициатор не знает заранее отождествления хоста ответчика (opportunistic Initiator), он практически не способен защитить обмен HIP от таких атак, поскольку нет возможности проверить подлинность при обмене открытыми ключами. Единственным способом снижения угрозы перехвата состояния HIP является требование к ответам R1 на opportunistic I1 содержать тот же IP-адрес отправителя, на который был передан пакет I1. Это сохраняет уровень защиты, присущий современному состоянию Internet.

Однако из соображений простоты эта спецификация не разрешает создавать ассоциации HIP через RVS гибким (opportunistic) способом.

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

В [RFC5204], отменённом этим документом, заданы указанные в таблице определения и резервирование в субреестре Parameter Types реестра Host Identity Protocol (HIP) Parameters.

Значение

Тип параметра

Размер

65498

FROM

16

65500

RVS_HMAC

переменный

65502

VIA_RVS

переменный

В субреестре Parameter Types реестра Host Identity Protocol (HIP) Parameters ссылки на [RFC5204] заменены ссылками на этот документ.

В [RFC5204], отменённом этим документом, задано приведённое в таблице определение для субреестра Registration Types в реестре Host Identity Protocol (HIP) Parameters.

 

Значение

Тип регистрации

1

RENDEZVOUS

 

В субреестре Registration Types реестра Host Identity Protocol (HIP) Parameters ссылка на [RFC5204] заменена ссылкой на этот документ.

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

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

[RFC1122] Braden, R., Ed., «Requirements for Internet Hosts — Communication Layers», STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, <http://www.rfc-editor.org/info/rfc1122>.

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

[RFC6724] Thaler, D., Ed., Draves, R., Matsumoto, A., and T. Chown, «Default Address Selection for Internet Protocol Version 6 (IPv6)», RFC 6724, DOI 10.17487/RFC6724, September 2012, <http://www.rfc-editor.org/info/rfc6724>.

[RFC7401] Moskowitz, R., Ed., Heer, T., Jokela, P., and T. Henderson, «Host Identity Protocol Version 2 (HIPv2)», RFC 7401, DOI 10.17487/RFC7401, April 2015, <http://www.rfc-editor.org/info/rfc7401>.

[RFC8003] Laganier, J. and L. Eggert, «Host Identity Protocol (HIP) Registration Extension», RFC 8003, DOI 10.17487/RFC8003, October 2016, <http://www.rfc-editor.org/info/rfc8003>.

[RFC8005] Laganier, J., «Host Identity Protocol (HIP) Domain Name System (DNS) Extension», RFC 8005, DOI 10.17487/RFC8005, October 2016, <http://www.rfc-editor.org/info/rfc8005>.

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

[HIP-ARCH] Moskowitz, R. and M. Komu, «Host Identity Protocol Architecture», Work in Progress3, draft-ietf-hip-rfc4423-bis-14, June 2016.

[HIP-HOST-MOB] Henderson, T., Vogt, C., and J. Arkko, «Host Mobility with the Host Identity Protocol», Work in Progress, draft-ietf-hip-rfc5206-bis-144, October 2016.

[RFC2827] Ferguson, P. and D. Senie, «Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing», BCP 38, RFC 2827, DOI 10.17487/RFC2827, May 2000, <http://www.rfc-editor.org/info/rfc2827>.

[RFC3013] Killalea, T., «Recommended Internet Service Provider Security Services and Procedures», BCP 46, RFC 3013, DOI 10.17487/RFC3013, November 2000, <http://www.rfc-editor.org/info/rfc3013>.

[RFC5204] Laganier, J. and L. Eggert, «Host Identity Protocol (HIP) Rendezvous Extension», RFC 5204, DOI 10.17487/RFC5204, April 2008, <http://www.rfc-editor.org/info/rfc5204>.

Приложение A. Отличия от RFC 5204

Обновлены ссылки HIP с указанием пересмотренных спецификаций HIP.

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

Перечисленные ниже люди представили содержательные и полезные замечания и/или предложения для улучшения этого документа: Marcus Brunner, Tom Henderson, Miika Komu, Mika Kousa, Pekka Nikander, Juergen Quittek, Justino Santos, Simon Schuetz, Tim Shepard, Kristian Slavov, Martin Stiemerling. Lars Eggert получил финансирование в рамках исследовательской и инновационной программы Европейского союза Horizon 2020 на 2014-2018 годы по гранту 644866. Этот документ отражает лишь точку зрения авторов и Европейская комиссия не несёт ответственности за какое-либо использование содержащихся в документе сведений.

Спасибо Joel M. Halpern за рецензирование Gen-ART для этого документа в процессе его публикации.

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

Julien Laganier
Luminate Wireless, Inc.
Cupertino, CA
United States of America
Email: julien.ietf@gmail.com
 
Lars Eggert
NetApp
Sonnenallee 1
Kirchheim 85551
Germany
Phone: +49 151 12055791
Email: lars@netapp.com
URI: http://eggert.org

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

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

nmalykh@protokols.ru

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

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

3Опубликовано в RFC 9063. Прим. перев.

4Опубликовано в RFC 8046. Прим. перев.

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