RFC 8468 IPv4, IPv6, and IPv4-IPv6 Coexistence: Updates for the IP Performance Metrics (IPPM) Framework

Internet Engineering Task Force (IETF)                         A. Morton
Request for Comments: 8468                                     AT&T Labs
Updates: 2330                                                  J. Fabini
Category: Informational                                          TU Wien
ISSN: 2070-1721                                                N. Elkins
                                                   Inside Products, Inc.
                                                            M. Ackermann
                                      Blue Cross Blue Shield of Michigan
                                                                V. Hegde
                                                              Consultant
                                                           November 2018

IPv4, IPv6, and IPv4-IPv6 Coexistence: Updates for the IP Performance Metrics (IPPM) Framework

Обновление схемы измерения производительности IP (IPPM) для IPv4, IPv6 и сосуществования IPv4-IPv6

PDF

Аннотация

Этот документ обновляет схему показателей производительности IP (IP Performance Metrics или IPPM), определённую в RFC 2330, рассматривая дополнительные методы измерений и тесты. Обновлено определение стандартных пакетов для включения IPv6, отменено определение минимального пакета IP, дополнены аспекты различий, называемые Type-P, для тестовых пакетов из RFC 2330. Документ указывает, что сосуществование IPv4 и IPv6 может осложнять измерения в рамках IPPM. Примеры использования включают, помимо прочего, трансляцию IPv4-IPv6, NAT, инкапсуляцию. Рассмотрено сжатие заголовков IPv6 и использование в сетях 6LoWPAN1 с исключением этих вариантов из оценки для стандартизованных пакетов.

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

Рабочая группа IETF IPPM (IP Performance Metrics) описала схему для разработки показателей в [RFC2330]. Эта схема проверена временем и позволила разработать множество фундаментальных показателей. Схема была обновлена в части состава показателей [RFC5835] и в нескольких областях, связанных с активными измерениями потоков в современных сетях с реактивными свойствами [RFC7312].

В схеме IPPM [RFC2330] отмечено (раздел 13), что многие свойства пакетов IP могут влиять на обработку пакета в процессе его передачи через сеть.

В разделе 15 [RFC2330] определён «пакет стандартного формата» (standard-formed). Однако это определение не было расширено для пакетов IPv6, хотя авторы [RFC2330] явно указали необходимость такого обновления в разделе 15: «с полем версии 4 (позднее будет описан случай для версии 6)».

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

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

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

3. Область действия

Целью этого документа является расширение сферы действия IPPM за счёт включения IPv6, указания дополнительных параметров тестовых пакетов и включение этого в схему IPPM.

Цель состоит в обновлении ключевых разделов [RFC2330] с добавлением соображений, которые помогут в разработке новых методов измерения для современных сетей IP. В частности, документ расширяет набор примеров Type-P из раздела 13 в [RFC2330] и определение пакетов стандартного формата (раздел 15 в [RFC2330]) включением параметров заголовка IPv6 и других свойств.

Другие аспекты [RFC2330], которые могут быть обновлены или дополнены, оставлены на будущее. К таким вопросам относятся пассивные и гибридные измерения.

4. Пакеты Type-P

Фундаментальное свойство многих показателей Internet заключается в том, что измеряемое значение зависит от параметров пакетов IP, применяемых для измерения. Факторы влияния включают поля заголовков IP и их значения, а также заголовки вышележащего протокола и их значения. Например, для метрики связности IP значения будут зависеть от использования общеизвестных портов TCP или незарезервированных портов UDP, наличия ошибок в контрольных суммах IPv4, значение TTL или Hop Limit (например, 16). В некоторых случаях различия будут диктовать специальную обработку пакетов на промежуточных узлах и оконечных системах, например, при использовании Diffserv [RFC2474], явного уведомления о перегрузке (Explicit Congestion Notification или ECN) [RFC3168], Router Alert [RFC6398], расширений Hop-by-Hop [RFC7045], меток потоков (Flow Label) [RFC6437], а также наличия в пути межсетевых экранов или резервирования RSVP.

Из-за таких различий введено понятие пакетов Type-P, который в некоторых вариантах контекста P определяется явно (т. е. тип пакета задаётся точно), частично (например, в размером данных B октетов) или остаётся базовым. Таким образом, можно говорить о базовой связности IP-Type-P-connectivity или более конкретно о IP-port-HTTP-connectivity. Некоторые показатели и методики можно задать с использованием базовых определений Type-P, которые конкретизируются при выполнении фактических измерений.

Когда значение показателя зависит от типа вовлечённых в тест пакетов, имя параметра будет включать конкретный тип или фразу вида Type-P. Таким образом определяется не метрика IP-connectivity, а метрика IP-Type-P-connectivity и/или, например, IP-port-HTTP-connectivity. Такое соглашение об именовании служит важным напоминанием о необходимости точно учитывать тип используемого для измерений трафика.

Если установлено, что сведения, определяющие Type-P у отправителя (Source), изменились на стороне получателя (Destination) или в точке измерения между отправителем и получателем, как в [RFC5644], изменённые значения должны быть указаны в отчёте о результатах. Некоторые изменения происходят в соответствии с условиями на пути (например, уведомлением о перегрузке) или требованиями сегментов пути между отправителем и получателем. Например, размер пакета будет меняться, если заголовки IP будут преобразованы к другой версии (семейству адресов), а также при добавлении или удалении заголовков расширения. Даже обычно изменяемые в пути поля заголовка, такие как TTL/Hop Limit, могут влиять на некоторые тесты. Например, пакеты протокола обнаружения соседей (Neighbor Discovery Protocol или NDP) [RFC4861] передаются с Hop Limit = 255 и для их корректности у получателя это поле должно иметь значение 255. Хотя в других тестах поле TTL/Hop Limit может исключаться из определения Type-P, для этого теста значение Hop Limit важно и должно включаться в определение Type-P.

Локальные правила промежуточных узлов, проверяющие заголовки расширения IPv6, могут влиять на повторяемость измерений. Если промежуточные узлы выполняют рекомендации [RFC7045], повторяемость в той или иной степени может быть улучшена.

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

Распределение нагрузки между параллельными путями является одним из примеров, где такой класс C будет сложно определить в измерениях IPPM. Балансировщики и маршрутизаторы часто применяют идентификаторы потоков в форме хэш-значений заголовка пакета (для конкретного пути), которые служат для выбора среди доступных путей. Пакеты м идентичным хэш-значением относятся к одному потоку и пересылаются одному ресурсу в балансировщике (маршрутизаторе). Наличие балансировки в пути измерения, а также конкретные заголовки и поля, применяемые в решении о пересылке, не будут известны, когда измерительный путь является «чёрным ящиком». Возможные варианты оценки включают измерение одного из параллельных путей и измерение всех доступных параллельных путей, которые могут применяться для балансировки. Поэтому знание определения потоков в балансировщике (или связанная с классом C обработка полей заголовка в части хэширования) является необходимым условием для повторяемости измерений. На пути может оказаться несколько балансировщиков, что усложнит определение класса C.

5. Пакеты стандартного формата

Если не указано иное, все определения показателей, относящиеся к пакетам IP, неявно включают допущение о стандартном формате пакетов. Пакет считается имеющим стандартный формат, если он соответствует требованиям:

  • наличие действительного (корректного) заголовка IP с учётом версии протокола;

  • не является фрагментом IP;

  • адреса отправителя и получателя Включая групповых получателей) соответствуют предусмотренным Source и Destination;

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

Для стандартных пакетов IPv4 (в соответствии с [RFC791] и обновляющими его RFC) требуется:

  • значение 4 в поле версии;

  • значение размера заголовка (Internet Header Length или IHL) не менее 5 и корректная контрольная сумма;

  • соответствие общего размера пакета в заголовке IPv4 размеру заголовка и данных (payload);

  • пакет имеет достаточное значение TTL для доставки от Source к Destination, если TTL декрементируется на каждом этапе пересылки, или TTL = 255;

  • пакет не содержит опция IP, которые не указаны явно.

Для стандартных пакетов IPv6 (в соответствии с [RFC8200] и будущими обновлениями) требуется:

  • значение 6 в поле версии;

  • соответствие общего размера пакета размеру заголовка IPv6 (40 октетов) и размеру данных (payload) в заголовке IPv6;

  • соответствие размера данных (включая заголовки расширения) спецификации IPv6;

  • пакет имеет достаточное значение Hop Limit для доставки от Source к Destination, если Hop Limit декрементируется на каждом этапе пересылки, или Hop Limit = 255;

  • пакет не включает заголовков расширения или число и тип этих заголовков корректно указаны в пакете и порядок заголовков соответствует спецификации (Next Header);

  • все параметры в заголовке и заголовках расширения присутствуют в реестре Internet Protocol Version 6 (IPv6) Parameters, заданном в [IANA-6P].

В контексте стандартных пакетов требуется обсудить два механизма — 6LowPAN [RFC4944] и отказоустойчивое сжатие заголовков (Robust Header Compression или ROHC) [RFC3095]. Определение 6LowPAN дано в [RFC4944] и обновлено в [RFC6282] компрессией заголовков и в [RFC6775] оптимизацией обнаружения соседей. В 6LowPAN предложено решение для использования IPv6 в сетях с ограниченными ресурсами. Уровень адаптации позволяет передавать пакеты IPv6 через сети с MTU меньше минимального значения IPv6 MTU. Фрагментация и сборка пакетов IPv6, а также результирующее состояние, хранящееся на промежуточных узлах, создают серьёзные проблемы для измерений. Точно так же ROHC работает с сохранением состояний сжатия заголовков на субпутях в промежуточных точках (хостах). Изменение Type-P для измерительных пакетов в ROHC и 6LowPAN требует существенных усилий, как и требования в части стандартных пакетов для этих 2 протоколов. По этой причине пакеты ROHC и 6LowPAN исключены из числа стандартных форматов пакетов.

Тема заголовков расширения IPv6 вызывает споры, как отмечено в [RFC6564] и [RFC7045]. Однако измерения в контексте схемы IPPM, такие как OAM [IOAM-DATA] в корпоративной среде, могут выигрывать от проверки, изменения, добавления или удаления заголовков расширения IPv6 на хостах в измерительном пути.

[RFC8250] поддерживает использование IPv6 Destination Option для измерений в соответствии с уместными спецификациями, одобренными IETF.

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

  • Проверка заголовков расширения. Некоторые промежуточные узлы могут проверять заголовки расширения или передаваемые пакеты IPv6 целиком. В исключительных случаях они могут отбрасывать пакеты или направлять их по неоптимальному пути, что может делать измерения ненадёжными или неповторяемыми. Пакет (если он приходит) может иметь стандартный формат с соответствующим Type-P.

  • Изменение заголовков расширения. В заголовках Hop-by-Hop для опций TLV может быть разрешено изменение на промежуточных узлах. Результирующий пакет может иметь стандартный формат с соответствующим Type-P.

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

  • Изменение размера пакетов (по сравнению с размеров у источника) или заголовков имеет важное значение для измерений в Internet и требует указывать изменённый Type-P в результатах теста.

Дополнительно требуется, чтобы для пакета размером B октетов выполнялось условие 0 <= B <= 65535, а если B указывает размер данных (payload) в октетах, B <= (65535 — размер заголовка IP с учётом заголовков расширения). Это не учитывает джамбограммы, определённые в [RFC2675], но при наличии IPv6 Jumbogram Payload Hop-by-Hop Option Header пакет соответствующего размера должен считаться стандартным. На практике значение path MTU будет ограничивать размер стандартных пакетов, которые можно передать по данному пути. Для предотвращения фрагментации рекомендуется применять механизм Path MTU Discovery для IP версии 6 (PMTUD, [RFC8201]) или Packetization Layer Path MTU Discovery (PLPMTUD, [RFC4821]).

Например, можно представить определение показателя IP-связности как «IP-Type-P-connectivity для стандартных пакетов с IP Diffserv = 0» или более кратко как «IP-Type-P-connectivity с IP Diffserv = 0», поскольку соглашение уже предполагает стандартный формат. Смена содержимого поля, например, на Diffserv Code Point, биты ECN или Flow Label может существенно повлиять на обработку пакетов в процессе передачи, но пакеты не перестанут быть стандартными. Аналогично, добавление, изменение или удаление заголовков расширения может изменить обработку пакетов на промежуточных хостах.

В [RFC2330] определён «минимальный пакет IP от A к B» как определённый тип пакета со стандартным форматом, который зачастую полезно рассмотреть. При определении показателей IP ни один пакет меньше или проще минимального не может быть передан через корректно работающую сеть IP. Однако концепция минимального пакета IP не нашла широкого применения (поскольку активные системы измерения обычно используют транспортный протокол и данные). Поэтому данный документ отменяет эту концепцию.

6. NAT, переход IPv4-IPv6 и методы сжатия

В этом документе добавлены соображения по использованию IPv6 в двух важнейших соглашениях схемы IPPM о пакетах Type-P и пакетах стандартного формата. Необходимость сосуществования IPv4 и IPv6 вызвала создание переходных стандартов, таких как трансляция IPv4/IPv6 [RFC6144] и IP/ICMP [RFC7915] [RFC7757].

Определение и проведение измерений в контексте IPPM сталкивается с проблемами при наличии упомянутых механизмов трансляции на пути измерений. В случаях трансляции IPv4-IPv6, NAT, протокольной инкапсуляции, сжатия заголовков pIPv6 пакеты Type-P на пути измерения могут изменяться. Все такие изменения должны указываться в отчёте. Некоторые примеры последствий приведены ниже.

  • Изменение или добавление заголовков или полей на промежуточных узлах. Преобразование IPv4-IPv6 или сжатие заголовков IPv6 может менять Type-P измерительных пакетов. В результате хосты на пути измерения могут по разному трактовать пакеты. При измерениях в точках наблюдения на пути может потребоваться дополнительный контекст для однозначной идентификации пакета.

  • Трансляторы сетевых адресов (Network Address Translator или NAT) на пути могут оказывать непредсказуемое влияние на измерение задержки (в части дополнительного времени обработки) и, возможно, других показателей. Обычно это влияние невозможно контролировать, поскольку у тестировщиков может не быть средств воздействия на базовую сеть и промежуточные устройства. Существует вероятность того, что NAT с учётом состояния будет вызвать нестабильность производительности потока с конкретным Type-P, поскольку требуется создать состояние для первого пакета в потоке и это состояние может быть утеряно позднее, если у транслятора NAT недостаточно ресурсов. Однако это не делает Type-P непригодным для теста, например, в случае измерения влияния NAT на вариации задержки. Наличие NAT может означать изменение измеренной производительности Type-P между источником и получателем. Это может вызывать проблемы при сопоставлении измерений, выполненных на сегментах пути с трансляторами NAT. Поэтому наличие (или отсутствие) трансляторов адресов следует учитывать при измерениях.

  • Изменение задержки в зависимости от внутреннего состояния. Одним из побочных эффектов преобразований IPv4-IPv6 является переменная задержка на промежуточных узлах в результате преобразования заголовков. Как и в случае NAT, выделение внутреннего состояния и организация контекста на промежуточных узлах может приводить к переменным задержкам, зависящим от картины измерительного потока и размещения пакета в потоке. Например, первый пакет потока обычно вызывает организацию внутреннего состояния на промежуточных хостах с преобразованием IPv4-IPv6. Это состояние будет обеспечивать более быструю обработку последующих пакетов. Однако при больших интервалах между пакетами состояние может теряться и для последующих пакетов придётся создавать его заново. Следует отметить, что такая переменная задержка в результате создания внутреннего состояния на промежуточных узлах сама может быть предметом изучения (измерения).

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

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

Здесь применимы соображения безопасности, относящиеся к любым активным измерениям (см. [RFC4656] и [RFC5357]).

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

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

Этот документ не требует действий IANA.

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

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

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

[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>.

[RFC2330] Paxson, V., Almes, G., Mahdavi, J., and M. Mathis, «Framework for IP Performance Metrics», RFC 2330, DOI 10.17487/RFC2330, May 1998, <https://www.rfc-editor.org/info/rfc2330>.

[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, «Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers», RFC 2474, DOI 10.17487/RFC2474, December 1998, <https://www.rfc-editor.org/info/rfc2474>.

[RFC2675] Borman, D., Deering, S., and R. Hinden, «IPv6 Jumbograms», RFC 2675, DOI 10.17487/RFC2675, August 1999, <https://www.rfc-editor.org/info/rfc2675>.

[RFC3095] Bormann, C., Burmeister, C., Degermark, M., Fukushima, H., Hannu, H., Jonsson, L-E., Hakenberg, R., Koren, T., Le, K., Liu, Z., Martensson, A., Miyazaki, A., Svanbro, K., Wiebke, T., Yoshimura, T., and H. Zheng, «RObust Header Compression (ROHC): Framework and four profiles: RTP, UDP, ESP, and uncompressed», RFC 3095, DOI 10.17487/RFC3095, July 2001, <https://www.rfc-editor.org/info/rfc3095>.

[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, «The Addition of Explicit Congestion Notification (ECN) to IP», RFC 3168, DOI 10.17487/RFC3168, September 2001, <https://www.rfc-editor.org/info/rfc3168>.

[RFC4656] Shalunov, S., Teitelbaum, B., Karp, A., Boote, J., and M. Zekauskas, «A One-way Active Measurement Protocol (OWAMP)», RFC 4656, DOI 10.17487/RFC4656, September 2006, <https://www.rfc-editor.org/info/rfc4656>.

[RFC4821] Mathis, M. and J. Heffner, «Packetization Layer Path MTU Discovery», RFC 4821, DOI 10.17487/RFC4821, March 2007, <https://www.rfc-editor.org/info/rfc4821>.

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

[RFC4944] Montenegro, G., Kushalnagar, N., Hui, J., and D. Culler, «Transmission of IPv6 Packets over IEEE 802.15.4 Networks», RFC 4944, DOI 10.17487/RFC4944, September 2007, <https://www.rfc-editor.org/info/rfc4944>.

[RFC5357] Hedayat, K., Krzanowski, R., Morton, A., Yum, K., and J. Babiarz, «A Two-Way Active Measurement Protocol (TWAMP)», RFC 5357, DOI 10.17487/RFC5357, October 2008, <https://www.rfc-editor.org/info/rfc5357>.

[RFC5644] Stephan, E., Liang, L., and A. Morton, «IP Performance Metrics (IPPM): Spatial and Multicast», RFC 5644, DOI 10.17487/RFC5644, October 2009, <https://www.rfc-editor.org/info/rfc5644>.

[RFC5835] Morton, A., Ed. and S. Van den Berghe, Ed., «Framework for Metric Composition», RFC 5835, DOI 10.17487/RFC5835, April 2010, <https://www.rfc-editor.org/info/rfc5835>.

[RFC6144] Baker, F., Li, X., Bao, C., and K. Yin, «Framework for IPv4/IPv6 Translation», RFC 6144, DOI 10.17487/RFC6144, April 2011, <https://www.rfc-editor.org/info/rfc6144>.

[RFC6282] Hui, J., Ed. and P. Thubert, «Compression Format for IPv6 Datagrams over IEEE 802.15.4-Based Networks», RFC 6282, DOI 10.17487/RFC6282, September 2011, <https://www.rfc-editor.org/info/rfc6282>.

[RFC6398] Le Faucheur, F., Ed., «IP Router Alert Considerations and Usage», BCP 168, RFC 6398, DOI 10.17487/RFC6398, October 2011, <https://www.rfc-editor.org/info/rfc6398>.

[RFC6437] Amante, S., Carpenter, B., Jiang, S., and J. Rajahalme, «IPv6 Flow Label Specification», RFC 6437, DOI 10.17487/RFC6437, November 2011, <https://www.rfc-editor.org/info/rfc6437>.

[RFC6564] Krishnan, S., Woodyatt, J., Kline, E., Hoagland, J., and M. Bhatia, «A Uniform Format for IPv6 Extension Headers», RFC 6564, DOI 10.17487/RFC6564, April 2012, <https://www.rfc-editor.org/info/rfc6564>.

[RFC6775] Shelby, Z., Ed., Chakrabarti, S., Nordmark, E., and C. Bormann, «Neighbor Discovery Optimization for IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs)», RFC 6775, DOI 10.17487/RFC6775, November 2012, <https://www.rfc-editor.org/info/rfc6775>.

[RFC7045] Carpenter, B. and S. Jiang, «Transmission and Processing of IPv6 Extension Headers», RFC 7045, DOI 10.17487/RFC7045, December 2013, <https://www.rfc-editor.org/info/rfc7045>.

[RFC7312] Fabini, J. and A. Morton, «Advanced Stream and Sampling Framework for IP Performance Metrics (IPPM)», RFC 7312, DOI 10.17487/RFC7312, August 2014, <https://www.rfc-editor.org/info/rfc7312>.

[RFC7757] Anderson, T. and A. Leiva Popper, «Explicit Address Mappings for Stateless IP/ICMP Translation», RFC 7757, DOI 10.17487/RFC7757, February 2016, <https://www.rfc-editor.org/info/rfc7757>.

[RFC7915] Bao, C., Li, X., Baker, F., Anderson, T., and F. Gont, «IP/ICMP Translation Algorithm», RFC 7915, DOI 10.17487/RFC7915, June 2016, <https://www.rfc-editor.org/info/rfc7915>.

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

[RFC8200] Deering, S. and R. Hinden, «Internet Protocol, Version 6 (IPv6) Specification», STD 86, RFC 8200, DOI 10.17487/RFC8200, July 2017, <https://www.rfc-editor.org/info/rfc8200>.

[RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., «Path MTU Discovery for IP version 6», STD 87, RFC 8201, DOI 10.17487/RFC8201, July 2017, <https://www.rfc-editor.org/info/rfc8201>.

[RFC8250] Elkins, N., Hamilton, R., and M. Ackermann, «IPv6 Performance and Diagnostic Metrics (PDM) Destination Option», RFC 8250, DOI 10.17487/RFC8250, September 2017, <https://www.rfc-editor.org/info/rfc8250>.

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

[IANA-6P] IANA, «Internet Protocol Version 6 (IPv6) Parameters», <https://www.iana.org/assignments/ipv6-parameters>.

[IOAM-DATA] Brockners, F., Bhandari, S., Pignataro, C., Gredler, H., Leddy, J., Youell, S., Mizrahi, T., Mozes, D., Lapukhov, P., Chang, R., daniel.bernier@bell.ca, d., and J. Lemon, «Data Fields for In-situ OAM», Work in Progress, draft-ietf-ippm-ioam-data-03, June 2018.

[RFC7594] Eardley, P., Morton, A., Bagnulo, M., Burbridge, T., Aitken, P., and A. Akhter, «A Framework for Large-Scale Measurement of Broadband Performance (LMAP)», RFC 7594, DOI 10.17487/RFC7594, September 2015, <https://www.rfc-editor.org/info/rfc7594>.

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

Авторы благодарны Brian Carpenter за указание отсутствия охвата IPv6 в схеме IPPM и перечисление дополнительных факторов различия для пакетов Type-P. Brian и Fred Baker обсудили с соавторами многие интересные аспекты IPv6, что улучшило цельность первого предварительного варианта документа, спасибо им. Спасибо Bill Jouris за редактирование текста pre-00. В конце работы Nevil Brownlee, Mike Heard, Spencer Dawkins, Warren Kumari и Suresh Krishnan внесли ценные предложения.

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

Al Morton
AT&T Labs
200 Laurel Avenue South
Middletown, NJ 07748
United States of America
Phone: +1 732 420 1571
Fax: +1 732 368 1192
Email: acm@researh.att.com
 
Joachim Fabini
TU Wien
Gusshausstrasse 25/E389
Vienna 1040
Austria
Phone: +43 1 58801 38813
Fax: +43 1 58801 38898
Email: Joachim.Fabini@tuwien.ac.at
URI: http://www.tc.tuwien.ac.at/about-us/staff/joachim-fabini/
 
Nalini Elkins
Inside Products, Inc.
Carmel Valley, CA 93924
United States of America
Email: nalini.elkins@insidethestack.com
 
Michael S. Ackermann
Blue Cross Blue Shield of Michigan
Email: mackermann@bcbsm.com
 
Vinayak Hegde
Consultant
Brahma Sun City, Wadgaon-Sheri
Pune, Maharashtra 411014
India
Phone: +91 9449834401
Email: vinayakh@gmail.com
URI: http://www.vinayakhegde.com

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

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

nmalykh@protokols.ru

1IPv6 over Low-Power Wireless Area Networks — сети IPv6 на основе беспроводных каналов со слабым питанием.

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

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

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

RFC 8469 Recommendation to Use the Ethernet Control Word

Internet Engineering Task Force (IETF)                         S. Bryant
Request for Comments: 8469                                      A. Malis
Updates: 4448                                                     Huawei
Category: Standards Track                                    I. Bagdonas
ISSN: 2070-1721                                                  Equinix
                                                           November 2018

Recommendation to Use the Ethernet Control Word

Рекомендации по использованию управляющего слова Ethernet

PDF

Аннотация

Для псевдопроводной (PW1) инкапсуляции Ethernet в RFC 4448 указано, что использование управляющего слова (CW2) не обязательно. В отсутствие CW пакет Ethernet PW может быть ошибочно принят маршрутизатором LSR3 за пакет IP. Это может привести к ошибочному выбору пути для пакета среди ECMP4 а в результате может нарушиться порядок пакетов. Эта проблема стала более серьезной в результате развертывания оборудования с адресами Ethernet MAC5, начинающимися с 0x4 или 0x6. Использование Ethernet PW CW решает эту проблему. Данный документ рекомендует использовать Ethernet PW CW при любых необычных обстоятельствах.

Этот документ обновляет RFC 4448.

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

Спецификация псевдопроводной инкапсуляции Ethernet [RFC4448] указывает, что использование управляющего слова CW не обязательно. Маршрутизаторы LSR обычно выполняют поиск после стека меток для определения присутствия пакета IP в поле данных и, при его обнаружении, выбора следующего интервала (next hop) на основании «пятерки» (five-tuple) — IP-адреса отправителя и получателя, protocol/next-header, номера транспортных портов отправителя и получателя. В отсутствие PW CW пакет Ethernet PW может быть ошибочно принят за пакетом IP маршрутизатором LSR, выбирающим путь ECMP на основе five-tuple. Это может приводить к выбору ошибочного пути ECMP и, в результате, к нарушению порядка доставки пакетов. Дополнительное рассмотрение этой проблемы дано в [RFC4928].

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

Пакеты IPv4 и IPv6 начинаются со значений 0x4 и 0x6, соответственно. Может происходить ошибочная идентификация пакета, если пакет Ethernet PW без CW содержит кадр Ethernet с адресом получателя, начинающимся с указанных значений.

По ряду причин эта проблема недавно стала серьезной. Во-первых, Регистрационный комитет IEEE (RAC8) выделил адреса Ethernet MAC, начинающиеся с 0x4 и 0x6, а оборудование с такими MAC-адресами появилось в сетях. Во-вторых, озабоченность вопросами приватности привела к использованию случайных MAC-адресов, назначаемых локально. При случайном назначении адреса, начинающиеся с указанных значений будут составлять приблизительно 1/8 часть всех выделяемых адресов.

Использование Ethernet PW CW решает эту проблему.

Данный документ рекомендует использовать Ethernet PW CW при любых необычных обстоятельствах.

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

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

3. Обоснование

Инкапсуляция Ethernet PW определена в [RFC4448]. Особое значение имеет параграф 4.6, часть которого для удобства читателя приведена ниже. Отметим, что RFC 4448 цитирует [PWE3-CW] для ссылки на [RFC4385] и [VCCV] для ссылки на документ, который в конечном итоге опубликован как [RFC5085].

Управляющее слово, определенное в этом параграфе, основано на Generic PW MPLS Control Word из [PWE3-CW]. Оно обеспечивает возможность упорядочить отдельные кадры в PW, а также избежать распределения пакетов между равноценными путями (ECMP) [RFC2992] и применения механизмов OAM9, включая VCCV [VCCV].

В [PWE3-CW] сказано «Если PW реагирует на нарушение порядка пакетов и передается через MPLS PSN с использованием содержимого данных MPLS (payload) для выбора пути ECMP, псевдопровод может реализовать механизм предотвращения нарушений порядка пакетов». Это требуется для того, чтобы реализации ECMP могли проверить первый полубайт после стека меток MPLS для определения принадлежности пакета к протоколу IP. Если MAC-адрес отправителя в кадре Ethernet, передаваемом через PW без управляющего слова, начинается с 0x4 или 0x6, он будет ошибочно сочтен пакетом IPv4 или IPv6. В зависимости от конфигурации и топологии сети MPLS это может приводить к ситуации, где пакеты данного PW будут передаваться по разным путям. В результате может возрасти число кадров с нарушением порядка доставки в данном PW или пакеты OAM пойдут по пути, отличающемуся от пути обычного трафика (см. параграф 4.4.3 Порядок кадров).

Функции, предоставляемые управляющим словом, могут не требоваться для данного Ethernet PW. Например, ECMP может не быть или не использоваться в данной сети MPLS, соблюдение порядка кадров может не требоваться и пр. В таких случаях роль слова управления невелика и оно может не использоваться. Ранние реализации Ethernet PW развертывались без CW и возможности обрабатывать слово управления при его наличии. Для совместимости со старыми версиями будущие реализации должны быть способны передавать и принимать кадры без CW.

В начале развертывания PW часть коммерчески значимого оборудования была не способна обрабатывать Ethernet CW. Кроме того, в те времена предполагалось, что адреса Ethernet MAC, начинающиеся с 0x4 или 0x6, не будут назначаться IEEE RAC и можно реализовать Ethernet PW без поддержки CW.

С течением времени адреса Ethernet MAC, начинающиеся с 0x4 и 0x6, были выделены RAC. Поэтому допущение о том, что в реальных сетях не будет возникать путаницы между пакетами Ethernet PW без CW и пакетами IP, перестало соответствовать реалиям.

Возможно несанкционированное использование адресов Ethernet MAC послужило тому, что некоторые производители оборудования реализовали более сложные, фирменные методы, позволяющие различать пакеты Ethernet PW и IP. Такие механизмы основаны на эвристике проверки транзитных пакетов с целью точного определения типа пакета и не могут считаться надежными из-за произвольной природы данных, передаваемых в таких пакетах.

Проблема была обозначения в почтовой конференции NANOG, доступной по ссылке https://mailman.nanog.org/pipermail/nanog/2016-December/089395.html.

4. Рекомендации

Неоднозначность идентификации в данных MPLS пакетов Ethernet PW и IP устраняется при использовании Ethernet PW CW. Этот документ обновляет [RFC4448] в том смысле, что входным и выходным граничным устройствам провайдера (PE10) следует поддерживать Ethernet PW CW и при наличии этой поддержки CW должно применяться.

Там, где требуется применение ECMP для трафика Ethernet PW, а входные и выходные устройства PE поддерживают ELI/EL11 [RFC6790] и FAT PW12 [RFC6391], может применяться любой метод. Использование обоих методов на одном PW обычно не требуется и его следует избегать, если позволяют обстоятельства. В случае многосегментных PW при использовании ELI/EL его следует применять на каждом сегменте PW. Метод обеспечения использования ELI/EL на каждом сегменте выходит за рамки этого документа.

5. Равноценные пути (ECMP)

Там, где объем трафика Ethernet PW требует применения ECMP, может использоваться один из двух методов:

  • FAT PW через сеть MPLS PSN13, как описано в [RFC6391];

  • метки энтропии LSP14, как описано в [RFC6790].

RFC 6391 работает на основе повышения энтропии нижней метки стека. Поддержка этой функции требуется на входных и выходных PE. Также требуется, чтобы достаточное число LSR на пути LSP между входным и выходным PE было способно выбирать путь ECMP для пакета MPLS с достаточной глубиной стека.

RFC 6790 работает на основе включения энтропии в путь LSP-часть стека меток. Это требует от входного и выходного PE поддержки вставки и удаления EL и ELI, а также достаточного числа LSR на пути LSP, способных выбирать путь ECMP на основе EL.

В обоих случаях требуется обеспечить прохождение пакетов OAM и пакетов данных по одному пути. Этот вопрос подробно рассмотрен в разделе 7 [RFC6391] и разделе 6 [RFC6790]. Однако в обоих случаях ситуация улучшается по сравнению с поведением ECMP без использования Ethernet PW CW, когда нет возможности обеспечить прохождение пакетов PW OAM по одному пути с пакетами данных PW, для которых ECMP выбирается на основе five-tuple данных IP.

Метка PW вталкивается перед меткой LSP. Поскольку метки ELI/EL являются частью уровня LSP, а не уровня PW, они вталкиваются после метки PW.

6. Пути смягчения проблемы

Когда нет возможности использовать Ethernet PW CW, влияние ECMP может быть предотвращено путем передачи PW по пути с организацией трафика, который не использует поле данных (payload) для распределения нагрузки (например, RSVP-TE [RFC3209]). Однако на таких путях может применяться распределение нагрузки через связки каналов (link-bundle) и, естественно, весь трафик PW должен передаваться через один LSP.

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

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

Вместо указания типа данных в пакетах MPLS использует уровень управления для сигнализации о типе данных, который следуют за нижней меткой стека. Некоторые LSR пытаются определить типа пакета путем проверки данных MPLS и в ряде случаев просматривают данные дальше PW CW. Если данные представляются пакетом IP или IP указан в заголовке Ethernet, они выполняют расчет ECMP на основе данных, сочтенных полями five-tuple. Однако такое определение типа данных не дает точного результата и при ошибочной идентификации пакета как IP может нарушаться порядок доставки пакетов. Нарушение порядка в этом случае оператору трудно обнаружить. При включении функции, позволяющей использовать информацию из пакета, расположенную после PW CW, при расчете ECMP, оператору следует принимать во внимание возможность нарушения порядка доставки кадров Ethernet, несмотря на присутствие CW.

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

В этом документе отдано предпочтение одной широко распространенной инкапсуляции Ethernet PW над другой. С этим методом связаны вопросы безопасности, рассмотренные в [RFC4448]. Документ не создает других проблем безопасности.

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

Этот документ не запрашивает действий IANA.

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

10.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>.

[RFC4385] Bryant, S., Swallow, G., Martini, L., and D. McPherson, «Pseudowire Emulation Edge-to-Edge (PWE3) Control Word for Use over an MPLS PSN», RFC 4385, DOI 10.17487/RFC4385, February 2006, <https://www.rfc-editor.org/info/rfc4385>.

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

[RFC4928] Swallow, G., Bryant, S., and L. Andersson, «Avoiding Equal Cost Multipath Treatment in MPLS Networks», BCP 128, RFC 4928, DOI 10.17487/RFC4928, June 2007, <https://www.rfc-editor.org/info/rfc4928>.

[RFC6391] Bryant, S., Ed., Filsfils, C., Drafz, U., Kompella, V., Regan, J., and S. Amante, «Flow-Aware Transport of Pseudowires over an MPLS Packet Switched Network», RFC 6391, DOI 10.17487/RFC6391, November 2011, <https://www.rfc-editor.org/info/rfc6391>.

[RFC6790] Kompella, K., Drake, J., Amante, S., Henderickx, W., and L. Yong, «The Use of Entropy Labels in MPLS Forwarding», RFC 6790, DOI 10.17487/RFC6790, November 2012, <https://www.rfc-editor.org/info/rfc6790>.

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

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

[RFC2992] Hopps, C., «Analysis of an Equal-Cost Multi-Path Algorithm», RFC 2992, DOI 10.17487/RFC2992, November 2000, <https://www.rfc-editor.org/info/rfc2992>.

[RFC3209] Awduche, D., Berger, L., Gan, D., Li, T., Srinivasan, V., and G. Swallow, «RSVP-TE: Extensions to RSVP for LSP Tunnels», RFC 3209, DOI 10.17487/RFC3209, December 2001, <https://www.rfc-editor.org/info/rfc3209>.

[RFC5085] Nadeau, T., Ed. and C. Pignataro, Ed., «Pseudowire Virtual Circuit Connectivity Verification (VCCV): A Control Channel for Pseudowires», RFC 5085, DOI 10.17487/RFC5085, December 2007, <https://www.rfc-editor.org/info/rfc5085>.

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

Авторы благодарят Job Snijders за привлечение внимания к проблеме. Спасибо Pat Thaler за разъяснение вопроса о локальном назначении MAC-адресов и Sasha Vainshtein за ценные разъяснения и замечания.

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

Stewart Bryant

Huawei

Email: stewart.bryant@gmail.com

Andrew G. Malis

Huawei

Email: agmalis@gmail.com

Ignas Bagdonas

Equinix

Email: ibagdona.ietf@gmail.com>


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

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

nmalykh@gmail.com

1Pseudowire.

2Control word.

3Label switching router — маршрутизатор с коммутацией по меткам.

4Equal-cost multipath — множество равноценных путей.

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

6Internet Engineering Task Force.

7Internet Engineering Steering Group.

8Registration Authority Committee.

9Operations, Administration, and Maintenance — операции, администрирование и поддержка.

10Provider edge.

11Entropy Label Indicator/Entropy Label — индикатор метки энтропии/метка энтропии.

12Flow-Aware Transport of Pseudowire — осведомленный о потоках транспорт псевдопровода.

13Packet Switched Network — сеть с коммутацией пакетов.

14Label Switched Path — путь с коммутацией по меткам.

Рубрика: RFC | Комментарии к записи RFC 8469 Recommendation to Use the Ethernet Control Word отключены

RFC 8466 A YANG Data Model for Layer 2 Virtual Private Network (L2VPN) Service Delivery

Internet Engineering Task Force (IETF)                            B. Wen
Request for Comments: 8466                                       Comcast
Category: Standards Track                               G. Fioccola, Ed.
ISSN: 2070-1721                                           Telecom Italia
                                                                  C. Xie
                                                           China Telecom
                                                                L. Jalil
                                                                 Verizon
                                                            October 2018

A YANG Data Model for Layer 2 Virtual Private Network (L2VPN) Service Delivery

Модель данных YANG для предоставления услуг виртуальных сетей L2 (L2VPN)

PDF

Аннотация

В этом документе определена модель данных YANG, которая может служить для настройки конфигурации предоставляемого провайдером сервиса L2 VPN. Система управления принимает эту модель в качестве входных данных и создаёт конкретные модели конфигурации разных элементов сети для предоставления услуг. Вопросы непосредственной настройки элементов сети выходят за рамки этого документа.

Определённая в этом документе модель данных YANG включает услуги VPWS1 («точка-точка») и VPLS2 (многоточечные), которые используют псевдопровода с сигнализаций на основе протокола LDP3 и BGP4, как описано в RFC 4761 и RFC 6624.

Определённая здесь модель данных YANG соответствует архитектуре конфигурационных хранилищ NMDA5, определённой в RFC 8342.

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

Этот документ определяет модель данных YANG для услуг L2 VPN (L2VPN). Модель описывает элементы конфигурации сервиса, которые могут применяться в коммуникационных протоколах между абонентами и сетевыми операторами. Эти элементы могут также служить входными данными для автоматизированных приложений управления и настройки конфигурации, которые могут генерировать конкретные конфигурации для настройки различных элементов сети, обеспечивающих сервис. Способы настройки конфигурации сетевых элементов выходят за рамки этого документа.

Дополнительное рассмотрение способов моделирования услуг с помощью YANG и связей между «абонентскими моделями сервиса», подобными описанным здесь, и конфигурационными моделями можно найти в [RFC8309] и [RFC8199]. В разделах 4 и 6 приведена более подробная информация о способах применения этой модели сервиса и её роли в общей архитектуре моделирования.

Определённая в этом документе модель YANG включает поддержку услуг VPWS (точка-точка) и VPLS (многоточечные), использующих псевдопровода с сигнализацией на основе протокола LDP и BGP, как описано в [RFC4761] и [RFC6624]. Модель соответствует архитектуре NMDA [RFC8342].

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

Ниже перечислены термины, определённые в [RFC6241] и используемые здесь:

  • client — клиент;

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

  • server — сервер;

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

Ниже перечислены термины, определённые в [RFC7950] и используемые здесь:

  • augment — добавление (усиление);

  • data model — модель данных;

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

Терминология для описания моделей данных YANG заимствована из [RFC7950].

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

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

1.2. Диаграммы деревьев

Диаграммы деревьев в этом документе используют нотацию [RFC8340].

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

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

Service Provider (SP) — сервис-провайдер

Организация (обычно коммерческое предприятие), отвечающая за работу сети, которая предоставляет услуги VPN клиентам и абонентам.

Customer Edge (CE) Device — краевое устройство абонента

Оборудование, выделенное для конкретного абонента и напрямую подключённое к одному или нескольким устройствам PE через устройства (каналы) присоединения (AC8). Устройства CE обычно размещаются на площадке абонента и как правило выделяются для одной сети VPN, хотя могут поддерживать и множество VPN, если для каждой применяется своё присоединение AC. Устройствами CE могут быть маршрутизаторы, мосты, коммутаторы или хосты.

Provider Edge (PE) Device — краевое устройство провайдера

Управляемое SP оборудование, способное поддерживать множество VPN для разных абонентов и напрямую соединённое с одним или множеством устройств CE через AC. Устройства PE обычно размещаются в точке присутствия SP POP9 и управляются SP.

Virtual Private LAN Service (VPLS) — услуги виртуальной частной ЛВС

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

Virtual Private Wire Service (VPWS) — услуги виртуального частного провода

VPWS представляет собой устройство «точка-точка» (т. е. канал), соединяющее два устройства CE. Канал организуется в форме логического соединения L2 через PSN. Устройства CE в сети абонента подключаются к PE в сети провайдера через AC, которые являются физическими или логическими устройствами (каналами). VPWS отличается от VPLS тем, что VPLS является многоточечным сервисом, а VPWS обеспечивает соединения «точка-точка». В некоторых реализациях набор VPWS служит для создания сети L2VPN с множеством сайтов.

Pseudowire (PW) — псевдопровод

Псевдопровод представляет собой эмуляцию естественного сервиса через PSN. Эмулируемым сервисом может быть ATM, Frame Relay, Ethernet, низкоскоростной канал TDM11 или SONET/SDH12, а сетью PSN — MPLS, IP (IPv4 или IPv6), L2TPv313.

MAC-VRF

Таблица виртуальной маршрутизации и пересылки для MAC14-адресов в PE. Иногда используется термин VSI15.

UNI

Интерфейс пользователя с сетью. Точка физического разделения между областями ответственности абонента и провайдера.

NNI

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

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

BSS

Business Support System — система поддержки бизнеса.

BUM

Broadcast, Unknown Unicast, or Multicast — групповые, неизвестные индивидуальные и широковещательные (кадры).

CoS

Class of Service — класс обслуживания.

LAG

Link Aggregation Group — группы объединенных каналов.

LLDP

Link Layer Discovery Protocol — протокол обнаружения канального уровня.

OAM

Operations, Administration, and Maintenance — эксплуатация, администрирование и поддержка.

OSS

Operations Support System — система поддержки операций.

PDU

Protocol Data Unit — модуль данных протокола.

QoS

Quality of Service — качество обслуживания.

3. Модель сервиса L2 VPN

Сервис VPN уровня 2 (L2VPN16) представляет собой набор сайтов, уполномоченных обмениваться трафиком между собой через общую сетевую инфраструктуру на базе технологии общего назначения. Модель сервиса L2VPN (L2SM17), описанная в этом документе, обеспечивает базовое представление о развёртывании соответствующих услуг L2VPN через инфраструктуру общего пользования.

Этот документ представляет L2SM на основе языка моделирования данных YANG [RFC7950] в качестве формального языка, понятного человеку и пригодного для разбора программами, использующими протоколы NETCONF18 [RFC6241] и RESTCONF [RFC8040].

Эта модель ограничена сетями VPN на основе VPWS и VPLS, как описано в [RFC4761] и [RFC6624], а также Ethernet VPN (EVPN), описанными в [RFC7432].

3.1. Типы сервиса L2 VPN

С точки зрения технологии базовые типы сервиса L2VPN включают:

  • VPWS «точка-точка», использующие псевдопровода с сигнализацией LDP или L2TP [RFC6074];

  • многоточечные VPLS, использующие псевдопровода с сигнализацией LDP или L2TP [RFC6074];

  • многоточечные VPLS, использующие уровень управления BGP, как описано в [RFC4761] и [RFC6624];

  • IPLS19, являющиеся функциональным подмножеством услуг VPLS [RFC7436];

  • EVPN на основе BGP MPLS, как описано в [RFC7432] и [RFC7209];

  • EVPN VPWS, как описано в [RFC8214].

3.2. Топология физической сети L2 VPN

На рисунке 1 показана физическая топология типовой сети SP. Большинство SP использует инфраструктуру с мультисервисным ядром IP, MPLS или сегментной маршрутизации (SR20). Входящие кадры L2 отображаются в псевдопровод Ethernet (например, PWE321) или туннель VXLAN22 между устройствами PE. Выбор механизмов туннелирования остаётся за провайдером и не является частью L2SM.

L2VPN обеспечивает сквозные соединения L2 через инфраструктуру мультисервисного ядра между двумя или более площадками абонента. Устройства AC размещаются между CE и PE, обеспечивая доставку кадров L2 из сети абонента через сеть доступа в провайдерскую сеть или на удалённый сайт. Граничная точка (т. е., UNI) между абонентом и SP может размещаться (1) между узлами абонента и устройством CE или (2) между устройствами CE и PE. Опорное соединение между CE и PE будет описано в L2SM.

SP может также выбрать модель «бесшовного MPLS» для создания туннеля PWE3 или VXLAN между сайтами.

SP может использовать MP-BGP23 для автоматического обнаружения и сигнализации конечных точек туннелей PWE3 или VXLAN.

          Сайт A  |                          | Сайт B
 ---     ----     |        VXLAN/PW          |               ---
|   |   |    |    |<------------------------>|              |   |
| C +---+ CE |    |                          |              | C |
|   |   |    |    |         ---------        |              |   |
 ---     ----\    |        (         )       |              /---
              \  -|--     (           )     -|--     ----  /
               \|    |   (    Сеть     )   |    |   |    |/
                | PE +---+ IP/MPLS/SR  +---+ PE +---+ CE |
               /|    |   (             )   |    |   |    |\
              /  ----     (           )     ----     ----  \
 ---     ----/             (         )                      \---
|   |   |    |              ----+----                       |   |
| C +---+ CE |                  |                           | C |
|   |   |    |                --+--                         |   |
 ---     ----                | PE  |                         ---
                              --+--
                                |      Сайт C
                              --+--
                             | CE  |
                              --+--
                                |
                              --+--
                             |  C  |
                              -----

Рисунок 1. Эталонная сеть для использования L2SM.


Однако с точки зрения абонента все устройства CE будут соединены через имитируемую среду ЛВС, как показано на рисунке 2. Широковещательные и групповые пакеты передаются всем участникам одного домена мостов.

CE---+----+-----+---CE
     |    |     |
     |    |     |
     |    |     |
CE---+    CE    +---CE

Рисунок 2. L2VPN с точки зрения абонента.


4. Использование модели данных сервиса

L2SM обеспечивает абстрактный интерфейс для запроса, настройки и управления компонентами сервиса L2VPN. Модель применяется абонентами, приобретающими соединения и другие услуги у SP, для коммуникаций с этим SP.

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

Настройка конфигурации элементов сети может выполняться через командный интерфейс (CLI25) или иной интерфейс настройки (южную границу — southbound), такой как NETCONF [RFC6241] в комбинации с определяемой устройством и протоколом моделью YANG.

Этот способ использования модели сервиса показан на рисунке 3, а более подробное описание приведено в [RFC8309] и [RFC8199]. Разделение функций оркестровки на уровне сервиса (service orchestrator) и сети (network orchestrator) разъяснено в [RFC8309]. Применение этой модели сервиса не исчерпывается представленным примером, она может использоваться любым компонентом системы управления, но не напрямую элементами сети.

Применение и структуру этой модели следует сравнивать с сервисной моделью L3 VPN, определённой в [RFC8299].

В Metro Ethernet Forum (MEF) [MEF-6] также была разработана архитектура работы сети и сетевого управления, но работа MEF охватывает все аспекты оркестровки жизненного цикла сервиса, включая оплату (billing), соглашения об уровне обслуживания (SLA26), управление заказами и жизненным циклом сервиса. Работа IETF над моделью сервиса обычно более компактна и предлагает простой, самодостаточный модуль YANG. Подробности см. в [RFC8309].

    ---------------------------------
   | Запрашивающее сервис устройство |
    ---------------------------------
           |
           |
     L2SM  |
           |
           |
         -----------------------
        |  Оркестровка сервиса  |
         -----------------------
           |
           |     Модель              +-------------+
           |     доставки    +------>|  Приложение |
           |     сервиса     |       |   BSS/OSS   |
           |                 V       +-------------+
         -----------------------
        |   Оркестровка сети    |
         -----------------------
           |            |
   +----------------+   |
   |Менеджер конфиг.|   |
   +----------------+   |  Модели
           |            |  устройств
           |            |
--------------------------------------------
                   Сеть
                              +++++++
                              + AAA +
                              +++++++

      ++++++++   Опорное   ++++++++           ++++++++      ++++++++
      + CE A + ----------- + PE A +           + PE B + ---- + CE B +
      ++++++++  соединение ++++++++           ++++++++      ++++++++

                 Сайт A                               Сайт B

Рисунок 3. Эталонная архитектура для использования L2SM.


5. Устройство модели данных

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

Модуль YANG разделен на два основных контейнера — услуги VPN (vpn-services) и сайты (sites). Контейнер vpn-svc в иерархии vpn-services определяет глобальные параметры сервиса VPN для конкретного абонента.

Сайт имеет по меньше мере одно подключение к сети (т. е. доступ сайта в сеть обеспечивающий связь и другими сайтами, как указано в параграфе 5.3.2) и может иметь множество подключений в многодомном случае. Подключение сайта к сети выполняется через опорное соединение (носитель — bearer) на канальном уровне (L2). «Носитель» относится к свойствам ниже уровня L2, а «соединение» к протокольным свойствам L2. Соединение-носитель может динамически выделяться SP, а абонент может задавать некоторые ограничения для управления местом соединения.

Полномочия на обмен трафиком предоставляются на основе политики или топологии VPN, которая определяет правила обмена маршрутной информацией между сайтами.

Сквозные многосегментные соединения могут быть реализованы на основе комбинации связности на уровне сайтов и сегментов.

На рисунке 4 показана общая структура модуля YANG.

   module: ietf-l2vpn-svc
   +--rw l2vpn-svc
     +--rw vpn-profiles
     |  +--rw valid-provider-identifiers
     |     +--rw cloud-identifier*  string{cloud-access}?
     |     +--rw qos-profile-identifier* string
     |     +--rw bfd-profile-identifier* string
     |     +--rw remote-carrier-identifier* string
     +--rw vpn-services
     |  +--rw vpn-service* [vpn-id]
     |     +--rw vpn-id                      svc-id
     |     +--rw vpn-svc-type?               identityref
     |     +--rw customer-name?              string
     |     +--rw svc-topo?                   identityref
     |     +--rw cloud-accesses {cloud-access}?
     |     |  +--rw cloud-access* [cloud-identifier]
     |     |     +--rw cloud-identifier
     |     |     |    -> /l2vpn-svc/vpn-profiles/
     |     |     |      valid-provider-identifiers/cloud-identifier
     |     |     +--rw (list-flavor)?
     |     |        +--:(permit-any)
     |     |        |  +--rw permit-any?         empty
     |     |        +--:(deny-any-except)
     |     |        |  +--rw permit-site*
     |     |        |  :    -> /l2vpn-svc/sites/site/site-id
     |     |        +--:(permit-any-except)
     |     |           +--rw deny-site*
     |     |                -> /l2vpn-svc/sites/site/site-id
     |     +--rw frame-delivery {frame-delivery}?
     |     |  +--rw customer-tree-flavors
     |     |  |  +--rw tree-flavor*   identityref
     |     |  +--rw bum-frame-delivery
     |     |  |  +--rw bum-frame-delivery* [frame-type]
     |     |  |     +--rw frame-type       identityref
     |     |  |     +--rw delivery-mode?   identityref
     |     |  +--rw multicast-gp-port-mapping    identityref
     |     +--rw extranet-vpns {extranet-vpn}?
     |     |  +--rw extranet-vpn* [vpn-id]
     |     |     +--rw vpn-id              svc-id
     |     |     +--rw local-sites-role?   identityref
     |     +--rw ce-vlan-preservation        boolean
     |     +--rw ce-vlan-cos-preservation    boolean
     |     +--rw carrierscarrier?            boolean {carrierscarrier}?
     +--rw sites
       +--rw site* [site-id]
        +--rw site-id                                string
        +--rw site-vpn-flavor?                       identityref
        +--rw devices
        |  +--rw device* [device-id]
        |     +--rw device-id     string
        |     +--rw location
        |     |    -> ../../../locations/location/location-id
        |     +--rw management
        |        +--rw transport?   identityref
        |        +--rw address?     inet:ip-address
        +--rw management
        |  +--rw type    identityref
        +--rw locations
        |  +--rw location* [location-id]
        |     +--rw location-id     string
        |     +--rw address?        string
        |     +--rw postal-code?    string
        |     +--rw state?          string
        |     +--rw city?           string
        |     +--rw country-code?   string
        +--rw site-diversity {site-diversity}?
        |  +--rw groups
        |     +--rw group* [group-id]
        |        +--rw group-id    string
        +--rw vpn-policies
        |  +--rw vpn-policy* [vpn-policy-id]
        |     +--rw vpn-policy-id    string
        |     +--rw entries* [id]
        |        +--rw id         string
        |        +--rw filters
        |        |  +--rw filter* [type]
        |        |     +--rw type       identityref
        |        |     +--rw lan-tag*   uint32 {lan-tag}?
        |        +--rw vpn* [vpn-id]
        |           +--rw vpn-id
        |           |    -> /l2vpn-svc/vpn-services/
        |           |            vpn-service/vpn-id
        |           +--rw site-role?   identityref
        +--rw service
        |  +--rw qos {qos}?
        |  |  +--rw qos-classification-policy
        |  |  |  +--rw rule* [id]
        |  |  |     +--rw id                   string
        |  |  |     +--rw (match-type)?
        |  |  |     |  +--:(match-flow)
        |  |  |     |  |  +--rw match-flow
        |  |  |     |  |     +--rw dscp?           inet:dscp
        |  |  |     |  |     +--rw dot1q?          uint16
        |  |  |     |  |     +--rw pcp?            uint8
        |  |  |     |  |     +--rw src-mac?        yang:mac-address
        |  |  |     |  |     +--rw dst-mac?        yang:mac-address
        |  |  |     |  |     +--rw color-type?     identityref
        |  |  |     |  |     +--rw target-sites*
        |  |  |     |  |     |               svc-id {target-sites}?
        |  |  |     |  |     +--rw any?            empty
        |  |  |     |  |     +--rw vpn-id?         svc-id
        |  |  |     |  +--:(match-application)
        |  |  |     |     +--rw match-application?   identityref
        |  |  |     +--rw target-class-id?     string
        |  |  +--rw qos-profile
        |  |     +--rw (qos-profile)?
        |  |        +--:(standard)
        |  |        |  +--rw profile?
        |  |        |       -> /l2vpn-svc/vpn-profiles/
        |  |        |              valid-provider-identifiers/
        |  |        |              qos-profile-identifier
        |  |        +--:(custom)
        |  |           +--rw classes {qos-custom}?
        |  |              +--rw class* [class-id]
        |  |                 +--rw class-id        string
        |  |                 +--rw direction?      identityref
        |  |                 +--rw policing?       identityref
        |  |                 +--rw byte-offset?    uint16
        |  |                 +--rw frame-delay
        |  |                 |  +--rw (flavor)?
        |  |                 |     +--:(lowest)
        |  |                 |     |  +--rw use-lowest-latency? empty
        |  |                 |     +--:(boundary)
        |  |                 |        +--rw delay-bound?     uint16
        |  |                 +--rw frame-jitter
        |  |                 |  +--rw (flavor)?
        |  |                 |     +--:(lowest)
        |  |                 |     |  +--rw use-lowest-jitter? empty
        |  |                 |     +--:(boundary)
        |  |                 |        +--rw delay-bound?     uint32
        |  |                 +--rw frame-loss
        |  |                 |  +--rw rate?   decimal64
        |  |                 +--rw bandwidth
        |  |                    +--rw guaranteed-bw-percent decimal64
        |  |                    +--rw end-to-end?           empty
        |  +--rw carrierscarrier {carrierscarrier}?
        |     +--rw signaling-type?   identityref
        +--rw broadcast-unknown-unicast-multicast {bum}?
        |  +--rw multicast-site-type?            enumeration
        |  +--rw multicast-gp-address-mapping* [id]
        |  |  +--rw id                 uint16
        |  |  +--rw vlan-id            uint16
        |  |  +--rw mac-gp-address     yang:mac-address
        |  |  +--rw port-lag-number?   uint32
        |  +--rw bum-overall-rate?     uint32
        |  +--rw bum-rate-per-type* [type]
        |     +--rw type    identityref
        |     +--rw rate?   uint32
        +--rw mac-loop-prevention {mac-loop-prevention}?
        |  +--rw protection-type?   identityref
        |  +--rw frequency?         uint32
        |  +--rw retry-timer?       uint32
        +--rw access-control-list
        |  +--rw mac* [mac-address]
        |     +--rw mac-address    yang:mac-address
        +--ro actual-site-start?   yang:date-and-time
        +--ro actual-site-stop?    yang:date-and-time
        +--rw bundling-type?       identityref
        +--rw default-ce-vlan-id   uint32
        +--rw site-network-accesses
           +--rw site-network-access* [network-access-id]
           +--rw network-access-id                 string
           +--rw remote-carrier-name?              string
           +--rw type?                             identityref
           +--rw (location-flavor)
           |  +--:(location)
           |  |  +--rw location-reference?
           |  |       -> ../../../locations/location/
           |  |               location-id
           |  +--:(device)
           |     +--rw device-reference?
           |          -> ../../../devices/device/device-id
           +--rw access-diversity {site-diversity}?
           |  +--rw groups
           |  |  +--rw group* [group-id]
           |  |     +--rw group-id    string
           |  +--rw constraints
           |     +--rw constraint* [constraint-type]
           |        +--rw constraint-type    identityref
           |        +--rw target
           |           +--rw (target-flavor)?
           |              +--:(id)
           |              |  +--rw group* [group-id]
           |              |     +--rw group-id    string
           |              +--:(all-accesses)
           |              |  +--rw all-other-accesses?   empty
           |              +--:(all-groups)
           |                 +--rw all-other-groups?     empty
           +--rw bearer
           |  +--rw requested-type {requested-type}?
           |  |  +--rw type?     string
           |  |  +--rw strict?   boolean
           |  +--rw always-on?         boolean {always-on}?
           |  +--rw bearer-reference?  string {bearer-reference}?
           +--rw connection
           |  +--rw encapsulation-type?    identityref
           |  +--rw eth-inf-type?          identityref
           |  +--rw tagged-interface
           |  |  +--rw type?               identityref
           |  |  +--rw dot1q-vlan-tagged {dot1q}?
           |  |  |  +--rw tg-type?    identityref
           |  |  |  +--rw cvlan-id    uint16
           |  |  +--rw priority-tagged
           |  |  |  +--rw tag-type?   identityref
           |  |  +--rw qinq {qinq}?
           |  |  |  +--rw tag-type?   identityref
           |  |  |  +--rw svlan-id    uint16
           |  |  |  +--rw cvlan-id    uint16
           |  |  +--rw qinany {qinany}?
           |  |  |  +--rw tag-type?   identityref
           |  |  |  +--rw svlan-id    uint16
           |  |  +--rw vxlan {vxlan}?
           |  |     +--rw vni-id       uint32
           |  |     +--rw peer-mode?   identityref
           |  |     +--rw peer-list* [peer-ip]
           |  |        +--rw peer-ip    inet:ip-address
           |  +--rw untagged-interface
           |  |  +--rw speed?                 uint32
           |  |  +--rw mode?                  neg-mode
           |  |  +--rw phy-mtu?               uint32
           |  |  +--rw lldp?                  boolean
           |  |  +--rw oam-802.3ah-link {oam-3ah}?
           |  |  |  +--rw enabled?   boolean
           |  |  +--rw uni-loop-prevention?   boolean
           |  +--rw lag-interfaces {lag-interface}?
           |  |  +--rw lag-interface* [index]
           |  |     +--rw index    string
           |  |     +--rw lacp {lacp}?
           |  |        +--rw enabled?           boolean
           |  |        +--rw mode?              neg-mode
           |  |        +--rw speed?             uint32
           |  |        +--rw mini-link-num?     uint32
           |  |        +--rw system-priority?   uint16
           |  |        +--rw micro-bfd {micro-bfd}?
           |  |        |  +--rw enabled?      enumeration
           |  |        |  +--rw interval?     uint32
           |  |        |  +--rw hold-timer?   uint32
           |  |        +--rw bfd {bfd}?
           |  |        |  +--rw enabled?      boolean
           |  |        |  +--rw (holdtime)?
           |  |        |     +--:(profile)
           |  |        |     |  +--rw profile-name?
           |  |        |     |    -> /l2vpn-svc/
           |  |        |     |         vpn-profiles/
           |  |        |     |        valid-provider-identifiers/
           |  |        |     |       bfd-profile-identifier
           |  |        |     +--:(fixed)
           |  |        |        +--rw fixed-value?    uint32
           |  |        +--rw member-links
           |  |        |  +--rw member-link* [name]
           |  |        |     +--rw name                string
           |  |        |     +--rw speed?              uint32
           |  |        |     +--rw mode?               neg-mode
           |  |        |     +--rw link-mtu?           uint32
           |  |        |     +--rw oam-802.3ah-link {oam-3ah}?
           |  |        |        +--rw enabled?  boolean
           |  |        +--rw flow-control?      boolean
           |  |        +--rw lldp?              boolean
           |  +--rw cvlan-id-to-svc-map* [svc-id]
           |  |  +--rw svc-id
           |  |  |    -> /l2vpn-svc/vpn-services/vpn-service/
           |  |  |           vpn-id
           |  |  +--rw cvlan-id* [vid]
           |  |     +--rw vid    uint16
           |  +--rw l2cp-control {l2cp-control}?
           |  |  +--rw stp-rstp-mstp?    control-mode
           |  |  +--rw pause?            control-mode
           |  |  +--rw lacp-lamp?        control-mode
           |  |  +--rw link-oam?         control-mode
           |  |  +--rw esmc?             control-mode
           |  |  +--rw l2cp-802.1x?      control-mode
           |  |  +--rw e-lmi?            control-mode
           |  |  +--rw lldp?             boolean
           |  |  +--rw ptp-peer-delay?   control-mode
           |  |  +--rw garp-mrp?         control-mode
           |  +--rw oam {oam}
           |     +--rw md-name         string
           |     +--rw md-level        uint16
           |     +--rw cfm-802.1-ag* [maid]
           |     |  +--rw maid                     string
           |     |  +--rw mep-id?                  uint32
           |     |  +--rw mep-level?               uint32
           |     |  +--rw mep-up-down?             enumeration
           |     |  +--rw remote-mep-id?           uint32
           |     |  +--rw cos-for-cfm-pdus?        uint32
           |     |  +--rw ccm-interval?            uint32
           |     |  +--rw ccm-holdtime?            uint32
           |     |  +--rw alarm-priority-defect?   identityref
           |     |  +--rw ccm-p-bits-pri?       ccm-priority-type
           |     +--rw y-1731* [maid]
           |        +--rw maid                           string
           |        +--rw mep-id?                        uint32
           |        +--rw type?                       identityref
           |        +--rw remote-mep-id?                 uint32
           |        +--rw message-period?                uint32
           |        +--rw measurement-interval?          uint32
           |        +--rw cos?                           uint32
           |        +--rw loss-measurement?              boolean
           |        +--rw synthetic-loss-measurement?    boolean
           |        +--rw delay-measurement
           |        |  +--rw enable-dm?   boolean
           |        |  +--rw two-way?     boolean
           |        +--rw frame-size?                    uint32
           |        +--rw session-type?               enumeration
           +--rw availability
           |  +--rw access-priority?   uint32
           |  +--rw (redundancy-mode)?
           |     +--:(single-active)
           |     |  +--rw single-active?     empty
           |     +--:(all-active)
           |        +--rw all-active?        empty
           +--rw vpn-attachment
           |  +--rw (attachment-flavor)
           |     +--:(vpn-id)
           |     |  +--rw vpn-id?
           |     |  |    -> /l2vpn-svc/vpn-services/
           |     |  |            vpn-service/vpn-id
           |     |  +--rw site-role?              identityref
           |     +--:(vpn-policy-id)
           |        +--rw vpn-policy-id?
           |             -> ../../../../vpn-policies/
           |                     vpn-policy/vpn-policy-id
           +--rw service
           |  +--rw svc-bandwidth {input-bw}?
           |  |  +--rw bandwidth* [direction type]
           |  |     +--rw direction    identityref
           |  |     +--rw type         identityref
           |  |     +--rw cos-id?      uint8
           |  |     +--rw vpn-id?      svc-id
           |  |     +--rw cir          uint64
           |  |     +--rw cbs          uint64
           |  |     +--rw eir?         uint64
           |  |     +--rw ebs?         uint64
           |  |     +--rw pir?         uint64
           |  |     +--rw pbs?         uint64
           |  +--rw svc-mtu            uint16
           |  +--rw qos {qos}?
           |  |  +--rw qos-classification-policy
           |  |  |  +--rw rule* [id]
           |  |  |     +--rw id                   string
           |  |  |     +--rw (match-type)?
           |  |  |     |  +--:(match-flow)
           |  |  |     |  |  +--rw match-flow
           |  |  |     |  |     +--rw dscp?           inet:dscp
           |  |  |     |  |     +--rw dot1q?          uint16
           |  |  |     |  |     +--rw pcp?            uint8
           |  |  |     |  |     +--rw src-mac?  yang:mac-address
           |  |  |     |  |     +--rw dst-mac?  yang:mac-address
           |  |  |     |  |     +--rw color-type?     identityref
           |  |  |     |  |     +--rw target-sites*
           |  |  |     |  |     |          svc-id {target-sites}?
           |  |  |     |  |     +--rw any?            empty
           |  |  |     |  |     +--rw vpn-id?         svc-id
           |  |  |     |  +--:(match-application)
           |  |  |     |     +--rw match-application? identityref
           |  |  |     +--rw target-class-id?     string
           |  |  +--rw qos-profile
           |  |     +--rw (qos-profile)?
           |  |        +--:(standard)
           |  |        |  +--rw profile?
           |  |        |       -> /l2vpn-svc/vpn-profiles/
           |  |        |              valid-provider-identifiers/
           |  |        |              qos-profile-identifier
           |  |        +--:(custom)
           |  |           +--rw classes {qos-custom}?
           |  |              +--rw class* [class-id]
           |  |                 +--rw class-id        string
           |  |                 +--rw direction?      identityref
           |  |                 +--rw policing?       identityref
           |  |                 +--rw byte-offset?    uint16
           |  |                 +--rw frame-delay
           |  |                 |  +--rw (flavor)?
           |  |                 |     +--:(lowest)
           |  |                 |     |  +--rw use-lowest-latency?
           |  |                 |     |                     empty
           |  |                 |     +--:(boundary)
           |  |                 |        +--rw delay-bound? uint16
           |  |                 +--rw frame-jitter
           |  |                 |  +--rw (flavor)?
           |  |                 |     +--:(lowest)
           |  |                 |     |  +--rw use-lowest-jitter?
           |  |                 |     |                     empty
           |  |                 |     +--:(boundary)
           |  |                 |        +--rw delay-bound? uint32
           |  |                 +--rw frame-loss
           |  |                 |  +--rw rate?   decimal64
           |  |                 +--rw bandwidth
           |  |                    +--rw guaranteed-bw-percent
           |  |                    |                    decimal64
           |  |                    +--rw end-to-end?       empty
           |  +--rw carrierscarrier {carrierscarrier}?
           |     +--rw signaling-type?   identityref
           +--rw broadcast-unknown-unicast-multicast {bum}?
           |  +--rw multicast-site-type?            enumeration
           |  +--rw multicast-gp-address-mapping* [id]
           |  |  +--rw id                 uint16
           |  |  +--rw vlan-id            uint16
           |  |  +--rw mac-gp-address     yang:mac-address
           |  |  +--rw port-lag-number?   uint32
           |  +--rw bum-overall-rate?               uint32
           |  +--rw bum-rate-per-type* [type]
           |     +--rw type    identityref
           |     +--rw rate?   uint32
           +--rw mac-loop-prevention {mac-loop-prevention}?
           |  +--rw protection-type?   identityref
           |  +--rw frequency?         uint32
           |  +--rw retry-timer?       uint32
           +--rw access-control-list
           |  +--rw mac* [mac-address]
           |     +--rw mac-address    yang:mac-address
           +--rw mac-addr-limit
           +--rw limit-number?    uint16
           +--rw time-interval?   uint32
           +--rw action?          identityref

Рисунок 4. Общая структура модуля YANG.

5.1. Свойства и их дополнение

Определённая в этом документе модель включает множество функций, которые обеспечивают возможность модульной реализации. Например, параметры L2 (параграф 5.3.2.2), предлагаемые абоненту, могут включаться и выключаться с помощью функций (возможностей). Модель также определяет некоторые возможности для расширенных опций, таких как поддержка Extranet VPN (параграф 5.2.4), разнородность сайтов (параграф 5.3) и QoS (параграф 5.10.2).

Как и многие другие модели YANG, данная модель может быть дополнена для реализации новых вариантов поведения или специальных возможностей. Например, эта модель определяет VXLAN [RFC7348] для инкапсуляции пакетов Ethernet и если инкапсуляция VXLAN не совсем удовлетворяет требования сервиса, можно реализовать новые опции путём дополнения.

5.2. Обзор сервиса VPN

Элемент списка vpn-service содержит базовую информацию о сервисе VPN. Элемент vpn-id в списке vpn-service задаёт внутреннюю ссылку для данного сервиса VPN. Этот идентификатор является внутренним для организации, отвечающей за поддержку сервиса VPN.

Список vpn-service содержит перечисленные ниже характеристики.

Информация абонента (customer-name)

Служит для идентификации абонента (заказчика).

Тип сервиса VPN (vpn-svc-type)

Служит для указания типа сервиса VPN. Идентификатор допускает произвольное кодирование для локального администрирования услуг VPN. Отметим, что для расширения базового идентификатора может применяться дополнительный.

Доступ в облако (cloud-access)

Всем сайтам в L2VPN следует по умолчанию предоставлять доступ в облако. Контейнер cloud-access содержит правила предоставления полномочий. Для идентификации целевого сервиса служит указатель облака. Идентификатор является локальным для каждого домена администрирования.

Топология сервиса (svc-topo)

Служит для указания требуемой топологии сервиса VPN.

Служба доставки кадров (frame-delivery)

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

Extranet VPN (extranet-vpns)

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

5.2.1. Тип сервиса VPN

Параметр vpn-svc-type определяет тип сервиса для предоставляемых провайдером услуг L2VPN. Текущая версия модели поддерживает шесть вариантов:

  • VPWS «точка-точка» для соединения двух сайтов абонента;

  • VPWS «точка-точка» или «точка-многоточка» для соединения множества сайтов абонента [RFC8214];

  • многоточечные VPLS для соединения множества сайтов абонента;

  • многоточечные VPLS для соединения одного или множества корневых сайтов с набором отделений (leaf site), но без связи между этими отделениями;

  • EVPN [RFC7432] для соединения множества сайтов абонента;

  • EVPN VPWS между двумя или множеством сайтов абонента, как указано в [RFC8214].

Другие типы сервиса L2VPN могут включаться через дополнения. Отметим, что сервис EPL27 или EVPL28 относится к типу E-Line29 [MEF-6] или EVC30, а сервис EP-LAN31 или EVP-LAN32 — к типу E-LAN33 [MEF-6] или многоточечному EVC.

5.2.2. Топология сервиса VPN

Рассматриваемые здесь типы топологии сервиса VPN могут при необходимости использоваться для настройки конфигурации. Описанный в документе модуль поддерживает полносвязные соединения (any-to-any), звезду (Hub-and-Spoke, где концентраторы могут обмениваться трафиком) и Hub-and-Spoke Disjoint (концентраторы не могут обмениваться трафиком). Новые варианты топологии могут быть реализованы в дополнениях. По умолчанию применяется топология any-to-any.

5.2.2.1. Выделение RT

Основанные на PE услуги L2 VPN (такие как VPLS и EVPN с применением BGP в качестве сигнального протокола) могут строиться с использованием целей маршрутов (RT34), как описано в [RFC4364] и [RFC7432]. Предполагается, что система управления автоматически выделяет набор RT при получении запроса на организацию сервиса VPN. Способ выделения RT системой управления выходит за рамки документа, но можно предусмотреть несколько вариантов, как описано в параграфе 6.2.1.1 [RFC8299].

5.2.2.2. Каждый с каждым (Any-to-Any)
+--------------------------------------------------------------+
|  VPN1_Site 1 ------ PE1               PE2 ------ VPN1_Site 2 |
|                                                              |
|  VPN1_Site 3 ------ PE3               PE4 ------ VPN1_Site 4 |
+--------------------------------------------------------------+

Рисунок 5. Топология сервиса Any-to-Any VPN.


В топологии сервиса VPN «any-to-any » все сайты VPN могут взаимодействовать между собой без ограничений. В этой модели предполагается, что система управления, получающая запрос на организацию сервиса any-to-any L2VPN, назначит, а затем настроит MAC-VRF и RT на соответствующих устройствах PE. Для полносвязной топологии в общем случае требуется одно значение RT и каждая таблица MAC-VRF импортирует и экспортирует это значение RT.

5.2.2.3. Концентратор и лучи (Hub-and-Spoke)
+---------------------------------------------------------------+
|   Hub_Site 1 ------ PE1               PE2 ------ Spoke_Site 1 |
|                          +------------------------------------+
|                          |
|                          +------------------------------------+
|   Hub_Site 2 ------ PE3               PE4 ------ Spoke_Site 2 |
+---------------------------------------------------------------+

Рисунок 6. Топология сервиса Hub-and-Spoke VPN.


В топологии сервиса VPN Hub-and-Spoke

  • все сайты-лучи (Spoke) могут взаимодействовать только с сайтами-концентраторами (Hub), т. е. лучи не могут взаимодействовать между собой;

  • концентраторы могут взаимодействовать между собой.

В этой модели предполагается, что система управления, получившая запрос на организацию сервиса Hub-and-Spoke L2VPN, назначит, а затем настроит MAC-VRF и RT на соответствующих устройствах PE. Для Hub-and-Spoke обычно нужны два значения RT (одно для Hub-маршрутов, другое для Spoke). Таблица Hub MAC-VRF, подключающая Hub-сайты, будет экспортировать Hub-маршруты с Hub RT и импортировать Spoke-маршруты через Spoke RT. Будут также импортироваться Hub RT для поддержки коммуникаций между Hub-сайтами. Таблица Spoke MAC-VRF, подключающая Spoke-сайты, будет экспортировать Spoke-маршруты со Spoke RT и импортировать Hub-маршруты через Hub RT.

5.2.2.4. Hub-and-Spoke Disjoint
+---------------------------------------------------------------+
|   Hub_Site 1 ------ PE1               PE2 ------ Spoke_Site 1 |
+--------------------------+  +---------------------------------+
                           |  |
+--------------------------+  +---------------------------------+
|   Hub_Site 2 ------ PE3               PE4 ------ Spoke_Site 2 |
+---------------------------------------------------------------+

Рисунок 7. Топология сервиса Hub-and-Spoke-Disjoint VPN.


В топологии сервиса VPN Hub-and-Spoke-Disjoint

  • все сайты-лучи (Spoke) могут взаимодействовать только с сайтами-концентраторами (Hub), т. е. лучи не могут взаимодействовать между собой;

  • концентраторы не могут взаимодействовать между собой.

В этой модели предполагается, что система управления, получившая запрос на организацию сервиса Hub-and-Spoke-Disjoint L2VPN назначит, а затем настроит VRF и RT для соответствующих устройств PE. В случае Hub-and-Spoke-Disjoint требуется по меньшей мере два значения RT (хотя бы одно для Hub-маршрутов и хотя бы одно для Spoke). Таблица Hub VRF, подключающая сайты Hub, будет экспортировать Hub-маршруты с RT и импортировать Spoke-маршруты через Spoke RT. Таблица Spoke VRF, подключающая сайты Spoke, будет экспортировать Spoke-маршруты со Spoke RT и импортировать Hub-маршруты через Hub RT.

Система управления должна учитывать ограничения для соединений Hub-and-Spoke как в предыдущем случае.

Топологию Hub-and-Spoke Disjoint можно рассматривать как множество Hub-and-Spoke VPN (одна сеть на Hub), использующих общий набор сайтов Spoke.

5.2.3. Доступ к облаку

Эта модель предполагает настройку доступа к облаку через контейнер cloud-access. Использование контейнера cloud-access нацелено на доступ к облачным службам общего пользования и в Internet. Контейнер cloud-access обеспечивает параметры правил предоставления полномочий. Отметим, что в этой модели предполагается некая общность доступа к облакам общего пользования и сети Internet, поэтому такие варианты доступа не различаются. При необходимости для доступа в Internet можно добавить отдельную метку путём дополнения.

Доступ к частным облакам можно организовать через контейнер site, как описано в параграфе 5.3, с использованием совместимого с сайтом типа интерфейса NNI.

Идентификатор облака служит для указания целевого сервиса. Этот идентификатор является локальным для административного домена.

По умолчанию всем сайтам в L2VPN следует разрешать доступ в облако или Internet. Если требуются ограничения, пользователь может настроить некоторые ограничения для отдельных сайтов или узлов с помощью правил, т. е. листа-списка permit-site или deny-site. Лист-список permit-site определяет список сайтов, имеющих полномочия для доступа к облаку, deny-site определяет сайты, которым доступ запрещён. Модель поддерживает варианты deny-any-except (запрет всем кроме …) и permit-any-except (разрешить всем кроме …).

Настройка ограничений в сетевых элементах выходит за рамки документа.

          L2VPN
++++++++++++++++++++++++++++++++     ++++++++++++
+            Сайт 3            + --- + Облако 1 +
+ Сайт 1                       +     ++++++++++++
+                              +
+ Сайт 2                       + --- ++++++++++++
+                              +     + Internet +
+            Сайт 4            +     ++++++++++++
++++++++++++++++++++++++++++++++
             |
        ++++++++++++
        + Облако 2 +
        ++++++++++++

Рисунок 8. Пример конфигурации доступа в облако.


На рисунке 8 показан пример VPN с глобальным доступом в Internet путём создания контейнера cloud-access, указывающего идентификатор контейнера для доступа в Internet (см. приведённый ниже код XML [W3C.REC-xml-20081126]). Уполномоченных сайтов не задано, поскольку доступ в Internet нужен для всех сайтов.

    <?xml version="1.0"?>
       <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
       <vpn-services>
       <vpn-service>
       <vpn-id>123456487</vpn-id>
      <cloud-accesses>
       <cloud-access>
          <cloud-identifier>INTERNET</cloud-identifier>
       </cloud-access>
      </cloud-accesses>
      <ce-vlan-preservation>true</ce-vlan-preservation>
      <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
      </vpn-service>
      </vpn-services>
    </l2vpn-svc>

Если Сайтам 1 и 2 нужно доступ в Облако 1, создаётся новый контейнер cloud-access с идентификатором Облака 1. Лист-список permit-site в нем указывает Сайты 1 и 2.

    <?xml version="1.0"?>
       <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
        <vpn-services>
         <vpn-service>
         <vpn-id>123456487</vpn-id>
         <cloud-accesses>
          <cloud-access>
            <cloud-identifier>Cloud1</cloud-identifier>
            <permit-site>site1</permit-site>
            <permit-site>site2</permit-site>
          </cloud-access>
         </cloud-accesses>
        <ce-vlan-preservation>true</ce-vlan-preservation>
        <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
       </vpn-service>
       </vpn-services>
    </l2vpn-svc>

Если всем сайтам кроме Сайта 1 нужен доступ в Облако 2, создаётся контейнер cloud-access с идентификатором Облака 2, в котором лист-список deny-site указывает Сайт 1.

    <?xml version="1.0"?>
      <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
        <vpn-services>
         <vpn-service>
           <vpn-id>123456487</vpn-id>
            <cloud-accesses>
             <cloud-access>
              <cloud-identifier>Cloud2</cloud-identifier>
              <deny-site>site1</deny-site>
            </cloud-access>
           </cloud-accesses>
          <ce-vlan-preservation>true</ce-vlan-preservation>
          <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
        </vpn-service>
      </vpn-services>
    </l2vpn-svc>

5.2.4. Сети Extranet VPN

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

            +-----------+           +-----------+
           /             \         /             \
Сайт A -- |    VPN A      |  ---  |    VPN B      | --- Сайт B
           \             /         \             /      (общие
            +-----------+           +-----------+        ресурсы)

Рисунок 9. Пример общего ресурса VPN.


Как показано на рисунке 9, VPN B имеет на Сайте B отдельные ресурсы, которые должны быть доступны некоторым абонентам/партнёрам. В частности, для VPN A должен обеспечиваться доступ к этим ресурсам VPN B.

Такие варианты связи между VPN могут быть реализованы на основе политики VPN, как описано в параграфе 5.5.2.2. Однако в некоторых простых случаях отдельной сети VPN (VPN A) нужен доступ ко всем ресурсам другой VPN (VPN B). Модель обеспечивает простой способ такого соединения за счёт использования контейнера extranet-vpns.

Контейнер extranet-vpns определяет список VPN, к которым заданная сеть VPN хочет получить доступ. Контейнеры extranet-vpns используются в абонентских VPN, требующих доступа к ресурсам других VPN. На рисунке 9 для предоставления VPN A доступа в VPN B нужно настроить контейнер extranet-vpns для VPN A с записью, соответствующей VPN B. Настроек сервиса для VPN B не требуется.

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

Лист site-role указывает роль локальных сайтов VPN в топологии сервиса extranet VPN. Определения ролей приведены в параграфе 5.4.

В приведённом ниже примере VPN A обращается к ресурсам VPN B через соединение extranet. Для сайтов VPN A нужна роль Spoke, поскольку этим сайтам не разрешается взаимодействовать между собой через соединение extranet.

     <?xml version="1.0"?>
       <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
        <vpn-services>
          <vpn-service>
            <vpn-id>VPNB</vpn-id>
              <svc-topo>hub-spoke</svc-topo>
             <ce-vlan-preservation>true</ce-vlan-preservation>
             <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
          </vpn-service>
          <vpn-service>
             <vpn-id>VPNA</vpn-id>
               <svc-topo>any-to-any</svc-topo>
                  <extranet-vpns>
                    <extranet-vpn>
                     <vpn-id>VPNB</vpn-id>
                     <local-sites-role>spoke-role</local-sites-role>
                   </extranet-vpn>
                 </extranet-vpns>
             <ce-vlan-preservation>true</ce-vlan-preservation>
             <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
         </vpn-service>
       </vpn-services>
      </l2vpn-svc>

Эта модель не определяет способов создания конфигурации extranet в сети.

В любом более сложном варианте соединений между VPN (например, доступ лишь некоторых сайтов VPN A только к некоторой части сайтов VPN B) требуется присоединение VPN, описанное в параграфе 5.5.2, и, в частности, политика VPN, описанная в параграфе 5.5.2.2.

5.2.5. Услуги доставки кадров

Если для L2VPN поддерживается доставка индивидуальных кадров с неизвестными адресами, а также групповых и широковещательных кадров (BUM), при запросе сервиса потребуется указать некоторые глобальные параметры доставки кадров. Когда CE передаёт пакеты BUM, на входном PE выполняется репликация и необходимо поддерживать три типа кадров.

Пользователи этой модели должны обеспечить варианты деревьев, которые будут применяться абонентами в L2VPN (customer-tree-flavors). Определённая в документе модель поддерживает двунаправленные (bidirectional), совместно используемые (shared) и основанные на источнике (source-based) деревья, а с помощью дополнений могут поддерживаться другие типы. Одновременно может использоваться множество типов деревьев.

                          Сеть оператора
                          ______________
                         /              \
                        |                |
                        |                |
Recv -- Сайт 2 ------- PE2               |
                        |               PE1 --- Сайт 1 --- Источник 1
                        |                |        \
                        |                |         -- Источник 2
                        |                |
                        |                |
Recv -- Сайт 3 ------- PE3               |
                        |                |
                        |                |
Recv -- Сайт 4 ------- PE4               |
                      / |                |
Recv -- Сайт 5 -------  |                |
                        |                |
                        |                |
                         \______________/

Рисунок 10. Пример услуг доставки кадров BUM.


Отображения multicast-групп на порты могут быть созданы с использованием листа rp-group-mappings. Поддерживается два метода отображения:

  • статическая настройка групповых адресов Ethernet и портов (интерфейсов);

  • протокол управления групповой адресацией на основе технологии L2, обеспечивающей сигнализацию сопоставления групповых адресов с портами (интерфейсами), такой как GARP35/GMRP36 [IEEE-802-1D].

5.3. Обзор сайтов

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

                                               +-------------+
                                              /               \
                                       +-----|      VPN1       |
+------------------+                   |      \               /
|                  |                   |       +-------------+
| Офис в Нью-Йорке |------ (сайт) -----+
|                  |                   |       +-------------+
+------------------+                   |      /               \
                                       +-----|      VPN2       |
                                              \               /
                                               +-------------+

Рисунок 11. Офис абонента с двумя услугами VPN.


Провайдер использует контейнер site для хранения информации с подробным описанием соглашений с абонентом или операторами-партнерами для каждой точки присоединения (interconnect location).

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

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

Уникальный идентификатор (site-id)

Произвольная строка, однозначно указывающая сайт в общей сетевой инфраструктуре. Формат site-id определяется локальным администратором сервиса VPN.

Устройство (device)

Абонент может запросить подключение одного или множества устройств CPE к SP для отдельного сайта.

Управление (management)

Определяет модель управления для сайта. Например, тип, транспорт системы управления, адрес. Эти параметры задают границу между SP и абонентом, т. е. владение устройством CE.

Местоположение (location)

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

Отличия сайта (site-diversity)

Представляет те или иные параметры для поддержки разнообразных сайтов.

Доступ сайта к сети (site-network-accesses)

Указывает список портов для сайта и их свойства, в частности параметры носителя (bearer), соединения и сервиса.

Объект site-network-access представляет логическое соединение Ethernet для сайта. Сайт может иметь множество site-network-access.

+------------------+             Сайт
|                  |-------------------------------------
|                  |****** (site-network-access#1) ******
| Офис в Нью-Йорке |
|                  |****** (site-network-access#2) ******
|                  |-------------------------------------
+------------------+

Рисунок 12. Два объекта Site-Network-Access для сайта.


Множество site-network-access используется, например, при многодомных подключениях и в некоторых других случаях.

Конфигурация сайта представляется глобальным элементом, предполагается, что роль системы управления заключается в разделении параметров между разными элементами внутри сети. Например, в случае конфигурации site-network-access система управления должна разделить параметры конфигурации между устройствами PE и CE.

Сайт может иметь однодомное или многодомное подключение. Во втором случае сайт может поддерживать множество site-network-access, в каждом из которых определяется элемент vpn-attachment (подключение к VPN), связывающий site-network-access с данным сайтом, а также указывающий сеть VPN, к которой сайт будет подключён.

5.3.1. Устройства и площадки

Информация в субконтейнере location контейнера site и в контейнере devices позволяет легко отыскать данные о ближайших доступных точках подключения и может применяться для планирования топологии доступа. Она может также использоваться другими компонентами оркестровки сети для выбора восходящего PE и нисходящего CE. Местоположение указывается в терминах почтовой адресации. Более подробные сведения о месте расположения можно указать с помощью дополнений.

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

  Сайт в Нью-Йорке
+------------------+             Сайт
| +--------------+ |-------------------------------------
| | Манхэттен    | |****** (site-network-access#1) ******
| +--------------+ |
| +--------------+ |
| | Бруклин      | |****** (site-network-access#2) ******
| +--------------+ |-------------------------------------
+------------------+

Рисунок 13. Два сайта, два Site-Network-Access.


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

Используя контейнеры devices и locations, абонент может влиять на организацию многодомного подключения — одно устройство CE, два CE и т. д.

5.3.2. Доступ сайта в сеть

L2SM включает важный набор свойств физических интерфейсов и характеристик уровня Ethernet в контейнере site-network-accesses. Некоторые из них являются важными параметрами реализации, которые должны быть согласованы между абонентом и провайдером.

Как отмечено выше, сайт может быть многодомным. Каждое логическое подключение для сайта определяется контейнером site-network-accesses. Параметр site-network-access определяет способ подключения сайта к сети и включает три основных класса параметров:

  • bearer определяет требования к подключению (ниже уровня L2);

  • connection определяет параметры L2 для подключения;

  • availability определяет политику доступности сайта в соответствии с определениями параграфа 5.8.

Параметр site-network-access имеет конкретный тип. Данный документ определяет 2 типа:

  • point-to-point — соединение типа «точка-точка» между SP и абонентом;

  • multipoint — многоточечное соединение между SP и абонентом.

Тип site-network-access может влиять на параметры, предлагаемые абоненту. Например, SP может не предлагать предоставление защиты от петель MAC при многоточечном доступе. Провайдер сам принимает решение о поддерживаемых параметрах доступа для point-to-point и/или multipoint. Многоточечный доступ выходит за рамки документа. Некоторые контейнеры, определённые в этой модели, могут потребовать расширения для корректной работы при многоточечном доступе.

5.3.2.1. Контейнер bearer

Контейнер bearer определяет требования для подключения сайта (ниже уровня L2) к сети провайдера.

Параметры bearer помогают определить тип используемой для доступа среды передачи.

5.3.2.2. Контейнер connection

Контейнер connection определяет протокольные параметры L2 для подключения (например, vlan-id или circuit-id) и обеспечивают связность между абонентскими коммутаторами Ethernet. В зависимости от режима управления они относятся к адресации сегмента «PE-CE-ЛВС» или «CE-ЛВС абонента». В любом случае они описывают границу разделения ответственности между абонентом и провайдером. Для управляемого абонентом сайта параметры относятся к сегменту соединения «PE-CE-ЛВС», а для управляемого провайдером — к сегменту «CE-ЛВС абонента».

Параметр encapsulation-type позволяет абоненту выбрать инкапсуляцию Ethernet (доступ по портам) или Ethernet VLAN (доступ по VLAN). Все разрешённые типом интерфейса Ethernet (например, с тегами, без тегов, LAG) сервисные кадры могут быть указаны в ether-inf-type.

В соответствии с ether-inf-type контейнер connection представляет также три набора атрибутов канала для интерфейсов с тегами и без тегов, а также необязательного интерфейса LAG. Эти параметры важны для корректной организации соединения между устройствами CE и PE. Контейнер connection определяет также атрибут L2CP37, обеспечивающий протокольное взаимодействие на уровне управления между устройствами CE и PE.

5.3.2.2.1. Интерфейс без тегов

Для каждого интерфейса без тегов (untagged-interface) имеются базовые параметры, такие как индекс и скорость, MTU, настройки автосогласования и управления потоком данных и т. п. В дополнение к этому на основе взаимного соглашения между абонентом и провайдером могут указываться дополнительные возможности — LLDP, IEEE 802.3ah [IEEE-802-3ah] или обнаружение/предотвращение петель MAC на интерфейсе UNI. Если требуется предотвращение петель, для атрибута uni-loop-prevention должно быть установлено значение true.

5.3.2.2.2. Интерфейс с тегами

Если на логическом модуле соединения для интерфейса включены услуги с тегами, в качестве encapsulation-type следует указывать инкапсуляцию Ethernet VLAN (при работе на основе VLAN) или VXLAN, а также следует установить в eth-inf-type индикацию использования тегов.

В дополнение к этому следует указать tagged-interface-type в контейнере tagged-interface для задания режима использования тегов. Текущая модель определяет пять режимов установки тегов VLAN:

  • priority-tagged — SP инкапсулируют и помечают пакеты между CE и PE уровнем приоритета для кадра;

  • dot1q-vlan-tagged — SP инкапсулируют пакеты между CE и PE с одним или множеством абонентских идентификаторов VLAN (CVLAN38);

  • qinq — SP инкапсулируют пакеты на входе в свои сети с множеством идентификаторов CVLAN и одним тегом SP VLAN (SVLAN);

  • qinany — SP инкапсулируют пакеты на входе в свои сети с неизвестными CVLAN и одним тегом SVLAN;

  • vxlan — SP инкапсулирует пакеты на входе в свои сети и идентификатором VNI39 и списком партнёров.

Общий S-tag для устройства Ethernet и (если применимо) отображение C-tag на SVC40 помещаются в контейнер service. Для вариантов qinq и qinany значению S-tag в qinq и qinany в большинстве случаев следует соответствовать значению S-tag в контейнере service, однако в некоторых системах требуется трансляция VLAN для S-tag на обращённом наружу интерфейсе или восходящих PE для «нормализации» внешнего тега VLAN в S-tag сервиса на входе в сеть и обратной трансляции в S-tag при выходе из сети. Одним из примеров является агрегирующий коммутатор L2 на пути — S-tag для SVC ранее был назначен другому сервису и не может использоваться этим AC.

5.3.2.2.3. Интерфейс LAG

Иногда абонентам может потребоваться сборка множества физических каналов в одно логическое соединение LAG (точка-точка) с SP. Обычно на таких соединения применяется протокол LACP41 для динамического добавления или удаления каналов в группу-агрегат. В общем случае LAG позволяет расширить пропускную способность сервиса по сравнению с одиночным каналом, обеспечивая аккуратное снижение пропускной способности при отказе канала в группе, а также повышение уровня доступности.

В L2SM имеется набор атрибутов (под lag-interface), связанных с агрегированием каналов. Абонент и провайдер сначала должны решить, будет ли выполняться обмен LACP PDU между краевыми устройствами, и выбрать для LACP-state значение on или off. При включённом протоколе LACP обе стороны должны указать, (1) будет LACP работать в пассивном или активном режиме и (2) задать временной интервал и уровень приоритета для LACP PDU. Абонент и провайдер могут также определить минимальную пропускную способность агрегата LAG, которая считается допустимой, путём задания необязательного атрибута mini-link-num. Для включения быстрого детектирования отказов на каналах через независимые сессии UDP работает микро-BFD42 [RFC7130] для мониторинга состояния каждого канала в группе. Абоненту и провайдеру следует согласовать интервал BFD hello и время удержания.

Каждый канал группы указывается под интерфейсом LAG с базовыми свойствами физического канала. Некоторые атрибуты, такие как управление потоком данных, тип инкапсуляции, разрешённые Ethertype на входе и установки LLDP задаются на уровне LAG.

5.3.2.2.4. Отображение CVLAN-ID на SVC

Когда более одного сервиса мультиплексируется в один интерфейс, входящие кадры передаются в один из экземпляров сервиса L2VPN в соответствии с заранее согласованным сопоставлением абонентских VLAN с SVC. Множество CVLAN может передаваться через один канал SVC. Тип группировки будет определять связывание множества CVLAN в одном экземпляре сервиса VPN (т. е. группировку VLAN).

Когда это применимо, отображение cvlan-id-to-svc-map содержит список CVLAN, отображённых на один сервис. В большинстве случаев это будет списком доступа по VLAN из внутреннего тега 802.1Q [IEEE-802-1Q] (C-tag).

Сервис VPN можно настроить на сохранение CE-VLAN ID и CE-VLAN CoS от сайта-источника до сайта-получателя. Это нужно в тех случаях, когда абонент хочет использовать информацию из заголовка VLAN на обоих сайтах. Сохранение CE-VLAN ID и CE-VLAN CoS применяется в каждом site-network-access на сайтах. Это сохранение означает, что CE-VLAN ID и/или CE-VLAN CoS на стороне отправителя должны совпадать со значениями этих полей на стороне сайта-получателя, относящегося к тому же сервису L2VPN.

Если разрешена группировка для всех сайтов (тип группировки all-to-one), сохранение применяется для всех входящих кадров сервиса. Если группировка не включена, сохранение применяется для входящих кадров с тегом CE-VLAN ID.

5.3.2.2.5. Поддержка управления L2CP

Абоненту и SP следует заранее согласовать вопрос разрешения протокольных взаимодействий между CE и PE на уровне управления. Для обеспечения эффективной доставки группового трафика абоненты могут применять протоколы управления Ethernet (например, STP43 [IEEE-802-1D]).

Для поддержки эффективной динамической доставки могут использоваться кадры управления групповой передачей Ethernet (например, GARP/GMRP [IEEE-802-1D]) между устройствами CE и PE. Однако недопустимо предполагать, что все CE всегда используют такие протоколы (например, CE может быть маршрутизатором или не знать деталей L2).

MAC-адреса получателей в L2CP PDU относятся к двум резервным блокам, заданным рабочей группой IEEE 802.1. Для пакетов с MAC-адресом получателя из указанных ниже групповых диапазонов применяются особые правила пересылки.

  • Протоколы мостов — 01-80-C2-00-00-00 — 01-80-C2-00-00-0F.

  • Протоколы MRP — 01-80-C2-00-00-20 — 01-80-C2-00-00-2F.

Туннелирование протоколов L2 позволяет SP передавать абонентские L2 PDU через сеть без интерпретации и обработки на промежуточных устройствах. Эти L2CP PDU инкапсулируются с использованием QinQ для передачи через ядро сети с поддержкой MPLS.

Контейнер L2CP-control содержит список обычно используемых протоколов и параметров L2CP. SP может задать для каждого отдельного протокола режим отбрасывания (discard-mode), партнёрства (peer-mode) или туннелирования (tunnel-mode).

5.3.2.2.6. Ethernet Service OAM

Применение Ethernet в качестве технологии распределенных сетей предъявляет дополнительные требования к сквозному мониторингу сервиса и контролю отказов в сетях SP, особенно в части доступности сервиса и среднего времени восстановления (MTTR44). Ethernet Service OAM в контексте L2SM означает комбинацию протоколов IEEE 802.1ag [IEEE-802-1ag] и ITU-T Y.1731 [ITU-T-Y-1731].

Вообще говоря, Ethernet Service OAM позволяет SP проверять непрерывность предоставления услуг, изолировать отказы, измерять задержки и их вариации на уровне абонента и доступа сайта в сеть. Информация Ethernet Service OAM дополняет данные других инструментов верхних уровней IP/MPLS OSS для обеспечения SLA.

Функциональная модель обработки отказов 802.1ag CFM45 структурирована в иерархические домены MD46, каждому из которых назначается уникальный уровень обслуживания. MD верхних уровней могут быть вложены в MD нижних уровней, однако домены MD не могут пересекаться. Область действия каждого домена MD полностью находится в сети абонента или сети SP. Домены MD могут взаимодействовать между CE и PE (от абонента к провайдеру) или между PE (взаимодействие провайдеров), а также могут туннелироваться через другую сеть SP.

В зависимости от варианта применения несколько точек MEP47 может размещаться на обращённом наружу интерфейсе, передавая CFM PDU в направлении ядра сети (Up MEP) или в нисходящий канал (Down MEP).

Субконтейнер cfm-802.1-ag в контейнере site-network-access представляет ассоциацию обслуживания CFM MA48, т. е. Down MEP для UNI MA. Для каждой ассоциации MA пользователь может задать идентификатор MAID49, уровень и направление MEP, Remote MEP ID, уровень CoS для CFM PDU, интервал и время удержания сообщений проверки связности (CCM50), уровень генерации сигналов об отказе (т. е. самый низкий приоритет, при котором генерируется сигнал об отказе), тип приоритета CCM и т. п.

Мониторинг производительности ITU-T Y.1731 (PM51) обеспечивает важную телеметрическую информацию, которая включает задержку кадров Ethernet и её вариации, потери кадров и пропускную способность для кадров. Измерения задержки и её вариаций могут выполняться в одном или обоих направлениях. Обычно зонд Y.1731 PM передаёт небольшое число синтетических кадров вместе с обычными кадрами для измерения параметров SLA.

Субконтейнер y-1731 в контейнере site-network-access содержит набор данных для определения параметров зонда PM, включая MAID, локальный и удалённый идентификатор MEP ID, тип PM PDU, период сообщений и интервал измерения, уровень CoS для PM PDU, опции измерения по синтетическим или естественным кадрам, одно или два направления для измерений, размер кадров PM и тип сессии.

5.4. Роли сайта

Сервис VPN имеет определённую топологию, как описано в параграфе 5.2.2. В результате каждому сайту, относящемуся к VPN, назначается в этой топологии определённая роль. Лист site-role указывает роль сайта в конкретной топологии VPN.

В топологии any-to-any (каждый с каждым) все сайты должны играть одну роль — any-to-any-role.

В топологии Hub-and-Spoke или Hub-and-Spoke-Disjoint сайты должны играть роль Hub или Spoke.

5.5. Сайты, входящие в несколько VPN

5.5.1. Варианты VPN на сайте

Сайт может входить в одну или множество сетей VPN и site-vpn-flavor указывает способ мультиплексирования VPN. Возможны 4 типа обращённых наружу соединений, связанных с сервисом EVPN и сайтом. Поэтому модель поддерживает четыре варианта:

  • site-vpn-flavor-single — сайт входит в единственную сеть VPN;

  • site-vpn-flavor-multi — сайт включён во множество VPN и все логические соединения сайтов относятся к одному набору VPN;

  • site-vpn-flavor-nni — сайт представляет интерфейс NNI, где соединяются два административных домена, относящихся к одному или разным провайдерам;

  • site-vpn-flavor-e2e — сайт представляет сквозное многосегментное соединение.

5.5.1.1. Одно подключение — site-vpn-flavor-single

На рисунке 14 показано подключение сайта к одной сети VPN.

                                                   +--------+
+------------------+             Сайт             /          \
|                  |-----------------------------|            |
|                  |***(site-network-access#1)***|    VPN1    |
| Офис в Нью-Йорке |                             |            |
|                  |***(site-network-access#2)***|            |
|                  |-----------------------------|            |
+------------------+                              \          /
                                                   +--------+

Рисунок 14. Одно подключение к VPN.


5.5.1.2. Множество подключений — site-vpn-flavor-multi

На рисунке 15 показано подключение сайта к множеству VPN.

                                                        +---------+
                                                   +---/----+      \
+------------------+             Сайт             /   |      \      |
|                  |--------------------------------- |       |VPN B|
|                  |***(site-network-access#1)******* |       |     |
| Офис в Нью-Йорке |                             |    |       |     |
|                  |***(site-network-access#2)*******  \      |    /
|                  |-----------------------------| VPN A+-----|---+
+------------------+                              \          /
                                                   +--------+

Рисунок 15. Подключение к множеству VPN.


Офис в Нью-Йорке на рисунке 15 является многодомным. Для обоих логических соединений применяются одинаковые правила подключения к VPN и оба соединения относятся к VPN A и VPN B.

Доступ к VPN A или VPN B из офиса в Нью-Йорке выполняется на основе пересылки по MAC-адресу получателя. Возможность доступа к одному адресату из двух VPN может создавать проблемы маршрутизации. В этом случае роль администратора абонентской сети заключается в подходящем отображении MAC-адресов каждой VPN. Более подробное описание приведено в параграфах 5.5.2 и 5.10.2, а поддержка BUM рассмотрена в параграфе 5.10.3.

5.5.1.3. NNI — site-vpn-flavor-nni

Вариант с межсетевым соединением (NNI) можно промоделировать, используя контейнер sites. Для SP полезно указать, что запрашиваемое соединение VPN не относится к обычному сайту, а является NNI, поскольку в этом случае могут по умолчанию применяться другие параметры конфигурации (например, ACL52, правила маршрутизации).

         SP A                                         SP B
  -------------------                         -------------------
 /                   \                       /                   \
|                     |                     |                     |
|                 ++++++++Канал между AS ++++++++                 |
|                 +      +_______________+      +                 |
|                 + (MAC-VRF1)-(VPN1)-(MAC-VRF1)+                 |
|                 +      +               +      +                 |
|                 + ASBR +               + ASBR +                 |
|                 +      +               +      +                 |
|                 + (MAC-VRF2)-(VPN2)-(MAC-VRF2)+                 |
|                 +      +_______________+      +                 |
|                 ++++++++               ++++++++                 |
|                     |                     |                     |
|                     |                     |                     |
|                     |                     |                     |
|                 ++++++++Канал между AS ++++++++                 |
|                 +      +_______________+      +                 |
|                 + (MAC-VRF1)-(VPN1)-(MAC-VRF1)+                 |
|                 +      +               +      +                 |
|                 + ASBR +               + ASBR +                 |
|                 +      +               +      +                 |
|                 + (MAC-VRF2)-(VPN2)-(MAC-VRF2)+                 |
|                 +      +_______________+      +                 |
|                 ++++++++               ++++++++                 |
|                     |                     |                     |
|                     |                     |                     |
 \                   /                       \                   /
  -------------------                         -------------------

Рисунок 16. Сценарий NNI, вариант A.


На рисунке 16 показан вариант A сценария NNI, который можно смоделировать с помощью контейнера sites. Для подключения абонентских VPN (VPN1 и VPN2) к сети SP B провайдер SP A может запросить создание того или иного контейнера site-network-accesses для сети SP B. Можно использовать тип site-vpn-flavor-nni для информирования SP B о том, что это соединение NNI, а не обычное подключение абонента.

5.5.1.4. E2E — site-vpn-flavor-e2e

Сквозное (E2E53) многосегментное соединение VPN организуется из нескольких соединительных сегментов. Для SP будет полезно указать, что запрошенное соединение VPN не является обычным подключением сайта, а служит сквозным соединением VPN, поскольку в случае site-vpn-flavor-e2e по умолчанию могут применяться другие параметры (например, конфигурация QoS). Для организации соединения между Сайтом 1 в SP A и Сайтом 2 в SP B через множество доменов провайдер SP A может запросить организацию сквозного соединения с SP B. Тип site-vpn-flavor-e2e позволяет указать, что это сквозное соединение, а не обычное подключение абонентского сайта.

5.5.2. Присоединение сайта к VPN

По причине наличия множества вариантов site-vpn присоединение сайта к L2VPN выполняется на уровне site-network-access (логический доступ) через контейнер vpn-attachment, который является обязательным. Модель обеспечивает два способа присоединения сайта к VPN:

  • по непосредственной ссылке на целевую сеть VPN;

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

Эти опции позволяют пользователю выбрать наиболее подходящий вариант.

5.5.2.1. Указание VPN

Указание vpn-id обеспечивает простой способ привязать конкретное логическое соединение к VPN. Это является лучшим способом для VPN с одним подключением. При указании vpn-id должна добавляться роль сайта (site-role) в топологии целевого сервиса VPN.

    <?xml version="1.0"?>
    <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
     <vpn-services>
        <vpn-service>
          <vpn-id>VPNA</vpn-id>
          <ce-vlan-preservation>true</ce-vlan-preservation>
          <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
        </vpn-service>
        <vpn-service>
          <vpn-id>VPNB</vpn-id>
          <ce-vlan-preservation>true</ce-vlan-preservation>
          <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
        </vpn-service>
     </vpn-services>
     <sites>
       <site>
        <site-id>SITE1</site-id>
       <locations>
        <location>
         <location-id>L1</location-id>
        </location>
       </locations>
       <management>
        <type>customer-managed</type>
          </management>
           <site-network-accesses>
            <site-network-access>
             <network-access-id>LA1</network-access-id>
                <service>
                  <svc-bandwidth>
                     <bandwidth>
                       <direction>input-bw</direction>
                        <type>bw-per-cos</type>
                         <cir>450000000</cir>
                         <cbs>20000000</cbs>
                         <eir>1000000000</eir>
                         <ebs>200000000</ebs>
                     </bandwidth>
                    </svc-bandwidth>
                     <carrierscarrier>
                       <signaling-type>bgp</signaling-type>
                     </carrierscarrier>
                     <svc-mtu>1514</svc-mtu>
                   </service>
            <vpn-attachment>
             <vpn-id>VPNA</vpn-id>
             <site-role>spoke-role</site-role>
            </vpn-attachment>
           </site-network-access>
           <site-network-access>
            <network-access-id>LA2</network-access-id>
                <service>
                  <svc-bandwidth>
                     <bandwidth>
                       <direction>input-bw</direction>
                        <type>bw-per-cos</type>
                         <cir>450000000</cir>
                         <cbs>20000000</cbs>
                         <eir>1000000000</eir>
                         <ebs>200000000</ebs>
                     </bandwidth>
                    </svc-bandwidth>
                     <carrierscarrier>
                       <signaling-type>bgp</signaling-type>
                     </carrierscarrier>
                     <svc-mtu>1514</svc-mtu>
                   </service>
            <vpn-attachment>
             <vpn-id>VPNB</vpn-id>
             <site-role>spoke-role</site-role>
            </vpn-attachment>
           </site-network-access>
          </site-network-accesses>
      </site>
     </sites>
    </l2vpn-svc>

Приведенный выше пример описывает случай множества VPN, где сайт (SITE1) имеет два логических подключения (LA1 и LA2) к сетям VPNA и VPNB.

5.5.2.2. Политика VPN

Список vpn-policy позволяет описать вариант с множеством VPN, где логические подключения относятся к разным VPN.

Поскольку сайт может входить в несколько VPN, список vpn-policy может включать множество записей. Можно использовать фильтр для выбора ЛВС на сайте, которые будут частью определённой сети VPN. Сайт может включать множество сегментов ЛВС, каждый из которых может быть подключён к своей сети VPN. Каждый раз при подключении сайта (или ЛВС) к VPN пользователь должен точно указать его роль (site-role) в топологии целевого сервиса VPN.

+---------------------------------------------------------------+
|       Сайт 1 ------ PE7                                       |
+-------------------------+                 [VPN2]              |
                          |                                     |
+-------------------------+                                     |
|       Сайт 2 ------ PE3               PE4 ------ Сайт 3       |
+-----------------------------------+                           |
                                    |                           |
+-------------------------------------------------------------+ |
|       Сайт 4 ------ PE5           |   PE6 ------ Сайт 5     | |
|                                                             | |
|                      [VPN3]                                 | |
+-------------------------------------------------------------+ |
                                   |                            |
                                   +----------------------------+

Рисунок 17. Пример политики VPN.


На рисунке 17 Сайт 5 входит в VPN3 и VPN2, выступая в качестве Hub для VPN2 и any-to-any для VPN3. Этот вариант подключения описан ниже.

   <?xml version="1.0"?>
    <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
     <vpn-services>
      <vpn-service>
       <vpn-id>VPN2</vpn-id>
       <ce-vlan-preservation>true</ce-vlan-preservation>
       <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
      </vpn-service>
      <vpn-service>
       <vpn-id>VPN3</vpn-id>
       <ce-vlan-preservation>true</ce-vlan-preservation>
       <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
      </vpn-service>
     </vpn-services>
     <sites>
        <site>
       <locations>
        <location>
         <location-id>L1</location-id>
        </location>
       </locations>
       <management>
        <type>customer-managed</type>
       </management>
          <site-id>Site5</site-id>
          <vpn-policies>
           <vpn-policy>
            <vpn-policy-id>POLICY1</vpn-policy-id>
            <entries>
             <id>ENTRY1</id>
             <vpn>
              <vpn-id>VPN2</vpn-id>
              <site-role>hub-role</site-role>
             </vpn>
            </entries>
            <entries>
             <id>ENTRY2</id>
             <vpn>
              <vpn-id>VPN3</vpn-id>
              <site-role>any-to-any-role</site-role>
             </vpn>
            </entries>
           </vpn-policy>
          </vpn-policies>
          <site-network-accesses>
           <site-network-access>
            <network-access-id>LA1</network-access-id>
         <site>
          <site-id>SITE1</site-id>
       <locations>
        <location>
         <location-id>L1</location-id>
        </location>
       </locations>
       <management>
        <type>customer-managed</type>
       </management>
          <site-network-accesses>
           <site-network-access>
            <network-access-id>LA1</network-access-id>
                <service>
                  <svc-bandwidth>
                     <bandwidth>
                       <direction>input-bw</direction>
                        <type>bw-per-cos</type>
                         <cir>450000000</cir>
                         <cbs>20000000</cbs>
                         <eir>1000000000</eir>
                         <ebs>200000000</ebs>
                     </bandwidth>
                    </svc-bandwidth>
                     <carrierscarrier>
                       <signaling-type>bgp</signaling-type>
                     </carrierscarrier>
                     <svc-mtu>1514</svc-mtu>
                   </service>
            <vpn-attachment>
             <vpn-id>VPNA</vpn-id>
             <site-role>spoke-role</site-role>
            </vpn-attachment>
           </site-network-access>
           <site-network-access>
            <network-access-id>LA2</network-access-id>
                <service>
                  <svc-bandwidth>
                     <bandwidth>
                       <direction>input-bw</direction>
                        <type>bw-per-cos</type>
                         <cir>450000000</cir>
                         <cbs>20000000</cbs>
                         <eir>1000000000</eir>
                         <ebs>200000000</ebs>
                     </bandwidth>
                    </svc-bandwidth>
                     <carrierscarrier>
                       <signaling-type>bgp</signaling-type>
                     </carrierscarrier>
                     <svc-mtu>1514</svc-mtu>
                   </service>
            <vpn-attachment>
             <vpn-id>VPNB</vpn-id>
             <site-role>spoke-role</site-role>
            </vpn-attachment>
           </site-network-access>
          </site-network-accesses>
         </site>
            <vpn-attachment>
             <vpn-policy-id>POLICY1</vpn-policy-id>
            </vpn-attachment>
           </site-network-access>
          </site-network-accesses>
         </site>
     </sites>
    </l2vpn-svc>

Если требуется более детальное управление подключением к VPN, можно воспользоваться фильтрацией. Например, если сеть LAN1 Сайта 5 должна быть подключена к VPN2 в роли Hub, а LAN2 должна быть подключена к VPN3, можно использовать приведённую ниже конфигурацию.

    <?xml version="1.0"?>
      <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
        <vpn-services>
          <vpn-service>
            <vpn-id>VPN2</vpn-id>
            <ce-vlan-preservation>true</ce-vlan-preservation>
            <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
            </vpn-service>
            <vpn-service>
             <vpn-id>VPN3</vpn-id>
             <ce-vlan-preservation>true</ce-vlan-preservation>
             <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
            </vpn-service>
        </vpn-services>
      <sites>
       <site>
       <locations>
        <location>
         <location-id>L1</location-id>
        </location>
       </locations>
       <management>
        <type>customer-managed</type>
       </management>
             <site-id>Site5</site-id>
             <vpn-policies>
              <vpn-policy>
               <vpn-policy-id>POLICY1</vpn-policy-id>
               <entries>
                <id>ENTRY1</id>
                <filters>
                  <filter>
                    <type>lan</type>
                    <lan-tag>LAN1</lan-tag>
                  </filter>
                </filters>
                <vpn>
                 <vpn-id>VPN2</vpn-id>
                 <site-role>hub-role</site-role>
                </vpn>
               </entries>
               <entries>
                <id>ENTRY2</id>
                <filters>
                  <filter>
                    <type>lan</type>
                    <lan-tag>LAN2</lan-tag>
                  </filter>
                </filters>
                 <vpn>
                 <vpn-id>VPN3</vpn-id>
                 <site-role>any-to-any-role</site-role>
                </vpn>
               </entries>
              </vpn-policy>
             </vpn-policies>
             <site-network-accesses>
              <site-network-access>
               <network-access-id>LA1</network-access-id>
                 <service>
                   <svc-bandwidth>
                      <bandwidth>
                       <direction>input-bw</direction>
                        <type>bw-per-cos</type>
                         <cir>450000000</cir>
                         <cbs>20000000</cbs>
                         <eir>1000000000</eir>
                         <ebs>200000000</ebs>
                      </bandwidth>
                     </svc-bandwidth>
                      <carrierscarrier>
                         <signaling-type>bgp</signaling-type>
                      </carrierscarrier>
                       <svc-mtu>1514</svc-mtu>
                   </service>
               <vpn-attachment>
                <vpn-policy-id>POLICY1</vpn-policy-id>
               </vpn-attachment>
              </site-network-access>
             </site-network-accesses>
            </site>
           </sites>
         </l2vpn-svc>

5.6. Определение точки подключения сайта

Система управления будет определять для каждого site-network-access на конкретном сайте точку подключения к сети провайдера (например, PE или агрегирующий коммутатор).

Эта модель определяет параметры и ограничения, которые могут влиять на подключение site-network-access.

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

Параметры расположения сайта (параграф 5.6.2) и типа доступа (параграф 5.6.3) влияют на размещение сервиса, выбираемое системой управления.

Кроме учёта параметров и ограничений на решение системы управления могут влиять внутренние ограничения SP, например, наименьшая загрузка или удалённость.

5.6.1. Ограничение — устройство

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

  Сайт в Нью-Йорке
+------------------+             Сайт
| +--------------+ |-------------------------------------
| | Манхэттен    | |
| |           CE1********* (site-network-access#1) ******
| +--------------+ |
| +--------------+ |
| | Бруклин      | |
| |           CE2********* (site-network-access#2) ******
| +--------------+ |
|                  |-------------------------------------
+------------------+

Рисунок 18. Пример ограничений для устройства.


На рисунке 18 site-network-access#1 связывается с устройством CE1 из запроса. SP должен обеспечить это подключение.

5.6.2. Ограничение и параметр — расположение сайта

Обеспечивая этой моделью информация о местоположении может применяться системой управления при поиске PE для подключения сайта (на стороне SP). С каждым подключением сайта к сети должно быть связано конкретное место. Провайдер должен обеспечивать завершение сервиса в указанной точке доступа сайта в сеть (на стороне абонента). Значение country-code в местоположении сайта следует указывать кодом ISO 3166 и оно похоже на метку country, определённую в [RFC4119].

Местоположение site-network-access определяется значением location-flavor. Для сайтов, управляемых провайдером или совместно с ним, предполагается, что пользователь укажет значение device-reference (для устройства), которое свяжет site-network-access с конкретным устройством, заказанным абонентом. Поскольку устройство связано с конкретным местом, в этом случае информация о местоположении определяется по размещению устройства. Если сайт управляется абонентом, предполагается, что пользователь укажет location-reference (для местоположения) и это значение будет указывать уже настроенное местоположение, что поможет в размещении.

                         POP#1 (Нью-Йорк)
                      +---------+
                      |   PE1   |
 Сайт 1 ---...        |   PE2   |
(Атлантик-Сити)       |   PE3   |
                      +---------+

                         POP#2 (Вашингтон)
                      +---------+
                      |   PE4   |
                      |   PE5   |
                      |   PE6   |
                      +---------+

                         POP#3 (Филадельфия)
                      +---------+
                      |   PE7   |
 Сайт 2 CE#1---...    |   PE8   |
(Рестон)              |   PE9   |
                      +---------+

Рисунок 19. Данные о местоположении сайтов.


На рисунке 19 управляемый абонентом Сайт 1 имеет местоположение L1, а для управляемого провайдером Сайта 2 заказано устройство CE (CE#1). Для Сайта 2 указано местоположение L2. При настройке site-network-access для Сайта 1 пользователь должен указать местоположение L1, чтобы система управления знала, что в этом месте организуется доступ. Затем с учётом расстояния система управления может соединить Сайт 1 с PE в Philadelphia POP. При этом могут также учитываться ресурсы, доступные на PE, для точного определения целевого устройства PE (например, менее загруженного). Для Сайта 2 предполагается, что пользователь настроит site-network-access со ссылкой (device-reference) на CE#1, чтобы система управления знала о том, что доступ будет завершаться в месте размещения устройства CE#1, которое должно быть подключено. Для организации подключения на стороне SP в случае использования ближайшего PE, Сайт 2 может быть подключён к Washington POP.

5.6.3. Ограничение и параметр — тип доступа

Система управления должна выбрать среду для подключения сайта (например, xDSL, арендованная линия, Ethernet). Абонент может задать некоторые параметры и/или ограничения, которые помогут системе управления выбрать среду.

Информацию контейнера bearer следует рассматривать в первую очередь.

  • Параметр requested-type обеспечивает информацию о типе среды, который абонент хочет использовать. Если лист strict имеет значение true, система управления должна считать это строгим ограничением для типа среды. Если strict = false (принято по умолчанию) и запрошенная среда недоступна, система управления может выбрать другой тип среды. Абоненту и провайдеру следует обменяться данными о поддерживаемых типах сред, но механизмы такого обмена выходят за рамки документа.

  • Лист always-on определяет строгое ограничение. При значении true система управления должна выбрать тип среды, которая всегда доступна (always-on), т. е. не может применяться коммутируемый доступ.

  • Параметр bearer-reference используется в тех случаях, когда абонент уже заказал подключение к сети SP отдельно от сайта L2VPN и хочет воспользоваться этим соединением. Строка служит внутренней ссылкой от SP и описывает уже имеющееся соединение. Это требование является строгим и не может быть ослаблено. Способ предоставления ссылки абоненту выходит за рамки документа, но примером может служить указание канала-носителя, заказанного клиентом (с помощью процедуры, выходящей за рамки документа).

Могут применяться также иные внутренние параметры от SP. Система управления может использовать такие параметры, как «input svc-bandwidth» и «output svc-bandwidth» для выбора используемого типа доступа.

5.6.4. Ограничение — разнесение доступа

Каждый элемент site-network-access может включать одно или множество ограничений, которые будут определять размещение доступа. По умолчанию в модели предполагается отсутствие ограничений, но ожидается выделение уникального носителя (bearer) для каждого site-network-access.

Для реализации разных вариантов доступа элементы site-network-access можно помечать с помощью одного или нескольких идентификаторов групп. Идентификатор группы представляет собой строку, которая может включать как явное именование группы сайтов (например, multihomed-set1), так и числовое значение (например, 12345678). Значение каждого group-id локально для администратора абонента и система управления должна обеспечивать разным абонентам возможность использования одинаковых идентификаторов. Один или несколько group-id могут быть также определены на уровне сайта, в результате чего все site-network-access этого сайта должны наследовать идентификаторы group-id своего сайта. Когда в дополнение group-id сайта определяются идентификаторы на уровне site-network-access, система управления должна учитывать объединение всех групп (уровня сайта и уровня site-network-access) для конкретного элемента site-network-access.

Для уже настроенного элемента site-network-access каждое ограничение должно быть выражено применительно к набору site-network-accesses. Уже настроенный элемент site-network-access должен не приниматься во внимание в целевом наборе site-network-accesses. Например, «site-network-access S недопустимо подключать к той же точке присутствия POP, куда подключён контейнер site-network-accesses, являющийся частью Group 10». Набор site-network-accesses, к которому применяются ограничения, может быть указан в форме списка групп all-other-accesses или all-other-groups. Опция all-other-accesses означает, что текущее ограничение site-network-access допустимо применять ко всем site-network-accesses, относящимся к текущему сайту. Опция all-other-groups означает, что ограничение должно применяться ко всем группам, в которые текущий элемент site-network-access не входит.

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

  • pe-diverse — текущий элемент site-network-access недопустимо соединять с тем же PE, что и целевой site-network-accesses.

  • pop-diverse — текущий элемент site-network-access недопустимо соединять с той же точкой POP, что и целевой site-network-accesses.

  • linecard-diverse — текущий элемент site-network-access недопустимо соединять с той же линейной платой, что и целевой site-network-accesses. Отметим, что абонент может запросить linecard-diverse для site-network-accesses, но идентификатор текущей используемой линейной платы не следует показывать абоненту.

  • bearer-diverse — текущему элементу site-network-access недопустимо использовать общие компоненты носителя (bearer) с носителями, используемыми целевым site-network-accesses. Элемент bearer-diverse обеспечивает некоторый уровень разнесения доступа. Например, двум bearer-diverse site-network-accesses недопустимо использовать один мультиплексор DSLAM54, BAS55 или коммутатор L2.

  • same-pe — текущий элемент site-network-access должен соединяться с тем же PE, что и целевой site-network-accesses.

  • same-bearer — текущий элемент site-network-access должен соединяться с тем же носителем, что и целевой site-network-accesses.

Типы ограничений могут быть расширены с помощью дополнений. Каждое ограничение должно выражаться в форме «элемент site-network-access S должен быть <constraint-type> (например, pe-diverse, pop-diverse) из <target> site-network-accesses».

Идентификатор group-id, используемый для нацеливания того или иного site-network-accesses, может совпадать с применяемым в текущем элементе site-network-access. Это упрощает настройку для случаев, где группа точек site-network-access имеет ограничения между собой.

5.7. Выделение значений RD

Обозначение маршрута (RD56) является важнейшим параметром L2VPN на основе протокола BGP, описанных в [RFC4364], который обеспечивает возможность различать общие блоки адресов в разных VPN. Поскольку для целей маршрутов (RT) предполагается выделение системой управления таблиц MAC-VRF на целевом PE и RD для этих MAC-VRF, значение RD должно быть уникальным для каждой таблицы MAC-VRF в целевом PE.

Если MAC-VRF уже есть в целевом PE и удовлетворяет ограничениям для сайта, нет необходимости создавать другую таблицу MAC-VRF и сайт может быть подключён с использованием имеющейся MAC-VRF. Проверка системой управления соответствия имеющейся MAC-VRF ограничениям для сайта выходит за рамки документа.

Если таблицы MAC-VRF нет в целевом PE, система управления инициирует создание MAC-VRF в целевом PE и выделение для неё нового значения RD.

Система управления может применять политику выделения RD на уровне VPN или MAC-VRF в зависимости от правил SP. При выделении на уровне VPN все таблицы MAC-VRF (отправленные в разные PE) в рамках VPN будут использовать общее значение RD. При выделении на уровне MAC-VRF каждой таблице MAC-VRF следует назначать уникальное значение RD. Возможны другие варианты выделения значений и данный документ не ограничивает выбор.

Выделение RD может выполняться таким же способом как для RT. Представленная в параграфе 5.2.2.1 информация пригодна и в этом случае.

Отметим, что SP может настроить целевое устройство PE на автоматическое выделение значений RD. В таких случаях не потребуется какой-либо отдельной системы (backend) для назначения RD.

5.8. Доступность Site-Network-Access

Сайт может быть многодомным с множеством точек site-network-access. Ограничения на размещение, описанные в параграфе 5.6, помогут обеспечить разнесение физических подключений.

При размещении site-network-accesses в сети абонент может захотеть использовать определённую политику маршрутизации для этого доступа. Контейнер site-network-access/availability определяет параметры избыточности для резервирования на данном сайте. Лист access-priority определяет предпочтения для конкретного доступа. Эти предпочтения используются в сценариях «основной-резервный» и «распределение нагрузки». Большее значение access-priority задаёт более предпочтительное использование. Атрибут redundancy-mode определён для многодомных сайтов и служит для использования в сценариях «один активный» и «активный-активный». Это позволяет поддерживать множество активных путей в состоянии пересылки и для распределения нагрузки.

На рисунке 20 показаны варианты использования атрибута access-priority.

ЛВС Hub#1 (основной/резервный)    ЛВС Hub#2 (распределение нагрузки)
  |                                                     |
  |    access-priority 1          access-priority 1     |
  |--- CE1 ------- PE1            PE3 --------- CE3 --- |
  |                                                     |
  |                                                     |
  |--- CE2 ------- PE2            PE4 --------- CE4 --- |
  |    access-priority 2          access-priority 1     |

                        PE5
                         |
                         |
                         |
                        CE5
                         |
                    Сайт Spoke#1 (однодомный)

Рисунок 20. Пример настройки приоритета доступа.


Для ЛВС Hub#2 требуется распределение нагрузки, поэтому оба site-network-access должны иметь одинаковые значения access-priority. Для ЛВС Hub#1 требуется резервирование доступа и большее значение access-priority определяет основное соединение (site-network-access).

Могут быть промоделированы и более сложные сценарии. Рассмотрим Hub-сайт с 5 подключениями к сети (A1, A2, A3, A4, A5). Абонент хочет в обычных условиях распределять нагрузку между соединениями A1 и A2, при отказе этих каналов — распределять нагрузку между A3 и A4, а случае отказа всех каналов A1, A2, A3 и A4 — использовать канал A5. Это можно реализовать, установив значения access-priority: A1=100, A2=100, A3=50, A4=50, A5=10.

Подход access-priority имеет некоторые ограничения. Например, в описанном выше случае переход на распределение нагрузки между каналами A3 и A4 недостижим в случае отказа лишь одного из каналов A1 и A2. Однако атрибут access-priority хорошо подходит для большинства практических реализаций и при необходимости модель может быть расширена с помощью дополнений.

5.9. SVC MTU

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

5.10. Контейнер service

Контейнер service определяет параметры сервиса, связанные с сайтом.

5.10.1. Параметр Bandwidth

Параметр bandwidth указывает требования к пропускной способности между устройствами CE и PE, которая может быть указана значением согласованной (CIR57), избыточной (EIR58) или пиковой (PIR59) скорости. Запрошенная пропускная способность выражается как входная и выходная пропускная способность, определяемые относительно сайта абонента. Входная пропускная способность указывает скорость загрузки данных на сайт абонента, выходная — скорость выгрузки данных с сайта в сеть.

Пропускная способность настраивается только на уровне site-network-access (т. е. для соединения сайта с сетью).

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

Параметр svc-bandwidth имеет определённый тип. Данный документ определяет 4 типа:

  • bw-per-access — пропускная способность задаётся для соединения или доступа сайта в сеть применительно ко всем кадрам сервиса на интерфейсе, связанном с конкретным подключением;

  • bw-per-cos — пропускная способность задаётся для класса обслуживания (CoS), определяя скорость для всех кадров данного CoS с конкретным cos-id;

  • bw-per-svc — пропускная способность задаётся для сайта в целом, определяя скорость для всех кадров сервиса, связанных с конкретным экземпляром VPN;

  • «непрозрачная» пропускная способность, не связанная с каким-либо cos-id, экземпляром VPN (vpn-id) или идентификатором доступа сайта в сеть.

Параметр svc-bandwidth должен включать cos-id для типа bw-per-cos. Значения cos-id могут выделяться на основе (1) значения IEEE 802.1p [IEEE-802-1D] в C-tag или (2) кода DSCP60 в заголовке IP61. Измерения выполняются в соответствии с профилем пропускной способности, заданным cos-id.

Для типа bw-per-access параметр svc-bandwidth должен быть связан с конкретным параметром site-network-access-id. С каждым подключением сайта может быть связано множество значений полосы на уровне cos-id.

Для типа bw-per-svc параметр svc-bandwidth должен включать конкретный параметр vpn-id. С одним сервисом EVPN может быть связано множество значений полосы на уровне cos-id.

5.10.2. Параметр QoS

Модель определяет параметры QoS как абстракцию:

  • qos-classification-policy — определяет набор упорядоченных правил классификации абонентского трафика;

  • qos-profile — определяет применяемый профиль планирования QoS.

5.10.2.1. Классификация QoS

Правила классификации QoS определяются параметром qos-classification-policy, который представляет собой упорядоченный список правил, которые сопоставляются с потоками или приложениями, и устанавливают подходящий целевой класс обслуживания CoS (target-class-id). Пользователь может определить сопоставление с использованием более конкретного определения потока (по MAC-адресам отправителей и получателей, cos, dscp, cos-id, color-id и т. п.). Значение color-id может быть назначено кадру для идентификации соответствия профилю QoS. Кадры сервиса считаются «зелёными» (green), если они соответствуют согласованной скорости профиля пропускной способности. «Жёлтыми» (yellow) считаются кадры, выходящие за пределы согласованной скорости, но соответствующие «избыточной» скорости профиля пропускной способности. «Красными» (red) будут кадры, выходящие за пределы согласованной и избыточной скорости в профиле пропускной способности.

При использовании определения потока пользователь может применить лист-список target-sites для указания получателя потока вместо адреса получателя. В таких случаях привязка между абстракцией сайта и применяемыми для сайта MAC-адресами должна выполняться динамически. Способы организации такой привязки выходят за рамки документа. Связь сайта с L2VPN указывается контейнером vpn-attachment. Поэтому пользователь может идентифицировать получателей в потоке целевой сети VPN с помощью листа-списка target-sites и контейнера vpn-attachment. Правила без оператора сопоставления match считаются правилами «соответствия всему» (match-all). SP может реализовать завершающее правило классификации, если абонент не задал такого правила. Используемый по умолчанию класс определяет SP. В этой модели определены некоторые приложения, но можно добавлять новые с помощью дополнений. Точное значение отождествления каждого приложения зависит от SP, поэтому провайдер должен заранее информировать абонента об использовании сопоставлений по приложениям.

5.10.2.2. Профиль QoS

Пользователь может выбрать стандартный профиль, предоставленный оператором, или создать свой профиль. Профиль QoS (qos-profile) определяет правила планирования трафика, используемые SP.

Абонентский профиль QoS определяется как список записей CoS и связанных в ними свойств, приведённых ниже.

  • direction — служит для указания направления, к которому применяется qos-profile. Эта модель поддерживает направление с сайта в WAN (site-to-wan), из WAN на сайт (wan-to-site) и двухстороннее управление (bidirectional), которое применяется по умолчанию. При выборе двухстороннего управления провайдеру следует обеспечить планирование трафика в соответствии с запрошенными правилами в обоих направлениях (от SP на сайт и обратно). Например, правила планирования могут применяться на стороне PE и на стороне CE канала WAN. В направлении из WAN на сайт провайдеру следует обеспечивать планирование трафика из сети SP на сайт абонента. Например, правила управления трафиком могут быть реализованы лишь на устройстве PE, подключённом к WAN-каналу в направлении абонента.

  • policing — (необязательно) указывает, следует ли применять правила к одной скорости и двум цветами или двум скоростям и трём цветам.

  • byte-offset — (необязательно) указывает число байтов в заголовках кадров, которые не учитываются при ограничении скорости.

  • frame-delay — ограничивает задержки для данного класса. Ограничение задержки может быть указано минимальной возможной задержкой или границей задержки в миллисекундах. Выполнение этого ограничения зависит от реализации SP — может применяться строгий механизм приоритизации для очередей на канале доступа и в ядре сети или создаваться путь маршрутизации с малой задержкой для этого класса трафика.

  • frame-jitter — ограничивает вариации задержек для данного класса. Ограничение может быть выражено как минимальная возможная вариация или граница вариации в миллисекундах. Выполнение этого ограничения зависит от реализации SP — может применяться строгий механизм приоритизации для очередей на канале доступа и в ядре сети или создаваться путь маршрутизации с известной величиной вариаций для этого класса.

  • bandwidth — задаёт гарантированную пропускную способность для CoS, выражаемую в процентах. Параметр guaranteed-bw-percent использует в качестве единицы отсчёта доступную пропускную способность, которой следует быть не ниже значения CIR, определённого во входном или выходном параметре svc-bandwidth. При реализации контейнера qos-profile на стороне CE в качестве единицы отсчёта применяется выходное значение svc-bandwidth, а при реализации на стороне PE — входное значение svc-bandwidth. По умолчанию резервирование пропускной способности гарантируется лишь на уровне доступа. Пользователь может применить лист end-to-end для запроса сквозного резервирования пропускной способности, включая транспортную сеть MPLS. Иными словами, SP будет активировать в ядре MPLS те или иные средства обеспечения запрошенной абонентом пропускной способности. Решение этой задачи (например, резервирование RSVP-TE или резервирование в контроллере) выходит за рамки документа.

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

5.10.3. Поддержка BUM

Контейнер broadcast-unknown-unicast-multicast указывает тип сайта в топологии групповой пересылки абонента — источник, получатель или оба сразу. Эти параметры помогают системе управления оптимизировать групповой трафик.

Можно создать множество отображений групп на порты (group-to-port) с помощью списка multicast-gp-address-mapping, определяющего адрес multicast-группы и номер порта LAG. Эти параметры помогают SP выбрать подходящую привязку интерфейса к multicast-группе для удовлетворения требований абонента.

Для обеспечения «прозрачной» доставки данного кадра все групповые кадры L2 (данные и управление) следует без изменений (за исключением VLAN ID) передавать от CE до CE. Значения VLAN ID, заданные SP, также можно менять.

Для услуг «точка-точка» провайдер должен лишь доставить одну копию каждого кадра сервиса удалённому PE, независимо от типа MAC-адреса получателя во входящем кадре (групповой, индивидуальный, широковещательный). Поэтому все кадры следует доставлять безусловно.

Пересылка кадров BUM в многоточечном сервисе включает локальную лавинную рассылку другим устройствам AC того же PE и удалённую репликацию на всех других PE, которая требует дополнительных ресурсов и пропускной способности в ядре сети. На обращённых наружу интерфейсах (UNI или E-NNI62) могут быть реализованы специальные правила обработки кадром BUM с ограничением скорости для них числом пакетов или битов в секунду.

Может задаваться общий порог для всего трафика BUM или отдельные пороги для каждой категории трафика.

5.11. Управление сайтом

Субконтейнер management предназначен для опций управления сайтом с учётом принадлежности устройств и контроля доступа. Ниже кратко описаны три базовые модели управления.

Управляемое провайдером устройство CE. Провайдер монопольно владеет устройством CE и только он имеет доступ к CE. Граница ответственности SP и абонента размещается между CE и сетью абонента. Этот вариант используется чаще всего.

Управляемое абонентом устройство CE. Абонент монопольно владеет устройством CE и только он имеет доступ к CE. Граница ответственности SP и абонента размещается между PE и CE.

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

Выбранная модель управления указывается в листе type. Лист address хранит адрес для управления устройством CE. Лист management-transport служит для указания протокола, используемого для управления (IPv4 или IPv6). На основе выбранной модели управления могут быть заданы дополнительные опции защиты.

5.12. Защита от петель MAC

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

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

Частота переброса MAC-адресов и опции предотвращения петель указываются в контейнере mac-loop-prevention.

5.13. Ограничение числа MAC-адресов

Необязательный контейнер mac-addr-limit содержит предельное число абонентских MAC-адресов и данные, описывающие поведение при достижении предела или старении MAC-адреса.

При реализации нескольких экземпляров сервиса на одном элементе сети таблица MAC-адресов (а также пространство RIB63 для маршрутов MAC в случае EVPN) является совместно используемым ресурсом. Провайдер может ограничивать число MAC-адресов, узнанных от абонента, для одного экземпляра сервиса с помощью листа mac-addr-limit и может применять лист action для указания действий в случае превышения заданного предела — отбрасывание пакета, лавинная рассылка или просто запись события в системный журнал.

Если для услуг «точка-точка» обучение MAC отключено, ограничивать число MAC-адресов не требуется.

5.14. Расширенные возможности VPN

5.14.1. Оператор для операторов

В случае CsC64 [RFC8299] абонент может захотеть организовать сервис MPLS на основе L2VPN для передачи трафика.

ЛВС customer1
   |
   |
  CE1
   |
   | -------------
(vrf_cust1)
 CE1_ISP1
   |                 ISP1 POP
   | Канал MPLS 
   | -------------
   |
(vrf ISP1)
  PE1

 (...)   Магистраль првайдера

  PE2
(vrf ISP1)
   |
   | ------------
   |
   | Канал MPLS 
   |                 ISP1 POP
 CE2_ISP1
(vrf_cust1)
   | ------------
   |
  CE2
   |
ЛВС customer1

Рисунок 21. Сервис MPLS с использованием L2VPN.


В примере на рисунке 21 ISP1 продаёт услуги L2VPN, но не имеет инфраструктуры ядра между своими точками POP и использует сервис L2VPN в качестве такой инфраструктуры (принадлежащей другому провайдеру) между своими POP.

Для поддержки CsC сервис VPN должен указать поддержку MPLS путём указания для листа carrierscarrier в списке vpn-service значения true. Канал между CE1_ISP1/PE1 и CE2_ISP1/PE2 должен также поддерживать протокол сигнализации MPLS. Конфигурация выполняется на уровне сайта.

В этой модели в качестве сигнального протокола MPLS может применяться LDP или BGP. В случае LDP должен также применяться протокол внутренней маршрутизации IGP. В случае сигнализации BGP протокол BGP должен также служить протоколом маршрутизации.

При использовании CsC запрашиваемый лист svc-mtu должен указывать MPLS MTU, а не MTU на канале.

5.15. Ссылки на внешние идентификаторы

Модель сервиса порой обращается к внешней информации путём задания идентификаторов. Например, для заказа доступа в облако конкретного CSP65 в модели используется идентификатор целевого CSP. Если абонент напрямую применяет модель сервиса в качестве API (например, через RESTCONF или NETCONF) для заказа определённой услуги, провайдеру следует предоставлять список действующих идентификаторов. В случае доступа к облаку SP будет предоставлять идентификаторы, связанные с доступными провайдерами CSP. То же самое относится и к другим идентификаторам (таким, как qos-profile).

Например, установка remote-carrier-name используется в случае NNI, поскольку эта информация нужна текущему L2VPN SP, с которым организуется соединение, тогда как идентификатор облака (cloud-identifier) нужен текущему L2VPN SP и абоненту, поскольку он применяется для доступа к публичному облаку или в Internet.

Способы предоставления провайдером этой информации абоненту выходят за рамки документа.

5.16. Определение NNI и поддержка нескольких AS

Автономная система (AS66) представляет собой сеть или группу сетей с единым администрированием, которая использует один чётко определённый протокол маршрутизации. В некоторых случаях требуется организовать VPN через несколько AS, разделённых географически или относящихся к разным SP. Соединения между AS организуются провайдерами и не видны абоненту. Примеры таких соединений включают:

  • партнерские отношения между SP (например, оператор или облако) для расширения сервиса VPN;

  • внутренние границы в рамках одного SP (например, транзитные сети, ядро и ЦОД).

Интерфейсы NNI определяются для организации VPN через множество AS. В [RFC4761] определено множество вариантов реализации VPN NNI (например, VPLS), каждый из которых имеет свои преимущества и недостатки, но этот вопрос выходит за рамки документа. Например в варианте A (две AS) партнёры ASBR67 соединяются через множество интерфейсов, из которых по крайнем мере один, относящийся в обеим AS, будет присутствовать в VPN. Чтобы эти ASBR могли обмениваться блоками меток, они связывают каждый интерфейс с таблицей MAC-VRF (VSI, раздел 2) и сессией BGP. В результате трафик между устройствами в VPLS передаётся по протоколу Ethernet. В этом варианте все VPN изолированы одна от другой, а поскольку трафик передаются с помощью Ethernet, механизмы QoS для трафика Ethernet могут применяться для обеспечения абонентских соглашений SLA.

  --------                 --------------              -----------
 /        \               /              \            /           \
| Облачный |             |                |          |             |
| провайдер|-----NNI-----|                |----NNI---|     ЦОД     |
|  #1      |             |                |          |             |
 \        /              |                |           \           /
  --------               |                |            -----------
                         |                |
  --------               |    Моя сеть    |           -----------
 /        \              |                |          /           \
| Облачный |             |                |         |             |
| провайдер|-----NNI-----|                |---NNI---| Партнер     |
|  #2      |             |                |         | L2VPN       |
 \        /              |                |         |             |
  --------               |                |         |             |
                          \              /          |             |
                           --------------            \           /
                                 |                    -----------
                                 |
                                NNI
                                 |
                                 |
                         -------------------
                        /                   \
                       |                     |
                       |                     |
                       |                     |
                       |     Партнер L2VPN   |
                       |                     |
                        \                   /
                         -------------------

Рисунок 22. Сеть SP с несколькими NNI.


На рисунке 22 показана сеть SP (Моя сеть), имеющая несколько интерфейсов NNI, используемых для

  • расширения своего присутствия, основанного на партнёрстве L2VPN;

  • подключения своих ЦОД к абонентским L2VPN;

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

5.16.1. Определение NNI, вариант A

         AS A                                         AS B
  -------------------                         -------------------
 /                   \                       /                   \
|                     |                     |                     |
|                 ++++++++ Канал между AS+++++++++                |
|                 +      +_______________+       +                |
|                 +(MAC-VRF1)--(VPN1)--(MAC-VRF1)+                |
|                 +      +               +       +                |
|                 + ASBR +               + ASBR  +                |
|                 +      +               +       +                |
|                 +(MAC-VRF2)--(VPN2)--(MAC-VRF2)+                |
|                 +      +_______________+       +                |
|                 ++++++++               +++++++++                |
|                     |                     |                     |
|                     |                     |                     |
|                     |                     |                     |
|                 ++++++++ Канал между AS+++++++++                |
|                 +      +_______________+       +                |
|                 +(MAC-VRF1)--(VPN1)--(MAC-VRF1)+                |
|                 +      +               +       +                |
|                 + ASBR +               + ASBR  +                |
|                 +      +               +       +                |
|                 +(MAC-VRF2)--(VPN2)--(MAC-VRF2)+                |
|                 +      +_______________+       +                |
|                 ++++++++               +++++++++                |
|                     |                     |                     |
|                     |                     |                     |
 \                   /                       \                   /
  -------------------                         -------------------

Рисунок 23. Интерфейс NNI, вариант A, пример 1.


В варианте A две AS соединены между собой физическими каналами на маршрутизаторах ASBR. Для отказоустойчивости между AS может быть организовано множество физических соединений. Соединение VPN (физическое или логическое на основе физического) создаётся для каждой сети VPN, которой требуется выход за границу AS.

С точки зрения модели сервиса это соединение VPN может выглядеть сайтом. Предположим, что AS B хочет расширить соединение для VPN C на AS A. Администратор AS B может использовать эту модель сервиса для заказа сайта в AS A. Все варианты могут быть реализованы с использованием возможностей текущей модели. Например, на рисунке 23 показаны два физических соединения, на которые наложены логические соединения VPN. Это можно рассматривать как сценарий с множеством VPN. Администратор AS B может также выбрать подходящий протокол маршрутизации (например, EBGP68) для динамического обмена маршрутами между AS.

В этом документе предполагается, что для варианта A интерфейса NNI следует применять имеющуюся модель сайта VPN.

На рисунке 24 показан пример, где абонент хочет, чтобы его CSP A присоединил свою виртуальную сеть N к имеющейся L2VPN (VPN1) от сервиса L2VPN провайдера SP B.

         CSP A                           L2VPN SP B
  -----------------                     -----------
 /                 \                   /           \
|       |           |                 |             |
|  VM --|       ++++++++     NNI    ++++++++++      |--- VPN1
|       |       +      +____________+        +      |   Сайт 1
|       |-------+(MAC-VRF1)-(VPN1)-(MAC-VRF1)+      |
|       |       +      +            +        +      |
|       |       + ASBR +            + ASBR   +      |
|       |       +      +____________+        +      |
|       |       ++++++++            ++++++++++      |
|  VM --|           |                 |             |--- VPN1
|       |Виртуальная|                 |             |   Сайт 2
|       |сеть       |                 |             |
|  VM --|           |                 |             |--- VPN1
|       |           |                 |             |   Сайт 3
 \                 /                   \           /
  -----------------                     -----------
                                             |
                                             |
VM = Виртуальная машина                     VPN1
                                           Сайт 4

Рисунок 24. Интерфейс NNI, вариант A, пример 2.


Для подключения VPN провайдер CSP или абонент может использовать модель L2SM, раскрытую провайдером SP B. Поскольку интерфейс NNI используется совместно, можно считать, что физическое соединение (bearer) между CSP A и SP B уже имеется. CSP A может запросить через модель сервиса создание нового сайта с одним контейнером site-network-access (single-homing на рисунке 24). В качестве ограничения для размещения CSP A может использовать ссылку на носитель (bearer) от SP A для размещения VPN NNI на имеющемся канале. Приведённый ниже код XML иллюстрирует возможный запрос конфигурации к провайдеру SP B.

   <?xml version="1.0"?>
   <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
    <vpn-profiles>
     <valid-provider-identifiers>
      <qos-profile-identifier>
       <id>GOLD</id>
      </qos-profile-identifier>
      <qos-profile-identifier>
       <id>PLATINUM</id>
      </qos-profile-identifier>
     </valid-provider-identifiers>
    </vpn-profiles>
    <vpn-services>
     <vpn-service>
      <vpn-id>VPN1</vpn-id>
      <ce-vlan-preservation>true</ce-vlan-preservation>
      <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
     </vpn-service>
    </vpn-services>
    <sites>
         <site>
             <site-id>CSP_A_attachment</site-id>
              <locations>
               <location>
                 <location-id>NY1</location-id>
                 <city>NY</city>
                 <country-code>US</country-code>
              </location>
              </locations>
             <site-vpn-flavor>site-vpn-flavor-nni</site-vpn-flavor>
               <site-network-accesses>
                 <site-network-access>
                  <network-access-id>CSP_A_VN1</network-access-id>
                          <connection>
                          <encapsulation-type>vlan</encapsulation-type>
                          <eth-inf-type>tagged</eth-inf-type>
                           <tagged-interface>
                            <tagged-inf-type>dot1q</tagged-inf-type>
                            <dot1q-vlan-tagged>
                             <cvlan-id>17</cvlan-id>
                           </dot1q-vlan-tagged>
                           </tagged-interface>
                          </connection>
                            <service>
                              <svc-bandwidth>
                                <bandwidth>
                                 <direction>input-bw</direction>
                                  <type>bw-per-cos</type>
                                   <cir>450000000</cir>
                                   <cbs>20000000</cbs>
                                   <eir>1000000000</eir>
                                   <ebs>200000000</ebs>
                                </bandwidth>
                              </svc-bandwidth>
                              <carrierscarrier>
                                <signaling-type>bgp</signaling-type>
                             </carrierscarrier>
                            </service>
                           <vpn-attachment>
                              <vpn-id>12456487</vpn-id>
                              <site-role>spoke-role</site-role>
                            </vpn-attachment>
                </site-network-access>
             </site-network-accesses>
             <management>
              <type>customer-managed</type>
             </management>
         </site>
    </sites>
   </l2vpn-svc>

Описанный выше случай отличается от сценария использования контейнера cloud-accesses, который обеспечивает доступ в публичное облако, тогда как в примере организуется доступ к приватным ресурсам в сети CSP.

5.16.2. Определение NNI, вариант B

        AS A                                          AS B
  -------------------                         -------------------
 /                   \                       /                   \
|                     |                     |                     |
|                 ++++++++ Канал между AS++++++++                 |
|                 +      +_______________+      +                 |
|                 +      +               +      +                 |
|                 + ASBR +<---MP-BGP---->+ ASBR +                 |
|                 +      +               +      +                 |
|                 +      +_______________+      +                 |
|                 ++++++++               ++++++++                 |
|                     |                     |                     |
|                     |                     |                     |
|                     |                     |                     |
|                 ++++++++ Канал между AS++++++++                 |
|                 +      +_______________+      +                 |
|                 +      +               +      +                 |
|                 + ASBR +<---MP-BGP---->+ ASBR +                 |
|                 +      +               +      +                 |
|                 +      +_______________+      +                 |
|                 ++++++++               ++++++++                 |
|                     |                     |                     |
|                     |                     |                     |
 \                   /                       \                   /
  -------------------                         -------------------

Рисунок 25. Интерфейс NNI, вариант B, пример 1.


В варианте B две AS соединены между собой физическими каналами на ASBR. Для отказоустойчивости может использоваться множество соединений между AS. «VPN-соединение» между AS организуется путём обмена маршрутами VPN с использованием MP-BGP [RFC4761].

Существует три варианта реализации такого интерфейса NNI.

  1. NNI является внутренним для провайдера и расположен между магистралью и ЦОД. Домены являются доверенными и не нужно фильтровать маршруты VPN, т. е. обмен происходит для всех маршрутов. Может применяться фильтрация RT для сохранения некоторых необязательных состояний.

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

  3. NNI располагается между провайдерами, готовыми обмениваться маршрутами VPN лишь для конкретных RT. Каждый провайдер имеет свою схему RT. Поэтому работающие через две сети абоненты будут получать для конкретной VPN разные RT в каждой сети.

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

В случае 2 требуется политика фильтрации RT на ASBR. С точки зрения модели сервиса требуется согласовать список RT для передачи полномочий.

В случае 3 обе AS должны согласовать VPN RT для обмена, а также отображение VPN RT одной AS на RT из другой.

Такое моделирование выходит за рамки этого документа.

       CSP A                               L3VPN SP B
  -----------------                    ------------------
 /                 \                  /                  \
|       |           |                |                    |
|  VM --|       ++++++++   NNI    ++++++++                |--- VPN1
|       |       +      +__________+      +                |   Сайт 1
|       |-------+      +          +      +                |
|       |       + ASBR +<-MP-BGP->+ ASBR +                |
|       |       +      +__________+      +                |
|       |       ++++++++          ++++++++                |
|  VM --|           |                |                    |--- VPN1
|       |Виртуальная|                |                    |   Сайт 2
|       |сеть       |                |                    |
|  VM --|           |                |                    |--- VPN1
|       |           |                |                    |   Сайт 3
 \                 /                 |                    |
  -----------------                  |                    |
                                      \                  /
                                       ------------------
                                                |
VM = Виртуальная машина                         |
                                               VPN1
                                              Сайт 4

Рисунок 26. Интерфейс NNI, вариант B, пример 2.


На рисунке 26 показано соединение NNI между CSP A и сетью SP B. Провайдеры не доверяют друг другу и каждый применяет свои правила выделения RT. Поэтому в терминах реализации абонентская VPN имеет своё значение RT в каждой сети (RT A в CSP A и RT B в сети SP B). Для подключения виртуальной сети абонента в CSP A к абонентской L2VPN (VPN1) в сети SP B провайдеру CSP A следует запросить у сети SP B создание абонентской VPN на интерфейсе NNI (восприятие соответствующего RT). Трансляция RT выполняется на основе соглашения между двумя SP — SP B может разрешить CSP A запрос трансляции VPN (RT).

5.16.3. Определение NNI, вариант C

         AS A                                           AS B
  -------------------                          -------------------
 /                   \                        /                   \
|                     |                      |                     |
|                     |                      |                     |
|                     |                      |                     |
|                 ++++++++ Multihop EBGP  ++++++++                 |
|                 +      +                +      +                 |
|                 +      +                +      +                 |
|                 + RGW  +<----MP-BGP---->+ RGW  +                 |
|                 +      +                +      +                 |
|                 +      +                +      +                 |
|                 ++++++++                ++++++++                 |
|                     |                      |                     |
|                     |                      |                     |
|                     |                      |                     |
|                     |                      |                     |
|                     |                      |                     |
|                 ++++++++ Канал между AS++++++++                  |
|                 +      +_______________+      +                  |
|                 +      +               +      +                  |
|                 + ASBR +               + ASBR +                  |
|                 +      +               +      +                  |
|                 +      +_______________+      +                  |
|                 ++++++++               ++++++++                  |
|                     |                      |                     |
|                     |                      |                     |
|                     |                      |                     |
|                 ++++++++ Канал между AS++++++++                  |
|                 +      +_______________+      +                  |
|                 +      +               +      +                  |
|                 + ASBR +               + ASBR +                  |
|                 +      +               +      +                  |
|                 +      +_______________+      +                  |
|                 ++++++++               ++++++++                  |
|                     |                      |                     |
|                     |                      |                     |
 \                   /                        \                   /
  -------------------                          -------------------

Рисунок 27. Вариант C для NNI.


С точки зрения сервиса VPN вариант C для NNI очень похож на вариант B, поскольку используется сессия MP-BGP для обмена маршрутами VPN между AS. Различие состоит в том, что уровни пересылки и управления размещаются на разных узлах, поскольку сессия MP-BGP включает несколько этапов пересылки между шлюзами маршрутизации (RGW). С точки зрения сервиса VPN моделирование вариантов B и C выполняется идентично.

5.17. Применимость L2SM в межпровайдерской и междоменной оркестровке

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

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

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

Межпровайдерские управляющие соединения варианта (a) могут быть реализованы с использованием методов, описанных в параграфе 5.16 (например, определение NNI). Многосегментные соединения варианта (b) могут приводить к решениям для соединений между AS, похожим на схему (b) в разделе 10 [RFC4364]. Это можно реализовать путём «сшивания» соединений сайтов и сегментов сервиса в разных доменах. Например, сквозное соединение между сайтами 1 и 3 через множество доменов (скажем, городские сети) может быть организовано путём сшивания соединений доступа на сайте 1 с SEG1, SEG3, SEG4, а также с подключением к сети на сайте 3 (как показано на рисунке 28). Предполагается, что компонент оркестровки на рисунке 3 должен иметь представление о полной абстрактной топологии и доступности ресурсов. Это может основываться на планировании сети.

         ----------   ----------   ----------
        |          | |          | |          |
      +--+        +---+        +---+        +--+
Сайт 1|PE|==SEG1==|   |==SEG3==|   |==SEG4==|PE|Сайт 3
      +--+        +---+        |   |        +--+
        |          | |         |   |         |  ----------
        |          | |         |   |         | |          |
      +--+        +---+        |   |        +---+        +--+
Сайт 2|PE|==SEG2==|   |==SEG5==|   |==SEG6==|   |==SEG7==|PE|Сайт 4
      +--+        +---+        +---+        +---+        +--+
        |          | |          | |          | |          |
         ----------   ----------   ----------   ----------

Рисунок 28. Пример межпровайдерской и междоменной оркестровки.


Отметим, что SEG1, SEG2, SEG3, SEG4, SEG5 и SEG6 можно рассматривать как подключения доступа на сайте и они могут быть созданы как подключения обычных сайтов с использованием L2SM.

На рисунке 28 протокол BGP служит для распространения L2VPN NLRI69 из одной AS в соседнюю. Сначала маршрутизаторы PE используют BGP для распространения L2VPN NLRI маршрутизаторам ASBR или рефлекторам маршрутов, клиентами которых являются ASBR. Затем ASBR использует BGP для распространения этих L2VPN NLRI маршрутизатору ASBR в другой AS, который далее распространит их маршрутизаторам PE в своей AS или, возможно, другим ASBR, которые разошлют анонсы дальше.

В этом случае PE может узнать адрес маршрутизатора ASBR, через который доступен другой PE, для организации соединения с последним. Т. е. локальный PE будет получать анонс BGP с L2VPN NLRI для экземпляра L2VPN, где у локального PE есть подключённые участники. Следующим интервалом BGP в этом L2VPN NLRI будет ASBR локальной AS. Затем вместо создания управляющего соединения через весь путь с удаленным PE, локальный PE создаст соединение лишь с ASBR, т. е. сегмент соединения от PE до ASBR. Маршрутизатор ASBR может организовать соединение с ASBR в следующей AS, а затем «сшить» с соединением от PE, как описано в [RFC6073]. Повторение процедуры на каждом ASBR создаст цепочку соединений, которая после «сшивания» свяжет два маршрутизатора PE.

Отметим, что при описанном подходе локальный маршрутизатор PE может никогда не узнать IP-адрес удалённого PE. Он знает L2VPN NLRI из анонсов удалённого PE, который не обязан включать адрес удалённого PE, и знает IP-адрес ASBR, который служит следующим интервалом BGP для данного NLRI.

При использовании такого подхода для VPLS или полносвязной (full-mesh) VPWS возникает полносвязный набор соединений между PE, но полносвязные управляющие соединения (сессии LDP или L2TPv3) не требуются. Вместо этого управляющие соединения внутри AS организуются между всеми PE данной AS и маршрутизаторами ASBR этой AS. Одно управляющее соединение между ASBR смежных AS может поддерживать множество сегментов соединений AS-AS, если они нужны.

6. Взаимодействие с другими модулями YANG

Как разъяснено в разделе 4, эта модель сервиса не предназначена для элементов сети, а реализуется в системе управления.

Система управления может иметь модульную конструкцию и включать две разных части:

  1. компонент, отвечающий за модель сервиса (назовём его сервисным компонентом);

  2. компонент, отвечающий за настройку элементов сети (назовём его конфигурационным компонентом).

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

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

В этой схеме предполагается, что модели данных YANG будут применяться для настройки компонент сервиса на элементах сети. Будет существовать тесная связь между абстрактным представлением, обеспечиваемым этой моделью сервиса, и детальным представлением конфигурации, которое будет обеспечиваться конкретными моделями конфигурации для элементов сети, такими как определены в [MPLS-L2VPN-YANG] и [EVPN-YANG]. Компоненты сервиса, для которых нужна настройка элементов сети для поддержки определённой здесь модели сервиса, включают:

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

  • физические интерфейсы;

  • параметры уровня Ethernet (например, идентификаторы VLAN);

  • QoS (классификация, профили и т. п.);

  • поддержка Ethernet Service OAM.

7. Пример использования модели сервиса

Как разъяснено в разделе 4, эта модель сервиса предназначена для реализации на уровне управления и не рассчитана на прямое использование элементами сети. Система управления служит центральной точкой настройки сервиса в целом.

В этом разделе приведён пример использования модели системой управления для настройки сервиса L2VPN на элементах сети.

В приведённом ниже примере сервис VPN организуется для 3 сайтов, использующих VPWS «точка-точка» и топологию сервиса VPN Hub-and-Spoke, как показано на рисунке 29. Распределение нагрузки здесь не рассматривается.

Сайт 1
............
:          :             P2P VPWS
:Spoke-сайт:-----PE1--------------------------+
:          :                                  |        Сайт 3
:..........:                                  |      ............
                                              |      :          :
                                             PE3-----: Hub-сайт :
Сайт 2                                        |      :          :
............                                  |      :..........:
:          :             P2P VPWS             |
:Spoke-сайт:-----PE2--------------------------+
:          :
:..........:

Рисунок 29. Эталонная сеть для простого примера.


Приведённый ниже код XML упрощенно описывает общую конфигурацию сервиса для этой сети VPN.

       <?xml version="1.0"?>
       <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
         <vpn-services>
             <vpn-service>
              <vpn-id>12456487</vpn-id>
               <vpn-svc-type>vpws</vpn-svc-type>
               <svc-topo>hub-spoke</svc-topo>
               <ce-vlan-preservation>true</ce-vlan-preservation>
               <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
              </vpn-service>
             <vpn-service>
               <vpn-id>12456488</vpn-id>
               <vpn-svc-type>vpws</vpn-svc-type>
               <svc-topo>hub-spoke</svc-topo>
               <ce-vlan-preservation>true</ce-vlan-preservation>
               <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
              </vpn-service>
         </vpn-services>
       </l2vpn-svc>

При получении запроса на организацию сервиса VPN система управления будет внутренними средствами (или путём взаимодействия с другими компонентами OSS) выделять значения VPN RT. В данном конкретном случае будут выделены два значения RT (100:1 для концентраторов и 100:2 для лучей). Приведённый ниже результат описывает конфигурацию Spoke-сайта 1.

  <?xml version="1.0"?>
  <l2vpn-svc xmlns="urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc">
   <vpn-services>
    <vpn-service>
     <vpn-id>12456487</vpn-id>
     <svc-topo>hub-spoke</svc-topo>
     <ce-vlan-preservation>true</ce-vlan-preservation>
     <ce-vlan-cos-preservation>true</ce-vlan-cos-preservation>
    </vpn-service>
   </vpn-services>
   <sites>
     <site>
        <site-id>Spoke_Site1</site-id>
           <locations>
             <location>
              <location-id>NY1</location-id>
              <city>NY</city>
              <country-code>US</country-code>
             </location>
            </locations>
            <site-network-accesses>
               <site-network-access>
                  <network-access-id>Spoke_UNI-Site1</network-access-id>
                    <access-diversity>
                      <groups>
                        <group>
                          <group-id>20</group-id>
                        </group>
                      </groups>
                    </access-diversity>
                      <connection>
                       <encapsulation-type>vlan</encapsulation-type>
                        <tagged-interface>
                        <dot1q-vlan-tagged>
                          <cvlan-id>17</cvlan-id>
                        </dot1q-vlan-tagged>
                        </tagged-interface>
                        <l2cp-control>
                          <stp-rstp-mstp>tunnel</stp-rstp-mstp>
                          <lldp>true</lldp>
                        </l2cp-control>
                      </connection>
                      <service>
                        <svc-bandwidth>
                          <bandwidth>
                           <direction>input-bw</direction>
                            <type>bw-per-cos</type>
                             <cir>450000000</cir>
                             <cbs>20000000</cbs>
                             <eir>1000000000</eir>
                             <ebs>200000000</ebs>
                          </bandwidth>
                        </svc-bandwidth>
                        <carrierscarrier>
                         <signaling-type>bgp</signaling-type>
                        </carrierscarrier>
                     </service>
                      <vpn-attachment>
                        <vpn-id>12456487</vpn-id>
                        <site-role>spoke-role</site-role>
                      </vpn-attachment>
                    </site-network-access>
                  </site-network-accesses>
                  <management>
                    <type>provider-managed</type>
                  </management>
                </site>
          </sites>
      </l2vpn-svc>

При получении запроса на предоставление Spoke-сайта 1 система управления должна выделить сетевые ресурсы для этого сайта. Она должна сначала определить целевые элементы сети для предоставления доступа и, в частности, устройство PE (возможно, агрегирующий коммутатор). Как описано в параграфах 5.3.1 и 5.6, системе управления следует использовать данные о местоположении и она должна применять ограничения при доступе (access-diversity) для поиска подходящего PE. В этом случае мы считаем, что Spoke-сайт 1 требует разнесения PE с Hub-сайтами и система управления будет выбирать PE по наименьшей удалённости. На основе данных о местоположении система управления найдёт доступные PE в ближней к абоненту окрестности и укажет среди них подходящий по требованиям к разнесению доступа.

После выбора PE система управления должна выделить интерфейсные ресурсы на узле. Из доступных ресурсов PE выбирается один интерфейс. Система управления может начать инициализацию узла PE, используя любые удобные средства (например, NETCONF, CLI). Система управления проверит наличие таблицы виртуальной маршрутизации VSI, соответствующей потребностям. Если такой таблицы нет, система предоставит её — значение RD будет выбрано в соответствии с внутренней политикой, а значения RT будут выведены из конфигурации vpn-policy для сайта (т. е. система управления будет выделять некие значения RT для VPN). Поскольку сайт относится к типу Spoke (site-role), система управления знает, какие RT должны экспортироваться и импортироваться. Сайт управляется провайдером, поэтому могут быть добавлены значения RT для управления (100:5000). В конфигурацию могут также добавляться стандартные для провайдера правила VPN.

Пример созданной конфигурации PE приведён ниже.

l2vpn vsi context one
  vpn id 12456487
     autodiscovery bgp signaling bgp
     ve id 1001     <---- Указывает маршрутизаторы PE в домене VPLS
     ve range 50    <---- Размер VPLS Edge (VE)
     route-distinguisher 100:3123234324
     route-target import 100:1
     route-target import 100:5000    <---- Стандартная конфигурация SP 
     route-target export 100:2             для управляемого провайдером CE
   !

Когда таблица VSI предоставлена, система управления может начать настройку доступа на PE с использованием информации о выделенном интерфейсе. Тег или VLAN (например, тег экземпляра сервиса) выбирается системой управления. Один тег будет выбран из выделенной для PE подсети, другой будет служить для настройки CE.

Между PE и CE будут также настроены протоколы LACP. В модели с провайдерским управлением это будет делать SP. Этот выбор не зависит от протокола LACP, выбранного абонентом.

Пример созданной конфигурации PE показан ниже.

   !
   bridge-domain 1
    member Ethernet0/0 service-instance 100
    member vsi one
   !
   l2 router-id 198.51.100.1
   !
   l2 router-id 2001:db8::10:1/64
   !

   interface Ethernet0/0
    no ip address
    service instance 100 ethernet
   encapsulation dot1q 100
    !

   !
   router bgp 1
    bgp log-neighbor-changes
    neighbor 198.51.100.4 remote-as 1
    neighbor 198.51.100.4 update-source Loopback0
    !
    address-family l2vpn vpls
     neighbor 198.51.100.4 activate
     neighbor 198.51.100.4 send-community extended
     neighbor 198.51.100.4 suppress-signaling-protocol ldp
     neighbor 2001:db8::0a10:4 activate
     neighbor 2001:db8::0a10:4 send-community extended
    exit-address-family

   !
   interface vlan 100     <---- Связывание AC с MAC-VRF на PE 
     no ip address
     xconnect vsi PE1-VPLS-A
   !
   vlan 100
     state active

Поскольку маршрутизатор CE на этом этапе не доступен, система управления может создать полную конфигурацию CE для загрузки вручную (например, до передачи устройства CE абоненту, как описано в параграфе 5.3.1). Конфигурация CE будет создаваться таким же способом, как для устройства PE. На основе (1) типа CE (производитель, модель), выделенного абоненту, и (2) данных о носителе (bearer) система управления определяет требующий настройки интерфейс CE. Предполагается, что настройка канала PE-CE будет выполняться автоматически с использованием провайдерской системы OSS, поскольку оба ресурса обслуживаются внутри. Параметры интерфейса между CE и ЛВС, такие как теги dot1Q, выводятся из соединения Ethernet с учётом распространения системой управления тегов dot1Q между PE и CE внутри подсети. Это позволяет создать для CE конфигурацию plug’n’play.

Пример созданной конфигурации CE показан ниже.

   interface Ethernet0/1
     switchport trunk allowed vlan none
     switchport mode trunk
     service instance 100 ethernet
     encapsulation default
     l2protocol forward cdp
     xconnect 203.0.113.1 100 encapsulation mpls
   !

8. Модуль YANG

Этот модуль YANG импортирует определения типов (typedef) из [RFC6991] и [RFC8341].

<CODE BEGINS> file "ietf-l2vpn-svc@2018-10-09.yang"
module ietf-l2vpn-svc {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc";
  prefix l2vpn-svc;

  import ietf-inet-types {
    prefix inet;
  }
  import ietf-yang-types {
    prefix yang;
  }
  import ietf-netconf-acm {
    prefix nacm;
  }

  organization
    "IETF L2SM Working Group.";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/l2sm/> 
     WG List:  <mailto:l2sm@ietf.org> 
     Editor:   Giuseppe Fioccola
               <mailto:giuseppe.fioccola@tim.it>"; 
  description
    "This YANG module defines a generic service configuration model
     for Layer 2 VPN services common across all vendor
     implementations.

     Copyright (c) 2018 IETF Trust and the persons
     identified as authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject
     to the license terms contained in, the Simplified BSD License
     set forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info). 

     This version of this YANG module is part of RFC 8466;
     see the RFC itself for full legal notices.";

  revision 2018-10-09 {
    description
      "Initial revision.";
    reference
      "RFC 8466: A YANG Data Model for Layer 2 Virtual Private
       Network (L2VPN) Service Delivery";
  }

  feature carrierscarrier {
    description
      "Enables the support of carriers' carriers (CsC).";
  }

  feature ethernet-oam {
    description
      "Enables the support of Ethernet Service OAM.";
  }

  feature extranet-vpn {
    description
      "Enables the support of extranet VPNs.";
  }

  feature l2cp-control {
    description
      "Enables the support of L2CP control.";
  }

  feature input-bw {
    description
      "Enables the support of input bandwidth in a VPN.";
  }

  feature output-bw {
    description
      "Enables the support of output bandwidth in a VPN.";
  }

  feature uni-list {
    description
      "Enables the support of a list of UNIs in a VPN.";
  }

  feature cloud-access {
    description
      "Allows the VPN to connect to a Cloud Service Provider (CSP)
       or an ISP.";
  }

  feature oam-3ah {
    description
      "Enables the support of OAM 802.3ah.";
  }

  feature micro-bfd {
    description
      "Enables the support of micro-BFD.";
  }

  feature bfd {
    description
      "Enables the support of BFD.";
  }

  feature signaling-options {
    description
      "Enables the support of signaling options.";
  }

  feature site-diversity {
    description
      "Enables the support of site diversity constraints in a VPN.";
  }

  feature encryption {
    description
      "Enables the support of encryption.";
  }

  feature always-on {
    description
      "Enables support for the 'always-on' access constraint.";
  }

  feature requested-type {
    description
      "Enables support for the 'requested-type' access constraint.";
  }

  feature bearer-reference {
    description
      "Enables support for the 'bearer-reference' access
       constraint.";
  }

  feature qos {
    description
      "Enables support for QoS.";
  }

  feature qos-custom {
    description
      "Enables the support of a custom QoS profile.";
  }

  feature lag-interface {
    description
      "Enables LAG interfaces.";
  }

  feature vlan {
    description
      "Enables the support of VLANs.";
  }

  feature dot1q {
    description
      "Enables the support of dot1Q.";
  }

  feature qinq {
    description
      "Enables the support of QinQ.";
  }

  feature qinany {
    description
      "Enables the support of QinAny.";
  }

  feature vxlan {
    description
      "Enables the support of VXLANs.";
  }

  feature lan-tag {
    description
      "Enables LAN tag support in a VPN.";
  }

  feature target-sites {
    description
      "Enables the support of the 'target-sites'
       match-flow parameter.";
  }

  feature bum {
    description
      "Enables BUM capabilities in a VPN.";
  }

  feature mac-loop-prevention {
    description
      "Enables the MAC loop-prevention capability in a VPN.";
  }

  feature lacp {
    description
      "Enables the Link Aggregation Control Protocol (LACP)
       capability in a VPN.";
  }

  feature mac-addr-limit {
    description
      "Enables the MAC address limit capability in a VPN.";
  }

  feature acl {
    description
      "Enables the ACL capability in a VPN.";
  }

  feature cfm {
    description
      "Enables the 802.1ag CFM capability in a VPN.";
  }

  feature y-1731 {
    description
      "Enables the Y.1731 capability in a VPN.";
  }

  typedef svc-id {
    type string;
    description
      "Defines the type of service component identifier.";
  }

  typedef ccm-priority-type {
    type uint8 {
      range "0..7";
    }
    description
      "A 3-bit priority value to be used in the VLAN tag,
       if present in the transmitted frame.";
  }

  typedef control-mode {
    type enumeration {
      enum peer {
        description
          "'peer' mode, i.e., participate in the protocol towards
           the CE.  Peering is common for LACP and the Ethernet
           Local Management Interface (E-LMI) and, occasionally,
           for LLDP.  For VPLSs and VPWSs, the subscriber can also
           request that the SP peer enable spanning tree.";
      }
      enum tunnel {
        description
          "'tunnel' mode, i.e., pass to the egress or destination
           site.  For EPLs, the expectation is that L2CP frames are
           tunneled.";
      }
      enum discard {
        description
          "'discard' mode, i.e., discard the frame.";
      }
    }
    description
      "Defines the type of control mode on L2CP protocols.";
  }

  typedef neg-mode {
    type enumeration {
      enum full-duplex {
        description
          "Defines full-duplex mode.";
      }
      enum auto-neg {
        description
          "Defines auto-negotiation mode.";
      }
    }
    description
      "Defines the type of negotiation mode.";
  }

  identity site-network-access-type {
    description
      "Base identity for the site-network-access type.";
  }

  identity point-to-point {
    base site-network-access-type;
    description
      "Identity for a point-to-point connection.";
  }

  identity multipoint {
    base site-network-access-type;
    description
      "Identity for a multipoint connection, e.g.,
       an Ethernet broadcast segment.";
  }

  identity tag-type {
    description
      "Base identity from which all tag types are derived.";
  }

  identity c-vlan {
    base tag-type;
    description
      "A CVLAN tag, normally using the 0x8100 Ethertype.";
  }

  identity s-vlan {
    base tag-type;
    description
      "An SVLAN tag.";
  }

  identity c-s-vlan {
    base tag-type;
    description
      "Using both a CVLAN tag and an SVLAN tag.";
  }

  identity multicast-tree-type {
    description
      "Base identity for the multicast tree type.";
  }

  identity ssm-tree-type {
    base multicast-tree-type;
    description
      "Identity for the Source-Specific Multicast (SSM) tree type.";
    reference "RFC 8299: YANG Data Model for L3VPN Service Delivery";
  }

  identity asm-tree-type {
    base multicast-tree-type;
    description
      "Identity for the Any-Source Multicast (ASM) tree type.";
    reference "RFC 8299: YANG Data Model for L3VPN Service Delivery";
  }

  identity bidir-tree-type {
    base multicast-tree-type;
    description
      "Identity for the bidirectional tree type.";
    reference "RFC 8299: YANG Data Model for L3VPN Service Delivery";
  }

  identity multicast-gp-address-mapping {
    description
      "Identity for mapping type.";
  }

  identity static-mapping {
    base multicast-gp-address-mapping;
    description
      "Identity for static mapping, i.e., attach the interface
       to the multicast group as a static member.";
  }

  identity dynamic-mapping {
    base multicast-gp-address-mapping;
    description
      "Identity for dynamic mapping, i.e., an interface was added
       to the multicast group as a result of snooping.";
  }

  identity tf-type {
    description
      "Identity for the traffic type.";
  }

  identity multicast-traffic {
    base tf-type;
    description
      "Identity for multicast traffic.";
  }

  identity broadcast-traffic {
    base tf-type;
    description
      "Identity for broadcast traffic.";
  }

  identity unknown-unicast-traffic {
    base tf-type;
    description
      "Identity for unknown unicast traffic.";
  }

  identity encapsulation-type {
    description
      "Identity for the encapsulation type.";
  }

  identity ethernet {
    base encapsulation-type;
    description
      "Identity for Ethernet type.";
  }

  identity vlan {
    base encapsulation-type;
    description
      "Identity for the VLAN type.";
  }

  identity carrierscarrier-type {
    description
      "Identity of the CsC type.";
  }

  identity ldp {
    base carrierscarrier-type;
    description
      "Use LDP as the signaling protocol
       between the PE and the CE.";
  }

  identity bgp {
    base carrierscarrier-type;
    description
      "Use BGP (as per RFC 8277) as the signaling protocol
       between the PE and the CE.
       In this case, BGP must also be configured as
       the routing protocol.";
  }

  identity eth-inf-type {
    description
      "Identity of the Ethernet interface type.";
  }

  identity tagged {
    base eth-inf-type;
    description
      "Identity of the tagged interface type.";
  }

  identity untagged {
    base eth-inf-type;
    description
      "Identity of the untagged interface type.";
  }

  identity lag {
    base eth-inf-type;
    description
      "Identity of the LAG interface type.";
  }

  identity bw-type {
    description
      "Identity of the bandwidth type.";
  }

  identity bw-per-cos {
    base bw-type;
    description
      "Bandwidth is per CoS.";
  }

  identity bw-per-port {
    base bw-type;
    description
      "Bandwidth is per site network access.";
  }

  identity bw-per-site {
    base bw-type;
    description
      "Bandwidth is per site.  It is applicable to
       all the site network accesses within the site.";
  }

  identity bw-per-svc {
    base bw-type;
    description
      "Bandwidth is per VPN service.";
  }

  identity site-vpn-flavor {
    description
      "Base identity for the site VPN service flavor.";
  }

  identity site-vpn-flavor-single {
    base site-vpn-flavor;
    description
      "Identity for the site VPN service flavor.
       Used when the site belongs to only one VPN.";
  }

  identity site-vpn-flavor-multi {
    base site-vpn-flavor;
    description
      "Identity for the site VPN service flavor.
       Used when a logical connection of a site
       belongs to multiple VPNs.";
  }

  identity site-vpn-flavor-nni {
    base site-vpn-flavor;
    description
      "Identity for the site VPN service flavor.
       Used to describe an NNI option A connection.";
  }

  identity service-type {
    description
      "Base identity of the service type.";
  }

  identity vpws {
    base service-type;
    description
      "Point-to-point Virtual Private Wire Service (VPWS)
       service type.";
  }

  identity pwe3 {
    base service-type;
    description
      "Pseudowire Emulation Edge to Edge (PWE3) service type.";
  }

  identity ldp-l2tp-vpls {
    base service-type;
    description
      "LDP-based or L2TP-based multipoint Virtual Private LAN
       Service (VPLS) service type.  This VPLS uses LDP-signaled
       Pseudowires or L2TP-signaled Pseudowires.";
  }

  identity bgp-vpls {
    base service-type;
    description
      "BGP-based multipoint VPLS service type.  This VPLS uses a
       BGP control plane as described in RFCs 4761 and 6624.";
  }

  identity vpws-evpn {
    base service-type;
    description
      "VPWS service type using Ethernet VPNs (EVPNs)
       as specified in RFC 7432.";
  }

  identity pbb-evpn {
    base service-type;
    description
      "Provider Backbone Bridge (PBB) service type using
       EVPNs as specified in RFC 7432.";
  }

  identity bundling-type {
    description
      "The base identity for the bundling type.  It supports
       multiple CE-VLANs associated with an L2VPN service or
       all CE-VLANs associated with an L2VPN service.";
  }

  identity multi-svc-bundling {
    base bundling-type;
    description
      "Identity for multi-service bundling, i.e.,
       multiple CE-VLAN IDs can be associated with an
       L2VPN service at a site.";
  }

  identity one2one-bundling {
    base bundling-type;
    description
      "Identity for one-to-one service bundling, i.e.,
       each L2VPN can be associated with only one CE-VLAN ID
       at a site.";
  }

  identity all2one-bundling {
    base bundling-type;
    description
      "Identity for all-to-one bundling, i.e., all CE-VLAN IDs
       are mapped to one L2VPN service.";
  }

  identity color-id {
    description
      "Base identity of the color ID.";
  }

  identity color-id-cvlan {
    base color-id;
    description
      "Identity of the color ID based on a CVLAN.";
  }

  identity cos-id {
    description
      "Identity of the CoS ID.";
  }

  identity cos-id-pcp {
    base cos-id;
    description
      "Identity of the CoS ID based on the
       Port Control Protocol (PCP).";
  }

  identity cos-id-dscp {
    base cos-id;
    description
      "Identity of the CoS ID based on DSCP.";
  }

  identity color-type {
    description
      "Identity of color types.";
  }

  identity green {
    base color-type;
    description
      "Identity of the 'green' color type.";
  }

  identity yellow {
    base color-type;
    description
      "Identity of the 'yellow' color type.";
  }

  identity red {
    base color-type;
    description
      "Identity of the 'red' color type.";
  }

  identity policing {
    description
      "Identity of the type of policing applied.";
  }

  identity one-rate-two-color {
    base policing;
    description
      "Identity of one-rate, two-color (1R2C).";
  }

  identity two-rate-three-color {
    base policing;
    description
      "Identity of two-rate, three-color (2R3C).";
  }

  identity bum-type {
    description
      "Identity of the BUM type.";
  }

  identity broadcast {
    base bum-type;
    description
      "Identity of broadcast.";
  }

  identity unicast {
    base bum-type;
    description
      "Identity of unicast.";
  }

  identity multicast {
    base bum-type;
    description
      "Identity of multicast.";
  }

  identity loop-prevention-type {
    description
      "Identity of loop prevention.";
  }

  identity shut {
    base loop-prevention-type;
    description
      "Identity of shut protection.";
  }

  identity trap {
    base loop-prevention-type;
    description
      "Identity of trap protection.";
  }

  identity lacp-state {
    description
      "Identity of the LACP state.";
  }

  identity lacp-on {
    base lacp-state;
    description
      "Identity of LACP on.";
  }

  identity lacp-off {
    base lacp-state;
    description
      "Identity of LACP off.";
  }

  identity lacp-mode {
    description
      "Identity of the LACP mode.";
  }

  identity lacp-passive {
    base lacp-mode;
    description
      "Identity of LACP passive.";
  }

  identity lacp-active {
    base lacp-mode;
    description
      "Identity of LACP active.";
  }

  identity lacp-speed {
    description
      "Identity of the LACP speed.";
  }

  identity lacp-fast {
    base lacp-speed;
    description
      "Identity of LACP fast.";
  }

  identity lacp-slow {
    base lacp-speed;
    description
      "Identity of LACP slow.";
  }

  identity bw-direction {
    description
      "Identity for the bandwidth direction.";
  }

  identity input-bw {
    base bw-direction;
    description
      "Identity for the input bandwidth.";
  }

  identity output-bw {
    base bw-direction;
    description
      "Identity for the output bandwidth.";
  }

  identity management {
    description
      "Base identity for the site management scheme.";
  }

  identity co-managed {
    base management;
    description
      "Identity for a co-managed site.";
  }

  identity customer-managed {
    base management;
    description
      "Identity for a customer-managed site.";
  }

  identity provider-managed {
    base management;
    description
      "Identity for a provider-managed site.";
  }

  identity address-family {
    description
      "Identity for an address family.";
  }

  identity ipv4 {
    base address-family;
    description
      "Identity for an IPv4 address family.";
  }

  identity ipv6 {
    base address-family;
    description
      "Identity for an IPv6 address family.";
  }

  identity vpn-topology {
    description
      "Base identity for the VPN topology.";
  }

  identity any-to-any {
    base vpn-topology;
    description
      "Identity for the any-to-any VPN topology.";
  }

  identity hub-spoke {
    base vpn-topology;
    description
      "Identity for the Hub-and-Spoke VPN topology.";
  }

  identity hub-spoke-disjoint {
    base vpn-topology;
    description
      "Identity for the Hub-and-Spoke VPN topology,
       where Hubs cannot communicate with each other.";
  }

  identity site-role {
    description
      "Base identity for a site type.";
  }

  identity any-to-any-role {
    base site-role;
    description
      "Site in an any-to-any L2VPN.";
  }

  identity spoke-role {
    base site-role;
    description
      "Spoke site in a Hub-and-Spoke L2VPN.";
  }

  identity hub-role {
    base site-role;
    description
      "Hub site in a Hub-and-Spoke L2VPN.";
  }

  identity pm-type {
    description
      "Performance-monitoring type.";
  }

  identity loss {
    base pm-type;
    description
      "Loss measurement.";
  }

  identity delay {
    base pm-type;
    description
      "Delay measurement.";
  }

  identity fault-alarm-defect-type {
    description
      "Indicates the alarm-priority defect (i.e., the
       lowest-priority defect that is allowed to
       generate a fault alarm).";
  }

  identity remote-rdi {
    base fault-alarm-defect-type;
    description
      "Indicates the aggregate health
       of the Remote MEPs.";
  }

  identity remote-mac-error {
    base fault-alarm-defect-type;
    description
      "Indicates that one or more of the Remote MEPs are
       reporting a failure in their Port Status TLVs or
       Interface Status TLVs.";
  }

  identity remote-invalid-ccm {
    base fault-alarm-defect-type;
    description
      "Indicates that at least one of the Remote MEP
       state machines is not receiving valid
       Continuity Check Messages (CCMs) from its Remote MEP.";
  }

  identity invalid-ccm {
    base fault-alarm-defect-type;
    description
      "Indicates that one or more invalid CCMs have been
       received and that a period of time 3.5 times the length
       of those CCMs' transmission intervals has not yet expired.";
  }

  identity cross-connect-ccm {
    base fault-alarm-defect-type;
    description
      "Indicates that one or more cross-connect CCMs have been
       received and that 3.5 times the period of at least one of
       those CCMs' transmission intervals has not yet expired.";
  }

  identity frame-delivery-mode {
    description
      "Delivery types.";
  }

  identity discard {
    base frame-delivery-mode;
    description
      "Service frames are discarded.";
  }

  identity unconditional {
    base frame-delivery-mode;
    description
      "Service frames are unconditionally delivered to the
       destination site.";
  }

  identity unknown-discard {
    base frame-delivery-mode;
    description
      "Service frames are conditionally delivered to the
       destination site.  Packets with unknown destination addresses
       will be discarded.";
  }

  identity placement-diversity {
    description
      "Base identity for site placement constraints.";
  }

  identity bearer-diverse {
    base placement-diversity;
    description
      "Identity for bearer diversity.
       The bearers should not use common elements.";
  }

  identity pe-diverse {
    base placement-diversity;
    description
      "Identity for PE diversity.";
  }

  identity pop-diverse {
    base placement-diversity;
    description
      "Identity for POP diversity.";
  }

  identity linecard-diverse {
    base placement-diversity;
    description
      "Identity for linecard diversity.";
  }

  identity same-pe {
    base placement-diversity;
    description
      "Identity for having sites connected on the same PE.";
  }

  identity same-bearer {
    base placement-diversity;
    description
      "Identity for having sites connected using the same bearer.";
  }

  identity tagged-inf-type {
    description
      "Identity for the tagged interface type.";
  }

  identity priority-tagged {
    base tagged-inf-type;
    description
      "Identity for the priority-tagged interface.";
  }

  identity qinq {
    base tagged-inf-type;
    description
      "Identity for the QinQ tagged interface.";
  }

  identity dot1q {
    base tagged-inf-type;
    description
      "Identity for the dot1Q VLAN tagged interface.";
  }

  identity qinany {
    base tagged-inf-type;
    description
      "Identity for the QinAny tagged interface.";
  }

  identity vxlan {
    base tagged-inf-type;
    description
      "Identity for the VXLAN tagged interface.";
  }

  identity provision-model {
    description
      "Base identity for the provision model.";
  }

  identity single-side-provision {
    description
      "Identity for single-sided provisioning with discovery.";
  }

  identity doubled-side-provision {
    description
      "Identity for double-sided provisioning.";
  }

  identity mac-learning-mode {
    description
      "MAC learning mode.";
  }

  identity data-plane {
    base mac-learning-mode;
    description
      "User MAC addresses are learned through ARP broadcast.";
  }

  identity control-plane {
    base mac-learning-mode;
    description
      "User MAC addresses are advertised through EVPN-BGP.";
  }

  identity vpn-policy-filter-type {
    description
      "Base identity for the filter type.";
  }

  identity lan {
    base vpn-policy-filter-type;
    description
      "Identity for a LAN tag filter type.";
  }

  identity mac-action {
    description
      "Base identity for a MAC action.";
  }

  identity drop {
    base mac-action;
    description
      "Identity for dropping a packet.";
  }

  identity flood {
    base mac-action;
    description
      "Identity for packet flooding.";
  }

  identity warning {
    base mac-action;
    description
      "Identity for sending a warning log message.";
  }

  identity qos-profile-direction {
    description
      "Base identity for the QoS-profile direction.";
   }

  identity site-to-wan {
    base qos-profile-direction;
    description
      "Identity for the site-to-WAN direction.";
  }

  identity wan-to-site {
    base qos-profile-direction;
    description
      "Identity for the WAN-to-site direction.";
  }

  identity bidirectional {
    base qos-profile-direction;
    description
      "Identity for both the WAN-to-site direction
       and the site-to-WAN direction.";
  }

  identity vxlan-peer-mode {
    description
      "Base identity for the VXLAN peer mode.";
  }

  identity static-mode {
    base vxlan-peer-mode;
    description
      "Identity for VXLAN access in the static mode.";
  }

  identity bgp-mode {
    base vxlan-peer-mode;
    description
      "Identity for VXLAN access by BGP EVPN learning.";
  }

  identity customer-application {
    description
      "Base identity for a customer application.";
  }

  identity web {
    base customer-application;
    description
      "Identity for a web application (e.g., HTTP, HTTPS).";
  }

  identity mail {
    base customer-application;
    description
      "Identity for a mail application.";
  }

  identity file-transfer {
    base customer-application;
    description
      "Identity for a file-transfer application
       (e.g., FTP, SFTP).";
  }

  identity database {
    base customer-application;
    description
      "Identity for a database application.";
  }

  identity social {
    base customer-application;
    description
      "Identity for a social-network application.";
  }

  identity games {
    base customer-application;
    description
      "Identity for a gaming application.";
  }

  identity p2p {
    base customer-application;
    description
      "Identity for a peer-to-peer application.";
  }

  identity network-management {
    base customer-application;
    description
      "Identity for a management application
       (e.g., Telnet, syslog, SNMP).";
  }

  identity voice {
    base customer-application;
    description
      "Identity for a voice application.";
  }

  identity video {
    base customer-application;
    description
      "Identity for a videoconference application.";
  }

  identity embb {
    base customer-application;
    description
      "Identity for the enhanced Mobile Broadband (eMBB)
       application.  Note that the eMBB application
       requires strict threshold values for a wide variety
       of network performance parameters (e.g., data rate,
       latency, loss rate, reliability).";
  }

  identity urllc {
    base customer-application;
    description
      "Identity for the Ultra-Reliable and Low Latency
       Communications (URLLC) application.  Note that the
       URLLC application requires strict threshold values for
       a wide variety of network performance parameters
       (e.g., latency, reliability).";
  }

  identity mmtc {
    base customer-application;
    description
      "Identity for the massive Machine Type
       Communications (mMTC) application.  Note that the
       mMTC application requires strict threshold values for
       a wide variety of network performance parameters
       (e.g., data rate, latency, loss rate, reliability).";
  }

  grouping site-acl {
    container access-control-list {
      if-feature "acl";
      list mac {
        key "mac-address";
        leaf mac-address {
          type yang:mac-address;
          description
            "MAC addresses.";
        }
        description
          "List of MAC addresses.";
      }
      description
        "Container for the ACL.";
    }
    description
      "Grouping that defines the ACL.";
  }

  grouping site-bum {
    container broadcast-unknown-unicast-multicast {
      if-feature "bum";
      leaf multicast-site-type {
        type enumeration {
          enum receiver-only {
            description
              "The site only has receivers.";
          }
          enum source-only {
            description
              "The site only has sources.";
          }
          enum source-receiver {
            description
              "The site has both sources and receivers.";
          }
        }
        default "source-receiver";
        description
          "Type of multicast site.";
      }
      list multicast-gp-address-mapping {
        key "id";
        leaf id {
          type uint16;
          description
            "Unique identifier for the mapping.";
        }
        leaf vlan-id {
          type uint16 {
            range "0..1024";
          }
          mandatory true;
          description
            "The VLAN ID of the multicast group.
             The range of the 12-bit VLAN ID is 0 to 1024.";
        }
        leaf mac-gp-address {
          type yang:mac-address;
          mandatory true;
          description
            "The MAC address of the multicast group.";
        }
        leaf port-lag-number {
          type uint32;
          description
            "The ports/LAGs belonging to the multicast group.";
        }
        description
          "List of port-to-group mappings.";
      }
      leaf bum-overall-rate {
        type uint64;
        units "bps";
        description
          "Overall rate for BUM.";
      }
      list bum-rate-per-type {
        key "type";
        leaf type {
          type identityref {
            base bum-type;
          }
          description
            "BUM type.";
        }
        leaf rate {
          type uint64;
          units "bps";
          description
            "Rate for BUM.";
        }
        description
          "List of limit rates for the BUM type.";
      }
      description
        "Container of BUM configurations.";
    }
    description
      "Grouping for BUM.";
  }

  grouping site-mac-loop-prevention {
    container mac-loop-prevention {
      if-feature "mac-loop-prevention";
      leaf protection-type {
        type identityref {
          base loop-prevention-type;
        }
        default "trap";
        description
          "Protection type.  By default, the protection
           type is 'trap'.";
      }
      leaf frequency {
        type uint32;
        default "5";
        description
          "The number of times to detect MAC duplication, where
           a 'duplicate MAC address' situation has occurred and
           the duplicate MAC address has been added to a list of
           duplicate MAC addresses.  By default, the number of
           times is 5.";
      }
      leaf retry-timer {
        type uint32;
        units "seconds";
        description
          "The retry timer.  When the retry timer expires,
           the duplicate MAC address will be flushed from
           the MAC-VRF.";
      }
      description
        "Container of MAC loop-prevention parameters.";
    }
    description
      "Grouping for MAC loop prevention.";
  }

  grouping site-service-qos-profile {
    container qos {
      if-feature "qos";
      container qos-classification-policy {
        list rule {
          key "id";
          ordered-by user;
          leaf id {
            type string;
            description
              "A description identifying the QoS classification
               policy rule.";
          }
          choice match-type {
            default "match-flow";
            case match-flow {
              container match-flow {
                leaf dscp {
                  type inet:dscp;
                  description
                    "DSCP value.";
                }
                leaf dot1q {
                  type uint16;
                  description
                    "802.1Q matching.  It is a VLAN tag added into
                     a frame.";
                }
                leaf pcp {
                  type uint8 {
                    range "0..7";
                  }
                  description
                    "PCP value.";
                }
                leaf src-mac {
                  type yang:mac-address;
                  description
                    "Source MAC.";
                }
                leaf dst-mac {
                  type yang:mac-address;
                  description
                    "Destination MAC.";
                }
                leaf color-type {
                  type identityref {
                    base color-type;
                  }
                  description
                    "Color types.";
                }
                leaf-list target-sites {
                  if-feature "target-sites";
                  type svc-id;
                  description
                    "Identifies a site as a traffic destination.";
                }
                leaf any {
                  type empty;
                  description
                    "Allow all.";
                }
                leaf vpn-id {
                  type svc-id;
                  description
                    "Reference to the target VPN.";
                }
                description
                  "Describes flow-matching criteria.";
              }
            }
            case match-application {
              leaf match-application {
                type identityref {
                  base customer-application;
                }
                description
                  "Defines the application to match.";
              }
            }
            description
              "Choice for classification.";
          }
          leaf target-class-id {
            type string;
            description
              "Identification of the CoS.
               This identifier is internal to the
               administration.";
          }
          description
            "List of marking rules.";
        }
        description
          "Configuration of the traffic classification policy.";
      }
      container qos-profile {
        choice qos-profile {
          description
            "Choice for the QoS profile.
             Can be a standard profile or a customized profile.";
          case standard {
            description
              "Standard QoS profile.";
            leaf profile {
              type leafref {
                path "/l2vpn-svc/vpn-profiles/"
                   + "valid-provider-identifiers/"
                   + "qos-profile-identifier";
              }
              description
                "QoS profile to be used.";
            }
          }
          case custom {
            description
              "Customized QoS profile.";
            container classes {
              if-feature "qos-custom";
              list class {
                key "class-id";
                leaf class-id {
                  type string;
                  description
                    "Identification of the CoS.  This identifier is
                     internal to the administration.";
                }
                leaf direction {
                  type identityref {
                    base qos-profile-direction;
                  }
                  default "bidirectional";
                  description
                    "The direction in which the QoS profile is
                     applied.  By default, the direction is
                     bidirectional.";
                }
                leaf policing {
                  type identityref {
                    base policing;
                  }
                  default "one-rate-two-color";
                  description
                    "The policing type can be either one-rate,
                     two-color (1R2C) or two-rate, three-color
                     (2R3C).  By default, the policing type is
                     'one-rate-two-color'.";
                }
                leaf byte-offset {
                  type uint16;
                  description
                    "Number of bytes in the service frame header
                     that are excluded from the QoS calculation
                     (e.g., extra VLAN tags).";
                }
                container frame-delay {
                  choice flavor {
                    case lowest {
                      leaf use-lowest-latency {
                        type empty;
                        description
                          "The traffic class should use the path
                           with the lowest delay.";
                      }
                    }
                    case boundary {
                      leaf delay-bound {
                        type uint16;
                        units "milliseconds";
                        description
                          "The traffic class should use a path
                           with a defined maximum delay.";
                      }
                    }
                    description
                      "Delay constraint on the traffic class.";
                  }
                  description
                    "Delay constraint on the traffic class.";
                }
                container frame-jitter {
                  choice flavor {
                    case lowest {
                      leaf use-lowest-jitter {
                        type empty;
                        description
                          "The traffic class should use the path
                           with the lowest jitter.";
                      }
                    }
                    case boundary {
                      leaf delay-bound {
                        type uint32;
                        units "microseconds";
                        description
                          "The traffic class should use a path
                           with a defined maximum jitter.";
                      }
                    }
                    description
                      "Jitter constraint on the traffic class.";
                  }
                  description
                    "Jitter constraint on the traffic class.";
                }
                container frame-loss {
                  leaf rate {
                    type decimal64 {
                      fraction-digits 2;
                      range "0..100";
                    }
                    units "percent";
                    description
                      "Frame loss rate constraint on the traffic
                       class.";
                  }
                  description
                    "Container for frame loss rate.";
                }
                container bandwidth {
                  leaf guaranteed-bw-percent {
                    type decimal64 {
                      fraction-digits 5;
                      range "0..100";
                    }
                    units "percent";
                    mandatory true;
                    description
                      "Used to define the guaranteed bandwidth
                       as a percentage of the available service
                       bandwidth.";
                  }
                  leaf end-to-end {
                    type empty;
                    description
                      "Used if the bandwidth reservation
                       must be done on the MPLS network too.";
                  }
                  description
                    "Bandwidth constraint on the traffic class.";
                }
                description
                  "List of CoS entries.";
              }
              description
                "Container for list of CoS entries.";
            }
          }
        }
        description
          "Qos profile configuration.";
      }
      description
        "QoS configuration.";
    }
    description
      "Grouping that defines QoS parameters for a site.";
  }

  grouping site-service-mpls {
    container carrierscarrier {
      if-feature "carrierscarrier";
      leaf signaling-type {
        type identityref {
          base carrierscarrier-type;
        }
        default "bgp";
        description
          "CsC.  By default, the signaling type is 'bgp'.";
      }
      description
        "Container for CsC.";
    }
    description
      "Grouping for CsC.";
  }

  container l2vpn-svc {
    container vpn-profiles {
      container valid-provider-identifiers {
        leaf-list cloud-identifier {
          if-feature "cloud-access";
          type string;
          description
            "Identification of the public cloud service or
             Internet service.  Local to each administration.";
        }
        leaf-list qos-profile-identifier {
          type string;
          description
            "Identification of the QoS profile to be used.
             Local to each administration.";
        }
        leaf-list bfd-profile-identifier {
          type string;
          description
            "Identification of the SP BFD profile to be used.
             Local to each administration.";
        }
        leaf-list remote-carrier-identifier {
          type string;
          description
            "Identification of the remote carrier name to be used.
             It can be an L2VPN partner, data-center SP, or
             private CSP.  Local to each administration.";
        }
        nacm:default-deny-write;
        description
          "Container for valid provider identifiers.";
      }
      description
        "Container for VPN profiles.";
    }
    container vpn-services {
      list vpn-service {
        key "vpn-id";
        leaf vpn-id {
          type svc-id;
          description
            "Defines a service identifier.";
        }
        leaf vpn-svc-type {
          type identityref {
            base service-type;
          }
          default "vpws";
          description
            "Service type.  By default, the service type is 'vpws'.";
        }
        leaf customer-name {
          type string;
          description
            "Customer name.";
        }
        leaf svc-topo {
          type identityref {
            base vpn-topology;
          }
          default "any-to-any";
          description
            "Defines the service topology, e.g.,
             'any-to-any', 'hub-spoke'.";
        }
        container cloud-accesses {
          if-feature "cloud-access";
          list cloud-access {
            key "cloud-identifier";
            leaf cloud-identifier {
              type leafref {
                path "/l2vpn-svc/vpn-profiles/"
                   + "valid-provider-identifiers"
                   + "/cloud-identifier";
              }
              description
                "Identification of the cloud service.
                 Local to each administration.";
            }
            choice list-flavor {
              case permit-any {
                leaf permit-any {
                  type empty;
                  description
                    "Allow all sites.";
                }
              }
              case deny-any-except {
                leaf-list permit-site {
                  type leafref {
                    path "/l2vpn-svc/sites/site/site-id";
                  }
                  description
                    "Site ID to be authorized.";
                }
              }
              case permit-any-except {
                leaf-list deny-site {
                  type leafref {
                    path "/l2vpn-svc/sites/site/site-id";
                  }
                  description
                    "Site ID to be denied.";
                }
              }
              description
                "Choice for cloud access policy.
                 By default, all sites in the L2VPN
                 MUST be authorized to access the cloud.";
            }
            description
              "Cloud access configuration.";
          }
          description
            "Container for cloud access configurations.";
        }
        container frame-delivery {
          if-feature "bum";
          container customer-tree-flavors {
            leaf-list tree-flavor {
              type identityref {
                base multicast-tree-type;
              }
              description
                "Type of tree to be used.";
            }
            description
              "Types of trees used by the customer.";
          }
          container bum-deliveries {
            list bum-delivery {
              key "frame-type";
              leaf frame-type {
                type identityref {
                  base tf-type;
                }
                description
                  "Type of frame delivery.  It supports unicast
                   frame delivery, multicast frame delivery,
                   and broadcast frame delivery.";
              }
              leaf delivery-mode {
                type identityref {
                  base frame-delivery-mode;
                }
                default "unconditional";
                description
                  "Defines the frame delivery mode
                   ('unconditional' (default), 'conditional',
                   or 'discard').  By default, service frames are
                   unconditionally delivered to the destination site.";
              }
              description
                "List of frame delivery types and modes.";
            }
            description
              "Defines the frame delivery types and modes.";
          }
          leaf multicast-gp-port-mapping {
            type identityref {
              base multicast-gp-address-mapping;
            }
            mandatory true;
            description
              "Describes the way in which each interface is
               associated with the multicast group.";
          }
          description
            "Multicast global parameters for the VPN service.";
        }
        container extranet-vpns {
          if-feature "extranet-vpn";
          list extranet-vpn {
            key "vpn-id";
            leaf vpn-id {
              type svc-id;
              description
                "Identifies the target VPN that the local VPN wants to
                 access.";
            }
            leaf local-sites-role {
              type identityref {
                base site-role;
              }
              default "any-to-any-role";
              description
                "Describes the role of the local sites in the target
                 VPN topology.  In the any-to-any VPN service topology,
                 the local sites must have the same role, which will be
                 'any-to-any-role'.  In the Hub-and-Spoke VPN service
                 topology or the Hub-and-Spoke-Disjoint VPN service
                 topology, the local sites must have a Hub role or a
                 Spoke role.";
            }
            description
              "List of extranet VPNs to which the local VPN
               is attached.";
          }
          description
            "Container for extranet VPN configurations.";
        }
        leaf ce-vlan-preservation {
          type boolean;
          mandatory true;
          description
            "Preserves the CE-VLAN ID from ingress to egress, i.e.,
             the CE-VLAN tag of the egress frame is identical to
             that of the ingress frame that yielded this
             egress service frame.  If all-to-one bundling within
             a site is enabled, then preservation applies to all
             ingress service frames.  If all-to-one bundling is
             disabled, then preservation applies to tagged
             ingress service frames having CE-VLAN IDs 1 through 4094.";
        }
        leaf ce-vlan-cos-preservation {
          type boolean;
          mandatory true;
          description
            "CE VLAN CoS preservation.  The PCP bits in the CE-VLAN tag
             of the egress frame are identical to those of the
             ingress frame that yielded this egress service frame.";
        }
        leaf carrierscarrier {
          if-feature "carrierscarrier";
          type boolean;
          default "false";
          description
            "The VPN is using CsC, and so MPLS is required.";
        }
        description
          "List of VPN services.";
      }
      description
        "Container for VPN services.";
    }
    container sites {
      list site {
        key "site-id";
        leaf site-id {
          type string;
          description
            "Identifier of the site.";
        }
        leaf site-vpn-flavor {
          type identityref {
            base site-vpn-flavor;
          }
          default "site-vpn-flavor-single";
          description
            "Defines the way that the VPN multiplexing is
             done, e.g., whether the site belongs to
             a single VPN site or a multi-VPN site.  By
             default, the site belongs to a single VPN.";
        }
        container devices {
          when "derived-from-or-self(../management/type, "
             + "'l2vpn-svc:provider-managed') or "
             + "derived-from-or-self(../management/type, "
             + "'l2vpn-svc:co-managed')" {
            description
              "Applicable only for a provider-managed or
               co-managed device.";
          }
          list device {
            key "device-id";
            leaf device-id {
              type string;
              description
                "Identifier for the device.";
            }
            leaf location {
              type leafref {
                path "../../../locations/location/location-id";
              }
              mandatory true;
              description
                "Location of the device.";
            }
            container management {
              when "derived-from-or-self(../../../management/type, "
                 + "'l2vpn-svc:co-managed')" {
                description
                  "Applicable only for a co-managed device.";
              }
              leaf transport {
                type identityref {
                  base address-family;
                }
                description
                  "Transport protocol or address family
                   used for management.";
              }
              leaf address {
                when '(../ transport)' {
                  description
                    "If the address family is specified, then the
                     address should also be specified.  If the
                     transport is not specified, then the address
                     should not be specified.";
                }
                type inet:ip-address;
                description
                  "Management address.";
              }
              description
                "Management configuration.  Applicable only for a
                 co-managed device.";
            }
            description
              "List of devices requested by the customer.";
          }
          description
            "Device configurations.";
        }
        container management {
          leaf type {
            type identityref {
              base management;
            }
            mandatory true;
            description
              "Management type of the connection.";
          }
          description
            "Management configuration.";
        }
        container locations {
          list location {
            key "location-id";
            leaf location-id {
              type string;
              description
                "Location ID.";
            }
            leaf address {
              type string;
              description
                "Address (number and street) of the site.";
            }
            leaf postal-code {
              type string;
              description
                "Postal code of the site.  The format of 'postal-code'
                 is similar to the 'PC' (postal code) label format
                 defined in RFC 4119.";
            }
            leaf state {
              type string;
              description
                "State (region) of the site.  This leaf can also be used
                 to describe a region of a country that does not have
                 states.";
            }
            leaf city {
              type string;
              description
                "City of the site.";
            }
            leaf country-code {
              type string;
              description
                "Country of the site.  The format of 'country-code' is
                 similar to the 'country' label defined in RFC 4119.";
            }
            description
              "List of locations.";
          }
          description
            "Location of the site.";
        }
        container site-diversity {
          if-feature "site-diversity";
          container groups {
            list group {
              key "group-id";
              leaf group-id {
                type string;
                description
                  "The group-id to which the site belongs.";
              }
              description
                "List of group-ids.";
            }
            description
              "Groups to which the site belongs.
               All site network accesses will inherit those group
               values.";
          }
          description
            "The type of diversity constraint.";
        }
        container vpn-policies {
          list vpn-policy {
            key "vpn-policy-id";
            leaf vpn-policy-id {
              type string;
              description
                "Unique identifier for the VPN policy.";
            }
            list entries {
              key "id";
              leaf id {
                type string;
                description
                  "Unique identifier for the policy entry.";
              }
              container filters {
                list filter {
                  key "type";
                  ordered-by user;
                  leaf type {
                    type identityref {
                      base vpn-policy-filter-type;
                    }
                    description
                      "Type of VPN policy filter.";
                  }
                  leaf-list lan-tag {
                    when "derived-from-or-self(../type, "
                       + "'l2vpn-svc:lan')" {
                      description
                        "Only applies when the VPN policy filter is a
                         LAN tag filter.";
                    }
                    if-feature "lan-tag";
                    type uint32;
                    description
                      "List of Ethernet LAN tags to be matched.  An
                       Ethernet LAN tag identifies a particular
                       broadcast domain in a VPN.";
                  }
                  description
                    "List of filters used on the site.  This list can
                     be augmented.";
                }
                description
                  "If a more granular VPN attachment is necessary,
                   filtering can be used.  If used, it permits the
                   splitting of site LANs among multiple VPNs.  The
                   site LAN can be split based on either the LAN tag or
                   the LAN prefix.  If no filter is used, all the LANs
                   will be part of the same VPNs with the same role.";
              }
              list vpn {
                key "vpn-id";
                leaf vpn-id {
                  type leafref {
                    path "/l2vpn-svc/vpn-services/vpn-service/vpn-id";
                  }
                  description
                    "Reference to an L2VPN.";
                }
                leaf site-role {
                  type identityref {
                    base site-role;
                  }
                  default "any-to-any-role";
                  description
                    "Role of the site in the L2VPN.";
                }
                description
                  "List of VPNs with which the LAN is associated.";
              }
              description
                "List of entries for an export policy.";
            }
            description
              "List of VPN policies.";
          }
          description
            "VPN policy.";
        }
        container service {
          uses site-service-qos-profile;
          uses site-service-mpls;
          description
            "Service parameters on the attachment.";
        }
        uses site-bum;
        uses site-mac-loop-prevention;
        uses site-acl;
        leaf actual-site-start {
          type yang:date-and-time;
          config false;
          description
            "This leaf is optional.  It indicates the date and time
             when the service at a particular site actually started.";
        }
        leaf actual-site-stop {
          type yang:date-and-time;
          config false;
          description
            "This leaf is optional.  It indicates the date and time
             when the service at a particular site actually stopped.";
        }
        leaf bundling-type {
          type identityref {
            base bundling-type;
          }
          default "one2one-bundling";
          description
            "Bundling type.  By default, each L2VPN
             can be associated with only one
             CE-VLAN, i.e., one-to-one bundling is used.";
        }
        leaf default-ce-vlan-id {
          type uint32;
          mandatory true;
          description
            "Default CE VLAN ID set at the site level.";
        }
        container site-network-accesses {
          list site-network-access {
            key "network-access-id";
            leaf network-access-id {
              type string;
              description
                "Identifier of network access.";
            }
            leaf remote-carrier-name {
              when "derived-from-or-self(../../../site-vpn-flavor,"
                 + "'l2vpn-svc:site-vpn-flavor-nni')" {
                description
                  "Relevant when the site's VPN flavor is
                   'site-vpn-flavor-nni'.";
              }
              type leafref {
                path "/l2vpn-svc/vpn-profiles/"
                   + "valid-provider-identifiers"
                   + "/remote-carrier-identifier";
              }
              description
                "Remote carrier name.  The 'remote-carrier-name'
                 parameter must be configured only when
                 'site-vpn-flavor' is set to 'site-vpn-flavor-nni'.
                 If it is not set, it indicates that the customer
                 does not know the remote carrier's name
                 beforehand.";
            }
            leaf type {
              type identityref {
                base site-network-access-type;
              }
              default "point-to-point";
              description
                "Describes the type of connection, e.g.,
                 point-to-point or multipoint.";
            }
            choice location-flavor {
              case location {
                when "derived-from-or-self(../../management/type, "
                   + "'l2vpn-svc:customer-managed')" {
                  description
                    "Applicable only for a customer-managed device.";
                }
                leaf location-reference {
                  type leafref {
                    path "../../../locations/location/location-id";
                  }
                  description
                    "Location of the site-network-access.";
                }
              }
              case device {
                when "derived-from-or-self(../../management/type, "
                   + "'l2vpn-svc:provider-managed') or "
                   + "derived-from-or-self(../../management/type, "
                   + "'l2vpn-svc:co-managed')" {
                  description
                    "Applicable only for a provider-managed
                     or co-managed device.";
                }
                leaf device-reference {
                  type leafref {
                    path "../../../devices/device/device-id";
                  }
                  description
                    "Identifier of the CE to use.";
                }
              }
              mandatory true;
              description
                "Choice of how to describe the site's location.";
            }
            container access-diversity {
              if-feature "site-diversity";
              container groups {
                list group {
                  key "group-id";
                  leaf group-id {
                    type string;
                    description
                      "Group-id to which the site belongs.";
                  }
                  description
                    "List of group-ids.";
                }
                description
                  "Groups to which the site or site-network-access
                   belongs.";
              }
              container constraints {
                list constraint {
                  key "constraint-type";
                  leaf constraint-type {
                    type identityref {
                      base placement-diversity;
                    }
                    description
                      "The type of diversity constraint.";
                  }
                  container target {
                    choice target-flavor {
                      default "id";
                      case id {
                        list group {
                          key "group-id";
                          leaf group-id {
                            type string;
                            description
                              "The constraint will apply against this
                               particular group-id.";
                          }
                          description
                            "List of groups.";
                        }
                      }
                      case all-accesses {
                        leaf all-other-accesses {
                          type empty;
                          description
                            "The constraint will apply against all other
                             site network accesses of this site.";
                        }
                      }
                      case all-groups {
                        leaf all-other-groups {
                          type empty;
                          description
                            "The constraint will apply against all other
                             groups the customer is managing.";
                        }
                      }
                      description
                        "Choice for the group definition.";
                    }
                    description
                      "The constraint will apply against
                       this list of groups.";
                  }
                  description
                    "List of constraints.";
                }
                description
                  "Constraints for placing this site network access.";
              }
              description
                "Diversity parameters.";
            }
            container bearer {
              container requested-type {
                if-feature "requested-type";
                leaf type {
                  type string;
                  description
                    "Type of requested bearer: Ethernet, ATM, Frame
                     Relay, IP Layer 2 transport, Frame Relay Data
                     Link Connection Identifier (DLCI), SONET/SDH,
                     PPP.";
                }
                leaf strict {
                  type boolean;
                  default "false";
                  description
                    "Defines whether the requested type is a preference
                     or a strict requirement.";
                }
                description
                  "Container for requested types.";
              }
              leaf always-on {
                if-feature "always-on";
                type boolean;
                default "true";
                description
                  "Request for an 'always-on' access type.
                   For example, this could mean no dial-in access
                   type.";
              }
              leaf bearer-reference {
                if-feature "bearer-reference";
                type string;
                description
                  "An internal reference for the SP.";
              }
              description
                "Bearer-specific parameters.  To be augmented.";
            }
            container connection {
              leaf encapsulation-type {
                type identityref {
                  base encapsulation-type;
                }
                default "ethernet";
                description
                  "Encapsulation type.  By default, the
                   encapsulation type is set to 'ethernet'.";
              }
              leaf eth-inf-type {
                type identityref {
                  base eth-inf-type;
                }
                default "untagged";
                description
                  "Ethernet interface type.  By default, the
                   Ethernet interface type is set to 'untagged'.";
              }
              container tagged-interface {
                leaf type {
                  type identityref {
                    base tagged-inf-type;
                  }
                  default "priority-tagged";
                  description
                    "Tagged interface type.  By default,
                     the type of the tagged interface is
                     'priority-tagged'.";
                }
                container dot1q-vlan-tagged {
                  when "derived-from-or-self(../type, "
                     + "'l2vpn-svc:dot1q')" {
                    description
                      "Only applies when the type of the tagged
                       interface is 'dot1q'.";
                  }
                  if-feature "dot1q";
                  leaf tg-type {
                    type identityref {
                      base tag-type;
                    }
                    default "c-vlan";
                    description
                      "Tag type.  By default, the tag type is
                       'c-vlan'.";
                  }
                  leaf cvlan-id {
                    type uint16;
                    mandatory true;
                    description
                      "VLAN identifier.";
                  }
                  description
                    "Tagged interface.";
                }
                container priority-tagged {
                  when "derived-from-or-self(../type, "
                     + "'l2vpn-svc:priority-tagged')" {
                    description
                      "Only applies when the type of the tagged
                       interface is 'priority-tagged'.";
                  }
                  leaf tag-type {
                    type identityref {
                      base tag-type;
                    }
                    default "c-vlan";
                    description
                      "Tag type.  By default, the tag type is
                       'c-vlan'.";
                  }
                  description
                    "Priority tagged.";
                }
                container qinq {
                  when "derived-from-or-self(../type, "
                     + "'l2vpn-svc:qinq')" {
                    description
                      "Only applies when the type of the tagged
                       interface is 'qinq'.";
                  }
                  if-feature "qinq";
                  leaf tag-type {
                    type identityref {
                      base tag-type;
                    }
                    default "c-s-vlan";
                    description
                      "Tag type.  By default, the tag type is
                       'c-s-vlan'.";
                  }
                  leaf svlan-id {
                    type uint16;
                    mandatory true;
                    description
                      "SVLAN identifier.";
                  }
                  leaf cvlan-id {
                    type uint16;
                    mandatory true;
                    description
                      "CVLAN identifier.";
                  }
                  description
                    "QinQ.";
                }
                container qinany {
                  when "derived-from-or-self(../type, "
                     + "'l2vpn-svc:qinany')" {
                    description
                      "Only applies when the type of the tagged
                       interface is 'qinany'.";
                  }
                  if-feature "qinany";
                  leaf tag-type {
                    type identityref {
                      base tag-type;
                    }
                    default "s-vlan";
                    description
                      "Tag type.  By default, the tag type is
                       's-vlan'.";
                  }
                  leaf svlan-id {
                    type uint16;
                    mandatory true;
                    description
                      "SVLAN ID.";
                  }
                  description
                    "Container for QinAny.";
                }
                container vxlan {
                  when "derived-from-or-self(../type, "
                     + "'l2vpn-svc:vxlan')" {
                    description
                      "Only applies when the type of the tagged
                       interface is 'vxlan'.";
                  }
                  if-feature "vxlan";
                  leaf vni-id {
                    type uint32;
                    mandatory true;
                    description
                      "VXLAN Network Identifier (VNI).";
                  }
                  leaf peer-mode {
                    type identityref {
                      base vxlan-peer-mode;
                    }
                    default "static-mode";
                    description
                      "Specifies the VXLAN access mode.  By default,
                       the peer mode is set to 'static-mode'.";
                  }
                  list peer-list {
                    key "peer-ip";
                    leaf peer-ip {
                      type inet:ip-address;
                      description
                        "Peer IP.";
                    }
                    description
                      "List of peer IP addresses.";
                  }
                  description
                    "QinQ.";
                }
                description
                  "Container for tagged interfaces.";
              }
              container untagged-interface {
                leaf speed {
                  type uint32;
                  units "mbps";
                  default "10";
                  description
                    "Port speed.";
                }
                leaf mode {
                  type neg-mode;
                  default "auto-neg";
                  description
                    "Negotiation mode.";
                }
                leaf phy-mtu {
                  type uint32;
                  units "bytes";
                  description
                    "PHY MTU.";
                }
                leaf lldp {
                  type boolean;
                  default "false";
                  description
                    "LLDP.  Indicates that LLDP is supported.";
                }
                container oam-802.3ah-link {
                  if-feature "oam-3ah";
                  leaf enabled {
                    type boolean;
                    default "false";
                    description
                      "Indicates whether or not to support
                       OAM 802.3ah links.";
                  }
                  description
                    "Container for OAM 802.3ah links.";
                }
                leaf uni-loop-prevention {
                  type boolean;
                  default "false";
                  description
                    "If this leaf is set to 'true', then the port
                     automatically goes down when a physical
                     loopback is detected.";
                }
                description
                  "Container of untagged interface attribute
                   configurations.";
              }
              container lag-interfaces {
                if-feature "lag-interface";
                list lag-interface {
                  key "index";
                  leaf index {
                    type string;
                    description
                      "LAG interface index.";
                  }
                  container lacp {
                    if-feature "lacp";
                    leaf enabled {
                      type boolean;
                      default "false";
                      description
                        "LACP on/off.  By default, LACP is disabled.";
                    }
                    leaf mode {
                      type neg-mode;
                      description
                        "LACP mode.  LACP modes have active mode and
                         passive mode ('false').  'Active mode' means
                         initiating the auto-speed negotiation and
                         trying to form an Ethernet channel with the
                         other end.  'Passive mode' means not initiating
                         the negotiation but responding to LACP packets
                         initiated by the other end (e.g., full duplex
                         or half duplex).";
                    }
                    leaf speed {
                      type uint32;
                      units "mbps";
                      default "10";
                      description
                        "LACP speed.  By default, the LACP speed is 10
                         Mbps.";
                    }
                    leaf mini-link-num {
                      type uint32;
                      description
                        "Defines the minimum number of links that must
                         be active before the aggregating link is put
                         into service.";
                    }
                    leaf system-priority {
                      type uint16;
                      default "32768";
                      description
                        "Indicates the LACP priority for the system.
                         The range is from 0 to 65535.
                         The default is 32768.";
                    }
                    container micro-bfd {
                      if-feature "micro-bfd";
                      leaf enabled {
                        type enumeration {
                          enum on {
                            description
                              "Micro-bfd on.";
                          }
                          enum off {
                            description
                              "Micro-bfd off.";
                          }
                        }
                        default "off";
                        description
                          "Micro-BFD on/off.  By default, micro-BFD
                           is set to 'off'.";
                      }
                      leaf interval {
                        type uint32;
                        units "milliseconds";
                        description
                          "BFD interval.";
                      }
                      leaf hold-timer {
                        type uint32;
                        units "milliseconds";
                        description
                          "BFD hold timer.";
                      }
                      description
                        "Container of micro-BFD configurations.";
                    }
                    container bfd {
                      if-feature "bfd";
                      leaf enabled {
                        type boolean;
                        default "false";
                        description
                          "BFD activation.  By default, BFD is not
                           activated.";
                      }
                      choice holdtime {
                        default "fixed";
                        case profile {
                          leaf profile-name {
                            type leafref {
                              path "/l2vpn-svc/vpn-profiles/"
                                 + "valid-provider-identifiers"
                                 + "/bfd-profile-identifier";
                            }
                            description
                              "SP well-known profile.";
                          }
                          description
                            "SP well-known profile.";
                        }
                        case fixed {
                          leaf fixed-value {
                            type uint32;
                            units "milliseconds";
                            description
                              "Expected hold time expressed in
                               milliseconds.";
                          }
                        }
                        description
                          "Choice for the hold-time flavor.";
                      }
                      description
                        "Container for BFD.";
                    }
                    container member-links {
                      list member-link {
                        key "name";
                        leaf name {
                          type string;
                          description
                            "Member link name.";
                        }
                        leaf speed {
                          type uint32;
                          units "mbps";
                          default "10";
                          description
                            "Port speed.";
                        }
                        leaf mode {
                          type neg-mode;
                          default "auto-neg";
                          description
                            "Negotiation mode.";
                        }
                        leaf link-mtu {
                          type uint32;
                          units "bytes";
                          description
                            "Link MTU size.";
                        }
                        container oam-802.3ah-link {
                          if-feature "oam-3ah";
                          leaf enabled {
                            type boolean;
                            default "false";
                            description
                              "Indicates whether OAM 802.3ah links are
                               supported.";
                          }
                          description
                            "Container for OAM 802.3ah links.";
                        }
                        description
                          "Member link.";
                      }
                      description
                        "Container of the member link list.";
                    }
                    leaf flow-control {
                      type boolean;
                      default "false";
                      description
                        "Flow control.  Indicates whether flow control
                         is supported.";
                    }
                    leaf lldp {
                      type boolean;
                      default "false";
                      description
                        "LLDP.  Indicates whether LLDP is supported.";
                    }
                    description
                      "LACP.";
                  }
                  description
                    "List of LAG interfaces.";
                }
                description
                  "Container of LAG interface attribute
                   configurations.";
              }
              list cvlan-id-to-svc-map {
                key "svc-id";
                leaf svc-id {
                  type leafref {
                    path "/l2vpn-svc/vpn-services/vpn-service/vpn-id";
                  }
                  description
                    "VPN service identifier.";
                }
                list cvlan-id {
                  key "vid";
                  leaf vid {
                    type uint16;
                    description
                      "CVLAN ID.";
                  }
                  description
                    "List of CVLAN-ID-to-SVC-map configurations.";
                }
                description
                  "List of CVLAN-ID-to-L2VPN-service-map
                   configurations.";
              }
              container l2cp-control {
                if-feature "l2cp-control";
                leaf stp-rstp-mstp {
                  type control-mode;
                  description
                    "STP / Rapid STP (RSTP) / Multiple STP (MSTP)
                     protocol type applicable to all sites.";
                }
                leaf pause {
                  type control-mode;
                  description
                    "Pause protocol type applicable to all sites.";
                }
                leaf lacp-lamp {
                  type control-mode;
                  description
                    "LACP / Link Aggregation Marker Protocol (LAMP).";
                }
                leaf link-oam {
                  type control-mode;
                  description
                    "Link OAM.";
                }
                leaf esmc {
                  type control-mode;
                  description
                    "Ethernet Synchronization Messaging Channel
                     (ESMC).";
                }
                leaf l2cp-802.1x {
                  type control-mode;
                  description
                    "IEEE 802.1x.";
                }
                leaf e-lmi {
                  type control-mode;
                  description
                    "E-LMI.";
                }
                leaf lldp {
                  type boolean;
                  description
                    "LLDP protocol type applicable to all sites.";
                }
                leaf ptp-peer-delay {
                  type control-mode;
                  description
                    "Precision Time Protocol (PTP) peer delay.";
                }
                leaf garp-mrp {
                  type control-mode;
                  description
                    "GARP/MRP.";
                }
                description
                  "Container of L2CP control configurations.";
              }
              container oam {
                if-feature "ethernet-oam";
                leaf md-name {
                  type string;
                  mandatory true;
                  description
                    "Maintenance domain name.";
                }
                leaf md-level {
                  type uint16 {
                    range "0..255";
                  }
                  mandatory true;
                  description
                    "Maintenance domain level.  The level may be
                     restricted in certain protocols (e.g.,
                     protocols in Layer 0 to Layer 7).";
                }
                list cfm-8021-ag {
                  if-feature "cfm";
                  key "maid";
                  leaf maid {
                    type string;
                    mandatory true;
                    description
                      "Identifies a Maintenance Association (MA).";
                  }
                  leaf mep-id {
                    type uint32;
                    description
                      "Local Maintenance Entity Group End Point (MEP)
                       ID.  The non-existence of this leaf means
                       that no defects are to be reported.";
                  }
                  leaf mep-level {
                    type uint32;
                    description
                      "Defines the MEP level.  The non-existence of this
                       leaf means that no defects are to be reported.";
                  }
                  leaf mep-up-down {
                    type enumeration {
                      enum up {
                        description
                          "MEP up.";
                      }
                      enum down {
                        description
                          "MEP down.";
                      }
                    }
                    default "up";
                    description
                      "MEP up/down.  By default, MEP up is used.
                       The non-existence of this leaf means that
                       no defects are to be reported.";
                  }
                  leaf remote-mep-id {
                    type uint32;
                    description
                      "Remote MEP ID.  The non-existence of this leaf
                       means that no defects are to be reported.";
                  }
                  leaf cos-for-cfm-pdus {
                    type uint32;
                    description
                      "CoS for CFM PDUs.  The non-existence of this leaf
                       means that no defects are to be reported.";
                  }
                  leaf ccm-interval {
                    type uint32;
                    units "milliseconds";
                    default "10000";
                    description
                      "CCM interval.  By default, the CCM interval is
                       10,000 milliseconds (10 seconds).";
                  }
                  leaf ccm-holdtime {
                    type uint32;
                    units "milliseconds";
                    default "35000";
                    description
                      "CCM hold time.  By default, the CCM hold time
                       is 3.5 times the CCM interval.";
                  }
                  leaf alarm-priority-defect {
                    type identityref {
                      base fault-alarm-defect-type;
                    }
                    default "remote-invalid-ccm";
                    description
                      "The lowest-priority defect that is
                       allowed to generate a fault alarm.  By default,
                       'fault-alarm-defect-type' is set to
                       'remote-invalid-ccm'.  The non-existence of
                       this leaf means that no defects are
                       to be reported.";
                  }
                  leaf ccm-p-bits-pri {
                    type ccm-priority-type;
                    description
                      "The priority parameter for CCMs transmitted by
                       the MEP.  The non-existence of this leaf means
                       that no defects are to be reported.";
                  }
                  description
                    "List of 802.1ag CFM attributes.";
                }
                list y-1731 {
                  if-feature "y-1731";
                  key "maid";
                  leaf maid {
                    type string;
                    mandatory true;
                    description
                      "Identifies an MA.";
                  }
                  leaf mep-id {
                    type uint32;
                    description
                      "Local MEP ID.  The non-existence of this leaf
                       means that no measurements are to be reported.";
                  }
                  leaf type {
                    type identityref {
                      base pm-type;
                    }
                    default "delay";
                    description
                      "Performance-monitoring types.  By default, the
                       performance-monitoring type is set to 'delay'.
                       The non-existence of this leaf means that no
                       measurements are to be reported.";
                  }
                  leaf remote-mep-id {
                    type uint32;
                    description
                      "Remote MEP ID.  The non-existence of this
                       leaf means that no measurements are to be
                       reported.";
                  }
                  leaf message-period {
                    type uint32;
                    units "milliseconds";
                    default "10000";
                    description
                      "Defines the interval between Y.1731
                       performance-monitoring messages.  The message
                       period is expressed in milliseconds.";
                  }
                  leaf measurement-interval {
                    type uint32;
                    units "seconds";
                    description
                      "Specifies the measurement interval for
                       statistics.  The measurement interval is
                       expressed in seconds.";
                  }
                  leaf cos {
                    type uint32;
                    description
                      "CoS.  The non-existence of this leaf means that
                       no measurements are to be reported.";
                  }
                  leaf loss-measurement {
                    type boolean;
                    default "false";
                    description
                      "Indicates whether or not to enable loss
                       measurement.  By default, loss
                       measurement is not enabled.";
                  }
                  leaf synthetic-loss-measurement {
                    type boolean;
                    default "false";
                    description
                      "Indicates whether or not to enable synthetic loss
                       measurement.  By default, synthetic loss
                       measurement is not enabled.";
                  }
                  container delay-measurement {
                    leaf enable-dm {
                      type boolean;
                      default "false";
                      description
                        "Indicates whether or not to enable delay
                         measurement.  By default, delay measurement
                         is not enabled.";
                    }
                    leaf two-way {
                      type boolean;
                      default "false";
                      description
                        "Indicates whether delay measurement is two-way
                         ('true') or one-way ('false').  By default,
                         one-way measurement is enabled.";
                    }
                    description
                      "Container for delay measurement.";
                  }
                  leaf frame-size {
                    type uint32;
                    units "bytes";
                    description
                      "Frame size.  The non-existence of this leaf
                       means that no measurements are to be reported.";
                  }
                  leaf session-type {
                    type enumeration {
                      enum proactive {
                        description
                          "Proactive mode.";
                      }
                      enum on-demand {
                        description
                          "On-demand mode.";
                      }
                    }
                    default "on-demand";
                    description
                      "Session type.  By default, the session type
                       is 'on-demand'.  The non-existence of this
                       leaf means that no measurements are to be
                       reported.";
                  }
                  description
                    "List of configured Y-1731 instances.";
                }
                description
                  "Container for Ethernet Service OAM.";
              }
              description
                "Container for connection requirements.";
            }
            container availability {
              leaf access-priority {
                type uint32;
                default "100";
                description
                  "Access priority.  The higher the access-priority
                   value, the higher the preference will be for the
                   access in question.";
              }
              choice redundancy-mode {
                case single-active {
                  leaf single-active {
                    type empty;
                    description
                      "Single-active mode.";
                  }
                  description
                    "In single-active mode, only one node forwards
                     traffic to and from the Ethernet segment.";
                }
                case all-active {
                  leaf all-active {
                    type empty;
                    description
                      "All-active mode.";
                  }
                  description
                    "In all-active mode, all nodes can forward
                     traffic.";
                }
                description
                  "Redundancy mode choice.";
              }
              description
                "Container of available optional configurations.";
            }
            container vpn-attachment {
              choice attachment-flavor {
                case vpn-id {
                  leaf vpn-id {
                    type leafref {
                      path "/l2vpn-svc/vpn-services/vpn-service/vpn-id";
                    }
                    description
                      "Reference to an L2VPN.  Referencing a vpn-id
                       provides an easy way to attach a particular
                       logical access to a VPN.  In this case,
                       the vpn-id must be configured.";
                  }
                  leaf site-role {
                    type identityref {
                      base site-role;
                    }
                    default "any-to-any-role";
                    description
                      "Role of the site in the L2VPN.  When referencing
                       a vpn-id, the site-role setting must be added to
                       express the role of the site in the target VPN
                       service topology.";
                  }
                }
                case vpn-policy-id {
                  leaf vpn-policy-id {
                    type leafref {
                      path "../../../../vpn-policies/vpn-policy/"
                         + "vpn-policy-id";
                    }
                    description
                      "Reference to a VPN policy.";
                  }
                }
                mandatory true;
                description
                  "Choice for the VPN attachment flavor.";
              }
              description
                "Defines the VPN attachment of a site.";
            }
            container service {
              container svc-bandwidth {
                if-feature "input-bw";
                list bandwidth {
                  key "direction type";
                  leaf direction {
                    type identityref {
                      base bw-direction;
                    }
                    description
                      "Indicates the bandwidth direction.  It can be
                       the bandwidth download direction from the SP to
                       the site or the bandwidth upload direction from
                       the site to the SP.";
                  }
                  leaf type {
                    type identityref {
                      base bw-type;
                    }
                    description
                      "Bandwidth type.  By default, the bandwidth type
                       is set to 'bw-per-cos'.";
                  }
                  leaf cos-id {
                    when "derived-from-or-self(../type, "
                       + "'l2vpn-svc:bw-per-cos')" {
                      description
                        "Relevant when the bandwidth type is set to
                         'bw-per-cos'.";
                    }
                    type uint8;
                    description
                      "Identifier of the CoS, indicated by DSCP or a
                       CE-VLAN CoS (802.1p) value in the service frame.
                       If the bandwidth type is set to 'bw-per-cos',
                       the CoS ID MUST also be specified.";
                  }
                  leaf vpn-id {
                    when "derived-from-or-self(../type, "
                       + "'l2vpn-svc:bw-per-svc')" {
                      description
                        "Relevant when the bandwidth type is
                         set as bandwidth per VPN service.";
                    }
                    type svc-id;
                    description
                      "Identifies the target VPN.  If the bandwidth
                       type is set as bandwidth per VPN service, the
                       vpn-id MUST be specified.";
                  }
                  leaf cir {
                    type uint64;
                    units "bps";
                    mandatory true;
                    description
                      "Committed Information Rate.  The maximum number
                       of bits that a port can receive or send over
                       an interface in one second.";
                  }
                  leaf cbs {
                    type uint64;
                    units "bps";
                    mandatory true;
                    description
                      "Committed Burst Size (CBS).  Controls the bursty
                       nature of the traffic.  Traffic that does not
                       use the configured Committed Information Rate
                       (CIR) accumulates credits until the credits
                       reach the configured CBS.";
                  }
                  leaf eir {
                    type uint64;
                    units "bps";
                    description
                      "Excess Information Rate (EIR), i.e., excess frame
                       delivery allowed that is not subject to an SLA.
                       The traffic rate can be limited by the EIR.";
                  }
                  leaf ebs {
                    type uint64;
                    units "bps";
                    description
                      "Excess Burst Size (EBS).  The bandwidth available
                       for burst traffic from the EBS is subject to the
                       amount of bandwidth that is accumulated during
                       periods when traffic allocated by the EIR
                       policy is not used.";
                  }
                  leaf pir {
                    type uint64;
                    units "bps";
                    description
                      "Peak Information Rate, i.e., maximum frame
                       delivery allowed.  It is equal to or less
                       than the sum of the CIR and the EIR.";
                  }
                  leaf pbs {
                    type uint64;
                    units "bps";
                    description
                      "Peak Burst Size.  It is measured in bytes per
                       second.";
                  }
                  description
                    "List of bandwidth values (e.g., per CoS,
                     per vpn-id).";
                }
                description
                  "From the customer site's perspective, the service
                   input/output bandwidth of the connection or
                   download/upload bandwidth from the SP/site
                   to the site/SP.";
              }
              leaf svc-mtu {
                type uint16;
                units "bytes";
                mandatory true;
                description
                  "SVC MTU.  It is also known as the maximum
                   transmission unit or maximum frame size.  When
                   a frame is larger than the MTU, it is broken
                   down, or fragmented, into smaller pieces by
                   the network protocol to accommodate the MTU
                   of the network.  If CsC is enabled,
                   the requested svc-mtu leaf will refer to the
                   MPLS MTU and not to the link MTU.";
              }
              uses site-service-qos-profile;
              uses site-service-mpls;
              description
                "Container for services.";
            }
            uses site-bum;
            uses site-mac-loop-prevention;
            uses site-acl;
            container mac-addr-limit {
              if-feature "mac-addr-limit";
              leaf limit-number {
                type uint16;
                default "2";
                description
                  "Maximum number of MAC addresses learned from
                   the subscriber for a single service instance.
                   The default allowed maximum number of MAC
                   addresses is 2.";
              }
              leaf time-interval {
                type uint32;
                units "seconds";
                default "300";
                description
                  "The aging time of the MAC address.  By default,
                   the aging time is set to 300 seconds.";
              }
              leaf action {
                type identityref {
                  base mac-action;
                }
                default "warning";
                description
                  "Specifies the action taken when the upper limit is
                   exceeded: drop the packet, flood the packet, or
                   simply send a warning log message.  By default,
                   the action is set to 'warning'.";
              }
              description
                "Container of MAC address limit configurations.";
            }
            description
              "List of site network accesses.";
          }
          description
            "Container of port configurations.";
        }
        description
          "List of sites.";
      }
      description
        "Container of site configurations.";
    }
    description
      "Container for L2VPN services.";
  }
}

<CODE ENDS>

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

Модуль YANG, заданный в этом документе, определяет схему данных, которые предназначены для доступа по протоколам сетевого управления, таким как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF является защищённый транспорт, а обязательным для реализации транспортом — SSH70 [RFC6242]. Нижним уровнем протокола RESTCONF является HTTPS и обязательна реализация защищённого транспорта TLS [RFC8446].

Модель управления доступом NETCONF [RFC8341] обеспечивает способы ограничения доступа, разрешая его конкретным пользователям NETCONF или RESTCONF к заранее заданному набору всех доступных операций протокола NETCONF или RESTCONF, а также компонентам содержимого.

В этом модуле YANG определено множество узлов данных, которые разрешают запись/изменение/удаление (т. е. используют принятое по умолчанию значение config true). Эти узлы данных могут быть уязвимыми или конфиденциальными в некоторых средах. Операции записи (например, edit-config) в такие узлы без подобающей защиты могут оказывать негативное влияние на работу сети. Ниже перечислены такие субдеревья и узлы данных.

  • /l2vpn-svc/vpn-services/vpn-service

    Записи в этом списке включают все конфигурации сервиса VPN, на которые абонент подписан и будет применять для непрямого создания или изменения конфигурации устройств PE и CE. Неожиданные изменения этих записей могут вести к нарушению сервиса и/или недопустимому поведению сети.

  • /l2vpn-svc/sites/site

    Записи этого списка включают конфигурации абонентского сайта. Неожиданные изменения этих записей могут вести к нарушению сервиса и/или недопустимому поведению сети.

Некоторые из доступных для чтения узлов данных в этом модуле YANG могут быть уязвимыми или конфиденциальными в отдельных сетевых средах. Важно контролировать доступ (например, get, get-config, notification) к таким узлам. Ниже перечислены такие субдеревья и узлы данных.

  • /l2vpn-svc/vpn-services/vpn-service

  • /l2vpn-svc/sites/site

Записи в указанных выше списках содержат приватную или конфиденциальную информацию, например, название абонента, местоположение сайта, услуги, на которые подписан абонент.

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

Модель данных определяет некоторые параметры защиты, которые могут быть расширены с помощью дополнений. Эти параметры описаны в параграфах 5.12 и 5.13.

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

Агентство IANA выделило новое значение URI в реестре «IETF XML Registry» [RFC3688].

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

Агентство IANA выделило новое имя модуля YANG в реестре «YANG Module Names» [RFC6020].

      name: ietf-l2vpn-svc
      namespace: urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc
      prefix: l2vpn-svc
      reference: RFC 8466

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, <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>.

[RFC4364] Rosen, E. and Y. Rekhter, «BGP/MPLS IP Virtual Private Networks (VPNs)», RFC 4364, DOI 10.17487/RFC4364, February 2006, <https://www.rfc-editor.org/info/rfc4364>.

[RFC4761] Kompella, K., Ed. and Y. Rekhter, Ed., «Virtual Private LAN Service (VPLS) Using BGP for Auto-Discovery and Signaling», RFC 4761, DOI 10.17487/RFC4761, January 2007, <https://www.rfc-editor.org/info/rfc4761>.

[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>.

[RFC6073] Martini, L., Metz, C., Nadeau, T., Bocci, M., and M. Aissaoui, «Segmented Pseudowire», RFC 6073, DOI 10.17487/RFC6073, January 2011, <https://www.rfc-editor.org/info/rfc6073>.

[RFC6074] Rosen, E., Davie, B., Radoaca, V., and W. Luo, «Provisioning, Auto-Discovery, and Signaling in Layer 2 Virtual Private Networks (L2VPNs)», RFC 6074, DOI 10.17487/RFC6074, January 2011, <https://www.rfc-editor.org/info/rfc6074>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

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

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7432] Sajassi, A., Ed., Aggarwal, R., Bitar, N., Isaac, A., Uttaro, J., Drake, J., and W. Henderickx, «BGP MPLS-Based Ethernet VPN», RFC 7432, DOI 10.17487/RFC7432, February 2015, <https://www.rfc-editor.org/info/rfc7432>.

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

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

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

[RFC8214] Boutros, S., Sajassi, A., Salam, S., Drake, J., and J. Rabadan, «Virtual Private Wire Service Support in Ethernet VPN», RFC 8214, DOI 10.17487/RFC8214, August 2017, <https://www.rfc-editor.org/info/rfc8214>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[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, <https://www.w3.org/TR/2008/REC-xml-20081126>.

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

[EVPN-YANG] Brissette, P., Ed., Shah, H., Ed., Chen, I., Ed., Hussain, I., Ed., Tiruveedhula, K., Ed., and J. Rabadan, Ed., «Yang Data Model for EVPN», Work in Progress, draft-ietf-bess-evpn-yang-05, February 2018.

[IEEE-802-1ag] IEEE, «802.1ag — 2007 — IEEE Standard for Local and Metropolitan Area Networks — Virtual Bridged Local Area Networks Amendment 5: Connectivity Fault Management», DOI 10.1109/IEEESTD.2007.4431836.

[IEEE-802-1D] IEEE, «802.1D-2004 — IEEE Standard for Local and metropolitan area networks: Media Access Control (MAC) Bridges», DOI 10.1109/IEEESTD.2004.94569.

[IEEE-802-1Q] IEEE, «802.1Q — 2014 — IEEE Standard for Local and metropolitan area networks—Bridges and Bridged Networks», DOI 10.1109/IEEESTD.2014.6991462.

[IEEE-802-3ah] IEEE, «802.3ah — 2004 — IEEE Standard for Information technology— Local and metropolitan area networks— Part 3: CSMA/CD Access Method and Physical Layer Specifications Amendment: Media Access Control Parameters, Physical Layers, and Management Parameters for Subscriber Access Networks», DOI 10.1109/IEEESTD.2004.94617.

[ITU-T-Y-1731] International Telecommunication Union, «Operations, administration and maintenance (OAM) functions and mechanisms for Ethernet-based networks», ITU-T Recommendation Y.1731, August 2015, <https://www.itu.int/rec/T-REC-Y.1731/en>.

[MEF-6] Metro Ethernet Forum, «Ethernet Services Definitions — Phase 2», April 2008, <https://mef.net/PDF_Documents/technical-specifications/MEF6-1.pdf>.

[MPLS-L2VPN-YANG] Shah, H., Ed., Brissette, P., Ed., Chen, I., Ed., Hussain, I., Ed., Wen, B., Ed., and K. Tiruveedhula, Ed., «YANG Data Model for MPLS-based L2VPN», Work in Progress, draft-ietf-bess-l2vpn-yang-08, February 2018.

[RFC4119] Peterson, J., «A Presence-based GEOPRIV Location Object Format», RFC 4119, DOI 10.17487/RFC4119, December 2005, <https://www.rfc-editor.org/info/rfc4119>.

[RFC6624] Kompella, K., Kothari, B., and R. Cherukuri, «Layer 2 Virtual Private Networks Using BGP for Auto-Discovery and Signaling», RFC 6624, DOI 10.17487/RFC6624, May 2012, <https://www.rfc-editor.org/info/rfc6624>.

[RFC7130] Bhatia, M., Ed., Chen, M., Ed., Boutros, S., Ed., Binderberger, M., Ed., and J. Haas, Ed., «Bidirectional Forwarding Detection (BFD) on Link Aggregation Group (LAG) Interfaces», RFC 7130, DOI 10.17487/RFC7130, February 2014, <https://www.rfc-editor.org/info/rfc7130>.

[RFC7209] Sajassi, A., Aggarwal, R., Uttaro, J., Bitar, N., Henderickx, W., and A. Isaac, «Requirements for Ethernet VPN (EVPN)», RFC 7209, DOI 10.17487/RFC7209, May 2014, <https://www.rfc-editor.org/info/rfc7209>.

[RFC7348] Mahalingam, M., Dutt, D., Duda, K., Agarwal, P., Kreeger, L., Sridhar, T., Bursell, M., and C. Wright, «Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks», RFC 7348, DOI 10.17487/RFC7348, August 2014, <https://www.rfc-editor.org/info/rfc7348>.

[RFC7436] Shah, H., Rosen, E., Le Faucheur, F., and G. Heron, «IP-Only LAN Service (IPLS)», RFC 7436, DOI 10.17487/RFC7436, January 2015, <https://www.rfc-editor.org/info/rfc7436>.

[RFC8199] Bogdanovic, D., Claise, B., and C. Moberg, «YANG Module Classification», RFC 8199, DOI 10.17487/RFC8199, July 2017, <https://www.rfc-editor.org/info/rfc8199>.

[RFC8299] Wu, Q., Ed., Litkowski, S., Tomotaki, L., and K. Ogaki, «YANG Data Model for L3VPN Service Delivery», RFC 8299, DOI 10.17487/RFC8299, January 2018, <https://www.rfc-editor.org/info/rfc8299>.

[RFC8309] Wu, Q., Liu, W., and A. Farrel, «Service Models Explained», RFC 8309, DOI 10.17487/RFC8309, January 2018, <https://www.rfc-editor.org/info/rfc8309>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

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

Спасибо Qin Wu и Adrian Farrel за содействие в работе над предварительными версиями документа. Спасибо Zonghe Huang, Wei Deng и Xiaoling Song за рецензирование этого документа.

Отдельная благодарность Jan Lindblad за внимательное рецензирование YANG.

Этот документ основан на работе группы L3SM, представленной в [RFC8299].

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

Bin Wen

Comcast

Email: bin_wen@comcast.com

Giuseppe Fioccola (редактор)

Telecom Italia

Email: giuseppe.fioccola@tim.it

Chongfeng Xie

China Telecom

Email: xiechf.bri@chinatelecom.cn

Luay Jalil

Verizon

Email: luay.jalil@verizon.com

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

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

nmalykh@protokols.ru

1Virtual Private Wire Service — услуги виртуального частного провода.

2Virtual Private LAN Service — услуги виртуальной частной ЛВС.

3Label Distribution Protocol — протокол распространения меток.

4Border Gateway Protocol — протокол граничного шлюза.

5Network Management Datastore Architecture — архитектура хранилища информации сетевого управления.

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

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

8Attachment Circuit.

9Point of Presence.

10Packet switched network.

11Time-Division Multiplexing — мультиплексирование с разделением по времени.

12Synchronous Optical Network / Synchronous Digital Hierarchy — синхронная оптическая сеть / синхронная цифровая иерархия.

13Layer 2 Tunneling Protocol version 3 — протокол туннелирования L2, версия 3.

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

15Virtual Switching Instance — экземпляр виртуальной коммутации.

16Layer 2 VPN.

17L2VPN Service Model.

18Network Configuration Protocol — протокол настройки конфигурации сети.

19IP-only LAN Service — услуги ЛВС с поддержкой только протокола IP.

20Segment Routing.

21Pseudowire Emulation Edge to Edge — сквозная эмуляция псевдопровода.

22Virtual Extensible Local Area Network — виртуальная расширяемая ЛВС.

23Multiprotocol BGP — многопротокольный BGP.

24Authentication, Authorization, and Accounting — проверка подлинности, проверка полномочий, учет.

25Command Line Interface — интефейс командной строки.

26Service Level Agreement.

27Ethernet Private Line — частная линия Ethernet.

28Ethernet Virtual Private Line — виртуальная частная линия Ethernet.

29Ethernet Line — линия Ethernet.

30Ethernet Virtual Circuit — виртуальной устройство (канал) Ethernet.

31Ethernet Private LAN — частная ЛВС Ethernet.

32Ethernet Virtual Private LAN — виртуальная частная ЛВС Ethernet.

33Ethernet LAN — ЛВС Ethernet.

34Route Target.

35Generic Attribute Registration Protocol — базовый протокол регистрации атрибутов.

36GARP Multicast Registration Protocol — протокол регистрации групп GARP.

37Layer 2 Control Protocol — канал управления L2.

38Customer VLAN.

39VXLAN Network Identifier.

40Switched Virtual Circuit — коммутрируемое виртуальное устройство.

41Link Aggregation Control Protocol — протокол управления агрегированием каналов.

42Bidirectional Forwarding Detection — двухстороннее детектирование пересылки.

43Spanning Tree Protocol — протокол связующего дерева.

44Mean Time To Repair.

45Connectivity Fault Management — обработка отказов в соединениях.

46Maintenance Domain — домен обслуживания.

47Maintenance Entity Group End Point — конечная точка группы объектов обслуживания.

48Maintenance Association.

49Maintenance Association Identifier.

50Continuity Check Message.

51Performance Monitoring.

52Access Control List — список контроля доступа.

53End-to-end.

54Digital Subscriber Line Access Multiplexer — мультиплексор цифровых абонентских линий доступа.

55Broadband Access Switch — коммутатор широкополосного доступа.

56Route Distinguisher.

57Committed Information Rate — согласованная скорость передачи информации.

58Excess Information Rate — избыточная скорость передачи информации.

59Peak Information Rate — пиковая скорость передачи информации.

60Differentiated Services Code Point — код дифференцированного обслуживания.

61В оригинале ошибочно сказано «в заголовке кадра Ethernet». См. http://www.rfc-editor.org/errata/eid5615. Прим. перев.

62External NNI — внешний интерфейс между сетями.

63Routing Information Base — база маршрутной информации.

64Carriers’ Carriers — оператор для операторов.

65Cloud Service Provider — поставщик облачных услуг.

66Autonomous System.

67AS Border Router — граничный маршрутизатор AS.

68External BGP — внешний BGP.

69Network Layer Reachability Information — информация о доступности на сетевом уровне.

70Secure Shell.

Рубрика: RFC | Комментарии к записи RFC 8466 A YANG Data Model for Layer 2 Virtual Private Network (L2VPN) Service Delivery отключены

RFC 8407 Guidelines for Authors and Reviewers of Documents Containing YANG Data Models

Internet Engineering Task Force (IETF)                        A. Bierman
Request for Comments: 8407                                     YumaWorks
BCP: 216                                                    October 2018
Obsoletes: 6087
Category: Best Current Practice
ISSN: 2070-1721

Guidelines for Authors and Reviewers of Documents Containing YANG Data Models

Рекомендации для авторов и рецензентов документов с моделями данных YANG

PDF

Аннотация

В этом документе приведены рекомендации для авторов и рецензентов спецификаций с модулями YANG. Заданы рекомендации и процедуры, предназначенные для улучшения взаимодействия и применимости реализаций протоколов NETCONF (Network Configuration Protocol) и RESTCONF, применяющих модули YANG. Документ отменяет RFC 6087.

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

Документ относится к категории Internet Best Current Practice.

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

Стандартизация интерфейсов настройки конфигурации сети для использования с протоколами управления, такими как NETCONF (Network Configuration Protocol) [RFC6241] и RESTCONF [RFC8040], требует модульного набора моделей данных, которые можно будет использовать и расширять в течение долгого времени.

Этот документ задаёт набор рекомендаций для документов, содержащих модели данных YANG 1.1 [RFC7950] и YANG 1.0 [RFC6020]. Язык YANG применяется для определения структур данных, протокольных операций и содержимого уведомлений, используемых на серверах NETCONF и RESTCONF. Сервер, поддерживающий определённый модуль YANG, будет поддерживать операции клиентов NETCONF и RESTCONF, как указано в соответствующем модуле YANG.

Многие конструкции YANG не обязательны для применения (например, операторы description), однако для того, чтобы сделать модули YANG более полезными, желательно задать набор рекомендаций, которые обеспечат более высокий уровень соответствия, нежели заданный спецификацией YANG [RFC7950] минимум.

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

Этот документ задаёт рекомендации по использованию, относящиеся к уровням операций и содержимого NETCONF, как указано в [RFC6241], а также по использованию методов и ресурсов RESTCONF, как указано в [RFC8040]. Рекомендации предназначены для авторов и рецензентов и направлены на повышение уровня надёжности и взаимодействия публикуемых моделей данных YANG.

Документ не является учебником по YANG и предполагает знакомство читателя с языком моделирования YANG.

1.1. Отличия от RFC 6087

Ниже перечислены изменения, внесённые в рекомендации [RFC6087].

  • Обновлена ссылка на NETCONF заменой RFC 4741 на RFC 6241.

  • Обновлена ссылка на NETCONF по протоколу SSH заменой RFC 4742 на RFC 6242.

  • Обновлена ссылка на YANG Types заменой RFC 6021 на RFC 6991.

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

  • Изменена рекомендация для узлов данных верхнего уровня.

  • Разъяснено использование XPath (XML Path Language) для литеральных значений, представляющих отождествление YANG.

  • Разъяснено использование XPath для when-stmt.

  • Разъяснено использование XPath для осей preceding-sibling и following-sibling.

  • Добавлены терминологические рекомендации.

  • Добавлено упоминание RFC 8174, обновляющего RFC 2119 прояснением использования ключевых слов.

  • Добавлены рекомендации для диаграмм деревьев YANG.

  • Обновлены рекомендации XPath для преобразований и использования библиотеки функций.

  • Обновлён раздел «Типы данных».

  • Обновлён раздел «Определения уведомлений».

  • Разъяснены узлы ключевых листьев.

  • Разъяснено применение типов данных uint64 и int64.

  • Добавлен текст по использованию свойств YANG.

  • Добавлен раздел «Соглашения об именовании идентификаторов».

  • Разъяснено использование обязательных узлов с условными дополнениями.

  • Разъяснены соглашения о доменах и пространствах имён для примеров модулей.

  • Разъяснены соглашения для идентификации компонентов кода.

  • Добавлены рекомендации для YANG 1.1.

  • Добавлен раздел «Ограничения узла данных YANG».

  • Добавлено упоминание протокола RESTCONF.

  • Добавленные рекомендации для хранилищ данных, пересмотренные в архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA).

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

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

published — опубликованный

Стабильный выпуск модуля или субмодуля. Например, Request for Comments из параграфа 2.1 в [RFC2026] считается стабильной публикацией.

unpublished — неопубликованный

Стабильный выпуск модуля или субмодуля. Например, Internet-Draft из параграфа 2.2 в [RFC2026] считается нестабильной публикацией незавершённой работы, которая может измениться в любой момент.

YANG fragment — фрагмент YANG

Набор операторов YANG, не предназначенных для представления полного модуля или субмодуля YANG. Эти операторы не предназначены для реального применения за исключением представления примеров использования операторов YANG. Для указания дополнительных операторов YANG, присутствующих в реальном модуле, иногда применяется специальный синтаксис «…».

YANG tree diagram — диаграмма дерева YANG

Диаграмма (схема) представляющая содержимое модуля YANG в соответствии с [RFC8340]. Называется также диаграммой дерева (tree diagram).

2.1. Термины NETCONF

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

  • capabilities — возможности;

  • client — клиент;

  • operation — операция;

  • server — сервер.

2.2. Термины YANG

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

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

  • module — модуль;

  • namespace — пространство имён;

  • submodule — субмодуль;

  • version — версия;

  • YANG;

  • YIN.

Отметим, что термин module может использоваться в качестве базового для модулей и субмодулей YANG. При описании специфических свойств субмодуля применяется термин submodule.

2.3. Термины NMDA

Ниже перечислены термины, определённые в [RFC8342]:

  • configuration — конфигурация;

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

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

  • operational state — рабочее состояние;

  • operational state datastore — хранилище рабочей конфигурации.

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

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

3. Общие рекомендации для документов

Рассматриваемые модули YANG вероятно будут содержаться в документах Internet-Draft (I-D). Все рекомендации для авторов I-D [ID-Guidelines] должны выполняться. Следует выполнять рекомендации для RFC, заданные в [RFC7322] (и будущих RFC, заменяющий его), [RFC-STYLE], [RFC7841].

В I-D, содержащих модули должны присутствовать разделы:

  • Narrative (описание);

  • Definition (определения);

  • Security Considerations (вопросы безопасности);

  • IANA Considerations (взаимодействие с IANA);

  • References (списки ссылок).

Имеется три варианта присутствия YANG в I-D или RFC:

  • нормативный модули или субмодуль;

  • пример модуля или субмодуля;

  • пример фрагмента YANG, не являющийся частью модуля или субмодуля.

Рекомендации этого документа относятся прежде всего к нормативным моделям (субмодулям), но могут применяться к примерам и фрагментам YANG.

3.1. Авторские права на модуль

Оператор description в модуле должен включать упоминание последнего одобренного заявления IETF Trust Copyright, которое доступно по ссылке <https://trustee.ietf.org/license-info/>.

3.2. Компоненты кода

Каждый нормативный модуль или субмодуль YANG в документе I-D или RFC считается компонентом кода. Для идентификации таких компонентов должны применяться строки <CODE BEGINS> и <CODE ENDS>. За тегом <CODE BEGINS> следует помещать строку, указывающую имя файла, заданное в параграфе 5.2 [RFC7950]. В строку имени следует включать дату выпуска, которая должна совпадать с датой самого свежего выпуска модуля. Ниже приведён пример для модуля ietf-foo с датой выпуска 20.03.2016 г.

   <CODE BEGINS> file "ietf-foo@2016-03-20.yang"

       module ietf-foo {
         namespace "urn:ietf:params:xml:ns:yang:ietf-foo";
         prefix "foo";
         organization "...";
         contact "...";
         description "...";
         revision 2016-03-20 {
           description "Последний выпуск";
           reference "RFC XXXX: Foo Protocol";
         }
         // ... операторы
       }

   <CODE ENDS>

3.2.1. Модули примеров

Модули примеров не являются компонентами кода и соглашение <CODE BEGINS> недопустимо применять для них. Примеры следует именовать с использованием префикса example, за которым следует дефис и описательное имя, например, example-toaster. Рекомендации для пространств имён применительно к примерам даны в параграфе 4.9.

3.3. Раздел терминологии

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

3.4. Диаграммы деревьев

Диаграммы деревьев YANG дают краткое представление модуля YANG и их следует включать для облегчения понимания структуры модуля YANG. Рекомендации для деревьев приведены в разделе 3 [RFC8340].

При использовании диаграммы дерева YANG в документ должна включаться информационная ссылка на спецификацию диаграмм деревьев YANG. Пример такой ссылки имеется в параграфе 2.2 [RFC8349].

3.5. Описательный раздел

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

Если заданные в спецификации модули импортируют определения из других модулей (за исключением определений из [RFC7950] и [RFC6991]) или всегда реализуются совместно с другими модулями, этот факт должен быть отмечен в обзорном разделе. Также должны отмечаться все особые интерпретации определений из других модулей. Пример описательного раздела приведён в параграфе 2.3 [RFC8349].

Если документ содержит модули YANG, соответствующие архитектуре NMDA [RFC8342], это следует отметить в спецификации. Например,

Модель данных YANG в этом документе соответствует архитектуре хранилищ данных управления сетью (NMDA), определённой в RFC 8342.

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

      [Примечание: \ служит лишь для форматирования]

      <myleaf xmlns="tag:example.com,2017:example-two">\
        это слишком длинное значение, поэтому строку нужно\
        перенести, чтобы она была не длиннее 72 символов\
      </myleaf>

3.6. Раздел определений

Этот раздел содержит модули, определяемые спецификацией. Эти модули следует записывать с использованием синтаксиса YANG 1.1 [RFC7950]. Можно применять синтаксис YANG 1.0 [RFC6020], если в модуле не требуется семантика или конструкции YANG 1.1. Если какой-либо из импортируемых модулей YANG написан на YANG 1.1, данный модуль должен также быть написан на YANG 1.1.

В документе также может быть представлена версия модуля с YIN-синтаксисом и могут присутствовать другие типы модулей, такие как SMIv2 (Structure of Management Information Version 2), на которые эти рекомендации не влияют.

Если сам модуль является нормативным, а не примером модуля или фрагмента YANG, все операторы YANG в модуле YANG считаются нормативными. Использование ключевых слов, описанное в [RFC2119] и [RFC8174], применимо к операторам YANG description в нормативных модулях так же, как в других нормативных разделах.

В примеры модулей YANG и фрагменты YANG недопустимо включать нормативный текст (в том числе слова заглавными буквами, указанные в [RFC2119] и [RFC8174]).

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

Рекомендации по использованию YANG приведены в разделе 4.

3.7. Раздел «Вопросы безопасности»

Каждая спецификация, определяющая модули, должна включать раздел с обсуждением вопросов безопасности, связанных с модулями. Этот раздел должен соответствовать последнему одобренному шаблону (см. <https://trac.ietf.org/trac/ops/wiki/yang-security-guidelines>). В параграфе 3.7.1 приведён шаблон раздела, соответствующий шаблону от 08.05.2013 г., обновлённому 02.07.2018 г. Авторы должны проверять страницу по указанному выше идентификатору URL на предмет выпуска новой версии шаблона. В частности следует выполнять указанные ниже требования.

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

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

  • Операции (т. е. операторы YANG rpc), которые могут оказывать вредное влияние на поведение системы, должны явно указываться по именам, а связанные риски безопасности или приватности должны быть разъяснены.

3.7.1. Шаблон раздела «Вопросы безопасности»

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

Заданный этим документом модуль YANG определяет схему для данных, которые организованы для доступа по протоколам управления сетью, таким как NETCONF [RFC6241] и RESTCONF [RFC8040]. Нижним уровнем NETCONF является защищённый транспортный уровень с обязательной реализацией протокола SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF является HTTPS с обязательной реализацией защищённого транспорта TLS [RFC8446].

Модель управления доступом NETCONF [RFC8341] позволяет разрешать доступ конкретным пользователям NETCONF или RESTCONF лишь к предопределённому набору содержимого и операций протокола NETCONF или RESTCONF.

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

В этом модуле YANG имеются узлы с возможностью записи, создания, удаления (т. е. с принятым по умолчанию значением config true). Эти узлы могут быть уязвимы в некоторых сетевых средах. Операции записи (например, edit-config) в такие узлы без подобающей защиты могут оказывать негативное влияние на работу сети. Имеются субдеревья и узлы данных с уязвимостями или конфиденциальными сведениями

   <список субдеревьев и узлов данных и указание их уязвимостей>

Для всех модулей YANG должна выполняться оценка конфиденциальности и уязвимости узлов, доступных для чтения (узлы с config false и другие узлы, поскольку они могут считываться такими операциями как get-config). Например, они могут раскрывать сведения о заказчике или персональные данные, защищаемые Европейским союзом, при доступе к узлам неуполномоченных лиц.

Некоторые доступные для чтения узлы в данном модуле YANG могут быть уязвимыми или конфиденциальными в некоторых сетевых средах. Важно контролировать доступ для чтения (например, get, get-config, notification) таких узлов. Имеются субдеревья и узлы данных с уязвимостями или конфиденциальными сведениями

   <список субдеревьев и узлов данных и указание их уязвимостей>

Если модуль YANG определяет операции RPC, для них нужно описать конкретные уязвимости.

Некоторые операции RPC в этом модуле YANG могут быть уязвимыми в некоторых сетевых средах. Важно контролировать доступ к таким операциям и их конфиденциальность и уязвимость

   <список операций RPC и указание их уязвимостей>

3.8. Раздел «Взаимодействие с IANA»

В соответствии с правилами IESG, установленными в <https://www.ietf.org/id-info/checklist.html>, каждый документ I-D, представляемый IESG для публикации, должен содержать раздел IANA Considerations. Требования к этому разделу зависят от действий, которые нужны от IANA. Если документ не запрашивает действий IANA, в раздел включается фраза «This document has no IANA actions». Более подробные рекомендации приведены в [RFC8126].

Каждый нормативный модуль YANG должен регистрироваться в реестрах IETF XML Registry [RFC3688] [IANA-XML] и YANG Module Names [RFC6020] [IANA-MOD-NAMES]. Это применимо как к новым, так и к обновляемым модулям. Пример обновления регистрации для модуля ietf-template представлен в разделе 5.

3.8.1. Документы, создающие новые пространства имён

Если I-D определяет новое пространство имён, администрируемое IANA, документ должен включать раздел IANA Considerations, описывающий управление пространством имён. В частности, если значение оператора namespace в модуле YANG ещё не зарегистрировано в IANA, должна запрашиваться регистрация новой записи в субреестре ns реестра IETF XML Registry.

3.8.2. Документы с расширением пространств имён

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

3.9. Разделы ссылок

Для каждого присутствующего в модуле оператора import или include, который связан с модулем, заданным в другом документе, должна указываться нормативная ссылка на этот документ в разделе Normative References. Ссылка должна соответствовать конкретному выпуску модуля, используемому в спецификации.

Для каждого присутствующего в модуле нормативного оператора reference, указывающего отдельный документ, следует включать ссылку на этот документ в раздел Normative References. Ссылке следует указывать версию документа, используемую в спецификации. Если оператор reference содержит информационную ссылку, соответствующий документ может указываться в разделе Informative References.

3.10. Инструменты для проверки

Все модули необходимо проверять перед представлением I-D. Компилятор YANG pyang доступен на GitHub по ссылке <https://github.com/mbj4668/pyang>. При использовании pyang для проверки нормативного модуля в команде должна указываться опция —ietf для обнаружения любых несоответствий требованиям IETF. Если pyang применяется для проверки примера модуля, можно указывать в команде опцию —ietf для обнаружения несоответствий требованиям IETF.

Программа yanglint, также доступная на GitHub по ссылке <https://github.com/CESNET/libyang>, может служить для проверки операторов XPath в модулях YANG.

3.11. Средства извлечения модулей

Доступна версия программы rfcstrip, извлекающая модули YANG из документов I-D и RFC. Программа доступна по ссылке <https://github.com/mbj4668/rfcstrip>. Этот инструмент можно применять для проверки корректности тегов <CODE BEGINS> и <CODE ENDS> и возможности извлечения нормативных модулей YANG.

Программа xym, доступная на GitHub по ссылке <https://github.com/xym-tool/xym>, также позволяет извлекать модули YANG из документов.

3.12. Примеры применения модулей

Каждой спецификации, определяющей модули, следует включать примеры использования в самом документе или в приложении. Сюда входят фрагменты кода в подходящем формате (например, XML или JSON) для демонстрации предполагаемого использования модулей YANG. Примеры модулей должны быть проверены, средства проверки указаны в параграфе 3.10. При использовании в примерах адресов IP следует указывать сочетание адресов IPv4 и IPv6 или исключительно адреса IPv6.

4. Рекомендации по использованию YANG

Модули в спецификациях IETF Standards Track должны соответствовать всем синтаксическим и семантическим требованиям YANG 1.1 [RFC7950] (см. исключение для YANG 1.0 в параграфе 3.6). Рекомендации этого параграфа служат дополнением к спецификации YANG [RFC7950], предназначенным для задания минимального набора требований.

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

4.1. Соглашения по именованию модулей

Нормативные модули в документах Standards Track должны именоваться в соответствии с рекомендациями раздела «Взаимодействие с IANA» в [RFC7950]. В именах модулей следует применять отличительное слово или сокращение (например, имя протокола или рабочей группы). Если новые определения задаются для расширения имеющихся модулей, следует сохранять имена, а не создавать новые.

Имена всех публикуемых модулей должны быть уникальными. Для модулей YANG, публикуемых в RFC, такую уникальность гарантирует IANA. Для неопубликованных модулей авторам нужно убедиться, что другой разрабатываемый модуль не имеет такое же имя.

Примеры модулей не являются нормативными и для них следует использовать префикс example-.

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

После публикации имени модуля недопустимо применять его повторно даже при переводе содержащего модуль RFC в статус Historic. Имя модуля не может быть изменено в YANG и модуль будет считаться новым, а не переименованным.

4.2. Префиксы

Областью действия всех определений YANG является модуль, содержащий соответствующее определение. Это позволяет применять определения из разных модулей, даже если их имена не уникальны. В приведённом ниже примере идентификатор foo применяется во всех трёх модулях.

       module example-foo {
         namespace "tag:example.com,2017:example-foo";
         prefix f;

         container foo;
       }

       module example-bar {
         namespace "tag:example.com,2017:example-bar";
         prefix b;

         typedef foo { type uint32; }
       }

       module example-one {
         namespace "tag:example.com,2017:example-one";
         prefix one;
         import example-foo { prefix f; }
         import example-bar { prefix b; }

         augment "/f:foo" {
            leaf foo { type b:foo; }
         }
       }

YANG задаёт для использования префиксов ряд правил:

  • префиксы никогда не применяются для встроенных типов данных и ключевых слов YANG;

  • префикс должен применяться для любого внешнего оператора (т. е. оператора, определённого с помощью YANG extension);

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

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

Ниже приведены рекомендации по использованию префиксов текущего (локального) модуля:

  • префикс локального модуля следует указывать во всех выражениях путей;

  • префикс локального модуля должен указываться во всех операторах default для типов данных identityref и instance-identifier;

  • префикс локального модуля можно использовать для ссылок на typedef, grouping, extension, feature, identity, определённых в модуле.

Для префиксов следует выбирать короткие, но, вероятно, уникальные значения. Не следует выбирать значения префиксов, уже используемые в опубликованных модулях.

4.3. Идентификаторы

Идентификаторы в публикуемых модулях YANG должны иметь размер от 1 до 64 символов. К ним относятся любые конструкции, заданные как маркеры identifier-arg-str в ABNF раздела 14 [RFC7950].

4.3.1. Соглашения об именовании идентификаторов

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

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

Допускается применение общих идентификаторов, таких как name или id, в операторах определения данных, особенно если узлы имеют один тип данных.

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

4.4. Подразумеваемые значения

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

Оператор

Принятое по умолчанию значение

config

true

mandatory

false

max-elements

unbounded

min-elements

0

ordered-by

system

status

current

yin-element

false

4.5. Условные операторы

Модуль можно концептуально разделить на части с помощью операторов if-feature и/или when. Разработчикам моделей данных следует внимательно относиться к модульности, включая применение условных операторов YANG. Если определение является необязательным в зависимости от поддержки сервером возможностей протокола NETCONF или RESTCONF, следует применять оператор YANG feature. Определённый оператор feature следует применять в операторе условия if-feature, указывающем условное определение данных.

Если какие-либо данные уведомления или не являющегося конфигурационным узла не обязательны, от сервера может не требоваться возврат экземпляра этого узла данных. При наличии условия для возврата узла данных для уведомления или запроса извлечения это условие должно отражаться в документации. Например, для узла данных может применяться оператор when или if-feature или условие может быть разъяснено в операторе description внутри узла данных или одного из его потомков.

Если операторы if-feature применяются к узлу списка, те же операторы if-feature должны применяться ко всем узлам ключевых листьев списка. Недопустимо наличие операторов if-feature, применяемых к листьям ключей, но не применяемых к родительскому списку.

Не следует применять оператор when к узлам ключевых листьев. Возможно, что оператор when для узла-предка ключевого листа будет иметь такой же результат установки узла (node-set), что и ключевой лист. В таких случаях следует избегать оператора when для ключевых листьев, поскольку он будет избыточным.

4.6. Использование XPath

В этом параграфе даны рекомендации по использованию языка XML Path (XPath) [W3C.REC-xpath] в модулях YANG.

4.6.1. Контекст оценки XPath

YANG определяет 5 различных вариантов контекста оценки операторов XPath.

  1. Рабочее хранилище (running) — множество всех конфигурационных узлов данных. Корень документа является концептуальным контейнером (например, config в операции edit-config), который является родителем всех операторов определения данных верхнего уровня с config true.

  2. Данные состояния + рабочее хранилище (running) — множество всех узлов данных YANG. Корень документа является концептуальным контейнером для всех операторов определения данных верхнего уровня.

  3. Уведомления — документ уведомлений о событиях. Корень документа является элементом уведомления.

  4. Ввод RPC. Корень документа является концептуальным узлом input, который служит родителем всех определений входных параметров RPC.

  5. Вывод RPC. Корень документа является концептуальным узлом output, который служит родителем всех определений выходных параметров RPC.

Отметим, что эти контексты XPath не могут смешиваться. Например, оператор when в контексте уведомлений не может ссылаться на данные конфигурации.

       notification foo {
         leaf mtu {
           // НЕ ВЕРНО, поскольку оператор when находится в контексте уведомлений
           when "/if:interfaces/if:interface[name='eth0']";
           type leafref {
             // Верно, поскольку оператор path имеет иной контекст
             path "/if:interfaces/if:interface/if:mtu";
           }
         }
       }

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

4.6.2. Библиотека функций

Функции position и last не следует применять. Это относится и к неявному использованию функции position (например, //chapter[42]). Серверу требуется поддерживать лишь относительный порядок документов XML для всех экземпляров определённого списка, упорядоченного пользователем, или leaf-list. Функции position и last можно использовать, если они вычисляются в контексте, где узлом является упорядоченный пользователем list или leaf-list.

Не следует применять функцию id. Атрибут ID не присутствует в документах YANG, поэтому функция не имеет смысла. Компилятору YANG следует возвращать для этой функции пустую строку.

Функции namespace-uri и name применять не следует. Расширенные имена в XPath отличаются от YANG, где конкретного канонического представления не существует.

Не следует применять функцию lang, которая не подходит для YANG, поскольку документы не имеют атрибута lang. Компилятору YANG следует возвращать для этой функции значение false.

Функции local-name, namespace-uri, name, string, number не следует использовать с аргументом node-set, поскольку в этом случае результат функции будет зависеть от порядка набора узлов, который может отличаться на каждом сервере. Для вызовов функции с неявным преобразованием node-set в string проблема сохраняется.

Не следует применять функцию local-name для ссылки на локальные имена вне модуля YANG, определяющего выражения must или when с функцией local-name. Например, не следует использовать

      /*[local-name()='foo']

Следует использовать функцию derived-from-or-self вместо равенств для значений identityref. Это позволяет концептуально дополнять отождествления. Например,

      // не следует использовать
      when "md-name-format = 'name-format-null'";

      // предпочтительно
      when "derived-from-or-self(md-name-format, 'name-format-null')";

4.6.3. Отношения порядка

«Оси» attribute и namespace не поддерживаются в YANG и могут быть пустыми в серверах NETCONF и RESTCONF.

Отношения preceding и following применять не следует. Эти конструкции полагаются на порядок документов XML в конфигурационной базе данных сервера NETCONF или RESTCONF, который может быть не согласованным или не давать одинаковых результатов в разных реализациях. Вместо этого следует применять выражения-предикаты на основе статических свойств узла (например, имя или значение элемента и отношения ancestor или descendant). Отношения preceding и following можно использовать, если порядок документов не влияет на результат выражения (например, для проверки глобальной уникальности значения параметра).

Отношения preceding-sibling и following-sibling не следует применять, однако они допустимы, если порядок документов не влияет на результат выражения. От сервера требуется поддержка лишь относительного порядка документов XML для всех экземпляров определённо упорядоченного пользователем list или leaf-list. Отношения preceding-sibling и following-sibling можно применять, если они оцениваются в контексте, где узлом является упорядоченный пользователем list или leaf-list.

4.6.4. Типы

Узлы данных, использующие встроенные типы int64 и uint64, не следует применять в числовых и логических выражениях. Имеются граничные условия, при которых преобразование 64-битового типа YANG в число XPath могут давать некорректные результаты. В частности, число XPath с плавающей запятой «двойной точности» не может представить очень большое положительное или отрицательное 64-битовое число, поскольку оно обеспечивает суммарную «точность» лишь в 53 бита. Данные типа int64 и uint64 можно применять в числовых выражениях, если для представления значений достаточно 53 битов.

Создателям моделей данных следует быть осторожными и не путать пространства значений YANG и XPath. Типы данных в них не одинаковы и преобразования между YANG и XPath следует выполнять с осторожностью. Можно выполнять явные преобразования типов XPath (например, функции string, boolean, number) вместо неявных.

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

Выражениям XPath для операторов when не следует ссылаться на узлы контекста или их потомков. Можно ссылаться на узлы-потомки, если оператор when содержится внутри оператора augment, а указываемый узел не определён внутри оператора augment. Например,

      augment "/rt:active-route/rt:input/rt:destination-address" {
         when "rt:address-family='v4ur:ipv4-unicast'" {
           description
             "Это дополнение действительно лишь для IPv4 unicast.";
         }
         // Узлы, заданные здесь в операторе augment,
         // не могут быть указаны в операторе when
      }

4.6.5. Шаблоны

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

Преобразование шаблонов на сервере выполняется для всех узлов из всех пространств имён, поэтому выражение must или when с оператором * всегда даёт результат false при оценка в рамках одного модуля YANG. В таких случаях следует указывать в операторах description, что дополняющие объекты предполагаются соответствующими преобразованию шаблона.

      when /foo/services/*/active {
        description
          "В этом модуле нет прямых определений служб.
           Соответствовать будут объекты, добавленные контейнером служб.";
      }

4.6.6. Логические выражения

Операторы YANG must и when используют логические выражения XPath при проверке условий. Важно задавать эти выражения так, чтобы не возникло непреднамеренной смены результатов, если включённые в выражение объекты будут изменены в новой версии модуля. Например, лист foo2 должен существовать при foo1 равном one или three.

        leaf foo1 {
          type enumeration {
             enum one;
             enum two;
             enum three;
          }
        }

        leaf foo2 {
          // Некорректно
          must "/f:foo1 != 'two'";
          type string;
        }

        leaf foo2 {
          // Корректно
          must "/f:foo1 = 'one' or /f:foo1 = 'three'";
          type string;
        }

В следующем выпуске модуля лист foo1 включает дополнительное значение four

        leaf foo1 {
          type enumeration {
             enum one;
             enum two;
             enum three;
             enum four;
          }
        }

В этом случае первое выражение XPath позволяет воспринять four в дополнение к one и three.

4.7. Управление жизненным циклом определений YANG

Оператор YANG status должен присутствовать в определении, если он имеет значение deprecated или obsolete. Значение status = current не следует менять напрямую на obsolete. Доступность объекта следует сохранять по меньшей мере в течение года после спены статуса на deprecated, прежде чем сменить статус на obsolete.

После публикации модуля или субмодуля недопустимо менять его имя.

Идентификатор URI для пространства имён модуля недопустимо менять после публикации модуля.

Субоператору даты выпуска внутри операторов import и include следует присутствовать, если применяется какая-либо группировка из внешнего модуля.

Если оператор import относится к модулю из стабильного источника (например, RFC для модуля IETF), в него следует включать оператор reference.

        import ietf-yang-types {
           prefix yang;
           reference "RFC 6991: Common YANG Data Types";
        }

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

Определения для использования в будущем не следует включать в модуль. Не следует включать «заменители» вроде reserved, как показано ниже.

       leaf reserved {
         type string;
         description
           "Этот объект в настоящее время не нужен, но в будущем
            выпуске модуля для него может быть дано определение.";
         }
       }

4.8. Заголовок, метаданные, операторы revision

Для опубликованных модулей пространство имён должно быть глобально уникальным URI, как указано в [RFC3986]. Значение обычно выделяет IANA.

Должен присутствовать оператор organization. Если модуль содержится в документе, предназначенном получить статус IETF Standards Track, в качестве организации следует указывать рабочую группу IETF (WG), уполномоченную на создание документа. Для других органов стандартизации предлагается применять аналогичный подход.

Должен присутствовать оператор contact. Если модуль содержится в документе, предназначенном получить статус IETF Standards Track, следует указывать WG-страницу и почтовый адрес рабочей группы, а также следует включать контактные данные основного автора или редактора документа. При наличии дополнительных авторов или редакторов, можно включать их контактные данные. Включать сведения о руководителе WG не требуется.

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

Если модуль полагается на сведения из других документов, которые не совпадают с предполагаемыми операторами import в модуле, эти документы должны быть указаны в операторе reference.

Оператор revision должен присутствовать для каждой опубликованной версии модуля и должен включать субоператор reference, который должен указывать опубликованный документ с модулем. Модули часто извлекаются из исходных документов, а разработчикам и операторам полезно знать, где можно найти оригинальный документ. Оператор revision может включать субоператор description. Ниже дан пример оператора revision для опубликованного модуля YANG.

      revision "2012-02-22" {
        description
          "Исходный выпуск";
        reference
          "RFC 8341: Network Configuration
                     Access Control Model";
      }

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

      revision "2017-12-11" {
        description
          "Добавлена поддержка действий и уведомлений YANG 1.1, привязанных
           к узлам данных. Разъяснено применение расширений NACM в других
           моделях данных.";
        reference
          "RFC 8407: Network Configuration Protocol (NETCONF)
                     Access Control Model";
      }

      revision "2012-02-22" {
        description
          "Исходный выпуск";
        reference
          "RFC 8341: Network Configuration
                     Access Control Model";
      }

4.9. Назначение пространств имён

Рекомендуется включать в документы лишь действительные модули YANG независимо от того, опубликованы ли эти модули. Это позволит:

  • корректно компилировать модули вместо получения множества сообщений о критических ошибках;

  • использовать модули в ранних реализациях без выбора случайных значений для пространства имён XML;

  • заранее тестировать взаимодействие, поскольку независимые реализации будут использовать одно пространство имён XML.

Пока идентификатор URI не выделен агентством the IANA, идентификатор URI для пространства имён должен предоставляться для оператора namespace в модуле YANG. Следует выбирать значение, которое не будет приводить к конфликтам с другими пространствами имён YANG. Недопустимо применять имена, префиксы и URI стандартных модулей, указанных в реестре YANG Module Names.

Стандартному значению оператора namespace следует иметь форму

       <URN prefix string>:<module-name>

Для публикуемых и непубликуемых модулей YANG следует использовать строку префикса URN в форме

       urn:ietf:params:xml:ns:yang:

Ниже приведены корректные значения URN для оператора namespace в модулях Standards Track.

       urn:ietf:params:xml:ns:yang:ietf-netconf-partial-lock
       urn:ietf:params:xml:ns:yang:ietf-netconf-state
       urn:ietf:params:xml:ns:yang:ietf-netconf

Отметим, что для модулей, не являющихся Standards Track следует применять иную строку префикса URN, которую следует выбирать в соответствии с рекомендациями [RFC7950].

Ниже приведены URI, иллюстрирующие возможное использование в модулях, не относящихся к Standards Track. Отметим, что в примерах IETF I-D следует использовать домен example.com. Эти URI не предназначены для разыменования и служат лишь для указания пространства имён модуля.

Примеры URI, использующие URL в соответствии с [RFC3986]

       https://example.com/ns/example-interfaces
       https://example.com/ns/example-system

Примеры URI, использующие теги в соответствии с [RFC4151]

       tag:example.com,2017:example-interfaces
       tag:example.com,2017:example-system

4.10. Определения данных верхнего уровня

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

Следует тщательно продумать разделение данных конфигурации и рабочего состояния. Иногда полезно задать раздельные контейнеры верхнего уровня для конфигурации и прочих данных. Для некоторых имеющихся узлов данных верхнего уровня конфигурационные данные могут быть вне зоны действия и контейнер будет представлять лишь данные рабочего состояния. Дополнительные подробности приведены в NMDA [RFC8342].

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

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

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

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

4.11. Типы данных

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

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

Числовые типы данных со знаком (int8, int16, int32, int64) не следует применять, если семантика не предполагает отрицательных значений.

4.11.1. Расширяемость фиксированных значений

Если набор значений и содержимое типа данных контролируется одним органом (naming authority), следует применять перечисляемый (enumeration) тип данных.

       leaf foo {
         type enumeration {
           enum one;
           enum two;
         }
       }

Если нужна расширяемость перечисляемых значений, следует применять тип identityref вместо enumeration или иного встроенного типа данных.

       identity foo-type {
         description "Base for the extensible type";
       }

       identity one {
         base f:foo-type;
       }
       identity two {
         base f:foo-type;
       }

       leaf foo {
         type identityref {
           base f:foo-type;
         }
       }

Отметим, что любой модуль может объявить отождествление с базой foo-type, действительное для листа foo. Значения identityref считаются пригодными (qualified) именами.

4.11.2. Шаблоны и диапазоны

Если для строковых типов данных семантика позволяет определить машиночитаемый шаблон, следует включать хотя бы один такой шаблон. Для задания шаблона следует указывать строку в одинарных кавычках (´), поскольку строка в двойных кавычках может менять содержимое. При использовании шаблонов в определении типа с известными ограничениями, таким как ложные совпадения (несовпадения), такие ограничения следует указывать в определении данных или typedef. Приведённый ниже оператор typedef из [RFC6991] даёт пример использования оператора pattern.

       typedef ipv4-address-no-zone {
         type inet:ipv4-address {
           pattern '[0-9\.]*';
         }
         ...
       }

Если для строкового типа данных во всех реализациях требуется ограничить размер, должен включаться оператор length, как показано ниже в примере typedef из [RFC6991].

       typedef yang-identifier {
         type string {
           length "1..max";
           pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
           pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
         }
         ...
       }

Если для численных типов семантика вносит дополнительные ограничения, следует включать оператор range, как показано ниже в примере из [RFC6991].

       typedef dscp {
         type uint8 {
            range "0..63";
         }
         ...
       }

4.11.3. Перечисляемые и биты

Для типов данных enumeration или bits семантику каждого enum или bit следует указывать в отдельном операторе description (внутри оператора enum или bit).

       leaf foo {
         // Некорректно
         type enumeration {
           enum one;
           enum two;
         }
         description
           "Перечисляемый тип foo ...
            one: первый элемент
            two: второй элемент";
       }

       leaf foo {
         // Корректно
         type enumeration {
           enum one {
             description "Первый элемент";
           }
           enum two {
             description "Второй элемент";
           }
         }
         description
           "Перечисляемый тип foo ...  ";
       }

4.11.4. Тип union

Тип YANG union оценивается путём сравнения с каждым элементом объединения. Первое определение типа, принимающее значение как допустимое, является используемым типом элемента. В общем случае типы элементов следует упорядочивать от более ограниченных к менее ограниченным типам. В приведённом ниже примере тип enumeration никогда не даст совпадения, поскольку тип string будет соответствовать чему угодно.

Некорректное определение

      type union {
        type string;
        type enumeration {
          enum up;
          enum down;
        }
      }

Корректное определение

      type union {
        type enumeration {
          enum up;
          enum down;
        }
        type string;
      }

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

Некорректное определение

      type union {
        type string;
        type int32;
      }

Корректное определение

      type union {
        type int32;
        type string;
      }

4.11.5. Пустой и логический тип

YANG поддерживает пустой тип данных empty, который имеет одно значение (присутствие — present). По умолчанию установлено not present (отсутствие), что фактически не является значением. При использовании в ключе списка для этого ключевого листа может (и должно) существовать единственное значение. Тип empty не следует применять для листа ключей, поскольку это бессмысленно. Лист типа empty и leaf-list этого типа не различаются и оба ограничены одним экземпляром. Тип empty не следует применять для leaf-list.

Преимуществом применения типа empty вместо boolean является то, что принятое по умолчанию значение (not present) не занимает каких-либо байтов в представлении. Недостаток состоит в том, что клиент не всегда может определить, отсутствует лист leaf потому, что он был отфильтрован или потому, что не был реализован. У клиента может не быть полной и точной схемы данных, возвращаемых сервером, и он может не знать об отсутствующем листе.

Тип данных YANG boolean предоставляет 2 значения true и false. При использовании ключе списка для ключевого листа может существовать две записи. Значения по умолчанию игнорируются для ключевых листьев, но оператор default часто применяется для обычных (plain) логических листьев. Преимущество типа boolean состоит в том, что лист или лист-список имеют представление обоих значений. Принятое по умолчанию значение обычно не возвращается, если клиент не запросил его явно, поэтому типичное представление места не занимает.

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

Некорректное определение

      leaf flag1 {
        type empty;
      }

Корректное определение

      leaf flag2 {
        type boolean;
        default false;
      }

4.12. Определения типов с многократным использованием

При наличии подходящего производного типа в каком-либо стандартном модуле (например, [RFC6991]) следует применять этот тип вместо определения нового производного типа.

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

Если с желаемой семантикой можно связать подходящее значение, принятое по умолчанию, следует включать оператор default.

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

Оператор description должен присутствовать.

Если семантика определения типа задана во внешнем документе (отличном от модуля YANG, указанного в операторе import), должен присутствовать оператор reference.

4.13. Группировки с многократным использованием

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

  • Чёткое указание назначения группировки в операторе description.

  • Чёткое указание одного из 5 контекстов XPath в YANG (rpc/input, rpc/output, notification, узлы config true и прочие узлы данных), применимого или неприменимого для группировки.

  • Отсутствие ссылок на данные вне группировки в операторах path, must, when.

  • Отсутствие субоператоров default в leaf и choice, если значение применимо не во всех возможных контекстах.

  • Отсутствие субоператоров config в узлах данных, если значение применимо не во всех возможных контекстах.

  • Чёткое указание в операторе группировки description внешних зависимостей, таких как узлы, указанные абсолютным путём в операторах path, must, when.

4.14. Определения данных

Оператор description должен присутствовать в операторах YANG:

  • anyxml;
  • augment;
  • choice;
  • container;
  • extension;
  • feature;
  • grouping;
  • identity;
  • leaf;
  • leaf-list;
  • list;
  • notification;
  • rpctypedef.

Если семантика определения данных задана во внешнем документе (отличном от модуля YANG, указанного в операторе import), должен присутствовать оператор reference.

Конструкция anyxml может быть полезна для представления HTML-баннера с элементами разметки, такими как <b> и </b>, и в таких случаях может применяться. Однако эту конструкцию не следует использовать, если можно применить другие типы узлов данных YANG для представления желаемого синтаксиса и семантики. Было обнаружено, что оператор anyxml не реализован единообразно на всех серверах. Возможно отсутствие поддержки смешанного режима XML или конфигурационных узлов anyxml.

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

Для определений данных list и leaf-list при наличии ограничений возможного числа экземпляров во всех реализациях следует включать оператор max-elements.

При использовании операторов must или when в определении данных в оператор description этого определения следует включать описание каждого из них.

Оператор choice можно напрямую включать в оператор case в YANG 1.1, но это нужно тщательно продумать. Следует рассмотреть возможность простого включения вложенного choice в качестве дополнительных операторов case внутри родительского choice. Отметим, что операторы mandatory и default во вложенном операторе choice применяются лишь в том случае, когда сначала выбирается вариант case, содержащий вложенный оператор choice.

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

4.14.1. Контейнеры отсутствия

Контейнер отсутствия (non-presence) применяется для организации данных в конкретные субдеревья и не имеет в модели данных какой-либо дополнительной семантики, хотя YANG разрешает её (например, оператор must внутри контейнера non-presence).

Пример с «заворачиванием» в контейнеры

       container top {
          container foos {
             list foo { ... }
          }
          container bars {
             list bar { ... }
          }
       }

Пример без заворачивания

       container top {
          list foo { ... }
          list bar { ... }
       }

Применение контейнеров отсутствия для организации данных является субъективным вопросом, подобно применению каталогов в файловой системе. Хотя эти контейнеры не имеют какой-либо семантики, они могут влиять на операции протокола для узлов-потомков в контейнере non-presence, поэтому к их использованию следует подходить осторожно.

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

4.14.2. Узлы данных верхнего уровня

При использовании объектов верхнего уровня требуется учитывать ряд важных аспектов:

  • «братские» (sibling) отношения на верхнем уровне не упорядочиваются;

  • «братские» отношения на верхнем уровне не статичны и зависят от загружаемых модулей;

  • для фильтрации субдеревьев извлечение leaf-list верхнего уровня считается узлом с совпадающим содержимым для всех «братьев» верхнего уровня;

  • списки верхнего уровня со множеством экземпляров могут влиять на производительность.

4.15. Определения операций

Если семантика операции задана во внешнем документе (отличном от модулей YANG в операторе import), должен присутствовать оператор reference.

Если операция влияет на поведение системе, это следует указать в операторе description. Если операция может оказать вредное влияние на поведение системы, это должно быть указано в разделе «Вопросы безопасности».

4.16. Определения уведомлений

Оператор description должен присутствовать.

Если семантика уведомления задана во внешнем документе (отличном от модулей YANG в операторе import), должен присутствовать оператор reference.

Если уведомление указывает экземпляр ресурса, этот экземпляр следует идентифицировать в данных уведомления. Обычно это делается включением узлов-листьев leafref со значениями ключей для экземпляров ресурса. Например,

     notification interface-up {
       description "Отправка при активизации интерфейса.";
       leaf name {
         type leafref {
           path "/if:interfaces/if:interface/if:name";
         }
       }
     }

Отметим отсутствие формальных операторов YANG для идентификации каких-либо ресурсов узла данных, связанных с уведомлением. В операторе description для уведомления следует указывать, идентифицирует ли уведомление какие-либо ресурсы узла данных, связанные с событием, и как это делается.

4.17. Определения функций

Оператор YANG feature служит для определения меток, задающий набор необязательных функций в модуле. В операторах YANG, связанных с такими функциями, применяется оператор if-feature. Оператор description внутри оператор feature должен задавать все взаимодействия с другими функциями.

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

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

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

Если одна функция требует реализации другой функции, следует применять оператор if-feature в зависимом операторе feature. В показанном ниже примере feature2 требует наличия feature1.

      feature feature1 {
        description "Некая функция протокола";
      }

      feature feature2 {
        if-feature "feature1";
        description "Другая функция протокола";
      }

4.18. Ограничения узла данных YANG

4.18.1. Управление числом элементов

Операторы min-elements и max-elements можно использовать для управления числом экземпляров list или leaf-list, требуемых для конкретного узла данных. Операторы ограничений в YANG следует применять для указания условий, относящихся ко всем реализациям модели данных. Если с операциями связаны зависимые от платформы ограничения (например, max-elements поддерживается для определённого списка), следует использовать оператор определения модели данных (например, лист max-ports) для указания ограничений.

4.18.2. Операторы must и when

Операторы YANG must и when служат для проверки ссылок между объектами и их поведение существенно различается. Оператор when ведёт к удалению данных, когда условие не выполняется (false) и это не считается ошибкой. Оператор when следует применять вместе с оператором augment или uses для создания модели по условию. Условие следует задавать на основе статических свойств дополняемого объекта (например, листьев списка ключей).

Оператор must вызывает ошибку хранилища данных при невыполнении условия (false). Этот оператор следует применять для того, чтобы обеспечить соблюдение ограничений на значения параметров, которые включают более 1 узла данных (например, параметр end-time должен быть больше параметра start-time).

4.19. Оператор augment

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

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

4.19.1. Условные операторы augment

Оператор augment часто используется вместе с оператором when и/или if-feature для задания условий дополнения к той или иной части модели данных. Ниже приведён пример из [RFC7223], показывающий условное добавление контейнера ethernet в список interface для записей типа ethernetCsmacd.

        augment "/if:interfaces/if:interface" {
            when "if:type = 'ianaift:ethernetCsmacd'";

            container ethernet {
                leaf duplex {
                    ...
                }
            }
        }

4.19.2. Условные операторы определения обязательных данных

В YANG применяются очень конкретные правила способов обновления данных конфигурации в новых выпусках модуля. Эти правила позволяют «старым клиентам» взаимодействовать с «новыми серверами».

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

Можно добавить условные операторы augment, чтобы старые клиенты не знали о новых условиях и не задавали новых условий. Условный оператор augment может содержать обязательные объекты лишь для случая несоблюдения условия (false), если объекты явно не запрошены клиентом. Таким способом можно применять лишь условные операторы augment, использующие форму условия с оператором when. Включённые на сервере функции YANG в этом случае не могут управляться клиентом, поэтому небезопасно добавлять обязательные узлы дополнения на основе оператора if-feature.

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

В приведённом ниже умозрительном примере допускается дополнение записи interface листом mandatory-leaf, поскольку это дополнение зависит some-new-iftype. Старый клиент не знает этого типа, поэтому не будет его выбирать и не добавит новый обязательны узел данных.

     module example-module {

       yang-version 1.1;
       namespace "tag:example.com,2017:example-module";
       prefix mymod;

       import iana-if-type { prefix iana; }
       import ietf-interfaces { prefix if; }

       identity some-new-iftype {
          base iana:iana-interface-type;
       }

       augment "/if:interfaces/if:interface" {
          when "if:type = 'mymod:some-new-iftype'";

          leaf mandatory-leaf {
             type string;
             mandatory true;
          }
       }
     }

Отметим, что такой подход безопасен лишь при создании ресурсов данных. Небезопасно заменять или изменять ресурсы, если клиент не знает о новых условиях. Модель данных YANG должна представляться так, чтобы клиент знал об обязательных узлах данных, если ему известно условие для этих данных. В приведённом выше примере some-new-iftype задаётся одном модуле с оператором определения данных mandatory-leaf.

Такой подход небезопасен для отождествлений, заданных в базовом модуле, таком как iana-if-type, поскольку клиент не обязан знать о my-module лишь потому, что он знает о модуле iana-if-type.

4.20. Операторы отклонения

В соответствии с параграфом 7.20.3 RFC 7950, оператор YANG deviation не разрешается включать в модули IETF YANG, но он может быть полезен для документирования возможностей сервера. Операторы deviation не могут применяться многократно и обычно не переносятся с одной платформы на другие.

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

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

Порядок проверки операторов deviation может влиять на результат, поэтому не следует использовать несколько операторов deviation в одном модуле для одного объекта.

Оператор max-elements предназначен для описания архитектурных ограничений числа элементов в списках и не предназначен для задания ограничений платформ. Для платформ с ограниченными ресурсами лучше применять оператор deviation.

Ниже приведены примеры документирования ограничений ресурсов платформы.

Некорректно (max-elements в самом списке)

        container backups {
          list backup {
             ...
             max-elements  10;
             ...
          }
        }

Корректно (max-elements в операторе deviation)

        deviation /bk:backups/bk:backup {
          deviate add {
             max-elements  10;
          }
        }

4.21. Оператор расширения

Оператор YANG extension служит для задания внешних определений, которые в синтаксисе YANG имеют вид unknown-statement. К использованию операторов extension в публикуемых модулях требуется подходить с осторожностью. Ниже приведены рекомендации по использованию расширений YANG.

  • Недопустимо наличие противоречий между семантикой extension и какими-либо операторами YANG. Расширения могут добавлять семантику, не охватываемую обычными операторами YANG.

  • Модуль, содержащий оператор extension, должен чётко указывать требования по совместимости для расширения. Следует чётко указать, должны ли все реализации модуля YANG, содержащего расширение, реализовать также это расширение. Если этого не требуется, нужно указать условия, при которых реализация расширения требуется.

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

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

4.22. Корреляция данных

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

  • Встраивание (inline). Модуль обновляется доступными по протоколу новыми объектами с использованием именования и организации исходных объектов. Новые объекты используют прежнее пространство имён.

  • Дополнение (augment). Создаётся новый модуль с доступными про протоколу объектами, дополняющими исходную структуру данных. с использованием именования и организации исходных объектов. Новые объекты используют пространство имён нового модуля.

  • Отражение (mirror). Создаются новые объекты в новом или исходном модуле, но применяется новая схема именования и размещения данных. Именование объектов может связываться разными способами. Тесная привязка достигается с помощью типа данных leafref с установкой для require-instance значения true. Следует применять этот метод.

Если новые экземпляры данных не ограничиваются значениями, применяемыми в исходной структуре данных, для оператора require-instance должно устанавливаться значение false. Слабая привязка достигается использованием ключевых листьев того же типа, что и с исходной структуре данных. Семантика совпадает со случаем установки для require-instance значения false.

Дополнительные связи между конфигурацией и рабочим состоянием разъяснены в NMDA [RFC8342].

4.22.1. Использование leafref для сопоставления ключей

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

Не рекомендуется

      list foo {
         key name;
         leaf name {
           type string;
         }
         ...
      }

      list foo-addon {
         key name;
         config false;
         leaf name {
           type string;
         }
         ...
      }

Предпочтительно

      list foo {
         key name;
         leaf name {
           type string;
         }
         ...
      }

      list foo-addon {
         key name;
         config false;
         leaf name {
           type leafref {
             path "/foo/name";
             require-instance false;
           }
         }
         leaf addon {
           type string;
           mandatory true;
         }
      }

4.23. Рабочее состояние

Моделирование рабочего состояния с помощью YANG со временем совершенствовалось. Сначала к рабочему состоянию относили лишь данных, для которых оператор config имел значение false. Эти данные не считались частью сведений в хранилище данных, что значительно усложняло определение YANG XPath.

Сейчас рабочее состояние моделируется на языке YANG в соответствии с архитектурой NMDA [RFC8342] и концептуально содержится в хранилище данных рабочего состояния, которое также включает рабочие значения данных конфигурации. Больше нет необходимости дублировать структуры данных для поддержки отдельных разделов конфигурации и данных рабочего состояния.

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

4.23.1. Объединение данных рабочего состояния и конфигурации

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

      container foo {
        ...
        // Содержит узлы config true, а также узлы config false, у которых
        // нет соответствующих объектов config true (например, счётчиков)
      }

4.23.2. Представление рабочих значений данных конфигурации

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

Иногда настраиваемый набор значений отличается от рабочего набора для объекта, например, листья admin-status и oper-status в [RFC8343]. В этом случае могут применяться разные объекты для представления настраиваемых и рабочих значений.

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

Если невозможно объединить конфигурационное и рабочее состояние, используемым для представления списков ключам следует иметь одинаковый тип. Тип leafref следует применять в рабочем состоянии для ключевых листьев, имеющих соответствующие экземпляры в конфигурации. Для оператора require-instance можно установить значение false (только в модулях YANG 1.1), чтобы указать возможность использования в рабочем состоянии экземпляров, которые не имеют соответствующих данных конфигурации.

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

Разработчикам следует подробно описывать и обосновывать все отклонения от архитектуры NMDA, такие как использование раздельных субдеревьев и/или листьев. Для этого следует применять операторы description в конфигурации и рабочем состоянии.

4.23.3. Рекомендации по переходу к NMDA

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

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

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

Ниже приведены варианты, которым можно следовать при определении механизмов NMDA.

  1. Модули, которым сразу нужна поддержка функций NMDA, следует структурировать для NMDA. Может существовать временная версия модуля не-NMDA, как имеющаяся модель или модель, созданная вручную или подходящим инструментом, отражающим текущую стратегию моделирования. Оба варианта (NMDA и не-NMDA) следует публиковать в одном документе, помещая модули NMDA в основной части документа, а не-NMDA — в ненормативном приложении. Наличие модуля не-NMDA даёт временный «мост» на период разработки реализаций NMDA.

  2. Для опубликованных модулей модель следует опубликовать заново со совместимой с NMDA структурой, отменяющей конструкции не-NMDA. Например, модель ietf-interfaces из [RFC7223] была реструктурирована для NMDA в [RFC8343]. Иерархия /interfaces-state была помечена как status deprecated. Модели, отмечающие иерархии /foo-state как status deprecated, позволяют поддерживающим NMDA реализациям избежать дублирования узлов состояний, сохраняя реализациям не-NMDA возможность использования этих узлов для доступа к значениям рабочего состояния.

  3. Для моделей, дополняющих не структурированные для NMDA модели, разработчикам следует рассмотреть структуру базовой модели с учётом приведённых выше рекомендаций. По возможности для таких моделей нужно подготовить новый выпуск базовой модели с поддержкой NMDA. Когда это невозможно, следует избегать дополнения контейнеров состояния, ожидая нового выпуска базовой модели с отменой устаревших контейнеров состояния. Рекомендуется дополнять лишь иерархию /foo в базовой модели. Если эти рекомендации не выполняются, следует включать все новые элементы состояния в свой модуль.

4.23.3.1. Временные модули не-NMDA

Временный модуль не-NMDA позволяет не поддерживающим NMDA клиентам получить доступ к рабочему состоянию на сервере NMDA. Модуль содержит узлы данных config false, определённые в традиционном (до NMDA) модуле YANG.

Сервер, которому нужно поддерживать клиентов NMDA и не-NMDA может анонсировать сразу новый модуль NMDA и временный модуль не-NMDA. Клиент без поддержки NMDA может использовать отдельные субдеревья foo и foo-state, исключая субдеревья foo-state, расположенные в других (временных) модулях. Модуль NMDA может использоваться клиентом без поддержки NMDA для доступа к традиционным хранилищам данных и устаревшей операции <get> для доступа к вложенным узлам данных config false.

Операции создания временной модели не-NMDA из модели NMDA перечислены ниже.

  • Переименование модуля с добавлением суффикса -state.

  • Смена пространства имён путём добавления суффикса -state к имени исходного пространства.

  • Смена префикса путём добавления суффикса -s к исходному префиксу.

  • Добавление импорта в исходный модуль (например, для определений typedef).

  • Сохранение или создание узлов верхнего уровня с config false. Эти субдеревья представляют узлы данных config false, объединённые в субдерево конфигурации и поэтому недоступные клиентам, не понимающим NMDA. Для каждого нового узла устанавливается status deprecated.

  • В описании модуля следует чётко указать, что это временный модуль не-NMDA.

4.23.3.2. Пример создания нового модуля NMDA

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

     module example-foo {
       namespace "urn:example.com:params:xml:ns:yang:example-foo";
       prefix "foo";

       container foo {
         // Рабочие значения дочерних узлов данных конфигурации в
         // хранилище рабочего состояния могут содержать лишь
         // узлы config false, если они нужны.
       }
    }
4.23.3.3. Пример преобразования модуля не-NMDA

Несовместимые объекты не следует удалять из существующих модулей. Вместо этого для них устанавливается статус deprecated. В какой-то момент (обычно по истечении 1 года) статус можно сменить на obsolete.

Старый модуль

     module example-foo {
       namespace "urn:example.com:params:xml:ns:yang:example-foo";
       prefix "foo";

       container foo {
         // Дочерние узлы данных конфигурации
       }

       container foo-state {
         config false;
         // Дочерние узлы рабочего состояния
       }
    }

Преобразованный модуль NMDA

     module example-foo {
       namespace "urn:example.com:params:xml:ns:yang:example-foo";
       prefix "foo";

       container foo {
         // Рабочие значения дочерних узлов данных конфигурации в
         // хранилище рабочего состояния могут содержать лишь
         // узлы config false, если они нужны (из старого foo-state).
       }

       // сохранить исходный foo-state, но сменить статус на deprecated
       container foo-state {
         config false;
         status deprecated;
         // Дочерние узлы рабочего состояния
       }
    }
4.23.3.4. Пример создания временного модуля NMDA

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

     module example-foo-state {
       namespace "urn:example.com:params:xml:ns:yang:example-foo-state";
       prefix "foo-s";

       // Импорт нового или конвертированного модуля (в примере не применяется)
       import example-foo { prefix foo; }

       container foo-state {
         config false;
         status deprecated;
         // Дочерние узлы рабочего состояния
       }
    }

4.24. Вопросы производительности

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

  • списки обычно «дороже» контейнеров;

  • оценка оператора when обычно дороже, чем операторов if-feature или choice;

  • операторы must обычно дороже, чем min-entries, max-entries, mandatory, unique;

  • листья identityref обычно дороже, чем листья enumeration;

  • типы leafref и instance-identifier с require-instance true обычно дороже, чем при установке require-instance false.

4.25. Рассмотрение открытых систем

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

4.26. Рекомендации для конструкций YANG 1.1

Набор рекомендация для YANG 1.1 будет расширяться по мере обретения опыта использования новых функций языка. В этом параграфе приведён первый набор рекомендаций для новых функций языка YANG 1.1.

4.26.1. Импорт нескольких выпусков

Стандартным модулям не следует импортировать несколько версий одного модуля. Так поступать можно при необходимости использовать независимые определения (например, enumeration typedef) из конкретных выпусков импортируемого модуля.

4.26.2. Использование логики feature

Логика функций в YANG 1.1 значительно выразительней, чем в YANG 1.0. Операторам description следует описывать логику if-feature в форме текста, чтобы помочь читателям понять модуль.

Функции YANG (feature) следует применять вместо оператора when, если это возможно. Функции анонсируются сервером, а объекты, с которыми связаны условия операторов if-feature группируются концептуально. Такой общности нет в операторах when.

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

4.26.3. Операторы anyxml и anydata

Оператор anyxml недопустимо применять для представления концептуального субдерева узлов данных YANG. Взамен должен использоваться оператор anydata.

4.26.4. Операторы action и rpc

Использование операторов action или rpc определяется разработчиком. Операции RPC не связаны с каким-либо конкретным узлом данных, а действия (action) связаны с конкретным определением узла. Оператор action следует применять в операциях протокола, связанных с подмножеством узлов данных, а не со всеми возможными узлами.

Одно и то же имя действия может применяться в разных определениях разных узлов данных. Например, действие reset в определении узла данных для интерфейса может иметь иные параметры, нежели в определении для источника питания или VLAN. Следует применять одно имя действия для представления похожей семантики.

Модель управления доступом NETCONF (NETCONF Access Control Model или NACM) [RFC8341] не поддерживает управление доступом на основе параметров для операций RPC. Пользователю предоставляется (или не предоставляется) возможность вызова операции RPC, независимо от её параметров. Например, если каждому клиенту разрешено сбрасывать лишь свой интерфейс, NACM не может применяться, поскольку не может обеспечить контроль доступа на основе значения параметра interface (управляет лишь доступом к операции reset).

      rpc reset {
        input {
          leaf interface {
            type if:interface-ref;
            mandatory true;
            description "Интерфейс для сброса.";
          }
        }
      }

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

      container interfaces {
        list interface {
          ...
          action reset { }
        }
      }

4.27. Обновление модулей YANG (опубликованных и неопубликованных)

Модули YANG могут меняться со временем. Обычно новые определения модели данных нужны для поддержки новых функций. Для опубликованных модулей должны выполняться правила обновления YANG из раздела 11 в [RFC7950]. Они могут применяться и для непубликуемых модулей.

Правила обновления YANG применяются лишь для опубликованных выпусков модулей. Каждая организация может применять свой способ определения опубликованных работ, которые считаются стабильными и неопубликованных работ, которые стабильными не считаются. Например, в IETF для опубликованных работ используются RFC, для неопубликованных — I-D.

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

Перечисленные ниже регистрации в субреестре ns реестра IETF XML Registry [RFC3688] были уточнены в [RFC6087] и обновлены IANA с указанием этого документа.

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

Приведённые в таблице назначения были уточнены в [RFC6087] и обновлены IANA в реестре YANG Module Names. Этот документ также был добавлен в ссылку для самого реестра YANG Module Names как содержащий шаблон, требуемый для регистрации, в Приложении B.

Назначение реестров YANG.

Поле

Значение

Name

ietf-template

Namespace

urn:ietf:params:xml:ns:yang:ietf-template

Prefix

temp

Reference

RFC8407

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

Этот документ даёт рекомендации для содержимого NETCONF и RESTCONF, определяемого с использованием языка моделирования данных YANG, поэтому не вносит новых и не меняет имеющихся рисков безопасности для систем управления.

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

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

[ID-Guidelines] Housley, R., «Guidelines to Authors of Internet-Drafts», December 2010, <https://www.ietf.org/standards/ids/guidelines/>.

[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>.

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

[RFC5378] Bradner, S., Ed. and J. Contreras, Ed., «Rights Contributors Provide to the IETF Trust», BCP 78, RFC 5378, DOI 10.17487/RFC5378, November 2008, <https://www.rfc-editor.org/info/rfc5378>.

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

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

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

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

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

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

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[W3C.REC-xpath] Clark, J. and S. DeRose, «XML Path Language (XPath) Version 1.0», W3C Recommendation REC-xpath-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xpath-19991116>.

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

[IANA-MOD-NAMES] IANA, «YANG Module Names», <https://www.iana.org/assignments/yang-parameters/>.

[IANA-XML] IANA, «IETF XML Registry», <https://www.iana.org/assignments/xml-registry/>.

[RFC-STYLE] RFC Editor, «Style Guide», <http://www.rfc-editor.org/styleguide/>.

[RFC2026] Bradner, S., «The Internet Standards Process — Revision 3», BCP 9, RFC 2026, DOI 10.17487/RFC2026, October 1996, <https://www.rfc-editor.org/info/rfc2026>.

[RFC4151] Kindberg, T. and S. Hawke, «The ‘tag’ URI Scheme», RFC 4151, DOI 10.17487/RFC4151, October 2005, <https://www.rfc-editor.org/info/rfc4151>.

[RFC4181] Heard, C., Ed., «Guidelines for Authors and Reviewers of MIB Documents», BCP 111, RFC 4181, DOI 10.17487/RFC4181, September 2005, <https://www.rfc-editor.org/info/rfc4181>.

[RFC6087] Bierman, A., «Guidelines for Authors and Reviewers of YANG Data Model Documents», RFC 6087, DOI 10.17487/RFC6087, January 2011, <https://www.rfc-editor.org/info/rfc6087>.

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

[RFC7322] Flanagan, H. and S. Ginoza, «RFC Style Guide», RFC 7322, DOI 10.17487/RFC7322, September 2014, <https://www.rfc-editor.org/info/rfc7322>.

[RFC7841] Halpern, J., Ed., Daigle, L., Ed., and O. Kolkman, Ed., «RFC Streams, Headers, and Boilerplates», RFC 7841, DOI 10.17487/RFC7841, May 2016, <https://www.rfc-editor.org/info/rfc7841>.

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8349] Lhotka, L., Lindem, A., and Y. Qu, «A YANG Data Model for Routing Management (NMDA Version)», RFC 8349, DOI 10.17487/RFC8349, March 2018, <https://www.rfc-editor.org/info/rfc8349>.

Приложение A. Контрольный список рецензирования модуля

Этот раздел является переработкой текста из RFC 4181.

Целью рецензирования модуля YANG является проверка его технической корректности и соответствия требованиям IETF к документации. Приведённый ниже список может помочь при рецензировании документов I-D.

  • Шаблон I-D (Boilerplate). Проверяется указание в документе шаблона I-D (см. https://www.ietf.org/id-info/guidelines.html), включая соответствующее заявление для разрешения публикации RFC и отсутствие в шаблоне I-D ссылок и номеров разделов.

  • Аннотация (Abstract). Проверяется отсутствие в аннотации ссылок и номера параграфа, а также соответствие рекомендациям https://www.ietf.org/id-info/guidelines.html.

  • Авторские права (Copyright Notice). Проверяется наличие корректного текста, относящегося к правам, которые участники работы предоставили IETF Trust [RFC5378]. Проверяется наличие полного указания прав IETF Trust в начале документа. Документ IETF Trust Legal Provisions (TLP) доступен по ссылке https://trustee.ietf.org/license-info/.

  • Раздел «Вопросы безопасности» (Security Considerations). Проверяется использование в документе последнего одобренного шаблона с сайта направления Operations and Management (OPS) (https://trac.ietf.org/area/ops/trac/wiki/yang-security-guidelines) и соблюдение приведённых там рекомендаций.

  • Раздел «Взаимодействие с IANA (IANA Considerations). Это обязательный раздел и для каждого модуля в документе этот раздел должен включать записи для реестров:

    XML Namespace Registry — реестр пространств имён модулей YANG;

    YANG Module Registry — реестр имён, префиксов пространств имён и номеров RFC для модулей YANG в соответствии с правилами [RFC6020].

  • Литература (References). Проверяется корректность разделения ссылок на нормативные и информационные, включение RFC 2119 и RFC 8174 в нормативные ссылки если используются упомянутые в этих документах термины, наличие всех ссылок, указанных в шаблоне, указание всех импортируемых и цитируемых модулей YANG в разделе нормативных ссылок, указание цитат из последних действующих RFC, если нет действительной причины указывать иные (например, включение информационной ссылки на предыдущую публикацию для разъяснений свойства, обеспечивающего совместимость с прежними версиями). Проверяется наличие ссылок на импортируемые модули в тексте документа (вне модуля YANG). Если модуль YANG содержит ссылки или операторы description, указывающие I-D, этот документ включается в информационные ссылки.

  • Лицензия. Проверяется указание Simplified BSD License в каждом модуле и субмодуле YANG. Некоторые рекомендации для этого требования даны в параграфе 3.1. Проверяется корректность года в указании авторских прав и использование одобренного текста из последнего документа TLP, доступного по ссылке https://trustee.ietf.org/license-info/.

  • Другие вопросы. Проверяется отсутствие проблем, отмеченных в https://www.ietf.org/id-info/checklist.html.

  • Техническое содержание. Рецензируется фактическое содержание документа на предмет соответствия рекомендациям этого документа. Рекомендуется использовать компилятор модуля YANG для обнаружения синтаксических ошибок. Список свободно распространяемых инструментов и другая информация, включая советы по форматированию, доступны по ссылкам https://trac.ietf.org/trac/netconf/wiki и https://trac.ietf.org/trac/netmod/wiki

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

Приложение B. Шаблон модуля YANG

   <CODE BEGINS> file "ietf-template@2016-03-20.yang"

   module ietf-template {
     yang-version 1.1;

     // Замените строку уникальным значением URN пространства имён
     namespace "urn:ietf:params:xml:ns:yang:ietf-template";

     // Замените строку, пытаясь указать уникальный префикс
     prefix temp;

     // Здесь помещаются операторы import, например,
     // import ietf-yang-types { prefix yang; }
     // import ietf-inet-types { prefix inet; }
     // Указывается рабочая группа IETF, если это применимо.

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     // Укажите реальные данные для контактов
     contact
       "WG Web:   <http://datatracker.ietf.org/wg/your-wg-name/>
        WG List:  <mailto:your-wg-name@ietf.org>

        Editor:   your-name
                  <mailto:your-email@example.com>";

     // Замените первое предложение в этом операторе description.
     // Замените сведения об авторских правах наиболее свежими,
     // если они обновились после публикации этого документа.
     description
       "Этот модуль задаёт шаблон для других модулей YANG.

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

        Распространение и применение модуля в исходной или двоичной 
        форме с изменениями или без таковых разрешено в соответствии с
        лицензией Simplified BSD License, изложенной в параграфе 4.c
        IETF Trust's Legal Provisions Relating to IETF Documents
        (https://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC XXXX, где правовые
        аспекты приведены более полно.";

     // RFC Ed.: замените XXXX фактическим номером RFC и удалите этот
     // комментарий.
     // Замените 2016-03-20 фактической датой публикации модуля в 
     // формате (год-месяц-число)
     revision 2016-03-20 {
       description
         "Что изменено в этом выпуске";
       reference "RFC XXXX: <Replace With Document Title>";
     }

     // Операторы extension
     // Операторы feature
     // Операторы identity
     // Операторы typedef 
     // Операторы grouping
     // Операторы определения данных
     // Операторы augment 
     // Операторы rpc 
     // Операторы notification 
     // НЕ ВКЛЮЧАЙТЕ операторы deviation в публикуемые модули
   }

   <CODE ENDS>

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

Структура и содержимое документа основаны на документе «Guidelines for Authors and Reviewers of MIB Documents» [RFC4181], созданном C. M. Heard.

Рабочая группа благодарна Martin Bjorklund, Juergen Schoenwaelder, Ladislav Lhotka, Jernej Tuljak, Lou Berger, Robert Wilton, Kent Watsen, William Lupton за их всеобъемлющие рецензии и вклад в этот документ.

Адрес автора

Andy Bierman

YumaWorks

Email: andy@yumaworks.com


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

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

nmalykh@protokols.ru

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

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

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

RFC 8431 A YANG Data Model for the Routing Information Base (RIB)

Internet Engineering Task Force (IETF)                           L. Wang
Request for Comments: 8431                                    Individual
Category: Standards Track                                        M. Chen
ISSN: 2070-1721                                                   Huawei
                                                                 A. Dass
                                                                Ericsson
                                                      H. Ananthakrishnan
                                                                 Netflix
                                                                 S. Kini
                                                              Individual
                                                              N. Bahadur
                                                                    Uber
                                                          September 2018

A YANG Data Model for the Routing Information Base (RIB)

Модель данных YANG для базы маршрутной информации (RIB)

PDF

Аннотация

Документ определяет модель данных YANG для базы маршрутной информации (Routing Information Base или RIB), согласованную с информационной моделью RIB интерфейса в систему маршрутизации (Routing System или I2RS).

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

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

Этот документ задаёт модель данных YANG [RFC7950] [RFC6991] для RIB, которая соответствует применению RIB и согласована с информационной моделью RIB.

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

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

1.2. Определения и сокращения

RIB

Routing Information Base — база маршрутной информации.

FIB

Forwarding Information Base — база информации для пересылки.

RPC

Remote Procedure Call — удалённый вызов процедуры.

IM

Information Model — информационная модель. Абстрактная модель концептуальной области, независимая от конкретной реализации или представления данных.

1.3. Диаграммы деревьев

Диаграммы деревьев в этом документе приведены в нотации [RFC8340].

2. Структура модели

На рисунке 1 обзорно показана структура дерева модуля ietf-i2rs-rib. Для краткости некоторые детали опущены, их можно найти в последующих параграфах.

   module: ietf-i2rs-rib
      +--rw routing-instance
         +--rw name              string
         +--rw interface-list* [name]
         |  +--rw name if:interface-ref
         +--rw router-id?        yang:dotted-quad
         +--rw lookup-limit?     uint8
         +--rw rib-list* [name]
            +--rw name              string
            +--rw address-family address-family-definition
            +--rw ip-rpf-check?     boolean
            +--rw route-list* [route-index]
            |  +--rw route-index                uint64
            |  +--rw match
            |  |  +--rw (route-type)?
            |  |     +--:(ipv4)
            |  |     |  ...
            |  |     +--:(ipv6)
            |  |     |  ...
            |  |     +--:(mpls-route)
            |  |     |  ...
            |  |     +--:(mac-route)
            |  |     |  ...
            |  |     +--:(interface-route)
            |  |        ...
            |  +--rw nexthop
            |  |  +--rw nexthop-id?           uint32
            |  |  +--rw sharing-flag?         boolean
            |  |  +--rw (nexthop-type)?
            |  |     +--:(nexthop-base)
            |  |     |  ...
            |  |     +--:(nexthop-chain) {nexthop-chain}?
            |  |     |  ...
            |  |     +--:(nexthop-replicate) {nexthop-replicate}?
            |  |     |  ...
            |  |     +--:(nexthop-protection) {nexthop-protection}?
            |  |     |  ...
            |  |     +--:(nexthop-load-balance) {nexthop-load-balance}?
            |  |        ...
            |  +--rw route-status
            |  |  ...
            |  +--rw route-attributes
            |  |  ...
            |  +--rw route-vendor-attributes
            +--rw nexthop-list* [nexthop-member-id]
               +--rw nexthop-member-id uint32
   rpcs:
      +---x rib-add
      |  +---w input
      |  |  +---w name        string
      |  |  +---w address-family      address-family-definition
      |  |  +---w ip-rpf-check?   boolean
      |  +--ro output
      |     +--ro result boolean
      |     +--ro reason? string
      +---x rib-delete
      |  +---w input
      |  |  +---w name string
      |  +--ro output
      |     +--ro result boolean
      |     +--ro reason? string
      +---x route-add
      |  +---w input
      |  |  +---w return-failure-detail?   boolean
      |  |  +---w rib-name                 string
      |  |  +---w routes
      |  |     +---w route-list* [route-index]
      |  |        ...
      |  +--ro output
      |     +--ro success-count     uint32
      |     +--ro failed-count      uint32
      |     +--ro failure-detail
      |        +--ro failed-routes* [route-index]
      |           +--ro route-index uint32
      |           +--ro error-code? uint32
      +---x route-delete
      |  +---w input
      |  |  +---w return-failure-detail?   boolean
      |  |  +---w rib-name                 string
      |  |  +---w routes
      |  |     +---w route-list* [route-index]
      |  |        ...
      |  +--ro output
      |     +--ro success-count     uint32
      |     +--ro failed-count      uint32
      |     +--ro failure-detail
      |        +--ro failed-routes* [route-index]
      |           +--ro route-index uint32
      |           +--ro error-code? uint32
      +---x route-update
      |  +---w input
      |  |  +---w return-failure-detail?           boolean
      |  |  +---w rib-name                         string
      |  |  +---w (match-options)?
      |  |     +--:(match-route-prefix)
      |  |     |  ...
      |  |     +--:(match-route-attributes)
      |  |     |  ...
      |  |     +--:(match-route-vendor-attributes) {...}?
      |  |     |  ...
      |  |     +--:(match-nexthop)
      |  |        ...
      |  +--ro output
      |     +--ro success-count uint32
      |     +--ro failed-count uint32
      |     +--ro failure-detail
      |        +--ro failed-routes* [route-index]
      |           +--ro route-index uint32
      |           +--ro error-code? uint32
      +---x nh-add
      |  +---w input
      |  |  +---w rib-name              string
      |  |  +---w nexthop-id?           uint32
      |  |  +---w sharing-flag?         boolean
      |  |  +---w (nexthop-type)?
      |  |     +--:(nexthop-base)
      |  |     |  ...
      |  |     +--:(nexthop-chain) {nexthop-chain}?
      |  |     |  ...
      |  |     +--:(nexthop-replicate) {nexthop-replicate}?
      |  |     |  ...
      |  |     +--:(nexthop-protection) {nexthop-protection}?
      |  |     |  ...
      |  |     +--:(nexthop-load-balance) {nexthop-load-balance}?
      |  |        ...
      |  +--ro output
      |     +--ro result        boolean
      |     +--ro reason?       string
      |     +--ro nexthop-id?   uint32
      +---x nh-delete
         +---w input
         |  +---w rib-name              string
         |  +---w nexthop-id?           uint32
         |  +---w sharing-flag?         boolean
         |  +---w (nexthop-type)?
         |     +--:(nexthop-base)
         |     |  ...
         |     +--:(nexthop-chain) {nexthop-chain}?
         |     |  ...
         |     +--:(nexthop-replicate) {nexthop-replicate}?
         |     |  ...
         |     +--:(nexthop-protection) {nexthop-protection}?
         |     |  ...
         |     +--:(nexthop-load-balance) {nexthop-load-balance}?
         |        ...
         +--ro output
            +--ro result boolean
            +--ro reason? string
   notifications:
      +---n nexthop-resolution-status-change
      |  +--ro nexthop
      |  |  +--ro nexthop-id?           uint32
      |  |  +--ro sharing-flag?         boolean
      |  |  +--ro (nexthop-type)?
      |  |     +--:(nexthop-base)
      |  |     |  ...
      |  |     +--:(nexthop-chain) {nexthop-chain}?
      |  |     |  ...
      |  |     +--:(nexthop-replicate) {nexthop-replicate}?
      |  |     |  ...
      |  |     +--:(nexthop-protection) {nexthop-protection}?
      |  |     |  ...
      |  |     +--:(nexthop-load-balance) {nexthop-load-balance}?
      |  |        ...
      |  +--ro nexthop-state nexthop-state-definition
      +---n route-change
         +--ro rib-name                 string
         +--ro address-family               address-family-definition
         +--ro route-index              uint64
         +--ro match
         |  +--ro (route-type)?
         |     +--:(ipv4)
         |     |  ...
         |     +--:(ipv6)
         |     |  ...
         |     +--:(mpls-route)
         |     |  ...
         |     +--:(mac-route)
         |     |  ...
         |     +--:(interface-route)
         |        ...
         +--ro route-installed-state route-installed-state-definition
         +--ro route-state         route-state-definition
         +--ro route-change-reasons* [route-change-reason]
            +--ro route-change-reason    route-change-reason-definition

Рисунок 1. Структура модуля I2RS RIB.

2.1. Возможности RIB

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

В то же время могут применяться цепочки nexthop для задания нескольких заголовков пакета перед пересылкой конкретного пакета. Не каждое сетевое устройство способно поддерживать все виды цепочек nexthop вместе с произвольным числом связанных в цепочку заголовков. Модели данных RIB нужен способ раскрытия возможностей поддержки цепочек nexthop на данном сетевом устройстве.

Этот модуль использует операторы feature и if-feature для анонсирования возможностей.

2.2. Экземпляр маршрутизации и RIB

Экземпляром маршрутизации в контексте информационной модели RIB является набор RIB, интерфейсов и параметров протоколов маршрутизации. Экземпляр маршрутизации создаёт логический срез (slice) маршрутизатора и может позволять множеству таких логических срезов в наборе маршрутизаторов взаимодействовать между собой. Параметры протоколов маршрутизации управляют сведениями, доступными в RIB. Более подробное описание экземпляров маршрутизации приведено в параграфе 2.2 [RFC8430].

Экземпляр маршрутизации может иметь несколько RIB, поэтому в модели для их представления используется список (list). Структура дерева для экземпляра маршрутизации представлена на рисунке 2

   +--rw routing-instance
      +--rw name              string
      +--rw interface-list* [name]
      |  +--rw name if:interface-ref
      +--rw router-id?        yang:dotted-quad
      +--rw lookup-limit?     uint8
      +--rw rib-list* [name]
         +--rw name            string
         +--rw address-family      address-family-definition
         +--rw ip-rpf-check?   boolean
         +--rw route-list* [route-index]
            ... // См. параграф 2.3

Рисунок 2. Структура экземпляра маршрутизации.

2.3. Маршрут

Маршрут — это, по сути, условие сопоставления и действие, выполняемое по этому условию. Условие задаёт тип маршрута (например, IPv4, MPLS, MAC3, Interface, etc.) and the set of fields to match on.

Маршрут должен содержать атрибут ROUTE_PREFERENCE (см. параграф 2.3 в [RFC8430]). Кроме того, в откликах на операции чтения или записи RIB с маршрутом должен быть связан один из указанных ниже атрибутов состояния.

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

  • Installed (установлен), указывает, что маршрут включён в FIB.

  • Reason (причина) указывает конкретную причину отказа, например, Not authorized (не разрешено).

Дополнительно маршрут может иметь один или несколько атрибутов (например, route-vendor-attributes).

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

   +--rw route-list* [route-index]
      +--rw route-index                uint64
      +--rw match
      |  +--rw (route-type)?
      |     +--:(ipv4)
      |     |  +--rw ipv4
      |     |     +--rw (ip-route-match-type)?
      |     |        +--:(dest-ipv4-address)
      |     |        |  ...
      |     |        +--:(src-ipv4-address)
      |     |        |  ...
      |     |        +--:(dest-src-ipv4-address)
      |     |           ...
      |     +--:(ipv6)
      |     |  +--rw ipv6
      |     |     +--rw (ip-route-match-type)?
      |     |        +--:(dest-ipv6-address)
      |     |        |  ...
      |     |        +--:(src-ipv6-address)
      |     |        |  ...
      |     |        +--:(dest-src-ipv6-address)
      |     |           ...
      |     +--:(mpls-route)
      |     |  +--rw mpls-label              uint32
      |     +--:(mac-route)
      |     |  +--rw mac-address             uint32
      |     +--:(interface-route)
      |        +--rw interface-identifier if:interface-ref
      +--rw nexthop
      |  ...(refer to Section 2.4)

Рисунок 3. Структура маршрута.

2.4. Следующий узел

Объект nexthop является результатом поиска маршрута. Как показано на рисунке 4 в [RFC8430], для поддержки вариантов применения (например, распределение нагрузки, защита, групповая передача или их сочетание) nexthop моделируется многоуровневой структурой и поддерживает рекурсию. Первый уровень nexthop включает 4 типа.

  • Базовый (base) служит основой для остальных типов и включает:

    • nexthop-id;
    • адрес IPv4;
    • адрес IPv6;
    • egress-interface
    • egress-interface с адресом IPv4;
    • egress-interface с адресом IPv6;
    • egress-interface с адресом MAC;
    • logical-tunnel;
    • tunnel-encapsulation;
    • tunnel-decapsulation;
    • rib-name.
  • Цепочка (chain) обеспечивает способ выполнить над пакетом несколько операций, объединяя их логически.

  • Балансировка нагрузки (load-balance) предназначена для распределения трафика, обычно с применением нескольких взвешенных nexthop.

  • Защитный (protection) служит для вариантов защиты, обычно включающих основной и резервный nexthop.

  • Репликация (replicate) служит для пересылки нескольким адресатам.

Дерево nexthop показано на рисунках 4 и 5.

   +--rw nexthop
   |  +--rw nexthop-id?           uint32
   |  +--rw sharing-flag?         boolean
   |  +--rw (nexthop-type)?
   |     +--:(nexthop-base)
   |     |  ...(refer to Figure 5)
   |     +--:(nexthop-chain) {nexthop-chain}?
   |     |  +--rw nexthop-chain
   |     |     +--rw nexthop-list* [nexthop-member-id]
   |     |        +--rw nexthop-member-id uint32
   |     +--:(nexthop-replicate) {nexthop-replicate}?
   |     |  +--rw nexthop-replicate
   |     |     +--rw nexthop-list* [nexthop-member-id]
   |     |        +--rw nexthop-member-id uint32
   |     +--:(nexthop-protection) {nexthop-protection}?
   |     |  +--rw nexthop-protection
   |     |     +--rw nexthop-list* [nexthop-member-id]
   |     |        +--rw nexthop-member-id uint32
   |     |        +--rw nexthop-preference nexthop-preference-definition
   |     +--:(nexthop-load-balance) {nexthop-load-balance}?
   |        +--rw nexthop-lb
   |           +--rw nexthop-list* [nexthop-member-id]
   |              +--rw nexthop-member-id uint32
   |              +--rw nexthop-lb-weight nexthop-lb-weight-definition

Рисунок 4. Структура Nexthop.

На рисунке 5 приведён фрагмент дерева nexthop, содержащий структуру базового nexthop.

+--:(nexthop-base)
|  +--rw nexthop-base
|     +--rw (nexthop-base-type)?
|        +--:(special-nexthop)
|        |  +--rw special? special-nexthop-definition
|        +--:(egress-interface-nexthop)
|        |  +--rw outgoing-interface if:interface-ref
|        +--:(ipv4-address-nexthop)
|        |  +--rw ipv4-address inet:ipv4-address
|        +--:(ipv6-address-nexthop)
|        |  +--rw ipv6-address inet:ipv6-address
|        +--:(egress-interface-ipv4-nexthop)
|        |  +--rw egress-interface-ipv4-address
|        |     +--rw outgoing-interface if:interface-ref
|        |     +--rw ipv4-address       inet:ipv4-address
|        +--:(egress-interface-ipv6-nexthop)
|        |  +--rw egress-interface-ipv6-address
|        |     +--rw outgoing-interface if:interface-ref
|        |     +--rw ipv6-address       inet:ipv6-address
|        +--:(egress-interface-mac-nexthop)
|        |  +--rw egress-interface-mac-address
|        |     +--rw outgoing-interface if:interface-ref
|        |     +--rw ieee-mac-address yang:mac-address
|        +--:(tunnel-encapsulation-nexthop) {nexthop-tunnel}?
|        |  +--rw tunnel-encapsulation
|        |     +--rw (tunnel-type)?
|        |        +--:(ipv4) {ipv4-tunnel}?
|        |        |  +--rw ipv4-header
|        |        |     +--rw src-ipv4-address inet:ipv4-address
|        |        |     +--rw dest-ipv4-address inet:ipv4-address
|        |        |     +--rw protocol          uint8
|        |        |     +--rw ttl?              uint8
|        |        |     +--rw dscp?             uint8
|        |        +--:(ipv6) {ipv6-tunnel}?
|        |        |  +--rw ipv6-header
|        |        |     +--rw src-ipv6-address inet:ipv6-address
|        |        |     +--rw dest-ipv6-address inet:ipv6-address
|        |        |     +--rw next-header       uint8
|        |        |     +--rw traffic-class? uint8
|        |        |     +--rw flow-label?
|        |        |             inet:ipv6-flow-label
|        |        |     +--rw hop-limit?        uint8
|        |        +--:(mpls) {mpls-tunnel}?
|        |        |  +--rw mpls-header
|        |        |     +--rw label-operations* [label-oper-id]
|        |        |        +--rw label-oper-id uint32
|        |        |        +--rw (label-actions)?
|        |        |           +--:(label-push)
|        |        |           |  +--rw label-push
|        |        |           |     +--rw label        uint32
|        |        |           |     +--rw s-bit?       boolean
|        |        |           |     +--rw tc-value? uint8
|        |        |           |     +--rw ttl-value? uint8
|        |        |           +--:(label-swap)
|        |        |              +--rw label-swap
|        |        |                 +--rw out-label     uint32
|        |        |                 +--rw ttl-action?
|        |        |                         ttl-action-definition
|        |        +--:(gre) {gre-tunnel}?
|        |        |  +--rw gre-header
|        |        |     +--rw (dest-address-type)?
|        |        |     |  +--:(ipv4)
|        |        |     |  |  +--rw ipv4-dest inet:ipv4-address
|        |        |     |  +--:(ipv6)
|        |        |     |     +--rw ipv6-dest inet:ipv6-address
|        |        |     +--rw protocol-type uint16
|        |        |     +--rw key?          uint64
|        |        +--:(nvgre) {nvgre-tunnel}?
|        |        |  +--rw nvgre-header
|        |        |     +--rw (nvgre-type)?
|        |        |     |  +--:(ipv4)
|        |        |     |  |  +--rw src-ipv4-address inet:ipv4-address
|        |        |     |  |  +--rw dest-ipv4-address inet:ipv4-address
|        |        |     |  |  +--rw protocol          uint8
|        |        |     |  |  +--rw ttl?              uint8
|        |        |     |  |  +--rw dscp?             uint8
|        |        |     |  +--:(ipv6)
|        |        |     |     +--rw src-ipv6-address inet:ipv6-address
|        |        |     |     +--rw dest-ipv6-address inet:ipv6-address
|        |        |     |     +--rw next-header       uint8
|        |        |     |     +--rw traffic-class?    uint8
|        |        |     |     +--rw flow-label?
|        |        |     |             inet:ipv6-flow-label
|        |        |     |     +--rw hop-limit?        uint8
|        |        |     +--rw virtual-subnet-id uint32
|        |        |     +--rw flow-id?          uint8
|        |        +--:(vxlan) {vxlan-tunnel}?
|        |           +--rw vxlan-header
|        |              +--rw (vxlan-type)?
|        |              |  +--:(ipv4)
|        |              |  |  +--rw src-ipv4-address inet:ipv4-address
|        |              |  |  +--rw dest-ipv4-address inet:ipv4-address
|        |              |  |  +--rw protocol             uint8
|        |              |  |  +--rw ttl?                 uint8
|        |              |  |  +--rw dscp?                uint8
|        |              |  +--:(ipv6)
|        |              |     +--rw src-ipv6-address inet:ipv6-address
|        |              |     +--rw dest-ipv6-address inet:ipv6-address
|        |              |     +--rw next-header          uint8
|        |              |     +--rw traffic-class?       uint8
|        |              |     +--rw flow-label? inet:ipv6-flow-label
|        |              |     +--rw hop-limit?           uint8
|        |              +--rw vxlan-identifier     uint32
|        +--:(tunnel-decapsulation-nexthop) {nexthop-tunnel}?
|        |  +--rw tunnel-decapsulation
|        |     +--rw (tunnel-type)?
|        |        +--:(ipv4) {ipv4-tunnel}?
|        |        |  +--rw ipv4-decapsulation
|        |        |     +--rw ipv4-decapsulation
|        |        |             tunnel-decapsulation-action-definition
|        |        |     +--rw ttl-action?   ttl-action-definition
|        |        +--:(ipv6) {ipv6-tunnel}?
|        |        |  +--rw ipv6-decapsulation
|        |        |     +--rw ipv6-decapsulation
|        |        |             tunnel-decapsulation-action-definition
|        |        |     +--rw hop-limit-action?
|        |        |             hop-limit-action-definition
|        |        +--:(mpls) {mpls-tunnel}?
|        |           +--rw label-pop
|        |              +--rw label-pop     mpls-label-action-definition
|        |              +--rw ttl-action?   ttl-action-definition
|        +--:(logical-tunnel-nexthop) {nexthop-tunnel}?
|        |  +--rw logical-tunnel
|        |     +--rw tunnel-type tunnel-type-definition
|        |     +--rw tunnel-name string
|        +--:(rib-name-nexthop)
|        |  +--rw rib-name?                        string
|        +--:(nexthop-identifier)
|           +--rw nexthop-ref                      nexthop-ref

Рисунок 5. Структура базового Nexthop.

2.5. Операции RPC

Этот модуль определяет указанные ниже операции RPC

  • rib-add добавляет RIB в экземпляр маршрутизации, принимая на входе имя RIB, семейство адресов RIB и (необязательно) режим проверки RPF. На выходе возвращается значение true при успехе или false при отказе (в случае отказа агент I2RS может возвращать конкретную причину ошибки).

  • rib-delete удаляет RIB из экземпляра маршрутизации. При удалении RIB удаляются все маршруты, установленные в RIB. Входным параметром является имя (rib-name), а на выходе возвращается значение true при успехе или false при отказе (в случае отказа агент I2RS может возвращать конкретную причину ошибки).

  • route-add добавляет маршрут или набор маршрутов в RIB, принимая на входе имя RIB, префиксы маршрутов, route-attributes, route-vendor-attributes, nexthop и флаг предоставления деталей при отказах. Перед вызовом route-add rpc нужно вызвать the nh-add для создания и/или возврата идентификатора nexthop. Если nexthop уже существует и nexthop-id известен, это можно не делать. На выходе возвращается комбинация состояний операции для соответствующего узла в дереве данных:

    • success-count — число добавленных маршрутов;

    • failed-count — число маршрутов, при добавлении которых возникли отказы;

    • failure-detail — конкретные маршруты, которые не удалось добавить.

  • route-delete удаляет маршрут или набор маршрутов из RIB, принимая на входе имя RIB, префиксы маршрутов и флаг предоставления деталей при отказах. На выходе возвращается комбинация состояний операции:

    • success-count — число удалённых маршрутов;

    • failed-count — число маршрутов, при удалении которых возникли отказы;

    • failure-detail — конкретные маршруты, которые не удалось удалить.

  • route-update обновляет маршрут или набор маршрутов в RIB, принимая на входе имя RIB, префиксы маршрутов, route-attributes, route-vendor-attributes или nexthop. Сопоставление может выполняться по префиксам, route-attributes, route-vendor-attributes или nexthop. Обновления могут применяться к nexthop, route-attributes и route-vendor-attributes. На выходе возвращается комбинация состояний операции:

    • success-count — число обновлённых маршрутов;

    • failed-count — число маршрутов, при обновлении которых возникли отказы;

    • failure-detail — конкретные маршруты, которые не удалось обновить.

  • nh-add добавляет nexthop в RIB, принимая на входе имя RIB и nexthop. Сетевому узлу требуется назначить идентификатор для nexthop. На выходе возвращается значение true (клиент I2RS возвращается идентификатор identifier) при успехе или false при отказе (в случае отказа агент I2RS может возвращать конкретную причину ошибки).

  • nh-delete удаляет nexthop из RIB, принимая на входе имя RIB и nexthop или идентификатор nexthop. На выходе возвращается значение true при успехе или false при отказе (в случае отказа агент I2RS может возвращать конкретную причину ошибки).

Дерево вызовов удалённых процедур показано на рисунке 6.

   rpcs:
      +---x rib-add
      |  +---w input
      |  |  +---w rib-name        string
      |  |  +---w address-family      address-family-definition
      |  |  +---w ip-rpf-check?   boolean
      |  +--ro output
      |     +--ro result uint32
      |     +--ro reason? string
      +---x rib-delete
      |  +---w input
      |  |  +---w rib-name string
      |  +--ro output
      |     +--ro result uint32
      |     +--ro reason? string
      +---x route-add
      |  +---w input
      |  |  +---w return-failure-detail?   boolean
      |  |  +---w rib-name                 string
      |  |  +---w routes
      |  |     +---w route-list* [route-index]
      |  |        ...
      |  +--ro output
      |     +--ro success-count     uint32
      |     +--ro failed-count      uint32
      |     +--ro failure-detail
      |        +--ro failed-routes* [route-index]
      |           +--ro route-index uint32
      |           +--ro error-code? uint32
      +---x route-delete
      |  +---w input
      |  |  +---w return-failure-detail?   boolean
      |  |  +---w rib-name                 string
      |  |  +---w routes
      |  |     +---w route-list* [route-index]
      |  |        ...
      |  +--ro output
      |     +--ro success-count     uint32
      |     +--ro failed-count      uint32
      |     +--ro failure-detail
      |        +--ro failed-routes* [route-index]
      |           +--ro route-index uint32
      |           +--ro error-code? uint32
      +---x route-update
      |  +---w input
      |  |  +---w return-failure-detail?           boolean
      |  |  +---w rib-name                         string
      |  |  +---w (match-options)?
      |  |     +--:(match-route-prefix)
      |  |     |  ...
      |  |     +--:(match-route-attributes)
      |  |     |  ...
      |  |     +--:(match-route-vendor-attributes) {...}?
      |  |     |  ...
      |  |     +--:(match-nexthop)
      |  |        ...
      |  +--ro output
      |     +--ro success-count uint32
      |     +--ro failed-count uint32
      |     +--ro failure-detail
      |        +--ro failed-routes* [route-index]
      |           +--ro route-index uint32
      |           +--ro error-code? uint32
      +---x nh-add
      |  +---w input
      |  |  +---w rib-name              string
      |  |  +---w nexthop-id?           uint32
      |  |  +---w sharing-flag?         boolean
      |  |  +---w (nexthop-type)?
      |  |     ...
      |  +--ro output
      |     +--ro result        uint32
      |     +--ro reason?       string
      |     +--ro nexthop-id?   uint32
      +---x nh-delete
         +---w input
         |  +---w rib-name              string
         |  +---w nexthop-id?           uint32
         |  +---w sharing-flag?         boolean
         |  +---w (nexthop-type)?
         |     ...
         +--ro output
            +--ro result uint32
            +--ro reason? string

Рисунок 6. Структура RPC.

2.6. Уведомления

Менеджер RIB сетевого устройства передаёт асинхронные уведомления внешнему объекту при запуске на сетевом устройстве того или иного события. Реализация этой модели данных RIB должна поддерживать отправку двух типов асинхронных уведомлений.

  1. Изменение маршрута:

    • Installed (установлен) указывает, что маршрут помещён в FIB);

    • Active (активен) указывает, есть ли у маршрута хотя бы один полностью распознанный nexthop и, следовательно, является ли маршрут кандидатом на включение в FIB;

    • Reason (причина), например, Not authorized (не разрешено)

  1. Статус распознавания nexthop (полностью распознан или не распознан)

В распознанном nexthop имеется адекватный уровень сведений для передачи исходящих пакетов в направлении получателя путём пересылки в интерфейс, напрямую соединённый с соседом. Для нераспознанного nexthop от менеджера RIB требуется определить окончательный распознанный nexthop. Например, это может быть адрес IP и менеджер RIB будет выяснять, как достичь этого адреса, например, проверяя его доступность через обычную пересылку IP, туннель MPLS или обоими способами. Если менеджер RIB не может распознать (преобразовать) nexthop, сохраняется нераспознанное состояние nexthop и он не является кандидатом на включение в FIB.

Реализация этой модели данных RIB должна поддерживать отправку уведомлений об изменении маршрута при каждой из указанных ниже смен состояния:

  • из активного в неактивное.

  • из неактивного в активно;

  • из установленного в неустановленный;

  • из неустановленного в установленный.

Можно использовать одно уведомление при смене неактивного и неустановленного состояния на активное и установленное или наоборот.

Структура дерева уведомлений показана на рисунке 7.

   notifications:
        +---n nexthop-resolution-status-change
        |  +--ro nexthop
        |  |  +--ro nexthop-id            uint32
        |  |  +--ro sharing-flag          boolean
        |  |  +--ro (nexthop-type)?
        |  |     +--:(nexthop-base)
        |  |     |  ...
        |  |     +--:(nexthop-chain) {nexthop-chain}?
        |  |     |  ...
        |  |     +--:(nexthop-replicate) {nexthop-replicate}?
        |  |     |  ...
        |  |     +--:(nexthop-protection) {nexthop-protection}?
        |  |     |  ...
        |  |     +--:(nexthop-load-balance) {nexthop-load-balance}?
        |  |        ...
        |  +--ro nexthop-state nexthop-state-definition
        +---n route-change
           +--ro rib-name                 string
           +--ro address-family           address-family-definition
           +--ro route-index              uint64
           +--ro match
           |  +--ro (route-type)?
           |     +--:(ipv4)
           |     |  ...
           |     +--:(ipv6)
           |     |  ...
           |     +--:(mpls-route)
           |     |  ...
           |     +--:(mac-route)
           |     |  ...
           |     +--:(interface-route)
           |        ...
           +--ro route-installed-state route-installed-state-definition
           +--ro route-state              route-state-definition
           +--ro route-change-reason      route-change-reason-definition

Рисунок 7. Структура уведомления.

3. Модуль YANG

Этот модуль YANG ссылается на [RFC2784], [RFC7348], [RFC7637], [RFC8344].

   <CODE BEGINS> file "ietf-i2rs-rib@2018-09-13.yang"

   module ietf-i2rs-rib {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-i2rs-rib";
     prefix iir;

     import ietf-inet-types {
       prefix inet;
       reference "RFC 6991";
     }
     import ietf-interfaces {
       prefix if;
       reference "RFC 8344";
     }
     import ietf-yang-types {
       prefix yang;
       reference "RFC 6991";
     }

     organization
       "IETF I2RS (Interface to Routing System) Working Group";
     contact
       "WG Web:   <https://datatracker.ietf.org/wg/i2rs/> 
        WG List:  <mailto:i2rs@ietf.org>

        Editor:   Lixing Wang
                  <mailto:wang_little_star@sina.com> 

        Editor:   Mach(Guoyi) Chen
                  <mailto:mach.chen@huawei.com> 

        Editor:   Amit Dass
                  <mailto:dass.amit@gmail.com> 

        Editor:   Hariharan Ananthakrishnan
                  <mailto:hari@netflix.com> 

        Editor:   Sriganesh Kini
                  <mailto:sriganeshkini@gmail.com> 

        Editor:   Nitin Bahadur
                  <mailto:nitin_bahadur@yahoo.com>"; 

     description
       "Этот модуль определяет модель данных YANG для базы RIB, которая
        соответствует информационной модели I2RS RIB.

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

        Распространение и применение модуля в исходной или двоичной 
        форме с изменениями или без таковых разрешено в соответствии с
        лицензией Simplified BSD License, изложенной в параграфе 4.c
        IETF Trust's Legal Provisions Relating to IETF Documents
        (https://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC 8341, где правовые
        аспекты приведены более полно.";
     revision 2018-09-13 {
       description
         "Исходный выпуск";
       reference "RFC 8431";
     }

     //Свойства (функции)

     feature nexthop-tunnel {
       description
         "Указывает поддержку узлом туннельных nexthop.";
     }

     feature nexthop-chain {
       description
         "Указывает поддержку узлом цепочек nexthop.";
     }

     feature nexthop-protection {
       description
         "Указывает поддержку узлом защитных nexthop.";
     }

     feature nexthop-replicate {
       description
         "Указывает поддержку узлом nexthop для репликации.";
     }

     feature nexthop-load-balance {
       description
         "Указывает поддержку узлом nexthop для распределения нагрузки";
     }

     feature ipv4-tunnel {
       description
         "Указывает поддержку узлом туннельной инкапсуляции IPv4.";
     }

     feature ipv6-tunnel {
       description
         "Указывает поддержку узлом туннельной инкапсуляции IPv6.";
     }

     feature mpls-tunnel {
       description
         "Указывает поддержку узлом туннельной инкапсуляции MPLS.";
     }

     feature vxlan-tunnel {
       description
         "Указывает поддержку узлом туннельной инкапсуляции VXLAN.";
       reference "RFC 7348";
     }

     feature gre-tunnel {
       description
         "Указывает поддержку узлом туннельной инкапсуляции GRE.";
       reference "RFC 2784";
     }

     feature nvgre-tunnel {
       description
         "Указывает поддержку узлом туннельной инкапсуляции NVGRE.";
       reference "RFC 7637";
     }

     feature route-vendor-attributes {
       description
         "Указывает поддержку узлом фирменных атрибутов маршрута.";
     }

     // Определения идентификаторов и типов
     identity mpls-label-action {
       description
         "Базовый идентификатор для вывода операций с метками MPLS
          push для добавления новой метки в стек
          pop для выталкивания верхней метки из стека
          swap для замены верхней метки стека на новую метку";
     }

     identity label-push {
       base mpls-label-action;
       description
         "Операция push для добавления новой метки в стек MPLS.";
     }

     identity label-pop {
       base mpls-label-action;
       description
         "Операция pop для выталкивания верхней метки из стека MPLS.";
     }

     identity label-swap {
       base mpls-label-action;
       description
         "Операция swap для замены верхней метки в стеке MPLS.";
     }

     typedef mpls-label-action-definition {
       type identityref {
         base mpls-label-action;
       }
       description
         "Определение действий с метками MPLS.";
     }

     identity tunnel-decapsulation-action {
       description
         "Базовый идентификатор для действий туннельной декапсуляции
          ipv4-decapsulation (декапсуляция туннеля IPv4)
          ipv6-decapsulation (декапсуляция туннеля IPv6)";
     }

     identity ipv4-decapsulation {
       base tunnel-decapsulation-action;
       description
         "Декапсуляция туннеля IPv4.";
     }

     identity ipv6-decapsulation {
       base tunnel-decapsulation-action;
       description
         "Декапсуляция туннеля IPv6.";
     }

     typedef tunnel-decapsulation-action-definition {
       type identityref {
         base tunnel-decapsulation-action;
       }
       description
         "Определение туннельной декапсуляции.";
     }

     identity ttl-action {
       description
         "Базовый идентификатор для действий с TTL.";
     }

     identity no-action {
       base ttl-action;
       description
         "Ничего не делать с TTL.";
     }

     identity copy-to-inner {
       base ttl-action;
       description
         "Копировать TTL из внешнего заголовка во внутренний.";
     }

     identity decrease-and-copy-to-inner {
       base ttl-action;
       description
         "Уменьшить TTL на 1 и скопировать во внутренний заголовок.";
     }

     identity decrease-and-copy-to-next {
       base ttl-action;
       description
         "Уменьшить TTL на 1 и скопировать в следующий заголовок,
          например, при смене метки MPLS уменьшается TTL в
          in_label и копируется в out_label.";
     }

     typedef ttl-action-definition {
       type identityref {
         base ttl-action;
       }
       description
         "Определение действий с TTL.";
     }

     identity hop-limit-action {
       description
         "Базовый идентификатор для действий с hop limit.";
     }

     identity hop-limit-no-action {
       base hop-limit-action;
       description
         "Ничего не делать с hop limit.";
     }

     identity hop-limit-copy-to-inner {
       base hop-limit-action;
       description
         "Копировать hop limit из внешнего заголовка во внутренний.";
     }

     typedef hop-limit-action-definition {
       type identityref {
         base hop-limit-action;
       }
       description
         "Определение действий с IPv6 hop limit.";
     }

     identity special-nexthop {
       description
         "Базовый идентификатор для вывода специальных nexthops.";
     }

     identity discard {
       base special-nexthop;
       description
         "Указывает, что сетевому устройству следует отбросить пакет и
          инкрементировать счётчик отбрасывания.";
     }

     identity discard-with-error {
       base special-nexthop;
       description
         "Указывает, что сетевому устройству следует отбросить пакет, 
          инкрементировать счётчик отбрасывания и передать подходящее
          сообщение об ошибке (например, ICMP).";
     }

     identity receive {
       base special-nexthop;
       description
         "Указывает, что трафик адресов сетевому устройству, например
          является пакетом протокола или OAM. Весь трафик для локального
          устройства следует дросселировать для предотвращения атак на
          службы маршрутизатора в плоскости управления. Можно задать
          ограничитель скорости для указания способа дросселирования
          трафика, адресованного в плоскость управления.";
     }

     identity cos-value {
       base special-nexthop;
       description
         "Специальный nexthop по значению CoS.";
     }

     typedef special-nexthop-definition {
       type identityref {
         base special-nexthop;
       }
       description
         "Определение специального nexthop.";
     }

     identity ip-route-match-type {
       description
         "Базовый идентификатор для вывода сопоставлений маршрутов - 
          по источнику, получателю или обоим.";
     }

     identity match-ip-src {
       base ip-route-match-type;
       description
         "Сопоставление по источнику.";
     }

     identity match-ip-dest {
       base ip-route-match-type;
       description
         "Сопоставление по получателю.";
     }

     identity match-ip-src-dest {
       base ip-route-match-type;
       description
         "Сопоставление по источнику и получателю.";
     }

     typedef ip-route-match-type-definition {
       type identityref {
         base ip-route-match-type;
       }
       description
         "Определение типа сопоставления для маршрутов IP.";
     }

     identity address-family {
       description
         "Базовый идентификатор для вывода семейств адресов RIB.";
     }

     identity ipv4-address-family {
       base address-family;
       description
         "Семейство адресов IPv4 RIB.";
     }

     identity ipv6-address-family {
       base address-family;
       description
         "Семейство адресов IPv6 RIB.";
     }

     identity mpls-address-family {
       base address-family;
       description
         "Семейство адресов MPLS RIB.";
     }

     identity ieee-mac-address-family {
       base address-family;
       description
         "Семейство адресов MAC RIB.";
     }

     typedef address-family-definition {
       type identityref {
         base address-family;
       }
       description
         "Определение семейств адресов RIB.";
     }

     identity route-type {
       description
         "Базовый идентификатор для вывода типов маршрутов.";
     }

     identity ipv4-route {
       base route-type;
       description
         "Маршрут IPv4.";
     }

     identity ipv6-route {
       base route-type;
       description
         "Маршрут IPv6.";
     }

     identity mpls-route {
       base route-type;
       description
         "Маршрут MPLS.";
     }

     identity ieee-mac {
       base route-type;
       description
         "Маршрут MAC.";
     }

     identity interface {
       base route-type;
       description
         "Маршрут через интерфейс.";
     }

     typedef route-type-definition {
       type identityref {
         base route-type;
       }
       description
         "Определение типа маршрута.";
     }

     identity tunnel-type {
       description
         "Базовый идентификатор для вывода типов туннелей.";
     }

     identity ipv4-tunnel {
       base tunnel-type;
       description
         "Туннель IPv4";
     }

     identity ipv6-tunnel {
       base tunnel-type;
       description
         "Туннель IPv6";
     }

     identity mpls-tunnel {
       base tunnel-type;
       description
         "Туннель MPLS";
     }

     identity gre-tunnel {
       base tunnel-type;
       description
         "Туннель GRE";
     }

     identity vxlan-tunnel {
       base tunnel-type;
       description
         "Туннель VXLAN";
     }

     identity nvgre-tunnel {
       base tunnel-type;
       description
         "Туннель NVGRE";
     }

     typedef tunnel-type-definition {
       type identityref {
         base tunnel-type;
       }
       description
         "Определение типа туннеля.";
     }

     identity route-state {
       description
         "Базовый идентификатор для вывода состояний маршрутов.";
     }

     identity active {
       base route-state;
       description
         "Активное состояние.";
     }

     identity inactive {
       base route-state;
       description
         "Неаутивное состояние.";
     }

     typedef route-state-definition {
       type identityref {
         base route-state;
       }
       description
         "Определение состояния маршрута.";
     }

     identity nexthop-state {
       description
         "Базовый идентификатор для вывода состояний nexthop.";
     }

     identity resolved {
       base nexthop-state;
       description
         "Распознанный nexthop.";
     }

     identity unresolved {
       base nexthop-state;
       description
         "Нераспознанный nexthop.";
     }

     typedef nexthop-state-definition {
       type identityref {
         base nexthop-state;
       }
       description
         "Определение состояния nexthop.";
     }

     identity route-installed-state {
       description
         "Базовый идентификатор для вывода статуса установки маршрута.";
     }

     identity uninstalled {
       base route-installed-state;
       description
         "Не установлен.";
     }

     identity installed {
       base route-installed-state;
       description
         "Установлен.";
     }

     typedef route-installed-state-definition {
       type identityref {
         base route-installed-state;
       }
       description
         "Определение состояния установки маршрута.";
     }

     // Идентификаторы причин изменения маршрута

     identity route-change-reason {
       description
         "Базовый идентификатор для вывода причин изменения маршрута.";
     }

     identity lower-route-preference {
       base route-change-reason;
       description
         "Маршрут установлен в FIB, поскольку он имеет меньшее значение
          preference (больший приоритет), чем у прежнего маршрута.";
     }

     identity higher-route-preference {
       base route-change-reason;
       description
         "Маршрут удалён из FIB, поскольку он имеет большее значение
          preference (меньший приоритет), чем у прежнего маршрута.";
     }

     identity resolved-nexthop {
       base route-change-reason;
       description
         "Маршрут активирован, поскольку имеет хотя бы 1
          распознанный nexthop.";
     }

     identity unresolved-nexthop {
       base route-change-reason;
       description
         "Маршрут деактивирован по отсутствию распознанных nexthop.";
     }

     typedef route-change-reason-definition {
       type identityref {
         base route-change-reason;
       }
       description
         "Определение причины смены маршрута.";
     }

     typedef nexthop-preference-definition {
       type uint8 {
         range "1..99";
       }
       description
         "Значение nexthop-preference применяется в схемах защиты. Это
          целое число от 1 до 99, меньшее значение предпочтительней.
          Для загрузки N nexthop в FIB выбираются N nexthop с 
          наименьшими значениями. При наличии большего числа nexthop
          с одинаковыми предпочтениями реализации клиента I2RS следует
          самостоятельно выбрать N nexthop и загрузить их.";
     }

     typedef nexthop-lb-weight-definition {
       type uint8 {
         range "1..99";
       }
       description
         "Значение nexthop-lb-weight служит для распределения нагрузки.
          Каждому элементу списка СЛЕДУЕТ назначать вес от 1 до 99. Вес
          определяет долю трафика через nexthop при пересылке как
          отношение веса этого nexthop к сумме весов других nexthop
          этого маршрута, применяемых для пересылки. Для равного
          распределения МОЖНО задать значение 0 для всех nexthop. Это
          значение зарезервировано для равномерного распределения и при
          его использовании ДОЛЖНО задаваться для всех nexthop.
          Это значение выбрано по историческим причинам и применяется
          обычно для ECMP.";
     }

     typedef nexthop-ref {
       type leafref {
         path  "/iir:routing-instance" +
               "/iir:rib-list" +
               "/iir:route-list" +
               "/iir:nexthop" +
               "/iir:nexthop-id";
       }
       description
         "Ссылка для косвенного nexthop.";
     }

     //Группировки

     grouping route-prefix {
       description
         "Базовые атрибуты для всех типов префиксов маршрута.";
       leaf route-index {
         type uint64;
         mandatory true;
         description
           "Индекс маршрута.";
       }
       container match {
         description
           "Условие задаёт тип маршрута (IPv4, MPLS и т. п.) и
            набор полей для сопоставления.";
         choice route-type {
           description
             "Типы маршрутов: IPv4, IPv6, MPLS, MAC и т. п.";
           case ipv4 {
             description
               "Маршрут IPv4.";
             container ipv4 {
               description
                 "Сопоставление для маршрута IPv4.";
               choice ip-route-match-type {
                 description
                   "Для маршрутов IP сопоставления выполняется по 
                    источнику, получателю или обоим.";
                 case dest-ipv4-address {
                   leaf dest-ipv4-prefix {
                     type inet:ipv4-prefix;
                     mandatory true;
                     description
                       "Сопоставление по адресу получателя IPv4.";
                   }
                 }
                 case src-ipv4-address {
                   leaf src-ipv4-prefix {
                     type inet:ipv4-prefix;
                     mandatory true;
                     description
                       "Сопоставление по адресу отправителя IPv4.";
                   }
                 }
                 case dest-src-ipv4-address {
                   container dest-src-ipv4-address {
                     description
                       "Сопоставление по адресам получателя и 
                        отправителя IPv4.";
                     leaf dest-ipv4-prefix {
                       type inet:ipv4-prefix;
                       mandatory true;
                       description
                         "Сопоставление по префиксу получателя IPv4.";
                     }
                     leaf src-ipv4-prefix {
                       type inet:ipv4-prefix;
                       mandatory true;
                       description
                         "Сопоставление по префиксу отправителя IPv4.";
                     }
                   }
                 }
               }
             }
           }
           case ipv6 {
             description
               "Маршрут IPv6.";
             container ipv6 {
               description
                 "Сопоставление для маршрута IPv6.";
               choice ip-route-match-type {
                 description
                   "Для маршрутов IP сопоставления выполняется по 
                    источнику, получателю или обоим.";
                 case dest-ipv6-address {
                   leaf dest-ipv6-prefix {
                     type inet:ipv6-prefix;
                     mandatory true;
                     description
                       "Сопоставление по адресу получателя IPv6.";
                   }
                 }
                 case src-ipv6-address {
                   leaf src-ipv6-prefix {
                     type inet:ipv6-prefix;
                     mandatory true;
                     description
                       "Сопоставление по адресу отправителя IPv6.";
                   }
                 }
                 case dest-src-ipv6-address {
                   container dest-src-ipv6-address {
                     description
                       "Сопоставление по адресам получателя и 
                        отправителя IPv6.";
                     leaf dest-ipv6-prefix {
                       type inet:ipv6-prefix;
                       mandatory true;
                       description
                         "Сопоставление по префиксу получателя IPv6.";
                     }
                     leaf src-ipv6-prefix {
                       type inet:ipv6-prefix;
                       mandatory true;
                       description
                         "Сопоставление по префиксу отправителя IPv6.";
                     }
                   }
                 }
               }
             }
           }
           case mpls-route {
             description
               "Маршрут MPLS.";
             leaf mpls-label {
               type uint32;
               mandatory true;
               description
                 "Метка для сопоставления.";
             }
           }
           case mac-route {
             description
               "Маршрут MAC.";
             leaf mac-address {
               type yang:mac-address;
               mandatory true;
               description
                 "MAC-адрес для сопоставления.";
             }
           }
           case interface-route {
             description
               "Маршрут через интерфейс.";
             leaf interface-identifier {
               type if:interface-ref;
               mandatory true;
               description
                 "Интерфейс для сопоставления.";
             }
           }
         }
       }
     }

     grouping route {
       description
         "Базовые атрибуты для всех типов маршрутов.";
       uses route-prefix;
       container nexthop {
         description
           "Значение nexthop для маршрута.";
         uses nexthop;
       }
       // В информационной модели это называется статистикой маршрута
       container route-status {
         description
           "Сведения о статусе маршрута.";
         leaf route-state {
           type route-state-definition;
           config false;
           description
             "Статус маршрута - активен или не активен.";
         }
         leaf route-installed-state {
           type route-installed-state-definition;
           config false;
           description
             "Статус установки маршрута - установлен или не установлен";
         }
         leaf route-reason {
           type route-change-reason-definition;
           config false;
           description
             "Причина изменения состояния маршрута.";
         }
       }
       container route-attributes {
         description
           "Атрибуты маршрута.";
         uses route-attributes;
       }
       container route-vendor-attributes {
         description
           "Фирменные (vendor) атрибуты маршрута.";
         uses route-vendor-attributes;
       }
     }

     grouping nexthop-list {
       description
         "Базовый список nexthop.";
       list nexthop-list {
         key "nexthop-member-id";
         description
           "Список nexthop.";
         leaf nexthop-member-id {
           type uint32;
           mandatory true;
           description
             "Идентификатор nexthop для элемента списка nexthop.";
         }
       }
     }

     grouping nexthop-list-p {
       description
         "Список nexthop с параметром preference.";
       list nexthop-list {
         key "nexthop-member-id";
         description
           "Список nexthop.";
         leaf nexthop-member-id {
           type uint32;
           mandatory true;
           description
             "Идентификатор nexthop для элемента списка nexthop.";
         }
         leaf nexthop-preference {
           type nexthop-preference-definition;
           mandatory true;
           description
             "Значение nexthop-preference применяется в схемах защиты.
              Это целое число от 1 и 99 и меньшее значение указывает
              более высокий приоритет. Для загрузки группы «основной-
              резервный-третий» в FIB выбираются распознанные nexthop с
              большим предпочтением (меньшими значениями).";
         }
       }
     }

     grouping nexthop-list-w {
       description
         "Список nexthop с весовыми параметрами.";
       list nexthop-list {
         key "nexthop-member-id";
         description
           "Список nexthop.";
         leaf nexthop-member-id {
           type uint32;
           mandatory true;
           description
             "Идентификатор nexthop для элемента списка nexthop.";
         }
         leaf nexthop-lb-weight {
           type nexthop-lb-weight-definition;
           mandatory true;
           description
             "Вес nexthop среди выбранных для распределения нагрузки.";
         }
       }
     }

     grouping nexthop {
       description
         "Структура nexthop.";
       leaf nexthop-id {
         type uint32;
         description
           "Идентификатор, указывающий nexthop.";
       }
       leaf sharing-flag {
         type boolean;
         description
           "Указывает, является ли nexthop обобщаемым:
            true  - обобщаемый (может применяться в других маршрутах)
            false — необобщаемый (непригоден для других маршрутов).";
       }
       choice nexthop-type {
         description
           "Варианты типов nexthop.";
         case nexthop-base {
           container nexthop-base {
             description
               "Базовый nexthop.";
             uses nexthop-base;
           }
         }
         case nexthop-chain {
           if-feature "nexthop-chain";
           container nexthop-chain {
             description
               "Цепочка nexthop.";
             uses nexthop-list;
           }
         }
         case nexthop-replicate {
           if-feature "nexthop-replicate";
           container nexthop-replicate {
             description
               "Реплицирующий nexthop.";
             uses nexthop-list;
           }
         }
         case nexthop-protection {
           if-feature "nexthop-protection";
           container nexthop-protection {
             description
               "Защитный nexthop.";
             uses nexthop-list-p;
           }
         }
         case nexthop-load-balance {
           if-feature "nexthop-load-balance";
           container nexthop-lb {
             description
               "Балансирующий нагрузку nexthop.";
             uses nexthop-list-w;
           }
         }
       }
     }

     grouping nexthop-base {
       description
         "Базовый nexthop.";
       choice nexthop-base-type {
         description
           "Варианты типа базового nexthop.";
         case special-nexthop {
           leaf special {
             type special-nexthop-definition;
             description
               "Специальный nexthop.";
           }
         }
         case egress-interface-nexthop {
           leaf outgoing-interface {
             type if:interface-ref;
             mandatory true;
             description
               "Выходной интерфейс как nexthop.";
           }
         }
         case ipv4-address-nexthop {
           leaf ipv4-address {
             type inet:ipv4-address;
             mandatory true;
             description
               "Адрес IPv4 как nexthop.";
           }
         }
         case ipv6-address-nexthop {
           leaf ipv6-address {
             type inet:ipv6-address;
             mandatory true;
             description
               "Адрес IPv6 как nexthop.";
           }
         }
         case egress-interface-ipv4-nexthop {
           container egress-interface-ipv4-address {
             leaf outgoing-interface {
               type if:interface-ref;
               mandatory true;
               description
                 "Имя выходного интерфейса.";
             }
             leaf ipv4-address {
               type inet:ipv4-address;
               mandatory true;
               description
                 "nexthop, указывающий интерфейс с адресом IPv4.";
             }
             description
               "nexthop является egress-interface и адресом IP. Это
                может применяться, например, при адресе IP link-local.";
           }
         }
         case egress-interface-ipv6-nexthop {
           container egress-interface-ipv6-address {
             leaf outgoing-interface {
               type if:interface-ref;
               mandatory true;
               description
                 "Имя выходного интерфейса.";
             }
             leaf ipv6-address {
               type inet:ipv6-address;
               mandatory true;
               description
                 "nexthop, указывающий интерфейс с адресом IPv6.";
             }
             description
               "nexthop является egress-interface и адресом IP. Это
                может применяться, например, при адресе IP link-local.";
           }
         }
         case egress-interface-mac-nexthop {
           container egress-interface-mac-address {
             leaf outgoing-interface {
               type if:interface-ref;
               mandatory true;
               description
                 "Имя выходного интерфейса.";
             }
             leaf ieee-mac-address {
               type yang:mac-address;
               mandatory true;
               description
                 "nexthop указывает интерфейс с конкретным адресом MAC";
             }
             description
               "Выходной интерфейс должен быть интерфейсом Ethernet.
                Распознавание адреса не требуется для такого nexthop.";
           }
         }
         case tunnel-encapsulation-nexthop {
           if-feature "nexthop-tunnel";
           container tunnel-encapsulation {
             uses tunnel-encapsulation;
             description
               "Инкапсуляция, представляющая туннель IP, MPLS или иной
                туннель, определённый в информационной модели. 
                Можно связать egress-interface с инкапсуляцией туннеля
                для указания передающего интерфейса. Это полезно в
                случаях, когда сетевое устройство имеет интерфейсы
                Ethernet и нужно распознавание адреса для пакетов IP.";
           }
         }
         case tunnel-decapsulation-nexthop {
           if-feature "nexthop-tunnel";
           container tunnel-decapsulation {
             uses tunnel-decapsulation;
             description
               "Задаёт декапсуляцию туннельного заголовка.";
           }
         }
         case logical-tunnel-nexthop {
           if-feature "nexthop-tunnel";
           container logical-tunnel {
             uses logical-tunnel;
             description
               "MPLS LSP или туннель GRE (или иной, заданный в этом
                документе), указанный уникальным идентификатором
                (например, именем).";
           }
         }
         case rib-name-nexthop {
           leaf rib-name {
             type string;
             description
               "Значение nexthop, указывающее на RIB, задаёт продолжение
                поиска в этой RIB (цепочка поиска).";
           }
         }
         case nexthop-identifier {
           leaf nexthop-ref {
             type nexthop-ref;
             mandatory true;
             description
               "Идентификатор, указывающий nexthop.";
           }
         }
       }
     }

     grouping route-vendor-attributes {
       description
         "Фирменные (vendor) атрибуты маршрута.";
     }

     grouping logical-tunnel {
       description
         "Логический туннель, указанный типом и именем.";
       leaf tunnel-type {
         type tunnel-type-definition;
         mandatory true;
         description
           "Тип туннеля.";
       }
       leaf tunnel-name {
         type string;
         mandatory true;
         description
           "Имя, указывающее логический туннель.";
       }
     }

     grouping ipv4-header {
       description
         "Сведения из заголовка инкапсуляции IPv4.";
       leaf src-ipv4-address {
         type inet:ipv4-address;
         mandatory true;
         description
           "IP-адрес отправителя в заголовке.";
       }
       leaf dest-ipv4-address {
         type inet:ipv4-address;
         mandatory true;
         description
           "IP-адрес получателя в заголовке.";
       }
       leaf protocol {
         type uint8;
         mandatory true;
         description
           "Идентификатор протокола в заголовке.";
       }
       leaf ttl {
         type uint8;
         description
           "Значение TTL в заголовке.";
       }
       leaf dscp {
         type uint8;
         description
           "Значение DSCP в заголовке.";
       }
     }

     grouping ipv6-header {
       description
         "Сведения из заголовка инкапсуляции IPv6.";
       leaf src-ipv6-address {
         type inet:ipv6-address;
         mandatory true;
         description
           "IP-адрес отправителя в заголовке.";
       }
       leaf dest-ipv6-address {
         type inet:ipv6-address;
         mandatory true;
         description
           "IP-адрес получателя в заголовке.";
       }
       leaf next-header {
         type uint8;
         mandatory true;
         description
           "Поле next header в заголовке IPv6.";
       }
       leaf traffic-class {
         type uint8;
         description
           "Значение класса трафика в заголовке.";
       }
       leaf flow-label {
         type inet:ipv6-flow-label;
         description
           "Метка потока в заголовке.";
       }
       leaf hop-limit {
         type uint8 {
           range "1..255";
         }
         description
           "Значение hop limit в заголовке.";
       }
     }

     grouping nvgre-header {
       description
         "Сведения из заголовка инкапсуляции NVGRE.";
       choice nvgre-type {
         description
           "NVGRE может применять заголовок инкапсуляции IPv4 или IPv6";
         case ipv4 {
           uses ipv4-header;
         }
         case ipv6 {
           uses ipv6-header;
         }
       }
       leaf virtual-subnet-id {
         type uint32;
         mandatory true;
         description
           "Идентификатор подсети в заголовке NVGRE.";
       }
       leaf flow-id {
         type uint8;
         description
           "Идентификатор потока в заголовке NVGRE.";
       }
     }

     grouping vxlan-header {
       description
         "Сведения из заголовка инкапсуляции VXLAN.";
       choice vxlan-type {
         description
           "VXLAN может применять заголовок инкапсуляции IPv4 или IPv6";
         case ipv4 {
           uses ipv4-header;
         }
         case ipv6 {
           uses ipv6-header;
         }
       }
       leaf vxlan-identifier {
         type uint32;
         mandatory true;
         description
           "Идентификатор VXLAN в заголовке VXLAN.";
       }
     }

     grouping gre-header {
       description
         "Сведения из заголовка инкапсуляции GRE.";
       choice dest-address-type {
         description
           "Варианты GRE - IPv4 или IPv6";
         case ipv4 {
           leaf ipv4-dest {
             type inet:ipv4-address;
             mandatory true;
             description
               "IP-адрес получателя в заголовке GRE.";
           }
         }
         case ipv6 {
           leaf ipv6-dest {
             type inet:ipv6-address;
             mandatory true;
             description
               "IP-адрес получателя в заголовке GRE.";
           }
         }
       }
       leaf protocol-type {
         type uint16;
         mandatory true;
         description
           "Тип протокола в заголовке GRE.";
       }
       leaf key {
         type uint64;
         description
           "Ключ GRE в заголовке GRE.";
       }
     }

     grouping mpls-header {
       description
         "Сведения из заголовка инкапсуляции MPLS.";
       list label-operations {
         key "label-oper-id";
         description
           "Label operations.";
         leaf label-oper-id {
           type uint32;
           description
             "Необязательный идентификатор операции с меткой.";
         }
         choice label-actions {
           description
             "Операции с метками.";
           case label-push {
             container label-push {
               description
                 "Операция вталкивания метки (push).";
               leaf label {
                 type uint32;
                 mandatory true;
                 description
                   "Метка для вталкивания.";
               }
               leaf s-bit {
                 type boolean;
                 description
                   "Бит вершины стека (s) для вталкиваемой метки.";
               }
               leaf tc-value {
                 type uint8;
                 description
                   "Класс трафика для вталкиваемой метки.";
               }
               leaf ttl-value {
                 type uint8;
                 description
                   "Значение TTL для вталкиваемой метки.";
               }
             }
           }
           case label-swap {
             container label-swap {
               description
                 "Операция смены метки (swap).";
               leaf in-label {
                 type uint32;
                 mandatory true;
                 description
                   "Метка для замены.";
               }
               leaf out-label {
                 type uint32;
                 mandatory true;
                 description
                   "Устанавливаемая взамен метка MPLS.";
               }
               leaf ttl-action {
                 type ttl-action-definition;
                 description
                   "Действие с TTL для метки
                    - ничего не делать
                    - копировать по внутреннюю метку
                    - уменьшить в in-label на 1 и поместить вout-label";
               }
             }
           }
         }
       }
     }

     grouping tunnel-encapsulation {
       description
         "Сведения туннельной инкапсуляции.";
       choice tunnel-type {
         description
           "Варианты туннеля для nexthop.";
         case ipv4 {
           if-feature "ipv4-tunnel";
           container ipv4-header {
             uses ipv4-header;
             description
               "Заголовок IPv4.";
           }
         }
         case ipv6 {
           if-feature "ipv6-tunnel";
           container ipv6-header {
             uses ipv6-header;
             description
               "Заголовок IPv6.";
           }
         }
         case mpls {
           if-feature "mpls-tunnel";
           container mpls-header {
             uses mpls-header;
             description
               "Заголовок MPLS.";
           }
         }
         case gre {
           if-feature "gre-tunnel";
           container gre-header {
             uses gre-header;
             description
               "Заголовок GRE.";
           }
         }
         case nvgre {
           if-feature "nvgre-tunnel";
           container nvgre-header {
             uses nvgre-header;
             description
               "Заголовок NVGRE.";
           }
         }
         case vxlan {
           if-feature "vxlan-tunnel";
           container vxlan-header {
             uses vxlan-header;
             description
               "Заголовок VXLAN.";
           }
         }
       }
     }

     grouping tunnel-decapsulation {
       description
         "Сведения туннельной декапсуляции.";
       choice tunnel-type {
         description
           "Варианты туннелей nexthop.";
         case ipv4 {
           if-feature "ipv4-tunnel";
           container ipv4-decapsulation {
             description
               "Декапсуляция IPv4.";
             leaf ipv4-decapsulation {
               type tunnel-decapsulation-action-definition;
               mandatory true;
               description
                 "Операции декапсуляции IPv4.";
             }
             leaf ttl-action {
               type ttl-action-definition;
               description
                 "Действие для TTL - нет или копипрование во внутрениий
                  заголовок.";
             }
           }
         }
         case ipv6 {
           if-feature "ipv6-tunnel";
           container ipv6-decapsulation {
             description
               "Декапсуляция IPv6.";
             leaf ipv6-decapsulation {
               type tunnel-decapsulation-action-definition;
               mandatory true;
               description
                 "Операции декапсуляции IPv6.";
             }
             leaf hop-limit-action {
               type hop-limit-action-definition;
               description
                 "Действия для hop limit - нет или копирование
                  во внутренний заголовок.";
             }
           }
         }
         case mpls {
           if-feature "mpls-tunnel";
           container label-pop {
             description
               "Декапсуляция MPLS.";
             leaf label-pop {
               type mpls-label-action-definition;
               mandatory true;
               description
                 "Выталкивания (pop) метки и стека.";
             }
             leaf ttl-action {
               type ttl-action-definition;
               description
                 "Действие с TTL для метки.";
             }
           }
         }
       }
     }

     grouping route-attributes {
       description
         "Атрибуты маршрута.";
       leaf route-preference {
         type uint32;
         mandatory true;
         description
           "ROUTE_PREFERENCE - численное значение для сравнения
            маршрутов от разных протоколов (статические маршруты также
            считаются протоколом). Это называют также административной
            дистанцией. Меньшее значение указывает больший приоритет.";
       }
       leaf local-only {
         type boolean;
         mandatory true;
         description
           "Указывает, является ли атрибут лишь локальным.";
       }
       container address-family-route-attributes {
         description
           "Атрибуты маршрута, связанные с семейством адресов.";
         choice route-type {
           description
             "Связанные с семейством адресов атрибуты маршрута. В 
              будущих документах следует задавать такие атрибуты
              дополнением вариантов (case) в этот выбор (choice).";
           case ip-route-attributes {
           }
           case mpls-route-attributes {
           }
           case ethernet-route-attributes {
           }
         }
       }
     }

     container routing-instance {
       description
         "Экземпляром маршрутизации в контексте информационной модели
          RIB служит набор RIB, интерфейсов и параметров маршрутизации";
       leaf name {
         type string;
         description
           "Имя экземпляра маршрутизации, которое ДОЛЖНО быть уникальным
            в рамках данного сетевого устройства.";
       }
       list interface-list {
         key "name";
         description
           "Список интерфейсов, связанных с экземпляром маршрутизации.
            Этот список помогает задать границы пересылки пакетов. 
            Пакеты, приходящие с интерфейсов из списка, напрямую связаны
            с данным экземпляром маршрутизации. Список содержит 
            идентификаторы, однозначно указывающие интерфейсы.";
         leaf name {
           type if:interface-ref;
           description
             "Имя интерфейса сетевого уровня.";
         }
       }
       leaf router-id {
         type yang:dotted-quad;
         description
           "Router ID - 32-битовое значение с разделением точками.";
       }
       leaf lookup-limit {
         type uint8;
         description
           "Предельное число выполняемых уровней поиска.";
       }
       list rib-list {
         key "name";
         description
           "Список RIB, связанных с экземпляром маршрутизации.";
         leaf name {
           type string;
           mandatory true;
           description
             "Имя каждой RIB.";
         }
         leaf address-family {
           type address-family-definition;
           mandatory true;
           description
             "Семейство адресов для RIB.";
         }
         leaf ip-rpf-check {
           type boolean;
           description
             "С каждой RIB можно связать атрибут ENABLE_IP_RPF_CHECK,
              управляющий проверкой обратного пути (RPF) для всех
              маршрутов IP в RIB, служащей для предотвращения подмены
              адресов (spoofing) и ограничения вредного трафика";
         }
         list route-list {
           key "route-index";
           description
             "Список маршрутов RIB.";
           uses route;
         }
         // Это список, поддерживающий nexthop, добавленные в RIB.
         uses nexthop-list;
       }
     }

     // Операции RPC
     rpc rib-add {
       description
         "Добавление RIB в экземпляр маршрутизации";
       input {
         leaf name {
           type string;
           mandatory true;
           description
             "Имя добавляемой RIB.";
         }
         leaf address-family {
           type address-family-definition;
           mandatory true;
           description
             "Семейство адресов в RIB.";
         }
         leaf ip-rpf-check {
           type boolean;
           description
             "С каждой RIB можно связать атрибут ENABLE_IP_RPF_CHECK,
              управляющий проверкой обратного пути (RPF) для всех
              маршрутов IP в RIB, служащей для предотвращения подмены
              адресов (spoofing) и ограничения вредного трафика";
         }
       }
       output {
         leaf result {
           type boolean;
           mandatory true;
           description
             "Результат операции rib-add - true - успех, false - отказ";
         }
         leaf reason {
           type string;
           description
             "Конкретная причина отказа.";
         }
       }
     }

     rpc rib-delete {
       description
         "Удаление RIB из экземпляра маршрутизации с удалением всех
          маршрутов, установленных из этой RIB.";
       input {
         leaf name {
           type string;
           mandatory true;
           description
             "Имя удаляемой RIB.";
         }
       }
       output {
         leaf result {
           type boolean;
           mandatory true;
           description
             "Результат операции rib-delete - true - успех, 
              false - отказ";
         }
         leaf reason {
           type string;
           description
             "Конкретная причина отказа.";
         }
       }
     }

     grouping route-operation-state {
       description
         "Статус операции для маршрутов.";
       leaf success-count {
         type uint32;
         mandatory true;
         description
           "Число добавленных, удалённых или изменённых маршрутов.";
       }
       leaf failed-count {
         type uint32;
         mandatory true;
         description
           "Число маршрутов с отказом добавления, удаления, изменения";
       }
       container failure-detail {
         description
           "Причины отказа операции с маршрутами. Это массив, содержащий
            индексы маршрутов и коды отказы.";
         list failed-routes {
           key "route-index";
           description
             "Список маршрутов с отказами.";
           leaf route-index {
             type uint32;
             description
               "Индекс маршрута с отказом.";
           }
           leaf error-code {
             type uint32;
             description
               "Код, указывающий причину отказа
                0 - резерв
                1 — попытка добавить имеющийся маршрут
                2 — попытка удалить отсутствующий маршрут
                3 — некорректные атрибуты маршрута.";
           }
         }
       }
     }

     rpc route-add {
       description
         "Добавление маршрута или набора маршрутов в RIB";
       input {
         leaf return-failure-detail {
           type boolean;
           default "false";
           description
             "Управляет возвратом сведений о причине отказа - true задаёт 
              возврат причины, false отменяет возврат причины отказа.";
         }
         leaf rib-name {
           type string;
           mandatory true;
           description
             "Имя RIB.";
         }
         container routes {
           description
             "Маршруты, добавляемые в RIB.";
           list route-list {
             key "route-index";
             description
               "Список добавляемых маршрутов.";
             uses route-prefix;
             container route-attributes {
               uses route-attributes;
               description
                 "Атрибуты маршрутов.";
             }
             container route-vendor-attributes {
               if-feature "route-vendor-attributes";
               uses route-vendor-attributes;
               description
                 "Фирменные (vendor) атрибуты маршрутов.";
             }
             container nexthop {
               uses nexthop;
               description
                 "Значение nexthop в добавляемом маршруте.";
             }
           }
         }
       }
       output {
         uses route-operation-state;
       }
     }

     rpc route-delete {
       description
         "Удаление маршрута или набора маршрутов из RIB";
       input {
         leaf return-failure-detail {
           type boolean;
           default "false";
           description
             "Управляет возвратом сведений о причине отказа - true задаёт 
              возврат причины, false отменяет возврат причины отказа.";
         }
         leaf rib-name {
           type string;
           mandatory true;
           description
             "Имя RIB.";
         }
         container routes {
           description
             "Маршруты, удаляемые из RIB.";
           list route-list {
             key "route-index";
             description
               "Список удаляемых маршрутов.";
             uses route-prefix;
           }
         }
       }
       output {
         uses route-operation-state;
       }
     }

     grouping route-update-options {
       description
         "Варианты обновления:
          1. обновить nexthop
          2. обновить атрибуты маршрута
          3. обновить фирменные атрибуты (route-vendor-attributes).";
       choice update-options {
         description
           "Варианты обновления:
            1. обновить nexthop
            2. обновить атрибуты маршрута
            3. обновить фирменные атрибуты (route-vendor-attributes).";
         case update-nexthop {
           container updated-nexthop {
             uses nexthop;
             description
               "Значение nexthop для обновления.";
           }
         }
         case update-route-attributes {
           container updated-route-attr {
             uses route-attributes;
             description
               "Атрибуты маршрута для обновления.";
           }
         }
         case update-route-vendor-attributes {
           container updated-route-vendor-attr {
             uses route-vendor-attributes;
             description
               "Фирменные (vendor) атрибуты для обновления.";
           }
         }
       }
     }

     rpc route-update {
       description
         "Обновление маршрута или набора маршрутов в RIB.
          Входные данные:
            1. Условия сопоставления, которые могут включать:
              a. префикс маршрута;
              b. атрибуты маршрута;
              c. nexthop.
            2. Параметры, используемые для обновления:
              a. новый nexthop;
              b. новые атрибуты маршрута.
          Действия:
            1. обновление nexthop;
            2. обновление атрибутов маршрута.
          Результат:
            success-count - число обновлённых маршрутов;
            failed-count - число маршрутов с отказами обновления;
            failure-detail — сведения о причинах отказа.";
       input {
         leaf return-failure-detail {
           type boolean;
           default "false";
           description
             "Управляет возвратом сведений о причине отказа - true задаёт 
              возврат причины, false отменяет возврат причины отказа.";
         }
         leaf rib-name {
           type string;
           mandatory true;
           description
             "Имя RIB.";
         }
         choice match-options {
           description
             "Опции сопоставления.";
           case match-route-prefix {
             description
               "Обновлять маршруты с совпадающими префиксами.";
             container input-routes {
               description
                 "Маршруты для обновления.";
               list route-list {
                 key "route-index";
                 description
                   "Список обновляемых маршрутов.";
                 uses route-prefix;
                 uses route-update-options;
               }
             }
           }
           case match-route-attributes {
             description
               "Обновлять маршруты с совпадающими атрибутами.";
             container input-route-attributes {
               description
                 "Атрибуты для сопоставления.";
               uses route-attributes;
             }
             container update-parameters {
               description
                 "Варианты обновления:
                  1. обновить nexthop
                  2. обновить атрибуты маршрута
                  3. обновить фирменные атрибуты.";
               uses route-update-options;
             }
           }
           case match-route-vendor-attributes {
             if-feature "route-vendor-attributes";
             description
               "Обновить маршруты с совпадающими фирменными атрибутами";
             container input-route-vendor-attributes {
               description
                 "Фирменные (vendor) атрибуты для сопоставления.";
               uses route-vendor-attributes;
             }
             container update-parameters-vendor {
               description
                 "Варианты обновления:
                  1. обновить nexthop
                  2. обновить атрибуты маршрута
                  3. обновить фирменные атрибуты.";
               uses route-update-options;
             }
           }
           case match-nexthop {
             description
               "Обновить маршруты с совпадающим nexthop.";
             container input-nexthop {
               description
                 "Значение nexthop для сопоставления.";
               uses nexthop;
             }
             container update-parameters-nexthop {
               description
                 "Варианты обновления:
                  1. обновить nexthop
                  2. обновить атрибуты маршрута
                  3. обновить фирменные атрибуты.";
               uses route-update-options;
             }
           }
         }
       }
       output {
         uses route-operation-state;
       }
     }
     rpc nh-add {
       description
         "Добавить nexthop в RIB.
          Входные параметры:
            1. rib-name
            2. nexthop
          Действие:
            Добавить nexthop в RIB.
          Результата:
            1. результата операции (true — успех, false - отказ)
            2. идентификатор nexthop";
       input {
         leaf rib-name {
           type string;
           mandatory true;
           description
             "Имя RIB.";
         }
         uses nexthop;
       }
       output {
         leaf result {
           type boolean;
           mandatory true;
           description
             "Результат операции nh-add (true — успех, false — отказ)";
         }
         leaf reason {
           type string;
           description
             "Конкретная причина отказа.";
         }
         leaf nexthop-id {
           type uint32;
           description
             "Идентификатор, выделенный для nexthop.";
         }
       }
     }

     rpc nh-delete {
       description
         "Удалить nexthop из RIB";
       input {
         leaf rib-name {
           type string;
           mandatory true;
           description
             "Имя RIB.";
         }
         uses nexthop;
       }
       output {
         leaf result {
           type boolean;
           mandatory true;
           description
             "Результат nh-delete (true — успех, false — отказ)";
         }
         leaf reason {
           type string;
           description
             "Конкретная причина отказа.";
         }
       }
     }

     // Уведомления
     notification nexthop-resolution-status-change {
       description
         "Статус распознавания nexthop (распознан или не распознан).";
       container nexthop {
         description
           "The nexthop.";
         uses nexthop;
       }
       leaf nexthop-state {
         type nexthop-state-definition;
         mandatory true;
         description
         "Статус распознавания nexthop (распознан или не распознан).";
       }
     }

     notification route-change {
       description
         "Изменение маршрута.";
       leaf rib-name {
         type string;
         mandatory true;
         description
           "Имя RIB.";
       }
       leaf address-family {
         type address-family-definition;
         mandatory true;
         description
           "Семейство адресов в RIB.";
       }
       uses route-prefix;
       leaf route-installed-state {
         type route-installed-state-definition;
         mandatory true;
         description
           "Указывает, включён ли маршрут в FIB.";
       }
       leaf route-state {
         type route-state-definition;
         mandatory true;
         description
           "Указывает, активен ли маршрут.";
       }
       list route-change-reasons {
         key "route-change-reason";
         description
           "Причина изменения маршрута. Это может быть, например,
            результатом распознавания nexthop, активирующего маршрут A,
            который предпочтительней активного ранее маршрута B.";
         leaf route-change-reason {
           type route-change-reason-definition;
           mandatory true;
           description
             "Причина изменения маршрута.";
         }
       }
     }
   }
   <CODE ENDS>

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

Этот документ регистрирует URI в субреестре ns реестра IETF XML Registry [RFC3688]

    URI: urn:ietf:params:xml:ns:yang:ietf-i2rs-rib
    Registrant Contact: The IESG.
    XML: N/A, запрошенный URI является пространством имён XML.

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

    name:         ietf-i2rs-rib
    namespace:    urn:ietf:params:xml:ns:yang:ietf-i2rs-rib
    prefix:       iir
    reference:    RFC 8431

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

Заданный этим документом модуль YANG определяет схему для данных, предназначенную для доступа через сеть с использованием протоколов управления, таких как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF служит защищённый транспорт с обязательной поддержкой SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF служит протокол HTTPS с обязательной поддержкой защиты на транспортном уровне (TLS) [RFC8446].

Модель доступа NETCONF [RFC8341] обеспечивает возможность разрешить доступ лишь указанных пользователей NETCONF или RESTCONF к заранее заданному подмножеству операций NETCONF или RESTCONF и содержимого.

Модуль YANG задаёт информацию, которая может быть настраиваемой в некоторых экземплярах, например, RIB, маршрут, nexthop могут создаваться и удаляться клиентскими приложениями. Модель YANG также задаёт RPC, которые клиенты могут применять для удаления и добавления RIB, маршрутов и nexthop. Вредоносный клиент может попытаться добавить, удалить или обновить RIB, маршруты или nexthop, создавая или удаляя соответствующие элементы в списках RIB, маршрутов, nexthop. Удаление RIB или маршрута может привести к отказам или снижению производительности служб, а изменение маршрута может привести к неоптимальной маршрутизации и снижению качества обслуживания и даже его прекращению. По этим причинам важно активно применять модель контроля доступа NETCONF для предотвращения изменения настроек неуполномоченными клиентами.

В этом модуле данных YANG определено множество узлов данных, которые разрешают запись, создание и удаление (т. е. config true, как принято по умолчанию). Эти узлы могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Запись в такие узлы (например, edit-config) без должной защиты может негативно влиять на работу сети. Ниже перечислены ветви и узлы, которые могут быть конфиденциальны или уязвимы.

RIB

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

route

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

nexthop

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

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, <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>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

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

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

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

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

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

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8344] Bjorklund, M., «A YANG Data Model for IP Management», RFC 8344, DOI 10.17487/RFC8344, March 2018, <https://www.rfc-editor.org/info/rfc8344>.

[RFC8430] Bahadur, N., Ed., Kini, S., Ed., and J. Medved, «RIB Information Model», RFC 8430, DOI 10.17487/RFC8430, September 2018, <http://www.rfc-editor.org/info/rfc8430>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

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

[I2RS-REQS] Hares, S. and M. Chen, «Summary of I2RS Use Case Requirements», Work in Progress, draft-ietf-i2rs-usecase-reqs-summary-03, November 2016.

[RFC2784] Farinacci, D., Li, T., Hanks, S., Meyer, D., and P. Traina, «Generic Routing Encapsulation (GRE)», RFC 2784, DOI 10.17487/RFC2784, March 2000, <https://www.rfc-editor.org/info/rfc2784>.

[RFC7348] Mahalingam, M., Dutt, D., Duda, K., Agarwal, P., Kreeger, L., Sridhar, T., Bursell, M., and C. Wright, «Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks», RFC 7348, DOI 10.17487/RFC7348, August 2014, <https://www.rfc-editor.org/info/rfc7348>.

[RFC7637] Garg, P., Ed. and Y. Wang, Ed., «NVGRE: Network Virtualization Using Generic Routing Encapsulation», RFC 7637, DOI 10.17487/RFC7637, September 2015, <https://www.rfc-editor.org/info/rfc7637>.

[RFC7921] Atlas, A., Halpern, J., Hares, S., Ward, D., and T. Nadeau, «An Architecture for the Interface to the Routing System», RFC 7921, DOI 10.17487/RFC7921, June 2016, <https://www.rfc-editor.org/info/rfc7921>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

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

Авторы благодарны Chris Bowers, John Scudder, Tom Petch, Mike McBride, Ebben Aries за рецензии, предложения и комментарии к документу.

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

Ниже указаны работы над документом.

  • Zekun He, Tencent Holdings Ltd.

  • Sujian Lu, Tencent Holdings Ltd.

  • Jeffery Zhang, Juniper Networks

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


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

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

nmalykh@protokols.ru

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

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

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

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

RFC 8430 RIB Information Model

Internet Engineering Task Force (IETF)                   N. Bahadur, Ed.
Request for Comments: 8430                                          Uber
Category: Informational                                     S. Kini, Ed.
ISSN: 2070-1721
                                                               J. Medved
                                                                   Cisco
                                                          September 2018

RIB Information Model

Информационная модель RIB

PDF

Аннотация

Маршрутизация и её функции в сети предприятия или оператора обычно выполняются сетевыми устройствами (маршрутизаторы и коммутаторы), использующими базы маршрутной информации (Routing Information Base или RIB). Протоколы и конфигурации выталкивают данные в RIB, а менеджер RIB устанавливает состояние в оборудовании для пересылки пакетов. Этот документ задаёт информационную модель RIB, позволяющую определить стандартизованную модель данных. Рабочая группа IETF I2RS использовала этот документ для разработки модели данных I2RS RIB. Этот документ публикуется для решений с информационными моделями RIB более высокого уровня, чтобы другие разработчики RIB могли воспользоваться преимуществами концепций проектирования.

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

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

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

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

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

Copyright (c) 2018. Авторские права принадлежат 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. Введение

Маршрутизация и её функции в сети предприятия или оператора обычно выполняются сетевыми устройствами. Маршрутизаторы обычно применяют протоколы маршрутизации, которые (вместе со статической конфигурацией) заполняют базы маршрутных данных (RIB) на маршрутизаторе. Базы RIB управляются менеджером RIB, а тот обеспечивает северный интерфейс с клиентами (т. е. протоколами маршрутизации) для вставки маршрутов в RIB. Менеджер RIB обращается к RIB для программирования базы пересылки (Forwarding Information Base или FIB) в оборудовании, взаимодействуя с менеджером FIB. Связи между этими элементами показаны на рисунке 1.

      +-------------+        +-------------+
      |Клиент 1 RIB | ...... |Клиент 2 RIB |
      +-------------+        +-------------+
             ^                      ^
             |                      |
             +----------------------+
                        |
                        V
             +---------------------+
             |    Менеджер RIB     |
             |                     |
             |     +--------+      |
             |     |Базы RIB|      |
             |     +--------+      |
             +---------------------+
                        ^
                        |
       +---------------------------------+
       |                                 |
       V                                 V
+----------------+               +----------------+
| Менеджер 1 FIB |               | Менеджер M FIB |
|   +--------+   |  ..........   |   +--------+   |
|   |Базы FIB|   |               |   |Базы FIB|   |
|   +--------+   |               |   +--------+   |
+----------------+               +----------------+

Рисунок 1. Менеджер RIB, клиенты RIB и менеджеры FIB.


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

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

Для понимания содержимого RIB в маршрутизаторах применяются методы, похожие на SNMP MIB для протоколов и «скобление» экрана (screen scraping). Эти методы не расширяемы, поскольку являются клиентскими механизмами вытягивания, а не упреждающего выталкивания (из маршрутизатора). Скобление экрана подвержено ошибкам (поскольку формат может меняться) и зависит от производителя. Создание RIB из протокольных MIB подвержено ошибкам, поскольку MIB представляют данные протокола, а не точные сведения, вошедшие в RIB. Таким образом, простое получение доступных лишь для чтения сведений RIB от маршрутизатора является сложной задачей.

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

Целью этого документа является задание информационной модели для RIB. Используя такую модель можно создать подробную модель данных для RIB. Такая модель данных может применяться клиентами RIB для программирования сетевых устройств. Одной из основанных на этом документе является модель данных I2RS RIB [RFC8431].

В разделе 2 подробно рассказано, что входит в RIB и что можно запрограммировать там. Разделы 3 и 4 содержать рекомендации по чтению и записи в RIB. В разделе 5 дано высокоуровневое представление событий и уведомлений от сетевых устройств клиенту RIB для обновления клиента по асинхронным событиям. Грамматика RIB описана в разделе 6, а примеры её использования — в разделе 7. В разделе 8 рассматривается выполнение операций RIB.

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

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

2. Данные RIB

В этом разделе описаны детали RIB. Раздел ссылается на грамматику RIB, описанную в разделе 6. Грамматика RIB. Высокоуровневое представление содержимого RIB представлено на рисунке 2. Для простоты на рисунке показан 1 экземпляр маршрутизации, 1 RIB и 1 маршрут. В параграфах этого раздела описаны логические узлы данных, которым следует присутствовать в RIB. В разделах 3 и 4 приведены высокоуровневые описания операций чтения и записи.

    Сетевое устройство
            |
            | 0..N
            |
  Экземпляры маршрутизации
      |             |
      |             |
0..N  |             | 0..N
      |             |
 Интерфейсы     Базы RIB
                    |
                    |
                    | 0..N
                    |
                Маршруты

Рисунок 2. Информационная модель RIB.


2.1. Определение RIB

В контексте информационной модели RIB является объектом, содержащим маршруты. Таблица указывается именем и содержится внутри экземпляра маршрутизации (параграф 2.2). Сетевое устройство может содержать экземпляры маршрутизации, каждый из которых может содержать таблицы RIB. Имя должно быть уникальным в рамках экземпляра маршрутизации. Все маршруты в данной RIB должны относиться к одному семейству адресов (например, IPv4). Каждая таблица RIB должна относиться к экземпляру маршрутизации. Каждый экземпляр маршрутизации может содержать несколько RIB для одного семейства адресов (например, IPv6). В типичном случае это может служит для маршрутизации с несколькими топологиями [RFC4915] [RFC5120].

С каждой RIB может быть связан атрибут ENABLE_IP_RPF_CHECK, разрешающий проверку пересылки по обратному пути (Reverse Path Forwarding или RPF) на всех маршрутах IP этой RIB. Проверка RPF применяется для предотвращения подмены адресов (spoofing) и ограничения вредоносного трафика. Для пакетов IP отыскивается адрес отправителя и интерфейсы RPF, связанные с маршрутом, для которого найден IP-адрес отправителя. Если интерфейс для входящего пакета IP соответствует одному из интерфейсов RPF, пакет IP пересылается по IP-адресу получателя, в иных случаях — отбрасывается.

2.2. Экземпляр маршрутизации

В контексте информационной модели RIB экземпляром маршрутизации является набор RIB, интерфейсов и параметров маршрутизации. Экземпляр маршрутизации создаёт логический «срез» (slice) маршрутизатора. Это позволяет таким срезам на разных маршрутизаторах взаимодействовать между собой. Виртуальные сети L3 VPN, L2 VPN (L2VPN) и VPLS3 можно моделировать как экземпляры маршрутизации. Отметим, что моделирование L2VPN с применением экземпляра маршрутизации представляет лишь аспект L3 (RIB), не представляя сведений L2 (например, ARP), которые могут быть связаны с L2VPN. Набор интерфейсов указывает, какие интерфейсы связаны с экземпляром маршрутизации. Таблицы RIB указывают, как будет пересылаться входящий трафик, а параметры маршрутизации контролируют информацию в RIB. Пересечение наборов интерфейсов двух экземпляров маршрутизации должно быть пустым, т. е. интерфейсу недопустимо присутствовать в двух экземплярах маршрутизации. Таким образом, экземпляр маршрутизации описывает данные и параметры маршрутизации через набор интерфейсов. Экземпляр маршрутизации должен включать указанные ниже поля.

INSTANCE_NAME

Имя,служащее для идентификации данного экземпляра маршрутизации, уникальное для каждого экземпляра в данном сетевом устройстве.

rib-list

Список RIB, связанных с экземпляром маршрутизации. Каждый экземпляр может иметь несколько RIB для представления маршрутов разных типов. Например, маршруты IPv4 могут помещаться в одну RIB, а маршруты MPLS — в другую. Список RIB может быть пустым.

Экземпляр маршрутизации может включать указанные ниже поля.

interface-list

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

ROUTER_ID

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

Экземпляр маршрутизации может создаваться исключительно для обработки пакетов и не иметь каких-либо связанных с ним интерфейсов. Например, входящие пакеты экземпляра маршрутизации A могут иметь в качестве nexthop экземпляр B, а после обработки в B значение nexthop может указывать экземпляр C, при этом экземпляр B не будет связан с каким-либо интерфейсом. С учётом того, что этот экземпляр не взаимодействует в плоскости управления с другими устройствами, ROUTER_ID для него не требуется.

2.3. Маршрут

Маршрут — это, по сути, условие сопоставления и действие, выполняемое по этому условию. Условие задаёт тип маршрута (IPv4, MPLS и т. п.) и набор полей для сопоставления. Содержимое маршрута показано на рисунке 3. Для простоты на рисунке показан лишь 1 экземпляр атрибутов маршрута, флагов сопоставления и nexthop.

                       Маршрут
                        | | |
              +---------+ | +----------+
              |           |            |
         0..N |           |            |
route-attribute         match         nexthop
                          |
                          |
          +-------+-------+-------+--------+
          |       |       |       |        |
          |       |       |       |        |

        IPv4    IPv6    MPLS    MAC    Интерфейс

Рисунок 3. Модель маршрута.


Ниже указаны типы сопоставлений, задаваемые этим документом.

  • IPv4 — сопоставление с IP-адресом получателя и/или отправителя в заголовке IPv4.

  • IPv6 — сопоставление с IP-адресом получателя и/или отправителя в заголовке IPv6.

  • MPLS — сопоставление с меткой MPLS на вершине стека меток MPLS.

  • MAC — сопоставление с MAC4-адресом получателя в заголовке Ethernet.

  • Interface — сопоставление с интерфейсом, принявшим пакет.

Маршрут может сопоставляться с одним или несколькими типами в соответствии с политикой, задающей ограничение числа маршрутов (AND) или объединение двух фильтров (OR).

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

ROUTE_PREFERENCE

Численное значение, позволяющее сравнивать маршруты от разных протоколов (статическая настройка тоже считается протоколом). Этот атрибут называют также административной дистанцией (administrative distance). Меньшее значение указывает более предпочтительный маршрут. Например, может быть маршрут OSPF для 192.0.2.1/32 (или IPv6 2001:DB8::1/128) с приоритетом 5. Если контроллер программирует маршрут для 192.0.2.1/32 (или IPv6 2001:DB8::1/128) с приоритетом 2, менеджер RIB предпочтёт маршрут от контроллера. Предпочтения следует использовать для управления поведением. Дополнительные примеры даны в параграфе 7.1.

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

route-vendor-attributes

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

С каждым маршрутом связан следующий узел пересылки (nexthop). Описание параметра приведено в параграфе 2.4.

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

2.4. Следующий узел

Объект nexthop является результатом поиска маршрута. Например, если поиск указывает передачу пакета через данный интерфейс, nexthop будет представлять этот интерфейс.

Значения nexthop могут быть распознанными полностью или нераспознанными. В полностью распознанном nexthop имеются адекватные сведения для отправки исходящего пакета получателю путём его пересылки на интерфейс, напрямую подключённый к соседу. Например, nexthop с интерфейсом «точка-точка» или IP-адресом интерфейса Ethernet является распознанным полностью. При нераспознанном nexthop менеджер RIB должен определить финальное распознанное значение nexthop. Например, это может быть адрес IP. Менеджер RIB будет выяснять, как достичь этот адрес IP, например, он может быть доступен путём обычной пересылки IP, через туннель MPLS или обоими способами. Если менеджер RIB не может преобразовать nexthop, сохраняется нераспознанное состояние и nexthop недопустимо считать кандидатом на установку в FIB. Последующие события RIB могут привести к распознавания (например, адрес IP будет анонсирован соседом IGP). И наоборот, распознанные полностью nexthop могут стать нераспознанными (например, в результате отключения туннеля) и перестанут быть кандидатами на включение в FIB.

Если хотя бы 1 из nexthop маршрута удалось распознать, маршрут можно применять для пересылки пакетов. Такие маршруты считаются подходящими для включения в FIB и далее называются FIB-eligible. И наоборот, если ни один из nexthop маршрута распознать не удалось, маршрут больше не применяется для пересылки пакетов. Такой маршрут считается неподходящим для установки в FIB и далее называется FIB-ineligible. Сведения информационной модели RIB позволяют клиентам RIB программировать маршруты, в которых nexthop изначально могут быть нераспознанными. При распознании nexthop менеджер RIB передаёт уведомление об этом (см. 5. Уведомления).

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

                             route
                               |
                               | 0..N
                               |
                             nexthop <-------------------------------+
                               |                                     |
        +-------+----------------------------+-------------+         |
        |       |              |             |             |         |
        |       |              |             |             |         |
     base   load-balance   protection      replicate     chain       |
        |       |              |             |             |         |
        |       |2..N          |2..N         |2..N         |1..N     |
        |       |              |             |             |         |
        |       |              V             |             |         |
        |       +------------->+<------------+-------------+         |
        |                      |                                     |
        |                      +-------------------------------------+
        |
        +-------------------+
                            |
                            |
                            |
                            |
   +---------------+--------+--------+--------------+----------+
   |               |                 |              |          |
   |               |                 |              |          |
nexthop-id  egress-interface  ip-address     logical-tunnel    |
                                                               |
                                                               |
                        +--------------------------------------+
                        |
     +----------------------+------------------+-------------+
     |                      |                  |             |
     |                      |                  |             |
tunnel-encapsulation   tunnel-decapsulation  rib-name   special-nexthop

Рисунок 4. Модель nexthop.


Этот документ определяет лишь базовую, расширяемую и рекурсивную грамматику для nexthop, которые могут быть базовыми или производными. В параграфе 2.4.1 рассмотрены базовые nexthop, а параграф 2.4.2 разъясняет разные типы производных nexthop. Имеются также специальные виды nexthop, описанные в параграфе 2.4.1.1. В параграфе 2.4.3 рассматривается косвенность nexthop и её применение. Примеры использования туннельных и производных nexthop приведены в параграфе 7.2.

2.4.1. Базовые nexthop

Ниже перечислены типы nexthop н самом низком уровне.

Идентификатор

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

Интерфейсные nexthop

Имеются nexthop, указывающие интерфейс. С ними связаны указанные ниже атрибуты.

Egress-interface

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

IP address

Выполняется поиск маршрута по этому для определения egress-interface. Распознавание адреса может потребоваться в зависимости от интерфейса.
  • Необязательное поле rib-name может задаваться для указания RIB, в которой будет выполняться поиск по адресу IP. Можно использовать rib-name для передачи пакета из одного домена в другой. По умолчанию используется RIB, к которой относится маршрут.
Эти атрибуты могут сочетаться с указанными ниже.

Egress-interface и IP address

Может применяться в случаях, где, например, IP-адрес относится к локальному каналу (link-local).

Egress-interface и MAC address

Выходной интерфейс (egress-interface) должен быть интерфейсом Ethernet. Распознавание адреса не требуется для этого nexthop.

Туннельные nexthop

Некоторые nexthop указывают туннель. Типы туннельных nexthop приведены ниже.

tunnel-encapsulation

Это может быть инкапсуляция, представляющая туннель IP, MPLS или иной, как описано в этом документе. С tunnel-encapsulation может быть связано значение egress-interface для указания интерфейса, передающего пакеты. Это полезно, когда сетевое устройство имеет интерфейсы Ethernet и нужно распознавать адрес для пакетов IP.

tunnel-decapsulation

Служит для декапсуляции туннельного заголовка. После декапсуляции для пакета может выполняться новый поиск для связывания с другим nexthop или пакет может передаваться напрямую через egress-interface.

logical-tunnel

Это может быть путь с коммутацией по меткам MPLS (Label Switched Path или LSP) или туннель GRE (а также другие, определённые в этом документе), представленный уникальным идентификатором (например, именем).

rib-name

Значение nexthop, указывающее RIB для продолжения поиска маршрута (способ организации цепочек поиска).

Туннельные nexthop позволяют клиентам RIB программировать статические туннельные заголовки. Могут быть случаи, когда удалённая конечная точка туннеля не поддерживает динамическую сигнализацию (например, хост не поддерживает LDP) и в таких случаях клиенту RIB может потребоваться программировать туннельные заголовки на обеих сторонах туннеля. Туннельный nexthop сохраняется базовым в соответствии со спецификациями для часто применяемых туннелей. Предполагается, что модель данных будет точно представлять такие типы туннелей.

2.4.1.1. Специальные nexthop

Специальные nexthop предназначены для выполнения особых чётко заданных функций (например, DISCARD).

DISCARD

Указывает, что сетевому устройству следует отбросить пакет и увеличить значение счётчика отбрасывания.

DISCARD_WITH_ERROR

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

RECEIVE

Указывает, что трафик предназначен для сетевого устройства, например, пакеты протокола или OAM5. Весь трафик для локального получателя следует дросселировать (throttle) во избежание DoS6-атак на плоскость управления маршрутизатора. Можно задавать дополнительный ограничитель скорости, указывающий, как ограничить трафик, адресованный плоскости управления. Описание таких ограничителей выходит за рамки документа.

2.4.2. Производные nexthop

Производными nexthop могут быть:

  • взвешенные списки, применяемые для распределения нагрузки;

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

  • списки репликации — списки nexthop, в которые передаются копии пакета;

  • цепочки nexthop для связывания нескольких операций или добавления нескольких заголовков;

  • списки списков для рекурсивного применения указанного выше.

Цепочки nexthop (см. параграф 7.2.5) обеспечивают способ связывания нескольких операций над пакетом путём их логического объединения. Например, можно сцепить операции декапсуляции заголовка MPLS и передачи пакета церез заданный интерфейс egress-interface. Цепочки могут служить для указания в пакете нескольких заголовков перед его пересылкой. Одним из простых примеров является работа MPLS через GRE, где пакет имеет внутренний заголовок MPLS, за которым следует заголовок GRE, затем — заголовок IP. Внешний заголовок IP определяется сетевым устройством, а заголовки MPLS или GRE — контроллером. Не каждое сетевое устройство способно поддерживать все типы цепочек nexthop и связывание произвольного числа заголовков. Модели данных RIB следует обеспечивать способ раскрытия возможностей цепочек nexthop, поддерживаемых данным сетевым устройством.

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

2.4.2.1. Атрибуты списка nexthop

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

NEXTHOP_PREFERENCE

Применяется в схемах защиты и задаётся целым числом от 1 до 99 (меньшее значение указывает более высокий приоритет). Для выгрузки пары основной-резервный в FIB nexthop преобразуются и выбираются два наиболее высоких приоритета. Каждому <NEXTHOP_PREFERENCE> следует иметь уникальной значение в <nexthop-protection> (см. 6. Грамматика RIB).

NEXTHOP_LB_WEIGHT

Служит для распределения нагрузки. Каждому элементу списка должен назначаться вес от 1 до 99. Вес определяет долю трафика, передаваемого через nexthop при пересылке отношением веса данного nexthop к сумме весов всех прочих nexthop этого маршрута, применяемых для пересылки. Для равномерного распределения нагрузки можно задать вес в всем nexthop. Это значение зарезервировано для равномерного распределения и при его применении должно устанавливаться для всех nexthop. Отметим, что значение 0 сохранилось по историческим причинам.

2.4.3. Косвенность nexthop

Можно применять идентификаторы nexthop для задания косвенности. Идентификаторы устанавливаются менеджером RIB и возвращаются клиенту RIB по запросу. Одним из примеров применения косвенности служит nexthop с указанием на другое сетевое устройство (например, партнер BGP). Возвращаемый идентификатор nexthop можно использовать для программирования маршрутов, указывающих этот nexthop. Учитывая, что менеджер RIB организовал косвенность с использованием идентификатора nexthop, изменение транспортного пути к сетевому устройству (партнёр BGP) будет незаметно для клиента RIB и все маршруты, указывающие на это сетевое устройство, автоматически пойдут по новому транспортному пути. Косвенность nexthop с использованием идентификаторов может применяться не только к индивидуальным (unicast) nexthop, но и к nexthop, содержащим цепочки и вложенные nexthop. Примеры представлены в параграфе 2.4.2. Производные nexthop.

3. Чтение из RIB

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

4. Запись в RIB

Модель данных RIB должна позволять клиенту RIB вносить записи в RIB, созданные этим объектом. Администратор сетевого устройства может разрешить клиенту RIB запись в другие RIB через списки доступа на сетевом устройстве. Детали списков доступа выходят за рамки этого документа. При записи объекта в RIB клиенту RIB следует пытаться записать все зависимости объекта до отправки самого объекта. Модели данных следует поддерживать запросы идентификаторов для nexthop и сбор этих идентификаторов в отклике.

Программирование маршрутов в RIB должно приводить к коду возврата, содержащему указанные ниже атрибуты.

  • Installed (установлен) — Yes/No (установлен ли маршрут в FIB).

  • Active (активен) — Yes/No (был ли маршрут распознан полностью и является ли кандидатом для выбора).

  • Reason (причина) — например, Not authorized (не разрешено).

Модель данных должна указывать, какие объекты можно изменять. Изменяемым считается объект, содержимое которого можно поменять без влияния на пересылку данных. Для изменения неизменяемого объекта требуется создать новый объект и удалить имеющийся. Например, маршрутам, использующим nexthop, указанный идентификатором nexthop, следует быть неизменными при смене содержимого nexthop.

5. Уведомления

Менеджер RIB на сетевом устройстве отправляет клиенту RIB асинхронные уведомления при тех или иных событиях на устройстве. Модель данных RIB должна поддерживать передачу асинхронных уведомлений. Краткий список предлагаемых уведомлений приведён ниже.

  • Изменение маршрута (с возвратом кода, указанного в разделе 4. Запись в RIB).

  • Статус распознавания nexthop (распознан или не распознан).

6. Грамматика RIB

В этом разделе задана информационная модель RIB в форме Бэкуса-Наура для маршрутизации (Routing Backus-Naur Form или rBNF) [RFC5511]. Эта грамматика поможет читателю лучше понять раздел 2 для вывода модели данных.

 <routing-instance> ::= <INSTANCE_NAME>
                        [<interface-list>] <rib-list>
                        [<ROUTER_ID>]

 <interface-list> ::= (<INTERFACE_IDENTIFIER> ...)

 <rib-list> ::= (<rib> ...)
 <rib> ::= <rib-name> <address-family>
                     [<route> ... ]
                     [ENABLE_IP_RPF_CHECK]
 <address-family> ::= <IPV4_ADDRESS_FAMILY> | <IPV6_ADDRESS_FAMILY> |
                      <MPLS_ADDRESS_FAMILY> | <IEEE_MAC_ADDRESS_FAMILY>

 <route> ::= <match> <nexthop>
             [<route-attributes>]
             [<route-vendor-attributes>]

 <match> ::= <IPV4> <ipv4-route> | <IPV6> <ipv6-route> |
             <MPLS> <MPLS_LABEL> | <IEEE_MAC> <MAC_ADDRESS> |
             <INTERFACE> <INTERFACE_IDENTIFIER>
 <route-type> ::= <IPV4> | <IPV6> | <MPLS> | <IEEE_MAC> | <INTERFACE>

 <ipv4-route> ::= <ip-route-type>
                  (<destination-ipv4-address> | <source-ipv4-address> |
                  (<destination-ipv4-address> <source-ipv4-address>))
 <destination-ipv4-address> ::= <ipv4-prefix>
 <source-ipv4-address> ::= <ipv4-prefix>
 <ipv4-prefix> ::= <IPV4_ADDRESS> <IPV4_PREFIX_LENGTH>

 <ipv6-route> ::= <ip-route-type>
                  (<destination-ipv6-address> | <source-ipv6-address> |
                   (<destination-ipv6-address> <source-ipv6-address>))
 <destination-ipv6-address> ::= <ipv6-prefix>
 <source-ipv6-address> ::= <ipv6-prefix>
 <ipv6-prefix> ::= <IPV6_ADDRESS> <IPV6_PREFIX_LENGTH>
 <ip-route-type> ::= <SRC> | <DEST> | <DEST_SRC>

 <route-attributes> ::= <ROUTE_PREFERENCE> [<LOCAL_ONLY>]
                        [<address-family-route-attributes>]

 <address-family-route-attributes> ::= <ip-route-attributes> |
                                       <mpls-route-attributes> |
                                       <ethernet-route-attributes>
 <ip-route-attributes> ::= <>
 <mpls-route-attributes> ::= <>
 <ethernet-route-attributes> ::= <>
 <route-vendor-attributes> ::= <>

 <nexthop> ::= <nexthop-base> |
               (<NEXTHOP_LOAD_BALANCE> <nexthop-lb>) |
               (<NEXTHOP_PROTECTION> <nexthop-protection>) |
               (<NEXTHOP_REPLICATE> <nexthop-replicate>) |
               <nexthop-chain>

 <nexthop-base> ::= <NEXTHOP_ID> |
                    <nexthop-special> |
                    <egress-interface> |
                    <ipv4-address> | <ipv6-address> |
                    (<egress-interface>
                        (<ipv4-address> | <ipv6-address>)) |
                    (<egress-interface> <IEEE_MAC_ADDRESS>) |
                    <tunnel-encapsulation> | <tunnel-decapsulation> |
                    <logical-tunnel> |
                    <rib-name>

 <egress-interface> ::= <INTERFACE_IDENTIFIER>

 <nexthop-special> ::= <DISCARD> | <DISCARD_WITH_ERROR> |
                       (<RECEIVE> [<COS_VALUE>])

 <nexthop-lb> ::= <NEXTHOP_LB_WEIGHT> <nexthop>
                  (<NEXTHOP_LB_WEIGHT> <nexthop) ...

 <nexthop-protection> = <NEXTHOP_PREFERENCE> <nexthop>
                       (<NEXTHOP_PREFERENCE> <nexthop>)...

 <nexthop-replicate> ::= <nexthop> <nexthop> ...

 <nexthop-chain> ::= <nexthop> ...

 <logical-tunnel> ::= <tunnel-type> <TUNNEL_NAME>
 <tunnel-type> ::= <IPV4> | <IPV6> | <MPLS> | <GRE> | <VxLAN> | <NVGRE>

 <tunnel-encapsulation> ::= (<IPV4> <ipv4-header>) |
                            (<IPV6> <ipv6-header>) |
                            (<MPLS> <mpls-header>) |
                            (<GRE> <gre-header>) |
                            (<VXLAN> <vxlan-header>) |
                            (<NVGRE> <nvgre-header>)

 <ipv4-header> ::= <SOURCE_IPv4_ADDRESS> <DESTINATION_IPv4_ADDRESS>
                   <PROTOCOL> [<TTL>] [<DSCP>]

 <ipv6-header> ::= <SOURCE_IPV6_ADDRESS> <DESTINATION_IPV6_ADDRESS>
                   <NEXT_HEADER> [<TRAFFIC_CLASS>]
                   [<FLOW_LABEL>] [<HOP_LIMIT>]

 <mpls-header> ::= (<mpls-label-operation> ...)
 <mpls-label-operation> ::= (<MPLS_PUSH> <MPLS_LABEL> [<S_BIT>]
                                         [<TOS_VALUE>] [<TTL_VALUE>]) |
                            (<MPLS_SWAP> <IN_LABEL> <OUT_LABEL>
                                        [<TTL_ACTION>])

 <gre-header> ::= <GRE_IP_DESTINATION> <GRE_PROTOCOL_TYPE> [<GRE_KEY>]
 <vxlan-header> ::= (<ipv4-header> | <ipv6-header>)
                    [<VXLAN_IDENTIFIER>]
 <nvgre-header> ::= (<ipv4-header> | <ipv6-header>)
                    <VIRTUAL_SUBNET_ID>
                    [<FLOW_ID>]

 <tunnel-decapsulation> ::= ((<IPV4> <IPV4_DECAP> [<TTL_ACTION>]) |
                            (<IPV6> <IPV6_DECAP> [<HOP_LIMIT_ACTION>]) |
                            (<MPLS> <MPLS_POP> [<TTL_ACTION>]))

Рисунок 5. Грамматика rBNF для RIB.

6.1. Разъяснение грамматики nexthop

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

7. Применение грамматики RIB

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

7.1. Использование предпочтений маршрутов

С помощью приоритета маршрута клиент может заранее установить альтернативные пути в сети. Например, если в OSPF задан приоритет маршрута 10, другой клиент может организовать маршрут к тому же получателю с приоритетом 20. В результате маршрут OSPF будет помещён в FIB, но при отзыве маршрута OSPF в FIB будет помещён альтернативный путь.

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

7.2. Использование различных типов nexthop

Грамматика RIB позволяет создавать nexthop разных типов, часть которых рассмотрена в последующих параграфах.

7.2.1. Туннельные nexthop

Туннельный nexthop указывает тот или иной туннель. Туннельный трафик инкапсулируется в зависимости от типа туннеля. Туннельные nexthop полезны для абстрагирования от деталей сети, поскольку трафик беспрепятственно пересекает границы сетей. В конце туннеля трафик декапсулируется. Таким образом, грамматика поддерживает два типа операций — инкапсуляцию и декапсуляцию.

7.2.2. Списки репликации

Можно создать список репликации для отправки копий нескольким адресатам. Получатели, в свою очередь, могут быть производными nexthop (на уровне, поддерживаемом сетевым устройством). Примеры репликации включают передачу от одного к нескольким (point to multipoint) и широковещания. Список репликации (на простейшем уровне) имеет вид

   <nexthop> ::= <NEXTHOP_REPLICATE> <nexthop> [ <nexthop> ... ]

Это можно вывести из грамматики, как показано ниже.

   <nexthop> ::= <nexthop-replicate>
   <nexthop> ::= <NEXTHOP_REPLICATE> <nexthop> <nexthop> ...

7.2.3. Взвешенные списки

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

   <nexthop> ::= <NEXTHOP_LOAD_BALANCE> (<nexthop> <NEXTHOP_LB_WEIGHT>)
                      [(<nexthop> <NEXTHOP_LB_WEIGHT>)... ]

Это можно вывести из грамматики, как показано ниже.

   <nexthop> ::= <nexthop-lb>
   <nexthop> ::= <NEXTHOP_LOAD_BALANCE>
                   <NEXTHOP_LB_WEIGHT> <nexthop>
                   (<NEXTHOP_LB_WEIGHT> <nexthop>) ...
   <nexthop> ::= <NEXTHOP_LOAD_BALANCE> (<NEXTHOP_LB_WEIGHT> <nexthop>)
                   (<NEXTHOP_LB_WEIGHT> <nexthop>) ...

7.2.4. Защита

Защита «основной-резервный» может быть представлена в виде

   <nexthop> ::= <NEXTHOP_PROTECTION> <1> <interface-primary>
                                      <2> <interface-backup>)

Это можно вывести из грамматики, как показано ниже.

<nexthop> ::= <nexthop-protection>
<nexthop> ::= <NEXTHOP_PROTECTION> (<NEXTHOP_PREFERENCE> <nexthop>
                      (<NEXTHOP_PREFERENCE> <nexthop>)...)
<nexthop> ::= <NEXTHOP_PROTECTION> (<NEXTHOP_PREFERENCE> <nexthop>
                      (<NEXTHOP_PREFERENCE> <nexthop>))
<nexthop> ::= <NEXTHOP_PROTECTION> ((<NEXTHOP_PREFERENCE> <nexthop-base>
                      (<NEXTHOP_PREFERENCE> <nexthop-base>))
<nexthop> ::= <NEXTHOP_PROTECTION> (<1> <interface-primary>
                      (<2> <interface-backup>))

Трафик можно распределить между несколькими основными nexthop с одним резервным, как показано ниже.

   <nexthop> ::= <NEXTHOP_PROTECTION> (<1>
                 (<NEXTHOP_LOAD_BALANCE>
                  (<NEXTHOP_LB_WEIGHT> <nexthop-base>
                  (<NEXTHOP_LB_WEIGHT> <nexthop-base>) ...))
                   <2> <nexthop-base>)

Резервный nexthop может иметь свой резерв, как показано ниже.

   <nexthop> ::= <NEXTHOP_PROTECTION> (<1> <nexthop>
                 <2> <NEXTHOP_PROTECTION>(<1> <nexthop> <2> <nexthop>))

7.2.5. Цепочки nexthop

Цепочки nexthop позволяют выполнить над пакетом несколько операций путём их логического объединения. Например, при поступлении пакета VPN на интерфейс WAN для его пересылки в нужный интерфейс VPN нужно извлечь из пакета метку VPN перед его отправкой. Используя цепочку nexthop можно объединить операции выталкивания заголовка MPLS и передачи на определённый интерфейс egress-interface. Это можно вывести из грамматики, как показано ниже.

   <nexthop-chain> ::= <nexthop> <nexthop>
   <nexthop-chain> ::= <nexthop-base> <nexthop-base>
   <nexthop-chain> ::= <tunnel-decapsulation> <egress-interface>
   <nexthop-chain> ::= (<MPLS> <MPLS_POP>) <interface-outgoing>

Элементы цепочки nexthop обрабатываются слева направо.

Цепочки nexthop также позволяют поместить один или несколько заголовков в исходящий пакет. Примером может служить псевдопровод, обеспечиваемый MPLS через какой-либо транспорт (скажем, MPLS или GRE) или расширяемая виртуальная ЛВС (Virtual eXtensible Local Area Network или VXLAN) по протоколу IP. Цепочка nexthop позволяет клиенту RIB разбить программирование nexthop на независимые части (по одной на инкапсуляцию). Простой пример MPLS через GRE можно представить в виде

   <nexthop-chain> ::= (<MPLS> <mpls-header>) (<GRE> <gre-header>)
                       <interface-outgoing>

Это можно вывести из грамматики, как показано ниже.

   <nexthop-chain> ::= <nexthop> <nexthop> <nexthop>
   <nexthop-chain> ::= <nexthop-base> <nexthop-base> <nexthop-base>
   <nexthop-chain> ::= <tunnel-encapsulation> <tunnel-encapsulation>
                       <egress-interface>
   <nexthop-chain> ::= (<MPLS> <mpls-header>) (<GRE> <gre-header>)
                       <interface-outgoing>

7.2.6. Списки списков

Список списков является производной конструкцией. Одним из примеров использования такой конструкции служит репликация трафика нескольким получателям с распределением нагрузки. Иными словами, для каждой ветви дерева репликации имеется несколько интерфейсов, между которыми нужно распределить трафик. Внешним списком является список репликации для группового трафика, а внутренним — взвешенный список для распределения нагрузки. Рассмотрим пример элемента сети, реплицирующего трафик двум другим сетевым элементам. Трафик к первому элементу нужно поровну разделить между двумя интерфейсами — outgoing-1-1 и outgoing-1-2. Трафик ко второму элементу следует разделить между тремя интерфейсами outgoing-2-1, outgoing-2-2, outgoing-2-3 в соотношении 20:20:60. Это можно вывести из грамматики, как показано ниже.

<nexthop> ::= <nexthop-replicate>
<nexthop> ::= <NEXTHOP_REPLICATE> (<nexthop> <nexthop>...)
<nexthop> ::= <NEXTHOP_REPLICATE> (<nexthop> <nexthop>)
<nexthop> ::= <NEXTHOP_REPLICATE> ((<NEXTHOP_LOAD_BALANCE> <nexthop-lb>)
              (<NEXTHOP_LOAD_BALANCE> <nexthop-lb>))
<nexthop> ::= <NEXTHOP_REPLICATE> ((<NEXTHOP_LOAD_BALANCE>
              (<NEXTHOP_LB_WEIGHT> <nexthop>
              (<NEXTHOP_LB_WEIGHT> <nexthop>) ...))
               ((<NEXTHOP_LOAD_BALANCE>
                (<NEXTHOP_LB_WEIGHT> <nexthop>
                (<NEXTHOP_LB_WEIGHT> <nexthop>) ...))
<nexthop> ::= <NEXTHOP_REPLICATE> ((<NEXTHOP_LOAD_BALANCE>
              (<NEXTHOP_LB_WEIGHT> <nexthop>
               (<NEXTHOP_LB_WEIGHT> <nexthop>)))
                ((<NEXTHOP_LOAD_BALANCE>
                (<NEXTHOP_LB_WEIGHT> <nexthop>
                (<NEXTHOP_LB_WEIGHT> <nexthop>)
                (<NEXTHOP_LB_WEIGHT> <nexthop>)))
<nexthop> ::= <NEXTHOP_REPLICATE> ((<NEXTHOP_LOAD_BALANCE>
               (<NEXTHOP_LB_WEIGHT> <nexthop>)
               (<NEXTHOP_LB_WEIGHT> <nexthop>)))
               ((<NEXTHOP_LOAD_BALANCE>
               (<NEXTHOP_LB_WEIGHT> <nexthop>)
               (<NEXTHOP_LB_WEIGHT> <nexthop>)
               (<NEXTHOP_LB_WEIGHT> <nexthop>)))
<nexthop> ::= <NEXTHOP_REPLICATE>
               ((<NEXTHOP_LOAD_BALANCE>
                 (50 <outgoing-1-1>)
                 (50 <outgoing-1-2>)))
                ((<NEXTHOP_LOAD_BALANCE>
                  (20 <outgoing-2-1>)
                  (20 <outgoing-2-2>)
                  (60 <outgoing-2-3>)))

7.3. Групповая передача

Групповая передача IP включает сопоставление пакетов по (S,G) или (*,G), где S (Source) указывает источник, а G (Group) — префиксы IP. При совпадении пакет реплицируется одному или нескольким получателям. Подписка получателей на multicast-рассылки выходит за рамки этого документа.

При групповой передаче на основе PIM пакеты IP пересылаются по дереву групповой рассылки IP (multicast tree). Узлами нисходящего направления в каждой точке этого дерева являются адреса IP. Это можно представить как список репликации (параграф 7.2.2).

При групповой передаче на основе MPLS пакеты пересылаются в P2MP7 LSP. Узел nexthop для P2MP LSP можно представить в грамматике nexthop как <logical-tunnel> (идентификатор P2MP LSP) или список репликации (параграф 7.2.2) <tunnel-encapsulation>, где каждый элемент tunnel-encapsulation представляется одним нисходящим MPLS nexthop.

8. Масштабные операции RIB

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

8.1. Чтение RIB

Должна поддерживаться группировка множества объектов в одном сообщении при передаче сетевым устройством данных RIB клиенту RIB. Модель данных должна позволять клиенту RIB запрашивать у сетевого устройства большой объем данных.

8.2. Запись в RIB

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

8.3. События и уведомления RIB

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

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

Заданная в этом документе информационная модель определяет схему для моделей данных, предназначенных для доступа по протоколам управления сетью, таким как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF служит защищённый транспорт с обязательной поддержкой SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF служит протокол HTTPS с обязательной поддержкой защиты на транспортном уровне (TLS) [RFC8446].

Модель управления доступом NETCONF [RFC8341] обеспечивает возможность разрешить доступ лишь определённых пользователей NETCONF или RESTCONF к заранее заданному подмножеству операций NETCONF или RESTCONF и содержимого.

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

  • Нужно требовать использования средств контроля подлинности и полномочий протокола NETCONF или RESTCONF.

  • Следует расширить предельные объёмы данных, которые могут быть записаны или обновлены удаленным узлом, созданным с учётом требования защиты для модели данных RIB.

  • Следует раскрывать конкретную модель данных RIB, реализованную через модели NETCONF/RESTCONF.

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

Этот документ не требует действий IANA.

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, <https://www.rfc-editor.org/info/rfc2119>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

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

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

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

[RFC8341] Bierman, A. And M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

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

[RFC4915] Psenak, P., Mirtorabi, S., Roy, A., Nguyen, L., and P. Pillay-Esnault, «Multi-Topology (MT) Routing in OSPF», RFC 4915, DOI 10.17487/RFC4915, June 2007, <https://www.rfc-editor.org/info/rfc4915>.

[RFC5120] Przygienda, T., Shen, N., and N. Sheth, «M-ISIS: Multi Topology (MT) Routing in Intermediate System to Intermediate Systems (IS-Iss)», RFC 5120, DOI 10.17487/RFC5120, February 2008, <https://www.rfc-editor.org/info/rfc5120>.

[RFC5511] Farrel, A., «Routing Backus-Naur Form (RBNF): A Syntax Used to Form Encoding Rules in Various Routing Protocol Specifications», RFC 5511, DOI 10.17487/RFC5511, April 2009, <https://www.rfc-editor.org/info/rfc5511>.

[RFC7920] Atlas, A., Ed., Nadeau, T., Ed., and О. Ward, «Problem Statement for the Interface to the Routing System», RFC 7920, DOI 10.17487/RFC7920, June 2016, <https://www.rfc-editor.org/info/rfc7920>.

[RFC8431] Wang, L., Chen, M., Dass, A., Ananthakrishnan, H., Kini, S., and N. Bahadur, «A YANG Data Model for the Routing Information Base (RIB)», RFC 8431, DOI 10.17487/RFC8431, September 2018, <http://www.rfc-editor.org/info/rfc8431>.

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

Авторы благодарны Ron Folkes, Jeffrey Zhang, сопредседателям рабочей группы и рецензентам за их комментарии и предложения к документу. На конференции I2RS Interim в апреле 2013 г. в разработку информационной модели RIB внесли свой вклад Wes George, Chris Liljenstolpe, Jeff Tantsura, Susan Hares, Fabian Schneider.

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


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

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

nmalykh@protokols.ru

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

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

3Virtual Private LAN Service — служба виртуальных частных ЛВС.

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

5Operations, Administration, and Maintenance — операции, администрирования, управление (поддержка).

6Denial-of-service — отказ в обслуживании.

7Point-to-Multipoint — от одного ко многим.

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

RFC 8447 IANA Registry Updates for TLS and DTLS

Internet Engineering Task Force (IETF)                        J. Salowey
Request for Comments: 8447                              Tableau Software
Updates: 3749, 5077, 4680, 5246, 5705,                         S. Turner
         5878, 6520, 7301                                          sn3rd
Category: Standards Track                                    August 2018
ISSN: 2070-1721

IANA Registry Updates for TLS and DTLS

Обновление реестров IANA для TLS и DTLS

PDF

Аннотация

Этот документ описывает многочисленные изменения в реестрах IANA для TLS и DTLS от примечаний в реестрах до изменения политики регистрации. Эти изменения вызваны в основном обзором реестров рабочей группой в процессе разработки спецификации TLS 1.3.

Этот документ обновляет RFC 3749, RFC 5077, RFC 4680, RFC 5246, RFC 5705, RFC 5878, RFC 6520, RFC 7301.

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

В соответствии с этим документом агентство IANA внесло множество изменений в реестры IANA, связанные с протоколами защиты транспортного уровня TLS (Transport Layer Security) и DTLS (Datagram Transport Layer Security). Эти изменения почти полностью вызваны разработкой спецификации TLS 1.3 [RFC8446].

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

Этот документ не меняет правила регистрации для реестров TLS Alerts [RFC8446], TLS ContentType [RFC8446], TLS HandshakeType [RFC8446], TLS Certificate Status Types [RFC6961], поскольку имеющиеся правила (Standards Action для трёх первых и IETF Review для последнего) подходят для этих однобайтовых кодов по причине их немногочисленности.

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

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

3. Добавление TLS в имена реестров

Для согласованности реестров TLS агентство IANA добавило префикс TLS к именам перечисленных ниже реестров.

  • Application-Layer Protocol Negotiation (ALPN) Protocol IDs [RFC7301].

  • ExtensionType Values.

  • Heartbeat Message Types [RFC6520].

  • Heartbeat Modes [RFC6520].

Агентство IANA обновило ссылки в этих реестрах с указанием данного документа. Далее в этом документе реестры именуются с префиксом TLS.

4. Соответствие RFC 8126

Многие из связанных с TLS реестров IANA используют процедуру регистрации IETF Consensus, которая была заменена процедурой IETF Review в [RFC8126]. С учётом этого агентство IANA указало процедуру IETF Review в перечисленных ниже реестрах.

  • TLS Authorization Data Formats [RFC4680].

  • TLS Supplemental Data Formats (SupplementalDataType) [RFC5878]

Это не универсальная замена, поскольку в некоторые реестры с процедурой IETF Consensus внесены изменения данным документом, [RFC8446] или [RFC8422].

Агентство IANA обновило ссылки в двух указанных реестрах, добавив ссылку на этот документ.

5. Добавление столбца Recommended

В соответствии с этим документом добавлен столбец Recommended (Рекомендуется) во многие реестры TLS для указания параметров, поддержка которых обычно рекомендуется в реализации. Добавление параметра Recommended (т. е. Y) в реестр или смена статуса Recommended выполняется по процедуре Standards Action. Не для всех параметров, заданных в документах Standards Track требуется маркировка Recommended.

Если элемент не помечен как рекомендуемый (т. е. N), это не обязательно указывает его изъян, этого говорит скорее о том, что элемент не прошёл процедуру согласования (IETF consensus), имеет ограниченную применимость или предназначен для особых случаев применения.

6. Расширение TLS Session Ticket

Номенклатура записей реестра TLS ExtensionType Values соответствует имени поля языка представления за исключением записи 35. Для согласованного представления записей в реестре агентство IANA:

  • переименовало запись 35 в session_ticket (вместо SessionTicket TLS из [RFC5077]);

  • добавило ссылку на этот документ в столбец Reference записи 35.

7. Значения TLS ExtensionType

Опыт показывает, что процедура IETF Review для расширений TLS слишком строга. Рабочая группа приняла решение о замене процедуры на Specification Required [RFC8126] с сохранением небольшой части кодов для приватного использования. В результате реестр TLS ExtensionType Values был обновлён IANA, как указано ниже.

  • Изменена процедура регистрации.

    Значения с первым байтом от 0 до 254 (десятичное) выделяются по процедуре Specification Required [RFC8126]. Значения с первым байтом 255 (десятичное) выделяются для приватного использования (Private Use) [RFC8126].

  • Обновленный столбец Reference указывает также этот документ.

Назначение экспертов дополнительно описано в разделе 17.

Несмотря на желание «смягчить» процедуру регистрации расширений TLS, полезно указать в реестре IANA расширения, поддержку которых рекомендует рабочая группа (WG). Поэтому агентство IANA обновило реестр TLS ExtensionType Values, как показано ниже.

  • Добавлен столбец Recommended (Рекомендуется), как показано в таблице ниже. При создании таблицы Для всех RFC со статусом Standards Track было установлено значение Y (рекомендуется), для остальных — N (не рекомендуется). Значение N в столбце Recommended устанавливается, если явно не запрошено иное, а установка Y выполняется по процедуре Standards Action [RFC8126]. Для смены Y на N требуется процедура IESG Approval.

 

Расширение

Рекомендуется

server_name

Y

max_fragment_length

N

client_certificate_url

Y

trusted_ca_keys

Y

truncated_hmac

Y

status_request

Y

user_mapping

Y

client_authz

N

server_authz

N

cert_type

N

supported_groups

Y

ec_point_formats

Y

srp

N

signature_algorithms

Y

use_srtp

Y

heartbeat

Y

application_layer_protocol_negotiation

Y

status_request_v2

Y

signed_certificate_timestamp

N

client_certificate_type

Y

server_certificate_type

Y

padding

Y

encrypt_then_mac

Y

extended_master_secret

Y

cached_info

Y

session_ticket

Y

renegotiation_info

Y

 

Агентство IANA добавило в реестр указанные ниже примечания.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как поддержку данного расширения.

Примечание. Как указано в [RFC8126], назначения из пространства Private Use обычно бесполезны для широкого взаимодействия (совместимости). Использующие значения из этого диапазона принимают на себя ответственность за предотвращение конфликтов значения (в предполагаемой области применения). Для более широких экспериментов доступны временно выделяемые значения.

Примечание. Если элемент не указан как Recommended, это не обязательно говорит о его изъянах, а указывает лишь, что элемент не прошёл процедуру согласования IETF, имеет ограниченную применимость или предназначен для использования в особых (конкретных) случаях.

Расширения, добавленные [RFC8446], не включены в таблицу и опущено также расширение token_binding, поскольку в [TOKBIND] для него указано значение колонки Recommended.

[RFC8446] использует реестр TLS ExtensionType Values, созданный [RFC4366]. Ниже приведён текст из [RFC8446] для согласования этих спецификаций.

  • Агентство IANA обновило реестр, добавив расширения key_share, pre_shared_key, psk_key_exchange_modes, early_data, cookie, supported_versions, certificate_authorities, oid_filters, post_handshake_auth и signature_algorithms_cert со значениями, заданными у этом документе и Recommended = Y.

  • Агентство IANA обновило реестр, включив колонку TLS 1.3, где указываются сообщения, в которых может присутствовать расширение. Эта колонка заполнена значениями в соответствии с таблицей из параграфа 4.2, а не указанные в таблице расширения помечены символом «-», указывающим, что они не применяются в TLS 1.3.

8. Реестр TLS Cipher Suites

Опыт показывает, что процедура IETF Consensus для TLS Cipher Suites слишком строга. Рабочая группа приняла решение о замене процедуры на Specification Required [RFC8126] с сохранением небольшой части кодов для приватного использования. В результате реестр TLS Cipher Suites был обновлён IANA, как указано ниже.

Значения с первым байтом от 0 до 254 (десятичное) выделяются по процедуре Specification Required [RFC8126]. Значения с первым байтом 255 (десятичное) выделяются для приватного использования (Private Use) [RFC8126].

Назначение экспертов дополнительно описано в разделе 17.

Реестр TLS Cipher Suites был существенно расширен и продолжает расширяться. Чтобы реестр был лучше понятен тем, кто не связан тесно с TLS, агентство IANA внесло в реестр TLS Cipher Suites указанное ниже изменение.

  • Добавлен столбец Recommended (Рекомендуется). Шифрам, указанным в двух следующих таблицах для этого столбца задано значение Y (рекомендуется), для остальных — N (не рекомендуется). Значение N в столбце Recommended устанавливается, если явно не запрошено иное, а установка Y выполняется по процедуре Standards Action [RFC8126]. Для смены Y на N требуется процедура IESG Approval.

В следующей таблице приведены шифронаборы из Standards Track с аутентификацией на сервере (возможно и у клиента), доступные в настоящее время для TLS 1.2.

Имя шифронабора

Значение

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

{0x00,0x9E}

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384

{0x00,0x9F}

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

{0xC0,0x2B}

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

{0xC0,0x2C}

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

{0xC0,0x2F}

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

{0xC0,0x30}

TLS_DHE_RSA_WITH_AES_128_CCM

{0xC0,0x9E}

TLS_DHE_RSA_WITH_AES_256_CCM

{0xC0,0x9F}

TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256

{0xCC,0xA8}

TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256

{0xCC,0xA9}

TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256

{0xCC,0xAA}

В следующей таблице приведены шифронаборы из Standards Track с с эфемерными, заранее распространяемыми (pre-shared) ключами, доступные в настоящее время для TLS 1.2.

Имя шифронабора

Значение

TLS_DHE_PSK_WITH_AES_128_GCM_SHA256

{0x00,0xAA}

TLS_DHE_PSK_WITH_AES_256_GCM_SHA384

{0x00,0xAB}

TLS_DHE_PSK_WITH_AES_128_CCM

{0xC0,0xA6}

TLS_DHE_PSK_WITH_AES_256_CCM

{0xC0,0xA7}

TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256

{0xD0,0x01}

TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384

{0xD0,0x02}

TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256

{0xD0,0x05}

TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256

{0xCC,0xAC}

TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256

{0xCC,0xAD}

Шифронаборы TLS 1.3, заданные в [RFC8446], не указаны в таблицах. Этот документ задаёт для них статус Recommended.

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

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

Агентство IANA добавило приведённое ниже примечание, чтобы указать занимающимся реестрами IANA, что в TLS 1.3 [RFC8446] используются те же реестры, но шифры определяются иначе.

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

Агентство IANA добавило приведённые ниже примечания для документирования правил заполнения столбца Recommended.

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

Примечание. Если элемент не помечен как Recommended, это не обязательно говорит о его изъянах, а указывает лишь, что элемент не прошёл процедуру согласования IETF, имеет ограниченную применимость или предназначен для использования в особых (конкретных) случаях.

Агентство IANA добавило приведённые ниже примечания с дополнительной информацией.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как поддержку данного шифра.

Примечание. Как указано в [RFC8126], назначения из пространства Private Use обычно бесполезны для широкого взаимодействия (совместимости). Использующие значения из этого диапазона принимают на себя ответственность за предотвращение конфликтов значения (в предполагаемой области применения). Для более широких экспериментов доступны временно выделяемые значения.

Агентство IANA обновило ссылки в этом реестре, добавив данный документ.

9. Поддерживаемые TLS группы

Как и шифронаборы, поддерживаемые группы со временем множились и некоторые люди рассматривают реестр как мерило соответствия реализаций. Поэтому агентство IANA добавило столбец Recommended со значением Y для групп secp256r1, secp384r1, x25519, x448, указав для остальных значение N. Группы Y взяты из RFC со статусом Standards Track, а [RFC8422] повышает статус secp256r1 и secp384r1 до Standards Track. Не все группы из [RFC8422], относящиеся к Standards Track, получили статус Y, эти группы применимы к TLS 1.3 [RFC8446] и прежним версиям TLS. Значение N в столбце Recommended устанавливается, если явно не запрошено иное, а установка Y выполняется по процедуре Standards Action [RFC8126]. Для смены Y на N требуется процедура IESG Approval.

Агентство IANA добавило в реестр приведённые ниже примечания.

Примечание. Если элемент не помечен как Recommended, это не обязательно говорит о его изъянах, а указывает лишь, что элемент не прошёл процедуру согласования IETF, имеет ограниченную применимость или предназначен для использования в особых (конкретных) случаях.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как продвижение данной поддерживаемой группы.

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

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

Агентство IANA обновило ссылки в этом реестре, добавив данный документ.

Значение 0 (0x0000) указано как резервное.

10. Идентификаторы TLS ClientCertificateType

Опыт показывает, что процедура IETF Consensus для TLS ClientCertificateType Identifiers слишком строга. Рабочая группа приняла решение о замене процедуры на Specification Required [RFC8126] с сохранением некоторой части кодов Standards Track и небольшой части для приватного использования. В результате реестр TLS ClientCertificateType Identifiers был обновлён IANA, как указано ниже.

Значения от 0 до 63 распределяются по процедуре Standards Action.

Значения от 64 до 223 распределяются по процедуре Specification Required [RFC8126].

Значения от 224 до 255 резервируются для приватного использования (Private Use).

Назначение экспертов дополнительно описано в разделе 17.

Агентство IANA добавило приведённые ниже примечания с дополнительной информацией.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как поддержку данного идентификатора.

Примечание. Как указано в [RFC8126], назначения из пространства Private Use обычно бесполезны для широкого взаимодействия (совместимости). Использующие значения из этого диапазона принимают на себя ответственность за предотвращение конфликтов значения (в предполагаемой области применения). Для более широких экспериментов доступны временно выделяемые значения.

11. Новый тип сообщений Session Ticket TLS Handshake

Для согласования с реализациями TLS и номенклатурой именования других типов сообщений Handshake агентство IANA:

  • переименовало запись 4 в реестре TLS HandshakeType на new_session_ticket (было NewSessionTicket) [RFC5077];

  • добавило ссылку на этот документе в столбец Reference для записи 4 в реестре TLS HandshakeType.

12. Реестр TLS Exporter Labels

В помощь рецензентам, начинающим с реестра, агентство IANA внесло 2 добавления.

  • Примечание в реестр TLS Exporter Labels.

Примечание. В [RFC5705] определены экспортёры ключевого материала для TLS в терминах TLS PRF. В [RFC8446] функция PRF была заменена на HKDF, что потребовало новой конструкции. Интерфейс экспортёра не изменился, однако значения рассчитываются иначе.
  • Столбец Recommended в реестре TLS Exporter Labels. Создана приведённая ниже таблица со статусом Y для Standards Track RFC и N для остальных. Значение N в столбце Recommended устанавливается, если явно не запрошено иное, а установка Y выполняется по процедуре Standards Action [RFC8126]. Для смены Y на N требуется процедура IESG Approval.

Значение экспортёра

Рекомендуется

client finished

Y

server finished

Y

master secret

Y

key expansion

Y

client EAP encryption

Y

ttls keying material

N

ttls challenge

N

EXTRACTOR-dtls_srtp

Y

EXPORTER_DTLS_OVER_SCTP

Y

EXPORTER: teap session key seed

Y

В качестве дополнительных сведений для назначенных экспертов агентство IANA добавило два примечания.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как поддержку данной экспортируемой метки. Эксперт также проверяет, что метка является строкой печатных символов ASCII, начинающейся с EXPORTER. Агентство IANA должно также проверять, что метка не является префиксом другой метки (например, метка key или master secretary недопустима).

Примечание. Если элемент не помечен как Recommended, это не обязательно говорит о его изъянах, а указывает лишь, что элемент не прошёл процедуру согласования IETF, имеет ограниченную применимость или предназначен для использования в особых (конкретных) случаях.

Агентство IANA обновило ссылки в этом реестре, добавив данный документ.

13. Добавление отсутствовавшего элемента в реестр TLS Alerts

Агентство IANA добавило приведённую ниже строку в реестр TLS Alerts (её пропустили в инструкциях для IANA [RFC7301]).

120 no_application_protocol Y [RFC7301] [RFC8447]

14. Типы сертификатов TLS

Опыт показывает, что процедура IETF Consensus для TLS Certificate Types Identifiers слишком строга. Рабочая группа приняла решение о замене процедуры на Specification Required [RFC8126] с сохранением некоторой части кодов для приватного использования. В результате реестр TLS Certificate Types Identifiers был обновлён IANA, как указано ниже.

  • Изменена процедура регистрации.

    Значения от 0 до 223 (десятичное) выделяются по процедуре Specification Required [RFC8126], значения из диапазона 224-255 (десятичные) зарезервированы для приватного использования (Private Use) [RFC8126].

  • В реестр добавлен столбец Recommended. Для X.509 и Raw Public Key в нем указано значение Y, для прочих — N. Значение N в столбце Recommended устанавливается, если явно не запрошено иное, а установка Y выполняется по процедуре Standards Action [RFC8126]. Для смены Y на N требуется процедура IESG Approval.

Назначение экспертов дополнительно описано в разделе 17.

Агентство IANA добавило приведённые ниже примечания.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как поддержку данного типа сертификата.

Примечание. Если элемент не помечен как Recommended, это не обязательно говорит о его изъянах, а указывает лишь, что элемент не прошёл процедуру согласования IETF, имеет ограниченную применимость или предназначен для использования в особых (конкретных) случаях.

Агентство IANA обновило ссылки в этом реестре, добавив данный документ.

15. «Осиротевшие» реестры

Чтобы пояснить исключение для (D)TLS 1.3 некоторых реестров (они сохраняются лишь для (D)TLS более ранних версий, агентство IANA внесло приведённые ниже изменения.

  • В реестр TLS Compression Method Identifiers [RFC3749] добавлено приведённое ниже примечание.

Примечание. Значение 0 (NULL) является единственным значением из этого реестра, применимым к (D)TLS версии 1.3 и выше.

  • В реестры TLS HashAlgorithm [RFC5246] и TLS SignatureAlgorithm [RFC5246] добавлено приведённое ниже примечание.

Примечание. Значения из этого реестра применимы лишь к протоколам (D)TLS до версии 1.3. Значения для (D)TLS 1.3 и более новых версий приведены в реестре TLS SignatureScheme.

  • Обновлено поле Reference в реестрах TLS Compression Method Identifiers, TLS HashAlgorithm, TLS SignatureAlgorithm с указанием ссылки на этот документ.

  • Обновлён реестр TLS HashAlgorithm для указания значений 7 и 9-223 как резервных (Reserved) и реестр TLS SignatureAlgorithm для указания значений 4-6 и 9-223 как Reserved.

  • Добавлено приведённое ниже примечание в реестр TLS ClientCertificateType Identifiers [RFC5246].

Примечание. Значения из этого реестра применимы лишь к протоколам (D)TLS до версии 1.3.

Несмотря на то, что реестры TLS HashAlgorithm и SignatureAlgorithm «осиротели», важность предупреждения разработчиков предшествующих (до TLS 1.3) реализации об опасности слепого внедрения криптоалгоритмов не исчезла. Поэтому агентство IANA добавило в реестры TLS HashAlgorithm и SignatureAlgorithm приведённое ниже примечание.

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

16. Дополнительные замечания

Агентство IANA добавило приведённые ниже примечания в реестр TLS SignatureScheme.

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

Примечание. Как указано в [RFC8126], назначения из пространства Private Use обычно бесполезны для широкого взаимодействия (совместимости). Использующие значения из этого диапазона принимают на себя ответственность за предотвращение конфликтов значения (в предполагаемой области применения). Для более широких экспериментов доступны временно выделяемые значения.

Агентство IANA добавило приведённые ниже примечания в реестр TLS PskKeyExchangeMode.

Примечание. Если элемент не помечен как Recommended, это не обязательно говорит о его изъянах, а указывает лишь, что элемент не прошёл процедуру согласования IETF, имеет ограниченную применимость или предназначен для использования в особых (конкретных) случаях.

Примечание. Роль назначенного эксперта описана в RFC 8447. Назначенный эксперт [RFC8126] обеспечивает публичную доступность спецификации. Для этого достаточно иметь документ Internet-Draft (который отправлен, но не опубликован в RFC) или документ оного органа стандартизации, отраслевого консорциума, университета и т. п. Эксперт может представить более глубокую рецензию, но одобрение эксперта не следует рассматривать как поддержку данного режима обмена ключами.

17. Назначенные эксперты

Запросы на выделение значений по процедуре Specification Required [RFC8126] регистрируются после 3-недельного периода рассмотрения в почтовой конференции <tls-reg-review@ietf.org> по рекомендации одного или нескольких назначенных экспертов. Однако для выделения значений до публикации назначенные эксперты могут утвердить регистрацию, как только убедятся в том, что спецификация будет опубликована.

В регистрационных запросах, направляемых в почтовую конференцию, следует указывать подходящую тему (subject), например, Request to register value in TLS bar registry (запрос на регистрацию в реестре TLS bar).

В течение периода рецензирования назначенные эксперты одобрят или отклонят запрос на регистрацию, сообщая своё решение в конференции и передавая его в IANA. В отказ следует включать разъяснение причины и, по возможности, предложения для обеспечения успешной регистрации. Запросы на регистрацию, не обработанные в течение 21 дня, могут быть представлены в IESG (через почтовую конференцию <iesg@ietf.org>) для разрешения проблемы.

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

Агентство IANA должно воспринимать обновления реестров только от назначенных экспертов и все регистрационные запросы следует направлять в почтовую конференцию (mailing list) для рецензирования.

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

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

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

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

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

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

Этот документ целиком посвящён связанным с TLS реестрам IANA.

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

20.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>.

[RFC3749] Hollenbeck, S., «Transport Layer Security Protocol Compression Methods», RFC 3749, DOI 10.17487/RFC3749, May 2004, <https://www.rfc-editor.org/info/rfc3749>.

[RFC4680] Santesson, S., «TLS Handshake Message for Supplemental Data», RFC 4680, DOI 10.17487/RFC4680, October 2006, <https://www.rfc-editor.org/info/rfc4680>.

[RFC5077] Salowey, J., Zhou, H., Eronen, P., and H. Tschofenig, «Transport Layer Security (TLS) Session Resumption without Server-Side State», RFC 5077, DOI 10.17487/RFC5077, January 2008, <https://www.rfc-editor.org/info/rfc5077>.

[RFC5246] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.2», RFC 5246, DOI 10.17487/RFC5246, August 2008, <https://www.rfc-editor.org/info/rfc5246>.

[RFC5705] Rescorla, E., «Keying Material Exporters for Transport Layer Security (TLS)», RFC 5705, DOI 10.17487/RFC5705, March 2010, <https://www.rfc-editor.org/info/rfc5705>.

[RFC5878] Brown, M. and R. Housley, «Transport Layer Security (TLS) Authorization Extensions», RFC 5878, DOI 10.17487/RFC5878, May 2010, <https://www.rfc-editor.org/info/rfc5878>.

[RFC6520] Seggelmann, R., Tuexen, M., and M. Williams, «Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension», RFC 6520, DOI 10.17487/RFC6520, February 2012, <https://www.rfc-editor.org/info/rfc6520>.

[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, «Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension», RFC 7301, DOI 10.17487/RFC7301, July 2014, <https://www.rfc-editor.org/info/rfc7301>.

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

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

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

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

[RFC4366] Blake-Wilson, S., Nystrom, M., Hopwood, D., Mikkelsen, J., and T. Wright, «Transport Layer Security (TLS) Extensions», RFC 4366, DOI 10.17487/RFC4366, April 2006, <https://www.rfc-editor.org/info/rfc4366>.

[RFC6961] Pettersen, Y., «The Transport Layer Security (TLS) Multiple Certificate Status Request Extension», RFC 6961, DOI 10.17487/RFC6961, June 2013, <https://www.rfc-editor.org/info/rfc6961>.

[RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, «Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlier», RFC 8422, DOI 10.17487/RFC8422, August 2018, <https://www.rfc-editor.org/info/rfc8422>.

[TOKBIND] Popov, A., Nystrom, M., Balfanz, D., and A. Langley, «Transport Layer Security (TLS) Extension for Token Binding Protocol Negotiation», Work in Progress3, draft-ietf-tokbind-negotiation-14, May 2018.

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

Joe Salowey
Tableau Software
Email: joe@salowey.net
 
Sean Turner
sn3rd
Email: sean@sn3rd.com

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

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

nmalykh@protokols.ru


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

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

3Опубликовано в RFC 8472. Прим. перев.

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

Спецификация кадров и пакетов MAC

PDF

По материалам стандарта IEEE 802.3-2018.

Обзор

Документ определяет сопоставление примитивов сервисного интерфейса MAC1 и пакетов Ethernet, включая синтаксис и семантику полей кадров MAC и полей для формирования пакетов из этих кадров MAC.

В процессе развития Ethernet добавлялись возможности инкапсуляции протоколов канального уровня (L2) в поле MAC Client Data в результате чего возникло несколько типов кадров MAC. Описанный здесь формат включает 3 типа кадров MAC:

  1. базовый кадр2;

  2. кадр с тегом Q3;

  3. кадр-конверт4 (envelope frame).

Для всех трёх типов кадров применяется один тип кадра Ethernet.

Формат пакета

На рисунке 1 показаны поля пакета: преамбула (Preamble), стартовый ограничитель кадра (Start Frame Delimiter или SFD), MAC-адреса отправителя и получателя кадра, поле типа или размера для указания размера или типа протокола следующего поля, содержащего клиентские данные MAC, необязательное поле заполнения, служащее для выравнивания размера, и поле FCS (Frame Check Sequence), содержащее циклическую контрольную сумму для обнаружения ошибок в полученном кадре MAC. При необходимости5 добавляется поле Extension. Все поля, кроме MAC Client Data, Pad и Extension имеют фиксированный размер, а поля переменного размера могут включать целое число октетов (от минимального до максимального) в зависимости от конкретной реализации MAC (см. Приложение 1. Реализации MAC).

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

Минимальный и максимальный размер кадра MAC (см. Приложение 1. Реализации MAC) относится к части кадра от поля Destination Address до Frame Check Sequence, включительно (собственно кадр MAC).

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

Сопоставления сервисного интерфейса


Рисунок 2. Сопоставления сервисного интерфейса.


На рисунке 2 показаны сопоставления параметров сервисного интерфейса с полями кадра MAC в пакете. Клиент MAC может не поддерживать поля Pad и FCS, поэтому их отображения показаны пунктирными линиями на рисунке.

Элементы кадра MAC и пакета

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

Преамбула

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

10101010 10101010 10101010 10101010 10101010 10101010 10101010

передаваемых слева направо, которая при манчестерском кодировании выглядит в среде как «волна». Отметим, что преамбула завершается битом 0.

Стартовый ограничитель

Поле SFD содержит последовательность 10101011, передаваемую сразу после преамбулы. Кадр MAC начинается сразу после поля SFD. Отметим, что октет стартового ограничителя отличается от октетов преамбулы лишь последним (при передаче) битом, который имеет значение 1.

Поля адресов

Каждый кадр MAC содержит два адресных поля — Destination Address (получатель) и Source Address (отправитель), передаваемых в указанном порядке. Поле Destination Address может указывать одного или множество получателей, которым предназначен данный кадр MAC. Поле Source Address указывает станцию, которая инициировала передачу кадра MAC. Представление адресных полей дано на рисунке 3.


Рисунок 3. Формат поля адреса.

  1. Каждое поле адреса имеет размер 48 битов (6 октетов).
  2. Первый (младший7 — LSB) бит в поле Destination Address указывает тип адреса — групповой (1) или индивидуальный (0). Групповые пакеты могут воспринимать некоторые (члены группы) или все станции ЛВС. Для поля Source Address этот бит считается резервным и устанавливается в 0. Таким образом, индивидуальные адреса MAC имеют чётное значение в старшем октете (последняя цифра — 0, 2, 4, 6, 8, A, C, E8).

  3. Второй бит указывает тип адреса — администрируемый глобально (0) или локально (1). Администратор сети может установить для своих устройств «произвольные» адреса MAC, содержащие 1 во втором бите первого октета адреса и используя оставшиеся биты по своему усмотрению с учётом п. a). Для широковещательных кадров этот бит имеет значение 1.

  4. Три старших (первых) октета9 MAC-адреса распределяются централизованно IEEE между производителями сетевого оборудования на платной основе. Реестр выделенных значений доступен по ссылке, условия выделения блоков MA-L (ранее назывался OUI) описаны в специальном документе.

  5. Оставшиеся три октета адреса владелец блока MA-L распределяет между выпускаемыми устройствами по своему усмотрению

  6. Биты всех октетов адреса передаются, начиная с младшего. Октеты передаются, начиная с первого (левого) в принятой записи MAC-адресов (xx:xx:xx:xx:xx:xx, где x — шестнадцатеричные цифры).

Предназначение адресов

Адреса подуровня MAC могут быть двух типов.

  1. Индивидуальный адрес связан с конкретной станцией сети.

  2. Групповой адрес связан с одной или несколькими станциями данной сети. Эти адреса дополнительно делятся на два типа:

    1. Адрес группы (Multicast-Group) связывается соглашением вышележащего уровня с группой логически связанных станций.

    2. Широковещательный (Broadcast) адрес — это специальный групповой адрес, указывающий все станции ЛВС.

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

Поле адреса получателя

Поле Destination Address указывает станцию или станции, которым предназначен кадр MAC, и может содержать индивидуальный или групповой (в том числе, широковещательный) адрес.

Поле адреса отправителя

Поле Source Address указывает станцию, передающую кадр MAC, и не интерпретируется подуровнем MAC.

Поле размера/типа

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

  1. Если десятичное значение этого поля не превышает 1500 (шестнадцатеричное значение 05DC), поле указывает число октетов данных клиента MAC в последующем поле MAC Client Data базового кадра (размер).

  2. Если десятичное значение поля не меньше 1536 (шестнадцатеричное значение 0600), поле указывает тип Ethertype протокола клиента MAC (тип). Значения типов распределяются регистрационным агентством департамента стандартизации IEEE на платной основе в соответствии со специальным документом. Список выделенных значений Ethertype доступен по ссылке.

Интерпретации поля как размера и типа являются взаимоисключающими, т. е. поле может указывать только тип или только размер, поскольку соответствующие диапазоны значения не перекрываются.

При использовании поля для указания типа клиент MAC отвечает за корректность обработки дополнения подуровнем MAC поля MAC Client Data (Данные клиента MAC).

Независимо от интерпретации поля Length/Type поле MAC Client Data будет дополняться до минимального размера, требуемого для корректной работы протокола, путём включения поля Pad (последовательность октетов) между полем MAC Client Data и FCS. Процедура определения размера поля Pad описана ниже.

Поле Length/Type передаётся и принимается, начиная со старшего октета.

Данные клиента MAC

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

Реализации Ethernet должны поддерживать хотя бы один из указанных ниже максимальных размеров поля MAC Client Data:

  1. 1500 октетов для базовых кадров;

  2. 1504 октета для кадров с тегом Q;

  3. 1982 октета для кадров-конвертов10.

Если поддерживается управление уровнем (layer management), кадры с размером поля MAC Client Data больше поддерживаемого максимума следует учитывать. В новых реализациях рекомендуется поддерживать передачу кадров-конвертов.

Следует отметить, что кадры с тегами Q являются конвертами, но не все кадры конверты имеют тег Q.

Все кадры IEEE 802.3 MAC имеют одинаковый формат и обработка кадров трёх типов в IEEE 802.3 MAC различается лишь в части управления. Однако клиент MAC может различать эти типы кадров.

Параметры MAC рассмотрены в Приложении 1 (Параметры MAC).

Поле заполнения

Метод управления доступом к среде CSMA/CD задаёт нижнее ограничение (minFrameSize) размера передаваемых кадров. Если размер кадра меньше minFrameSize, подуровень CSMA/CD MAC добавляет после поля MAC Client Data октеты заполнения (Pad), которые учитываются в контрольной сумме. Размер заполнения выбирается так, чтобы кадр, начиная с поля Destination Address и заканчивая полем FCS (включительно), имел размер не менее minFrameSize битов. Если поле FCS представляет клиент MAC, он должен предоставить и поле Pad. Значения битов заполнения (Pad) спецификация не задаёт.

Размер поля Pad определяется размером поля MAC Client Data, полученного от клиента MAC, а также минимальным размером кадра MAC и параметрами MAC для размера адреса (Параметры MAC). Размер поля Pad для MAC Client Data размером clientDatasize/8 октетов составляет max[0, minFrameSize – (clientDatasize + 2 addressSize + 48)] битов.

Контрольная сумма кадра

Циклическая контрольная сумма с избыточностью (cyclic redundancy check или CRC) применяется в алгоритмах приёма и передачи для создания и проверки значения поля FCS, содержащего 4 октета (32 бита) значения CRC. Значение определяется как функция защищаемых полей кадра MAC: Destination Address, Source Address, Length/Type, MAC Client Data, Pad (все поля, кроме FCS и Extension). Значение поля определяется полиномом

G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

Математически значение CRC для данного кадра MAC определяется приведённой ниже процедурой.

  1. Дополняются первые 32 бита кадра.

  2. n битов защищаемых полей выбираются в качестве коэффициентов полинома M(x) степени n – 1. Первый бит поля Destination Address соответствует члену x(n–1), а последний бит поля MAC Client Data (или Pad при его наличии) соответствует члену x0.

  3. M(x) умножается на x32 и делится на G(x), давая остаток R(x) степени 31.

  4. Коэффициент R(x) считается 32-битовой последовательностью.

  5. Последовательность битов дополняется, давая в результате CRC.

32 бита значения CRC помещаются в поле FCS так, что член x31 становится левым битом первого октета, а x0 — последним битом четвёртого октета. Биты CRC передаются в порядке x31, x30, …, x1, x0. Алгоритм описан в работе [Hammond].

Поле расширения

Поле Extension размещается после FCS и содержит последовательность битов расширения. Размер поля может меняться от 0 до (slotTime–minFrameSize) битов, включительно. Содержимое поля Extension не учитывается при расчёте FCS.

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

Расширение несущей (полнодуплексный режим)

При рабочей скорости 1000 Мбит/с значения slotTime, используемого при меньших скоростях, недостаточно для сетевых топологий с достаточной физической протяжённостью. Carrier Extension обеспечивает возможность увеличить slotTime до желаемого значения без увеличения параметра minFrameSize, поскольку это может вызывать негативные последствия. Не содержащие данных биты, называемые битами расширения, добавляются в конце кадра, размер которого меньше числа битов slotTime, чтобы передача в результате длилась не меньше slotTime. Carrier Extension можно применять лишь в тех случаях, когда базовый физический уровень способен принимать и передавать символы, которые легко отличить от символов данных, как это происходит в большинстве физических уровней, использующих схему блочного кодирования и декодирования. Максимальный размер расширения указывает разность (slotTimeminFrameSize). Кадр с полем расширения показан на рисунке 4.


Рисунок 4. Кадр с расширением несущей.

Уровень MAC продолжает отслеживать конфликты (коллизии) в среде при передаче битов расширения и будет считать любой конфликт после порога slotTime запоздалым (late collision).

В остальных случаях поле Extension имеет размер 0 (отсутствует). Реализации, рассмотренные в параграфе Параметры MAC, могут игнорировать это поле полностью, если число битов в параметре slotTime равно числу битов в minFrameSize.

Порядок передачи битов

Все октеты кадра MAC, за исключением FCS, передаются, начиная с младшего бита.

Непригодные кадры MAC

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

  1. Размер кадра не соответствует значению в поле Length/Type. Если это поле указывает тип (Поле размера/типа), размер кадра считается соответствующим полю и не позволяет считать кадр непригодным по этому условию11.

  2. Размер кадра не содержит целое число октетов.

  3. Биты входящего кадра (без учёта полей FCS и Extension) дают значение CRC, отличное от значения поля FCS.

Содержимое непригодного кадра MAC не передаётся подуровням LLC или MAC Control12. Информация о недействительных кадрах MAC может передаваться системе управления сетью.

Приложение 1. Реализации MAC

Совместимость

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

Устройство DTE должно быть способно работать в полудуплексном и полнодуплексном режиме. В соответствующей стандарту реализации все станции должны быть настроены на работу в одном режиме (полудуплексном или полнодуплексном).

Все DTE, подключённые к повторителю или смешанному сегменту, должны быть настроены на работу в полудуплексном режиме. Когда пара DTE подключена к разным концам одного канального сегмента, оба устройства должны использовать один режим работы (полудуплексный или полнодуплексный).

Параметры MAC

Приведённые в таблице 1 нужно использовать в соответствии со скоростью данных MAC.

Таблица 1. Параметры MAC.

Параметры

Скорость данных MAC

До 100 Мбит/с включительно

1 Гбит/с

2,5, 5, 25, 40, 100, 200, 400 Гбит/с

10 Гбит/с

slotTime

512 BT13

4096 BT

не применимо

не применимо

interPacketGap

96 BT14

96 BT15

96 BT16, 17

96 BT4

attemptLimit

16

16

не применимо

не применимо

backoffLimit

10

10

не применимо

не применимо

jamSize

32 бита

32 бита

не применимо

не применимо

maxBasicFrameSize

1518 октетов

1518 октетов

1518 октетов

1518 октетов

maxEnvelopeFrameSize

2000 октетов

2000 октетов

2000 октетов

2000 октетов

minFrameSize

512 битов (64 октета)

512 битов (64 октета)

512 битов (64 октета)

512 битов (64 октета)

burstLimit

не применимо

65 536 битов

не применимо

не применимо

ipgStretchRatio

не применимо

не применимо

не применимо

104 бита18

В полудуплексном режиме 10 Мбит/с не рекомендуется применять кадры-конверты при работе с повторителями, поскольку это может приводить к повреждению кадров из-за погрешностей часов.

Отклонение от приведённых в таблице значений параметров может нарушать работу сети.

Рекомендации по настройке

Режим работы MAC может определяться функцией автосогласования (Auto-Negotiation) или устанавливаться вручную. При использовании ручной настройки устройства на обоих концах сегмента канала должны работать в одном режиме. При использовании Auto-Negotiation уровень MAC должен настраиваться на режим, определённый функцией автоматического согласования.

Неорректная настройка режима дуплекса может нарушать работу сети.

Литература

[Hammond] Hammond, J. L., Brown, J. E., and Liu, S. S. Development of a Transmission Error Model and Error Control Model. Technical Report RADC-TR-75-138. Rome: Air Development Center (1975).

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

nmalykh@protokols.ru

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

2Кадр MAC, где поле Length/Type указывает размер или тип, а максимальный размер кадра не превышает 1518 октетов. Базовые кадры не позволяют включать дополнительные теги или инкапсуляцию, требуемую вышележащим уровнем (см. ниже).

3Кадр MAC с конкретным значением Ethertype и максимальным размером 1522 октета (см. ниже и IEEE Std 802.1Q, Annex G).

4Кадр MAC, где поле Length/Type указывает тип Type, который может задавать инкапсуляцию в поле MAC Client Data, и имеет максимальный размер 2000 октетов. Такие кадры предназначены для возможности включения дополнительных префиксов и суффиксов, требуемых вышележащими протоколами инкапсуляции, которые могут использовать до 482 октетов (см. ниже).

5Только в полнодуплексном пережиме 1000 Мбит/с.

6Physical Layer Signaling — сигнализация физического уровня.

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

8С учётом второго бита, описанного ниже, младшая цифра первого байта установленного производителем оборудования (аппаратного) MAC-адреса может принимать лишь значения 0, 4, 8, C.

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

10Эти кадры предназначены для возможности включения дополнительных префиксов и суффиксов, требуемых протоколами инкапсуляции вышележащего уровня, заданными рабочей группой IEEE 802.1 (такие как Provider Bridges и MAC Security), ITU-T или IETF (например, MPLS). Исходное ограничение размера MAC Client Data составляет 1500 октетов, а протоколам инкапсуляции можно добавлять до 482 октетов. Использование этих октетов для иных целей не рекомендуется и может приводить к отбрасыванию или повреждению кадров MAC.

11Этот подход применяется в кадрах большого размера jumbo, не включённых в стандарт IEEE 802.3. В таких кадрах поле Length/Type содержит значение 0x8870 (инкапсуляция LLC в соответствии с IEEE 802.1AC).

12Недействительные кадры MAC могут игнорироваться, отбрасываться или использоваться по своему усмотрению клиентом MAC, отличным от LLC и MAC Control. Спецификация не задаёт этого.

13Bit times — время передачи 1 бита.

14При скорости 10 Мбит/с интервал между двумя последовательными не конфликтующими пакетами (от начала бездействия в конце первого пакета до начала преамбулы следующего пакета) может сокращаться до 47 BT на приёмной линии AUI устройства DTE. Межпакетный интервал может уменьшаться в результате переменных задержек в сети, добавления битов преамбулы и погрешности часов.

15При скорости 1 Гбит/с интервал между двумя последовательными не конфликтующими пакетами ( от последнего бита поля FCS первого пакета до начала преамбулы следующего пакета) может сокращаться до 64 BT на приёмной линии GMII устройства DTE. Межпакетный интервал может уменьшаться в результате переменных задержек в сети, добавления битов преамбулы и погрешности часов.

16При скорости 2,5, 5, 10, 25 Гбит/с интервал между двумя последовательными не конфликтующими пакетами ( от последнего бита поля FCS первого пакета до начала преамбулы следующего пакета) может сокращаться до 40 BT на приёмной линии XGMII или 25GMII устройства DTE. Межпакетный интервал может уменьшаться в результате переменных задержек в сети и погрешности часов.

17При скорости 40, 100, 200, 400 Гбит/с интервал между двумя последовательными не конфликтующими пакетами (от последнего бита поля FCS первого пакета до начала преамбулы следующего пакета) может сокращаться до 80 BT на приёмной линии XLGMII, CGMII, 200GMII bkb 400GMII устройства DTE в результате погрешности часов и требований по выравниванию.

18При скорости 10 Гбит/с значение ipgStretchRatio = 104 адаптирует среднюю скорость данных подуровня MAC к скорости SONET/SDH STS-192 (с кадрами) для применения этого стандарта в сетях WAN.

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

RFC 8453 Framework for Abstraction and Control of TE Networks (ACTN)

Internet Engineering Task Force (IETF)                D. Ceccarelli, Ed.
Request for Comments: 8453                                      Ericsson
Category: Informational                                      Y. Lee, Ed.
ISSN: 2070-1721                                                   Huawei
                                                             August 2018

Модель абстрагирования и управления в сетях TE (ACTN)

Framework for Abstraction and Control of TE Networks (ACTN)

PDF

Аннотация

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

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

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

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

Термином «сеть TE» обозначают сети, в которых применяется ориентированная на соединения технология с распределенным или централизованным уровнем управления для поддержки динамического предоставления сквозных соединений. Сети TE имеют множество механизмов, облегчающих разделение уровней данных и управления, включая распределенную сигнализацию для организации и защиты путей, централизованный расчет путей для планирования и организации трафика, протоколы обеспечения для настройки и активирования сетевых ресурсов. Эти механизмы представляют основные технологии построения гибких и динамичных сетей. Примерами сетей, соответствующих этому определению, могут служить сети MPLS-TP5 [RFC5654] и MPLS-TE [RFC2702].

Одним из основных мотивов программно-определяемых сетей (SDN6) [RFC7149] является отделение уровня управления сетью от уровня данных. Такое разделение было достигнуто в сетях TE с развитием MPLS/GMPLS [RFC3945] и PCE7 [RFC4655]. Одним из преимуществ SDN является режим логически централизованного управления, позволяющий получить глобальное представление базовых сетей. Централизованное управление в SDN помогает улучшить использование ресурсов сети по сравнению с распределенным управлением. Для сетей на основе TE элементы PCE могут обеспечивать функции централизованного расчета путей.

В этом документе описан набор функций управления и администрирования, применяемых при управлении одной или несколькими сетями TE для создания виртуальных сете, которые могут быть представлены абонентам и строятся на основе абстрагирования базовых сетей TE. Например, канал в сеть абонента создается из пути или набора путей в базовых сетях. Этот набор функций назван ACTN8.

2. Обзор

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

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

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

  • Координация ресурсов множества независимых сетей и разных уровней технологии для сквозного предоставления услуг независимо от использования SDN в этих сетях.

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

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

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

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

  • Абстрагирование ресурсов базовой сети для приложений верхнего уровня и клиентов [RFC7926].

  • Виртуализация отдельных базовых ресурсов, критерием выбора которых является предоставление определенному клиенту, приложению или услуге [ONF-ARCH].

  • Сегментирование инфраструктуры сети TE для выполнения требований обслуживания клиентов.

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

  • Представление сетей клиентам как виртуальной сети с открытым и программируемым интерфейсом.

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

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

Domain — домен

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

Abstraction — абстрагирование

Этот процесс определен в [RFC7926].

TE Network Slicing — сегментация сети TE

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

Node — узел

Узлы являются вершинами графа представления топологии TE. В топологии физической сети узел соответствует физическому элементу сети (NE9), таком как маршрутизатор. В топологии абстрактной сети узел (иногда говорят «абстрактный узел») представляется одной вершиной для одного или нескольких физических NE и соединяющих их физических каналов. Концепция узла представляет возможность подключения к данному узлу элемента доступа (окончание канала), соединенного с другим узлом. При этом могут определяться «ограниченные возможности кросс-соединений» для ограничения такой функциональности. Абстракция сети также может служить для ограничения этой функциональности. Абстрагирование сети может быть рекурсивным, поэтому узел в одной топологии может создаваться путем абстрагирования, применяемого к узлам базовой (нижележащей) топологии.

Link — канал, соединение

Канал является ребром графа в представлении топологии TE. Два узла, соединенные каналом, называют смежными (adjacent) в топологии TE. В топологии физической сети канал соответствует физическому соединению. В топологии абстрактной сети, канал (иногда говорят «абстрактный канал») является представлениям возможного соединения пары точек с некими параметрами TE (см. [RFC7926]). Абстрагирование сети может быть рекурсивным, поэтому канал в одной топологии может создаваться путем абстрагирования, применяемого к каналам базовой топологии.

Abstract Topology — абстрактная топология

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

Virtual Network (VN) — виртуальная сеть

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

  • VN может быть абстракцией набора сквозных каналов (VN типа 1), каждый из которых называют членом VN, формируемый как сквозные туннели через базовые сети. Такие туннели можно создавать путем рекурсивного сегментирования или абстрагирования путей в базовых сетях, они включают оконечные точки сети клиента, каналы доступа, а также пути внутри доменов и между доменами.
  • VN может также абстрагироваться как топология виртуальных узлов и виртуальных каналов (VN типа 2). Оператор должен отобразить VN на реальные ресурсы сети, это называют «встраиванием виртуальной сети». Узлы в этом случае включают физические конечные точки, граничные и внутренние узлы, а также абстрагированные узлы. Аналогично, каналы включают физические каналы доступа, междоменные и внутридоменные соединения, а также абстрагированные каналы.

Ясно, что VN типа 1 являются частным случаем VN типа 2.

Access link — канал доступа

Канал между узлом клиента и узлом оператора.

Inter-domain link — междоменный канал

Канал между доменами с разным административным управлением.

Access Point (AP) — точка доступа

AP — общий для клиента и оператора логический идентификатор, служащий для указания канала доступа. AP применяется абонентом при запросе услуг виртуальной сети (VNS10). Отметим, что термин «точка завершения канала TE» (TE Link Termination Point), определенный в [TE-TOPO], описывает конечные точки соединений, тогда как AP является идентификатором самого соединения.

VN Access Point (VNAP) — точка доступа в виртуальную сеть

VNAP служит привязкой между AP и данной VN.

Server Network — сеть сервера

В соответствии с определением [RFC7926] сеть сервера является сетью, обеспечивающей подключение для другой сети (сеть клиента) в модели «клиент-сервер».

2.2. Модель виртуальных сетевых услуг для ACTN

Услуги VNS представляют собой соглашение между абонентом и оператором для предоставления VN. Когда VN является просто соединением между двумя точками, различие между VNS и службой соединения размывается. В этом документе определены 3 типа VNS.

  • VNS типа 1 указывает услугу VNS, где абонент может создавать и эксплуатировать VN типа.

  • Типы 2a и 2b указывают VNS, где абонент может создавать и эксплуатировать VN типа 2. В VNS типа 2a сети VN создаются статически во время настройки услуги и клиент не может менять топологию (например, добавлять или удалять абстрактные узлы и каналы). VNS типа 2b отличаются от VNS типа 2a возможностью клиента динамически изменять начальную топологию, заданную при организации услуги.

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

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

  • Динамические операции позволяют клиенту изменять или удалять VN. Клиент также может в рамках виртуальной сети создавать, изменять и удалять виртуальные каналы и узлы. Эти изменения будут приводить к управлению туннелями в сетях оператора.

Тремя основными элементами модели ACTN VNS являются:

  • абоненты (клиенты);

  • сервис-провайдеры;

  • сетевые операторы.

Эти элементы образуют трехуровневую модель, показанную на рисунке 1.

                       +----------------------+
                       |       Абонент        |
                       +----------------------+
                                  |
                  Запрос     ||   |   /\    Отклик
                   VNS       ||   |   ||     VNS
                             \/   |   ||
                       +----------------------+
                       |  Сервис-провайдер    |
                       +----------------------+
                       /          |           \
                      /           |            \
                     /            |             \
                    /             |              \
+------------------+   +------------------+   +------------------+
|Сетевой оператор 1|   |Сетевой оператор 2|   |Сетевой оператор 3|
+------------------+   +------------------+   +------------------+

Рисунок 1. Трехуровневая модель.


Коммерческие роли этих элементов описаны в последующих параграфах.

2.2.1. Абоненты

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

Клиентами с расширенными запросами являются крупные предприятия и государственные структуры. Такие абоненты запрашивают соединения «точка-точка» и многоточечную связность со значительными потребностями в ресурсах и существенно меняющимися с течением времени запросами. Это является одной из причин недостаточности предоставления клиенту пакетных услуг и желательностью предоставления настраиваемых услуг VNS. Такие клиенты могут также менять параметры сервиса в рамках своей виртуализованной среды. Основное внимание в ACTN уделяется таким абонентам.

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

2.2.2. Сервис-провайдеры

В рамках ACTN сервис-провайдеры предоставляют VNS своим клиентам. Сервис-провайдеры могут (не обязательно) иметь свою сетевую инфраструктуру (т. е., могут быть сетевыми операторами, описанными в параграфе 2.2.3). Если сервис-провайдер является также оператором сети, это похоже на имеющиеся модели VPN применительно к одному оператору (такой подход сложно использовать, если клиент охватывает несколько доменов независимых операторов).

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

2.2.3. Сетевые операторы

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

3. Базовая архитектура ACTN

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

Архитектура ACTN основана на трехуровневой эталонной модели и разрешает иерархию и рекурсии. Основная функциональность системы ACTN перечислена ниже.

Междоменная координация

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

Абстрагирование

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

Отображение и трансляция абонентов

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

Координация виртуальных услуг

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

          +---------+           +---------+             +---------+
          |   CNC   |           |   CNC   |             |   CNC   |
          +---------+           +---------+             +---------+
                \                    |                       /
                 \                   |                      /
Граница   ========\==================|=====================/=======
между              \                 |                    /
абонентом           -----------      | CMI  --------------
и оператором сети              \     |     /
                             +---------------+
                             |     MDSC      |
                             +---------------+
                               /     |     \
                   ------------      | MPI  -------------
                  /                  |                   \
             +-------+          +-------+            +-------+
             |  PNC  |          |  PNC  |            |  PNC  |
             +-------+          +-------+            +-------+
                 | SBI            /   |                  /  \
                 |               /    | SBI         SBI /    \
             ---------        -----   |                /      \
            (         )      (     )  |               /        \
            - Физичес.-     ( Физич.) |              /      -----
           (   сеть    )     (сеть )  |             /      (     )
          (   уровня    )     -----   |            /      ( Физич.)
           (управления )            -----        -----     (сеть )
            -         -            (     )      (     )     -----
            (         )           ( Физич.)    ( Физич.)
             ---------             (сеть )      (сеть )
                                    -----        -----

Рисунок 2. Базовая архитектура ACTN.


Базовая архитектура ACTN определяет 3 типа контроллеров и соответствующие интерфейсы между ними (рисунок 2):

  • CNC — контроллер сети абонента;

  • MDSC — многодоменный координатор услуг;

  • PNC — контроллер обеспечивающей сети.

На рисунке 2 также показаны перечисленные ниже интерфейсы.

  • CMI — интерфейс CNC-MDSC.

  • MPI — интерфейс MDSC-PNC.

  • SBI — интерфейс южного моста.

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

3.1. Контроллер в сети абонента

Контроллер в сети клиента (CNC) отвечает за передачу требований клиента к VNS оператору сети через интерфейс CNC-MDSC (CMI). Он знает конечные точки, связанные с VNS (указываются как AP), правила обслуживания и другие данные QoS, относящиеся к сервису.

Поскольку CNC напрямую взаимодействует с приложениями, он понимает многочисленные требования приложений и их потребности в обслуживании. Возможности CNC за пределами роли CMI выходят за рамки ACTN и могут быть реализованы разными способами. Например, CNC может, фактически, быть частью контроллера в домене клиента или функциональность CNC может быть реализована как часть портала сервис-провайдера.

3.2. Многодоменный координатор услуг

Многодоменный координатор услуг (MDSC) является функциональным блоком, реализующим все указанные в разделе 4 и описанные в параграфе 4.2 функции ACTN. Две функции MDSC относятся к сети — многодоменная координация и виртуализация/абстрагирование, а две другие функции — отображение/трансляция клиентов и координация виртуального сервиса — относятся к услугам. MDSC размещается в центре модели ACTN между CNC, который выдает запросы на подключение, и контроллерами PNC, управляющими ресурсами сети. Важной особенностью MDSC (и модели ACTN в целом) является отделение управления сетью и услугами от базовой технологии, чтобы помочь клиенту описать свою сеть в соответствии с потребностями бизнеса. MDSC обеспечивает нужную технологию и управление сетью для выполнения требований бизнеса. По сути, он контролирует и управляет примитивами для обеспечения функциональности в соответствии с запросами CNC.

Для координации множества доменов должны быть разрешены взаимодействия 1:N между MDSC и PNC.

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

3.3. Контроллер обеспечивающей сети

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

Функции PNC могут быть реализованы как часть контроллера SDN в домене, системы управления сетью (NMS) или ее элементами (EMS14), активного контроллера на базе PCE [RFC8283] или иным способом для динамического управления набором узлов, реализующих северный интерфейс с точки зрения узлов (выходит за рамки документа). Домен PNC включает все ресурсы, находящиеся под управлением одного PNC. Он может состоять из разных доменов маршрутизации или администрирования, а ресурсы могут поступать с разных уровней. Соединение доменой PNC показано на рисунке 3.

       _______                        _______
     _(       )_                    _(       )_
   _(           )_                _(           )_
  (               )   Граничный  (               )
 (     PNC     ------   канал  ------     PNC     )
(   домена X  |Гранич|========|Гранич|  домена Y   )
(             | узел |        | узел |             )
 (             ------          ------             )
  (_             _)              (_             _)
    (_         _)                  (_         _)
      (_______)                      (_______)

Рисунок 3. Границы домена PNC.


3.4. Интерфейсы ACTN

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

Три интерфейса архитектуры ACTN показаны на рисунке 2 и описаны ниже.

CMI

Интерфейс CNC-MDSC (CMI) реализуется между CNC и MDSC. CMI является бизнес-границей между клиентом и оператором. Он используется для запросов VNS приложениями. Вся информация, связанная с сервисом (тип VNS, топология, пропускная способность и ограничения сервиса), передается через этот интерфейс. Большая часть передаваемой через интерфейс информации не связана с используемой оператором технологией, но в некоторых случаях (например, настройка канала доступа) требуются зависящие от технологии детали.

MPI

Интерфейс MDSC-PNC (MPI) реализуется между MDSC и PNC. Он передает новые запросы на соединения или изменение пропускной способности в физическую сеть. В многодоменных средах MDSC нужно взаимодействовать с множеством PNC, каждый из которых отвечает за свой домен. MPI представляет абстрагированную топологию координатору MDSC, скрывая связанные с технологией аспекты сети и часть топологии в соответствии с правилами.

SBI

Интерфейс южного моста (SBI) выходит за рамки ACTN. Разными органами стандартизации и производителями было определено множество разных SBI для различных сред и технологий. На рисунке 3 они представлены для иллюстрации.

4. Расширенная архитектура ACTN

В этом разделе описаны расширенные конфигурации архитектуры ACTN.

4.1. Иерархия MDSC

Иерархия MDSC может применяться по разным причинам, включая расширяемость, администрирование, объединение в сети разных уровней и технологий. При наличии иерархии MDSC используются обозначения MDSC-H15 и MDSC-L16. Интерфейс между ними является рекурсией MPI. Реализация MDSC-H выполняет запросы на обеспечение обычным путем с помощью MPI, MDSC-L должен обеспечивать возможность получения запросов обычным путем через CMI, а также через MPI. Иерархия MDSC показана на рисунке 4.

Другой вариант реализации может предусматривать использование MDSC-L для всех PNC, относящихся к данной технологии (например, IP/MPLS17), другого MDSC-L для PNC, относящихся к иной технологии (например, OTN18/WDM19), и MDSC-H для их координации.

                +--------+
                |   CNC  |
                +--------+
                     |          +-----+
                     | CMI      | CNC |
               +----------+     +-----+
        -------|  MDSC-H  |----    |
       |       +----------+    |   | CMI
   MPI |                   MPI |   |
       |                       |   |
  +---------+               +---------+
  |  MDSC-L |               |  MDSC-L |
  +---------+               +---------+
MPI |     |                   |     |
    |     |                   |     |
  -----   -----             -----   -----
 | PNC | | PNC |           | PNC | | PNC |
  -----   -----             -----   -----

Рисунок 4. Иерархия MDSC.


Иерархия MDSC может быть рекурсивной, когда MDSC-H выступает в качестве MDSC-L для MDSC-H вышележащего уровня.

4.2. Разделение функций MDSC в координаторах

Реализация может разделить функции MDSC на две группы, одна из которых связана с услугами, другая — с сетью. Это позволяет реализовать оркестратор (координатор) услуг, который обеспечит связанные с сервисом функции MDSC, и координатор сети, который будет поддерживать связанные с сетью функции MDSC. Такое разделение согласуется с архитектурой модели YANG для сервиса, описанной в [RFC8309]. На рисунке 5 показан этот вариант и отображение интерфейсов ACTN на модели данных YANG.

                +--------------------+
                |           Абонент  |
                |   +-----+          |
                |   | CNC |          |
                |   +-----+          |
                +--------------------+
                         CMI | Модель обслуживания клиента
                             |
        +---------------------------------------+
        |                          Оркестратор  |
********|***********************   услуг        |
* MDSC  |  +-----------------+ *                |
*       |  |   Связанные с   | *                |
*       |  |сервисом функции | *                |
*       |  +-----------------+ *                |
*       +----------------------*----------------+
*                              *  |  Модель предоставления
*                              *  |  услуг
*       +----------------------*----------------+
*       |                      *   Оркестратор  |
*       |  +-----------------+ *   сети         |
*       |  |   Связанные с   | *                |
*       |  |  сетью функции  | *                |
*       |  +-----------------+ *                |
********|***********************                |
        +---------------------------------------+
                         MPI |  Модель настройки
                             |  сети
               +------------------------+
               |            Контроллер  |
               |  +------+  домена      |
               |  | PNC  |              |
               |  +------+              |
               +------------------------+
                         SBI |  Модель настройки
                             |  устройства
                         +--------+
                         |Устройст|
                         +--------+

Рисунок 5. Архитектура ACTN в контексте моделей YANG для сервиса.


5. Методы абстрагирования топологии

Абстрагирование топологии описано в [RFC7926]. В этом разделе рассматриваются факторы, типы и контекст абстрагирования в архитектуре ACTN.

Абстрагирование в ACTN выполняется PNC при представлении доступной топологии координатору MDSC или MDSC-L при представлении MDSC-H. Эта функция отличается от создания VN (в частности, VN типа 2), которая является не абстракцией, а конструкцией из виртуальных ресурсов.

5.1. Факторы абстрагирования

Как указано в [RFC7926], абстрагирование связано с правилами сетей. Например, в соответствии с операционной политикой PNC не будет передавать связанные с технологией детали (например, оптические параметры для WSON20) в абстрактную топологию, предоставляемую MDSC. Аналогично, политика сетей может определять тип абстрагирования, как описано в параграфе 5.2.

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

  • Абстракция зависит от природы сетей базового домена. Например, пакетные сети могут абстрагироваться с высокой степенью детализации, а абстракция оптических сетей зависит об единиц коммутации (например, длина волны), сквозных ограничений непрерывности и ограничений на кросс-соединения в сети.

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

  • Абстрагирование служит средством улучшения расширяемости. Когда естественная информация о сетевых ресурсах слишком велика, абстрагирование существенно повышает уровень расширяемости.

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

  • Природа поддержки в MDSC связанных с технологией параметров влияет на уровень абстракции. Если MDSC не может обрабатывать такие параметры, потребуется высокий уровень абстракции.

  • В некоторых случаях от PNC требуется скрывать важные данные внутренней топологии MDSC. Такая конфиденциальность может быть достигнута с помощью абстрагирования.

5.2. Типы абстракций

В этом параграфе описаны три перечисленных ниже типа абстракции.

  • Естественная (белая) топология (параграф 5.2.1).

  • Черная топология (параграф 5.2.2).

  • Серая топология (параграф 5.2.3)

5.2.1. Естественная (белая) топология

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

5.2.2. Черная топология

   .....................................
   : Домен PNC                         :
   :  +--+     +--+     +--+     +--+  :
------+  +-----+  +-----+  +-----+  +------
   :  ++-+     ++-+     +-++     +-++  :
   :   |        |         |        |   :
   :   |        |         |        |   :
   :   |        |         |        |   :
   :   |        |         |        |   :
   :  ++-+     ++-+     +-++     +-++  :
------+  +-----+  +-----+  +-----+  +------
   :  +--+     +--+     +--+     +--+  :
   :....................................

                +----------+
             ---+          +---
                |Абстрактн.|
                |   узел   |
             ---+          +---
                +----------+

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


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

5.2.3. Серая топология

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

Выделены два типа серой топологии, указанных ниже.

  • В топологии типа A граничные узлы соединены полносвязной сетью каналов TE (рисунок 7).

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

   .....................................
   : Домен PNC                         :
   :  +--+     +--+     +--+     +--+  :
------+  +-----+  +-----+  +-----+  +------
   :  ++-+     ++-+     +-++     +-++  :
   :   |        |         |        |   :
   :   |        |         |        |   :
   :   |        |         |        |   :
   :   |        |         |        |   :
   :  ++-+     ++-+     +-++     +-++  :
------+  +-----+  +-----+  +-----+  +------
   :  +--+     +--+     +--+     +--+  :
   :....................................

            ....................
            : Абстрактная сеть :
            :                  :
            :   +--+    +--+   :
         -------+  +----+  +-------
            :   ++-+    +-++   :
            :    |  \  /  |    :
            :    |   \/   |    :
            :    |   /\   |    :
            :    |  /  \  |    :
            :   ++-+    +-++   :
         -------+  +----+  +-------
            :   +--+    +--+   :
            :..................:

Рисунок 7. Естественная топология с соответствующей серой топологией.


5.3. Методы построения серой топологии

В этом параграфе рассмотрены два способа построения серой топологии:

  • автоматическая генерация абстрактной топологии по конфигурации (параграф 5.3.1);

  • генерация по запросу дополнительной топологии по запросам и откликам расчета пути (параграф 5.3.2).

5.3.1. Автоматическая генерация абстрактной топологии по конфигурации

Автоматическая генерация основана на абстрагировании/обобщении всего домена контроллером PNC и его анонсами на MPI. Уровень абстракции может быть выведен из параметров конфигурации PNC (например, «предоставлять возможные соединения между PE и любым ASBR в сети MPLS-TE»).

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

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

5.3.2. Генерация дополнительной топологии по запросам и откликам PC

Хотя абстрактная топология генерируется и обновляется автоматически по конфигурации, как описано в параграфе 5.3.1, дополнительная топология может быть получена MDSC через механизм запросов и откликов расчета пути.

Анонсы абстрактной топологии от PNC дают MDSC информацию о граничных узлах и каналах для каждого домена. В этом сценарии, когда MDSC нужно создать новую сеть VN, он может передать запрос расчета пути контроллерам PNC с ограничениями, соответствующими запросу VN, как описано в [ACTN-YANG]. Пример этого показан на рисунке 8, где MDSC создает P2P VN между AP1 и AP2. MDSC может использовать два разных междоменных канала из домена X в домен Y, но для выбора наилучшего сквозного пути ему нужно знать, что могут предложить домены X и Y в плане связности и ограничений между узлами PE и граничными узлами.

         -------                 --------
        (       )               (        )
       -      BrdrX.1------- BrdrY.1      -
      (+---+       )          (       +---+)
-+---( |PE1| Dom.X  )        (  Dom.Y |PE2| )---+-
 |    (+---+       )          (       +---+)    |
AP1    -      BrdrX.2------- BrdrY.2      -    AP2
        (       )               (        )
         -------                 --------

Рисунок 8. Пример с множеством доменов.


MDSC передает запрос расчета пути контроллеру PNC.X, выясняя возможную связность между PE1 и граничным узлом BrdrX.1, а также между PE1 и BrdrX.2 с определяемыми задачей функциями и метрическими ограничениями TE. Похожий запрос связности от граничного узла в домене Y к узлу PE2 будет передан PNC.Y. MDSC объединяет результаты для расчета оптимального сквозного пути, включающего междоменные каналы. MDSC может использовать результат этого расчета для запроса у PNC предоставления базовой сети, а затем MDSC может использовать сквозной путь в качестве виртуального канала в VN, предоставляемой абоненту.

5.4. Пример абстракции иерархической топологии

В этом параграфе показано, как абстракция топологии работает на разных уровнях иерархии MDSC (рисунок 9).

                          +-----+
                          | CNC |  CNC хочет организовать VN
                          +-----+  между CE A и CE B
                             |
                             |
                 +-----------------------+
                 |         MDSC-H        |
                 +-----------------------+
                       /           \
                      /             \
              +---------+         +---------+
              | MDSC-L1 |         | MDSC-L2 |
              +---------+         +---------+
                /    \               /    \
               /      \             /      \
            +----+  +----+       +----+  +----+
  CE A o----|PNC1|  |PNC2|       |PNC3|  |PNC4|----o CE B
            +----+  +----+       +----+  +----+

                Виртуальная сеть, предоставленная CNC

                  CE A o==============o CE B

                Топология, обслуживаемая MDSC-H

               CE A o----o==o==o===o----o CE B

Топология, обслуживаемая MDSC-L1     Топология, обслуживаемая MDSC-L2
               _        _                       _        _
              ( )      ( )                     ( )      ( )
             (   )    (   )                   (   )    (   )
    CE A o--(o---o)==(o---o)==Дом.3   Дом.2==(o---o)==(o---o)--o CE B
             (   )    (   )                   (   )    (   )
              (_)      (_)                     (_)      (_)

                           Реальная топология
             ___          ___          ___          ___
            (   )        (   )        (   )        (   )
           (  o  )      (  o  )      ( o--o)      (  o  )
          (  / \  )    (   |\  )    (  |  | )    (  / \  )
CE A o---(o-o---o-o)==(o-o-o-o-o)==(o--o--o-o)==(o-o-o-o-o)---o CE B
          (  \ /  )    ( | |/  )    (  |  | )    (  \ /  )
           (  o  )      (o-o  )      ( o--o)      (  o  )
            (___)        (___)        (___)        (___)

           Домен 1      Домен 2      Домен 3      Домен 4

     o   узел
     --- канал
     === граничный канал

Рисунок 9. Абстракция иерархической топологии.

В примере на рисунке 9 4 домена находятся под управлением PNC — PNC1, PNC2, PNC3, PNC4. MDSC-L1 управляет PNC1 и PNC2, а MDSC-L2 — PNC3 и PNC4. Каждый из PNC предоставляет серую абстракцию топологии, которая включает лишь краевые узлы, а также внутридоменные и междоменные каналы. Абстрактная топология с которой работает MDSC-L1, является комбинацией топологии от PNC1 и PNC2. Аналогично, абстрактная топология, с которой работает MDSC-L2, показана на рисунке 9. MDSC-L1 и MDSC-L2 представляют черную абстракцию топологии для координатора MDSC-H, в которой каждый домен PNC представлен одним виртуальным узлом. MDSC-H объединяет две топологии для создания абстрактной топологии, с которой будет работать. MDSC-H видит сети всех четырех доменов как 4 виртуальных узла, соединенных виртуальными каналами.

5.5. Рекурсия VN с сетевыми уровнями

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

Как показано на рисунке 10, клиент запрашивает сквозное соединение между CE A и CE B (виртуальную сеть). Клиентский CNC передает запрос MDSC оператора 1. MDSC определяет, какие сетевые ресурсы нужно настроить, и передает инструкции соответствующим PNC. Однако канал между Q и R является виртуальным каналом, предоставленным оператором 2 (оператор 1 является клиентом оператора 2).

Для поддержки этого оператор 1 имеет CNC, который взаимодействует с MDSC оператора 2. Отметим, что CNC оператора 1 на рисунке 10 является необязательной для реализации функциональной компонентой (может быть встроен в PNC).

Виртуальная CE A o===============================o CE B
сеть

                              -----    CNC хочет создать VN
Абонент                      | CNC |   между CE A и CE B
                              -----
                                :
         ***********************************************
                                :
Оператор 1         ---------------------------
                  |           MDSC            |
                   ---------------------------
                    :           :           :
                    :           :           :
                  -----   -------------   -----
                 | PNC | |     PNC     | | PNC |
                  -----   -------------   -----
                    :     :     :     :     :
Вышележащий         v     v     :     v     v
сетевой    CE A o---P-----Q===========R-----S---o CE B
уровень                   |     :     |
                          |     :     |
                          |   -----   |
                          |  | CNC |  |
                          |   -----   |
                          |     :     |
         ***********************************************
                          |     :     |
Оператор 2                |  ------   |
                          | | MDSC |  |
                          |  ------   |
                          |     :     |
                          |  -------  |
                          | |  PNC  | |
                          |  -------  |
                           \ :  :  : /
Нижележащий                 \v  v  v/
сетевой                      X--Y--Z
уровень

--- канал
=== виртуальный канал

Рисунок 10. Рекурсия VN с сетевыми уровнями.

6. Точки доступа и точки доступа виртуальных сетей

Для отображения идентификации соединений между сайтами клиента и сетями TE, а также охвата связности, запрошенной в VNS элементы CNC и MDSC указывают соединения с использованием AP, как показано на рисунке 11.

                 -------------
                (             )
               -               -
+---+ X       (                 )      Z +---+
|CE1|---+----(                   )---+---|CE2|
+---+   |     (                 )    |   +---+
       AP1     -               -    AP2
                (             )
                 -------------

Рисунок 11. AP с точки зрения клиента.


Рассмотрим в качестве примера вариант, показанный на рисунке 11. CE1 подключается к сети через канал 10 Гбит/с, а CE2 — через канал 40 Гбит/с. До создания какой-либо VN между AP1 и AP2 представление клиента можно описать рисунком 12.

      +----------+------------------------+
      | Endpoint | Полоса канала доступа  |
+-----+----------+----------+-------------+
|AP id| CE,port  | MaxResBw | AvailableBw |
+-----+----------+----------+-------------+
| AP1 |CE1,portX | 10 Гбит/с|  10 Гбит/с  |
+-----+----------+----------+-------------+
| AP2 |CE2,portZ | 40 Гбит/с|  40 Гбит/с  |
+-----+----------+----------+-------------+

Рисунок 12. AP с точки зрения клиента.


Топология с точки зрения оператора оператора показана на рисунке 13.

          -------            -------
         (       )          (       )
        -         -        -         -
   W  (+---+       )      (       +---+)  Y
-+---( |PE1| Dom.X  )----(  Dom.Y |PE2| )---+-
 |    (+---+       )      (       +---+)    |
 AP1    -         -        -         -     AP2
         (       )          (       )
          -------            -------

Рисунок 13. AP с точки зрения оператора.


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

      +----------+------------------------+
      | Endpoint | Полоса канала доступа  |
+-----+----------+----------+-------------+
|AP id| PE,port  | MaxResBw | AvailableBw |
+-----+----------+----------+-------------+
| AP1 |PE1,portW | 10 Гбит/с|  10 Гбит/с  |
+-----+----------+----------+-------------+
| AP2 |PE2,portY | 40 Гбит/с|  40 Гбит/с  |
+-----+----------+----------+-------------+

Рисунок 14. AP с точки зрения оператора.


Точка доступа виртуальной сети (VNAP) должна определяться как привязка между AP и VN. Это позволяет разным VN начинаться в одной AP, а также обеспечивает возможность организации трафика на каналах доступа и/или междоменных каналах (например, отслеживание выделенной полосы). В AP создаются свой VNAP для каждой сети VN.

В этом простом варианте предположим создание двух виртуальных сетей. Первая VN с идентификатором 9 между AP1 и AP2 имеет пропускную способность 1 Гбит/с, а вторая VN с идентификатором 5 между теми же AP1 и AP2 имеет полосу 2 Гбит/с.

Представление оператора будет меняться, как показано на рисунке 15.

          +----------+------------------------+
          | Endpoint | Канал доступа/VNAP Bw  |
+---------+----------+----------+-------------+
|AP/VNAPid| PE,port  | MaxResBw | AvailableBw |
+---------+----------+----------+-------------+
|AP1      |PE1,portW | 10 Гбит/с|   7 Гбит/с  |
| -VNAP1.9|          |  1 Гбит/с|       -     |
| -VNAP1.5|          |  2 Гбит/с|       -     |
+---------+----------+----------+-------------+
|AP2      |PE2,portY | 40 Гбит/с|   37 Гбит/с |
| -VNAP2.9|          |  1 Гбит/с|       -     |
| -VNAP2.5|          |  2 Гбит/с|       -     |
+---------+----------+----------+-------------+

Рисунок 15. Представление оператора для AP и VNAP после создания VNS.

6.1. Двудомный вариант

Зачастую используется двудомное соединение между CE и парой PE. Этот вариант должен поддерживаться определением VN, AP и VNAP. Предположим, что CE1 подключен к двум PE в домене оператора через AP1 и AP2, а клиенту нужна пропускная способность 5 Гбит/с между CE1 и CE2 (рисунок 16).

                ____________
        AP1    (            )    AP3
       -------(PE1)      (PE3)-------
    W /      (                )      \ X
+---+/      (                  )      \+---+
|CE1|      (                    )      |CE2|
+---+\      (                  )      /+---+
    Y \      (                )      / Z
       -------(PE2)      (PE4)-------
        AP2    (____________)

Рисунок 16. Двудомный вариант.

В этом случае клиент будет запрашивать VN между AP1, AP2 и AP3 указывая двудомное подключение CE1 через AP1 и AP2. В результате между AP1 и AP2 трафик передаваться не будет. Двудомное подключение будет отображаться на VNAP (поскольку другие VN также могут использовать AP1 и AP2 в качестве конечных точек).

Клиентское представление показано на рисунке 17.

          +----------+------------------------+
          | Endpoint | Канал доступа/VNAP Bw  |
+---------+----------+----------+-------------+-----------+
|AP/VNAPid| CE,port  | MaxResBw | AvailableBw | Двудомный |
+---------+----------+----------+-------------+-----------+
|AP1      |CE1,portW | 10 Гбит/с|   5 Гбит/с  |           |
| -VNAP1.9|          |  5 Гбит/с|      -      | VNAP2.9   |
+---------+----------+----------+-------------+-----------+
|AP2      |CE1,portY | 40 Гбит/с|   35 Гбит/с |           |
| -VNAP2.9|          |  5 Гбит/с|      -      | VNAP1.9   |
+---------+----------+----------+-------------+-----------+
|AP3      |CE2,portX | 50 Гбит/с|  45 Гбит/с  |           |
| -VNAP3.9|          |  5 Гбит/с|      -      |   нет     |
+---------+----------+----------+-------------+-----------+

Рисунок 17. Представление клиентом двудомного случая после создания VN.

7. Расширенное применение ACTN для множества клиентов

Более сложным приложением ACTN является выбор центра обработки данных (DC21), когда клиент должен выбрать DC на основе состояния сети (это называется Multi-Destination Service [ACTN-REQ]). С точки зрения ACTN контроллер CNC может запросить VNS между AP на стороне отправителя и получателя и отправить ее в сеть (MDSC) для выбора AP на стороне отправителя и получателя, используемых при организации VNS. Список AP-кандидатов определяется CNC (или иным элементом вне ACTN) на основе критериев, выходящих за рамки ACTN.

На основе выбора AP сделанного и возвращенного сетью (MDSC), CNC (или элемент вне ACTN) должен принять решение о последующих действиях, таких как координация или требования к организации сервиса. Эти действия выходят за рамки ACTN.

Рассмотрим пример, показанный на рисунке 18, где доступны три DC, но клиенту нужно выбрать между ними на основе состояния сети и организации соединения между AP1 (CE1) и одним из получателей (AP2 (DC-A), AP3 (DC-B), AP4 (DC-C)). MDSC (вместе с PNC) будет выбирать лучшую целевую AP на основе ограничений, критериев оптимизации, политики и т. п., а затем организовывать соединение (виртуальную сеть).

                -------            -------
               (       )          (       )
              -         -        -         -
+---+        (           )      (           )        +----+
|CE1|---+---(   Домен X   )----(   Домен Y   )---+---|DC-A|
+---+   |    (           )      (           )    |   +----+
         AP1  -         -        -         -    AP2
               (       )          (       )
                ---+---            ---+---
                   |                  |
               AP3-+              AP4-+
                   |                  |
                +----+              +----+
                |DC-B|              |DC-C|
                +----+              +----+

Рисунок 18. Выбор конечной точки на основе состояния сети.

7.1. Запланированный перенос конечной точки

Кроме того, в случае выбора DC клиент может запросить выбор резервного DC, чтобы в случае отказа он мог обеспечить защиту в режиме «горячего резервирования». Как показано на рисунке 19, DC-C выбран резервным для DC-A. Таким образом, следует организовать VN с помощью MDSC для создания основного соединения между AP1 (CE1) и AP2 (DC-A), а также резервного соединения между AP1 (CE1) и AP4 (DC-C).

                 -------            -------
                (       )          (       )
               -         -    __  -         -
+---+         (           )      (           )        +----+
|CE1|---+----(   Домен X   )----(   Домен Y   )---+---|DC-A|
+---+   |     (           )      (           )    |   +----+
        AP1    -         -        -         -    AP2    |
                (       )          (       )            |
                 ---+---            ---+---             |
                    |                  |                |
                AP3-|              AP4-|         HOT STANDBY
                    |                  |                |
                 +----+             +----+              |
                 |DC-D|             |DC-C|<-------------
                 +----+             +----+

Рисунок 19. Запланированный перенос конечной точки.


7.2. Перемещение конечной точки «на лету»

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

8. Вопросы управляемости

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

Сама платформа ACTN должна поддерживать запросы, отклики и резервирование соединений клиентского и сетевого уровня. Требуется также обеспечить мониторинг производительности и контроль ресурсов TE. Требования к управлению можно разделить на несколько категорий:

  • управление внешними протоколами ACTN;

  • управление внутренними интерфейсами и протоколами ACTN;

  • администрирование и мониторинг компонент ACTN;

  • настройка правил для применения в системе ACTN.

Схема и интерфейсы ACTN определены для обеспечения возможности организации трафика виртуальных сетевых служб и услуг связности. Операторы могут иметь другие задачи OAM22 для поддержки сервиса, оптимизации и гарантий за пределами организации трафика. Реализация OAM за пределами абстракции и управления сетями TE не рассматривается в этом документе.

8.1. Правила

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

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

  • Локальная политика может ограничивать число, тип, размер и планирование виртуальных сетей, которые клиент может запросить через свой CNC. Этот тип политики реализуется локально в MDSC.

  • Глобальная политика может ограничивать некоторых клиентов (или приложения) использованием лишь определенных MDSC, а также ограничивать типы физических сетей, управляемые PNC. Этими правилами будет управлять агент глобальной политики.

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

8.2. Правила, применяемые к контроллеру сети абонента

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

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

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

После разрешения услуга VN организуется через интерфейс CNC-MDSC (CMI) и будет отражать запросы клиентских приложений и связности, а также конкретные требования к доставке сервиса. У CNC и MDSC будут согласованные конечные точки и их использование следует выражать правилами при организации или добавлении услуг VN. Гарантия того, что разрешенные конечные точки определены до CNC и приложений будет требовать от MDSC поддержки реестра разрешенных точек подключения для CNC и типов приложений.

Могут возникать конфликты при одновременном применении критериев оптимизации услуг VN. Например, для достижения цели доступности услуг запрос может требовать точек соединения между множеством физических сетей, который будет противоречить требованиям политики безопасности для определенной сквозной услуги. В результате MDSC может потребоваться балансировка множества ограничений для запросов услуг и между разными услугами. Может также потребоваться балансировать запрошенные услуги с операционными номами для базовых физических сетей. Балансировка может быть реализована применением заданной политики и жестких или мягких ограничений.

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

PNC отвечает за настройку элементов сети, мониторинг физических ресурсов и раскрытие связности (реальной или абстрактной) MDSC. Поэтому предполагается, что политика будет определять обмен данными о связности через MPI.

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

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

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

Описанная здесь модель ACTN определяет основные компоненты и интерфейсы для управляемых сетей TE. Защита запросов и контроля ресурсов, конфиденциальность информации и доступность функций должны быть важными аспектами безопасности при развертывании и эксплуатации платформ ACTN.

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

Дальнейшее обсуждение вопросов безопасности ACTN разделено на две категории, описанные ниже.

  • Интерфейс между CNC и MDSC (интерфейс CNC-MDSC или CMI).

  • Интерфейс между MDSC и PNC (интерфейс MDSC-PNC или MPI).

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

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

9.1. Интерфейс CNC-MDSC (CMI)

Данные, хранящиеся в MDSC, могут раскрывать детали услуг VN, а также использования ресурсов клиентами, приложениями и CNC. Поэтому целесообразно рассмотреть вопрос шифрования таких данных.

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

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

9.2. Интерфейс MDSC-PNC (MPI)

Когда MDSC должен взаимодействовать с множеством (распределенных) PNC, предлагается использовать механизмы на основе PKI, такие как организация соединений TLS или HTTPS между MDSC и PNC для обеспечения доверия между компонентами уровня управления физической сетью и MDSC. Доверенные привязки для PKI можно настроить на применение меньшего (потенциально не пересекающегося) набора удостоверяющих центров (CA), нежели в Web PKI.

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

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

Этот документ не требует действий со стороны IANA

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

[ACTN-REQ] Lee, Y., Ceccarelli, D., Miyasaka, T., Shin, J., and K. Lee, «Requirements for Abstraction and Control of TE Networks», Work in Progress, draft-ietf-teas-actn-requirements-09, March 2018.

[ACTN-YANG] Lee, Y., Dhody, D., Ceccarelli, D., Bryskin, I., Yoon, B., Wu, Q., and P. Park, «A Yang Data Model for ACTN VN Operation», Work in Progress, draft-ietf-teas-actn-vn-yang-01, June 2018.

[ONF-ARCH] Open Networking Foundation, «SDN Architecture», Issue 1.1, ONF TR-521, June 2016.

[RFC2702] Awduche, D., Malcolm, J., Agogbua, J., O’Dell, M., and J. McManus, «Requirements for Traffic Engineering Over MPLS», RFC 2702, DOI 10.17487/RFC2702, September 1999, <https://www.rfc-editor.org/info/rfc2702>.

[RFC3945] Mannie, E., Ed., «Generalized Multi-Protocol Label Switching (GMPLS) Architecture», RFC 3945, DOI 10.17487/RFC3945, October 2004, <https://www.rfc-editor.org/info/rfc3945>.

[RFC4655] Farrel, A., Vasseur, J., and J. Ash, «A Path Computation Element (PCE)-Based Architecture», RFC 4655, DOI 10.17487/RFC4655, August 2006, <https://www.rfc-editor.org/info/rfc4655>.

[RFC5654] Niven-Jenkins, B., Ed., Brungard, D., Ed., Betts, M., Ed., Sprecher, N., and S. Ueno, «Requirements of an MPLS Transport Profile», RFC 5654, DOI 10.17487/RFC5654, September 2009, <https://www.rfc-editor.org/info/rfc5654>.

[RFC7149] Boucadair, M. and C. Jacquenet, «Software-Defined Networking: A Perspective from within a Service Provider Environment», RFC 7149, DOI 10.17487/RFC7149, March 2014, <https://www.rfc-editor.org/info/rfc7149>.

[RFC7926] Farrel, A., Ed., Drake, J., Bitar, N., Swallow, G., Ceccarelli, D., and X. Zhang, «Problem Statement and Architecture for Information Exchange between Interconnected Traffic-Engineered Networks», BCP 206, RFC 7926, DOI 10.17487/RFC7926, July 2016, <https://www.rfc-editor.org/info/rfc7926>.

[RFC8283] Farrel, A., Ed., Zhao, Q., Ed., Li, Z., and C. Zhou, «An Architecture for Use of PCE and the PCE Communication Protocol (PCEP) in a Network with Central Control», RFC 8283, DOI 10.17487/RFC8283, December 2017, <https://www.rfc-editor.org/info/rfc8283>.

[RFC8309] Wu, Q., Liu, W., and A. Farrel, «Service Models Explained», RFC 8309, DOI 10.17487/RFC8309, January 2018, <https://www.rfc-editor.org/info/rfc8309>.

[TE-TOPO] Liu, X., Bryskin, I., Beeram, V., Saad, T., Shah, H., and O. Dios, «YANG Data Model for Traffic Engineering (TE) Topologies», Work in Progress, draft-ietf-teas-yang-te-topo-18, June 2018.

Приложение A. Пример функций MDSC и PNC в оркестраторе

Абонент
            +-------------------------------+
            |    +-----+                    |
            |    | CNC |                    |
            |    +-----+                    |
            +-------|-----------------------+
                    |
Оркестратор         | CMI
сервиса/сети        |
            +-------|------------------------+
                    |    +------+   MPI   +------+   |
                    |    | MDSC |---------| PNC2 |   |
                    |    +------+         +------+   |
                    +-------|------------------|-----+
                            | MPI              |
Контроллер домена   |                  |
            +-------|-----+            |
            |   +-----+   |            | SBI
            |   |PNC1 |   |            |
            |   +-----+   |            |
            +-------|-----+            |
                    v SBI              v
                 -------            -------
                (       )          (       )
               -         -        -         -
              (           )      (           )
             (   Домен 1   )----(   Домен 2   )
              (           )      (           )
               -         -        -         -
                (       )          (       )
                 -------            -------


В этом приложении представлен пример возможного варианта развертывания, где координатор сервиса/сетей (Service/Network Orchestrator) может включать функциональность PNC для домена 2 и функциональность MDSC.

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

Adrian Farrel

Old Dog Consulting

Email: adrian@olddog.co.uk

Italo Busi

Huawei

Email: Italo.Busi@huawei.com

Khuzema Pithewan

Peloton Technology

Email: khuzemap@gmail.com

Michael Scharf

Nokia

Email: michael.scharf@nokia.com

Luyuan Fang

eBay

Email: luyuanf@gmail.com

Diego Lopez

Telefonica I+D

Don Ramon de la Cruz, 82

28006 Madrid

Spain

Email: diego@tid.es

Sergio Belotti

Nokia

Via Trento, 30

Vimercate

Italy

Email: sergio.belotti@nokia.com

Daniel King

Lancaster University

Email: d.king@lancaster.ac.uk

Dhruv Dhody

Huawei Technologies

Divyashree Techno Park, Whitefield

Bangalore, Karnataka 560066

India

Email: dhruv.ietf@gmail.com

Gert Grammel

Juniper Networks

Email: ggrammel@juniper.net

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

Daniele Ceccarelli (редактор)

Ericsson

Torshamnsgatan, 48

Stockholm

Sweden

Email: daniele.ceccarelli@ericsson.com

Young Lee (редактор)

Huawei Technologies

5340 Legacy Drive

Plano, TX 75023

United States of America

Email: leeyoung@huawei.com


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

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

nmalykh@protokols.ru

1Traffic Engineered.

2Abstraction and Control of TE Networks.

3Internet Engineering Task Force.

4Internet Engineering Steering Group.

5MPLS Transport Profile — транспортный профиль MPLS.

6Software-Defined Networking.

7Path Computation Element — элемент расчета пути.

8Abstraction and Control of TE Networks — абстрагирование и управление в сетях TE.

9Network element.

10Virtual Network Service.

11Service Level Agreement — соглашение об уровне обслуживания.

12Operations Support System — система поддержки операций.

13Network Management System — система управления сетью.

14Element Management System — система управления элементами сети.

15Higher-level MDSC — MDSC верхнего уровня.

16Lower-level MDSC — MDSC нижнего уровня.

17Multiprotocol Label Switching — многопротокольная коммутация по меткам.

18Optical Transport Network — оптическая транспортная сеть.

19Wavelength Division Multiplexing — мультиплексирование по длине волны.

20Wavelength Switched Optical Network — сеть с коммутацией по длине волны.

21Data center.

22Operations, Administration, and Maintenance — операции, администрирование и поддержка.

Рубрика: RFC | Комментарии к записи RFC 8453 Framework for Abstraction and Control of TE Networks (ACTN) отключены

RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3

Internet Engineering Task Force (IETF)                       E. Rescorla
Request for Comments: 8446                                       Mozilla
Obsoletes: 5077, 5246, 6961                                  August 2018
Updates: 5705, 6066
Category: Standards Track
ISSN: 2070-1721

The Transport Layer Security (TLS) Protocol Version 1.3

Протокол TLS версии 1.3

PDF

Аннотация

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

Этот документ обновляет RFC 5705 и RFC 6066, а также отменяет RFC 5077, RFC 5246 и RFC 6961. Документ также задаёт новые требования для реализаций TLS 1.2.

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

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

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

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

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

Авторские права (Copyright (c) 2018) принадлежат 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. Введение

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

  • Проверка подлинности (Authentication). Серверная сторона соединения аутентифицируется всегда, проверка подлинности клиентской стороны не обязательна. Аутентификация может выполняться на основе асимметричной криптографии (например, RSA [RSA], ECDSA4 [ECDSA], EdDSA5 [RFC8032]) или симметричного, заранее известного ключа (PSK6).

  • Конфиденциальность (Confidentiality). Переданные через канал данные доступны лишь конечным точкам соединения. TLS не скрывает размера передаваемых данных, хотя конечные точки могут дополнять записи TLS для сокрытия размера и улучшения защиты от анализа трафика.

  • Целостность (Integrity). Переданные через канал данные не могут быть незаметно изменены атакующим.

Эти свойства должны сохраняться даже при полном контроле сети злоумышленником, как описано в [RFC3552]. Дополнительное описание свойств защищенности дано в Приложении E.

TLS состоит из двух основных частей, указанных ниже.

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

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

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

Этот документ определяет TLS версии 1.3. Хотя TLS 1.3 и не совместим напрямую с прежними версиями, в протокол встроен механизм указания версии, который позволяет клиентам и серверам согласовать номер версии, поддерживаемой обоими.

Этот документ заменяет собой (и отменяет) прежние версии TLS, включая версию 1.2 [RFC5246]. Он также отменяет механизм квитанций TLS (ticket), заданный в [RFC5077], заменяя его механизмом, определенным в параграфе 2.2. Восстановление и PSK. Поскольку TLS 1.3 меняет способ создания ключей, он обновляет [RFC5705], как описано в параграфе 7.5. Экспортёры. Документ также меняет способ передачи сообщений OCSP7, в результате чего обновляет [RFC6066] и отменяет [RFC6961], как описано в параграфе 4.4.2.1. Статус OCSP и расширения SCT.

1.1. Соглашения и термины

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

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

client — клиент

Конечная точка, инициирующая соединение TLS.

connection — соединение

Соединение между парой конечных точек на транспортном уровне.

endpoint — конечная точка

Клиентская или серверная сторона соединения.

handshake — согласование

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

peer — партнёр

Конечная точка. При рассмотрении конкретной точки термин партнёр относится с точке, не являющейся основной темой обсуждения.

receiver — получатель

Конечная точка, принимающая записи.

sender — отправитель

Конечная точка, передающая записи.

server — сервер

Конечная точка, которая не инициировала соединение TLS.

1.2. Основные отличия от TLS 1.2

Ниже приведён список основных функциональных различий между TLS 1.2 и TLS 1.3. Список не является исчерпывающим, но включает и мелкие различия.

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

  • Добавлен режим 0-RTT10 для экономии одного периода кругового обхода при организации соединения для некоторых данных приложений за счёт отдельных свойств защиты.

  • Удалены шифронаборы Static RSA и Diffie-Hellman, все механизмы обмена на базе открытых ключей сейчас обеспечивают полную защиту.

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

  • Переработаны функции создания ключей. Новые функции позволяют упростить анализ за счёт улучшенных свойств разделения ключей. Используется основанная на HMAC функция HKDF11 в качестве базового примитива.

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

  • Алгоритмы на основе эллиптических кривых сейчас входят в базовую спецификацию и включены новые алгоритмы подписи, такие как EdDSA. Из TLS 1.3 удалено согласование формата точек и применяется один формат для каждой кривой.

  • Внесён ряд криптографических улучшений, включая замену заполнения RSA на RSASSA-PSS12, а также удаление компрессии, алгоритма DSA13 и пользовательских групп DHE14.

  • Механизм согласования версии TLS 1.2 был отменен в пользу указания списка версий в расширении. Это улучшает совместимость с имеющимися серверами, в которых некорректно реализовано согласование версий.

  • Восстановление сессии с состоянием сервера и без него, а также основанные на PSK шифры ранних версий TLS заменены одним новым обменом PSK.

  • Обновлены ссылки с указанием новых версий RFC, где это нужно (например, RFC 5280 вместо RFC 3280).

1.3. Обновления, влияющие на TLS 1.2

Этот документ задаёт некоторые изменения, которые могут влиять на реализации TLS 1.2, включая те, которые не поддерживают TLS 1.3.

  • Механизм защиты от снижения версии, описанный в параграфе 4.1.3. Серверное сообщение Hello.

  • Схемы подписи RSASSA-PSS, определённые в параграфе 4.2.3. Алгоритмы подписи.

  • Расширение supported_versions для ClientHello может применяться при согласовании используемой версии TLS вместо поля legacy_version в ClientHello.

  • Расширение signature_algorithms_cert позволяет клиенту указать, какие алгоритмы подписи он может принимать в сертификатах X.509.

В параграфе 9.3. Инварианты протокола разъяснены некоторые требования совместимости для прежних версий.

2. Обзор протокола

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

Отказ при согласовании или иная ошибка протокола ведёт к разрыву соединения, которому может предшествовать сигнальное сообщение (6. Протокол Alert).

TLS поддерживает три базовых режима обмена ключами:

  • (EC)DHE (Diffie-Hellman на основе конечных полей или эллиптических кривых);

  • PSK;

  • PSK с (EC)DHE.

На рисунке 1 показан базовый вариант полного согласования TLS.

                Клиент                                           Сервер
         
         Обмен^ ClientHello
       ключами| + key_share*
              | + signature_algorithms*
              | + psk_key_exchange_modes*
              v + pre_shared_key*       -------->
                                                           ServerHello  ^ Обмен
                                                          + key_share*  | ключами
                                                     + pre_shared_key*  v
                                                 {EncryptedExtensions}  ^ Параметры
                                                 {CertificateRequest*}  v сервера
                                                        {Certificate*}  ^
                                                  {CertificateVerify*}  | Аутентификация
                                                            {Finished}  v
                                        <-------- [Данные приложения*]
              ^ {Certificate*}
Аутентификация| {CertificateVerify*}
              v {Finished}              -------->
                [Данные приложения]     <------->  [Данные приложения]

+ заслуживающие внимания расширения из ранее отмеченного сообщения;

* необязательные или зависящие от ситуации сообщения или расширения;

{} сообщения, защищённые ключом на основе [sender]_handshake_traffic_secret;

[] сообщения, защищённые ключом на основе [sender]_application_traffic_secret_N.

Рисунок 1. Поток сообщений при полном TLS Handshake.


Согласование можно рассматривать как 3 этапа, показанных на рисунке 1.

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

  • Параметры сервера — поддержка прикладных протоколов, проверка подлинности клиента и пр.

  • Аутентификация сервера (возможно и клиента), а также подтверждение ключа и целостности согласования.

В фазе обмена ключами (Key Exchange) клиент передаёт сообщение ClientHello (параграф 4.1.2) со случайным одноразовым (nonce) ClientHello.random. Это сообщение предлагает версии протокола, список хэш-пар, шифр-HKDF, набор общих значений Diffie-Hellman (в расширении key_share, параграф 4.2.8), набор меток заранее известных ключей (в расширении pre_shared_key, параграф 4.2.11) или оба, а также может включать дополнительные расширения. Для совместимости с промежуточными устройствами могут добавляться другие поля и сообщения.

Сервер обрабатывает ClientHello и определяет подходящие криптографические параметры для соединения. Затем он отвечает сообщением ServerHello (параграф 4.1.3), которое указывает согласованные параметры соединения. Комбинация ClientHello и ServerHello определяет совместно используемые ключи. Если применяется организация ключей (EC)DHE, сообщение ServerHello включает расширение key_share со своим эфемерным значением Diffie-Hellman, которое должно относится к одной группе с одним из общих с клиентом значений. При использовании PSK сообщение ServerHello включает расширение pre_shared_key, указывающие какой из предложенных клиентом PSK был выбран. Реализации могут применять (EC)DHE и PSK вместе и в этом случае сообщение включает оба расширения.

Затем сервер передаёт два сообщения для организации параметров (Server Parameters).

EncryptedExtensions

Отклик на расширения ClientHello, которые не требуют определения криптографических параметров в дополнение к параметрам отдельных сертификатов. [4.3.1. Шифрованные расширения]

CertificateRequest

Если желательна аутентификация клиента по сертификату, сообщение содержит ожидаемые параметры сертификата. Сообщение не применяется, если подлинность клиента не нужно проверять. [4.3.2. Запрос сертификата]

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

Certificate

Сертификат конечной точки и связанные с ним расширения. Сервер пропускает сообщение, если его подлинность не проверяется по сертификату, а клиент пропускает его, если сервер не передал CertificateRequest (т. е. клиента не нужно аутентифицировать по сертификату). Отметим, что при использовании необработанных (raw) открытых ключей [RFC7250] или расширения для кэширования информации [RFC7924], это сообщение не будет включать сертификат, а вместо него будет указано некое значение, соответствующее долгосрочному ключу сервера. [4.4.2. Сообщение Certificate]

CertificateVerify

Подпись всего согласования с применением секретного ключа, соответствующего открытому ключу в сообщении Certificate. Сообщение пропускается, если конечная точка не аутентифицируется по сертификату [4.4.3. Сообщение CertificateVerify]

Finished

Код MAC для всего согласования. Это сообщение содержит подтверждение ключа, привязку конечных точек к переданным ключам, а в режиме PSK также подтверждает подлинность согласования [4.4.4. Сообщение Finished]

При получении сообщений от сервера клиент отвечает своими сообщениями Authentication — Certificate, CertificateVerify (при запросе) и Finished.

На этом согласование завершается, а клиент и сервер создают ключевой материал, нужный уровню записи для обмена данными приложений, защищённого аутентифицированным шифрованием. Данные приложений недопустимо передавать до отправки сообщения Finished, за исключением случая, описанного в параграфе 2.3. Данные 0-RTT. Отметим, что хотя сервер может передавать данные приложений до получения Authentication от клиента, эти данные будут передаваться неаутентифицированному партнёру.

2.1. Некорректные параметры DHE

Если клиент не представил достаточного расширения key_share (например, включил лишь непригодные или не поддерживаемые сервером группы DHE или ECDHE), сервер исправляет несоответствие путём передачи сообщения HelloRetryRequest и клиенту нужно возобновить согласование с подходящим расширением key_share, как показано на рисунке 2. Если общие криптографические параметры не согласованы, сервер должен прервать согласование с подходящим сигналом.

Клиент                                               Сервер

ClientHello
+ key_share             -------->
                                          HelloRetryRequest
                        <--------               + key_share
ClientHello
+ key_share             -------->
                                                ServerHello
                                                + key_share
                                      {EncryptedExtensions}
                                      {CertificateRequest*}
                                             {Certificate*}
                                       {CertificateVerify*}
                                                 {Finished}
                        <--------      [Данные приложения*]
{Certificate*}
{CertificateVerify*}
{Finished}              -------->
[Данные приложения]     <------->       [Данные приложения]

Рисунок 2. Поток сообщений полного TLS Handshake с несоответствием параметров.

Примечание. Показанное на рисунке согласование включает начальный обмен ClientHello/HelloRetryRequest и не сбрасывается новым ClientHello.

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

2.2. Восстановление и PSK

Хотя TLS PSK можно организовать отдельно (out of band), возможно создание ключей PSK в предшествующем соединении для использования в будущем (восстановление сессии или восстановление с PSK). По завершении согласования сервер может передать клиенту отождествление PSK, соответствующее уникальному ключу, выведенному из начального согласования (4.6.1. Сообщение NewSessionTicket). Клиент может применять это отождествление PSK в последующем согласовании для использования соответствующего PSK. Если сервер воспринимает PSK, контекст защиты нового соединения криптографически привязывается к исходному (прежнему) соединению и выведенный из начального согласования ключ применяется для загрузки криптографического состояния взамен полного согласования. В TLS 1.2 и более ранних версиях эта функциональность обеспечивалась идентификаторами сессий и квитанциями сессий (session ticket) [RFC5077]. Оба эти механизма отменены в TLS 1.3.

Ключи PSK можно использовать в обмене ключами (EC)DHE для ранней секретности в сочетании с общими ключами или отдельно за счёт потери ранней секретности для данных приложения.

На рисунке 3 показаны два согласования, первое из которых создаёт PSK, а второе использует этот секрет.

       Клиент                                               Сервер

Начальное согласование
       ClientHello
       + key_share               -------->
                                                       ServerHello
                                                       + key_share
                                             {EncryptedExtensions}
                                             {CertificateRequest*}
                                                    {Certificate*}
                                              {CertificateVerify*}
                                                        {Finished}
                                 <--------    [Данные приложения*]
       {Certificate*}
       {CertificateVerify*}
       {Finished}                -------->
                                 <--------      [NewSessionTicket]
       [Данные приложения]       <------->     [Данные приложения]

Последующее согласование
       ClientHello
       + key_share*
       + pre_shared_key          -------->
                                                       ServerHello
                                                  + pre_shared_key
                                                      + key_share*
                                             {EncryptedExtensions}
                                                        {Finished}
                                 <--------    [Данные приложения*]
       {Finished}                -------->
       [Данные приложения]       <------->     [Данные приложения]

Рисунок 3. Поток сообщений для восстановления и PSK.


Поскольку подлинность сервера проверяется с помощью PSK, он не передаёт сообщений Certificate и CertificateVerify. Когда клиент предлагает восстановление с помощью PSK, ему следует также представить серверу расширение key_share, чтобы тот мог при необходимости отвергнуть восстановление и вернуться к полному согласованию. Сервер отвечает расширением pre_shared_key для согласования использования PSK и может (как показано здесь) ответить расширением key_share для организации ключей (EC)DHE, обеспечивающих раннюю секретность.

Когда ключ PSK предоставляется по отдельному каналу (out of band), должны быть предоставлены также отождествление PSK и алгоритм хэширования KDF, которые будут применяться с PSK.

Примечание. При использовании переданного заранее по отдельному каналу ключа важен вопрос достаточности энтропии при создании ключа, как описано в [RFC4086]. Создание общего секрета на основе пароля или другого источника с малой энтропией не обеспечивает достаточной защиты. Секреты с малой энтропией или пароли взламываются с помощью атак по словарю, основанных на механизме привязки PSK. Указанная проверка подлинности PSK не является надёжным обменом ключами даже при использовании метода Diffie-Hellman. В частности, это не мешает атакующему, который может наблюдать согласование, провести атаку путём подбора (brute-force) пароля или заранее известного ключа.

2.3. Данные 0-RTT

Когда клиент и сервер применяют PSK (полученный извне или при предшествующем согласовании), TLS 1.3 позволяет клиентам сразу передавать данные (early data). Клиент применяет PSK для аутентификации сервера и шифрования.

Как показано на рисунке 4, данные 0-RTT просто добавляются к согласованию 1-RTT при первой передаче (first flight). Остальная часть согласования использует те же сообщения, что и согласование 1-RTT с восстановлением PSK.

Клиент                                               Сервер

ClientHello
+ early_data
+ key_share*
+ psk_key_exchange_modes
+ pre_shared_key
(Данные приложения*)     -------->
                                                ServerHello
                                           + pre_shared_key
                                               + key_share*
                                      {EncryptedExtensions}
                                              + early_data*
                                                 {Finished}
                        <--------      [Данные приложения*]
(EndOfEarlyData)
{Finished}              -------->
[Данные приложения]     <------->       [Данные приложения]

+ заслуживающие внимания расширения из ранее отмеченного сообщения;
* необязательные или зависящие от ситуации сообщения или расширения;
() сообщения, защищённые с помощью ключа, выведенного из client_early_traffic_secret;
{} сообщения, защищённые ключом на основе [sender]_handshake_traffic_secret;
[] сообщения, защищённые ключом на основе [sender]_application_traffic_secret_N.

Рисунок 4. Поток сообщений для 0-RTT Handshake.


Примечание для разработчиков. Защитные свойства для данных 0-RTT слабее, чем для остальных данных TLS.

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

  2. Нет гарантии защиты от повторного использования (replay) между соединениями. Защита от повторного использования для обычных данных TLS 1.3 1-RTT обеспечивается с помощью серверного значения Random, но данные 0-RTT не зависят от ServerHello и поэтому имеют более слабые гарантии. Это особенно актуально при аутентификации данных с помощью проверки подлинности клиента TLS или в рамках прикладного протокола. Эти предупреждения относятся и к любому использованию early_exporter_master_secret.

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

3. Язык представления

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

3.1. Размер базового блока

Представление всех элементов данных описано в явной форме. Базовый блок данных имеет размер 1 байт (8 битов). Многобайтовые элементы данных объединяются (конкатенация) слева направо и сверху вниз. Из байтового потока многобайтовый элемент (например, число) формируется следующим образом (используется нотация языка C)

значение = (байт[0] << 8*(n-1)) | (байт[1] << 8*(n-2)) | ... | байт[n-1];

Для многобайтовых значений используется сетевой порядок следования байтов15.

3.2. Различные элементы

Текст комментария начинается с символов /* и заканчивается символами */.

Необязательные компоненты заключены в двойные квадратные скобки [[ ]].

Однобайтовые элементы, содержащие неинтерпретируемые данные, имеют тип opaque16.

Псевдоним T’ для имеющегося типа T определяется в виде

      T T';

3.3. Числа

Базовым числовым элементом является беззнаковый байт uint8. Все остальные типы чисел формируются из базового типа путём описанной в параграфе 3.1 конкатенации фиксированного числа байтов. Ниже перечислены предопределённые типы чисел.

      uint8 uint16[2];
      uint8 uint24[3];
      uint8 uint32[4];
      uint8 uint64[8];

Все числовые значения, используемые в данной спецификации, сохраняются в сетевом порядке байтов. Число uint32, представленное шестнадцатеричными байтами 01 02 03 04, эквивалентно десятичному значению 16909060.

3.4. Векторы

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

T T'[n];

Вектор T’ в потоке данных занимает n байтов T. Размер вектора не включается в кодированный поток данных.

В приведённом ниже примере Datum определяется как три последовательных байта, которые протокол не интерпретирует, а Data — как три последовательных элемента Datum, занимающих в общей сложности 9 байтов.

    opaque Datum[3];      /* три неинтерпретируемых байта */
    Datum Data[9];        /* 3 последовательных 3-байтовых вектора */

Векторы переменной длины определяются с указанием допустимого диапазона размеров (включая крайние значения) в форме <floor..ceiling>. При кодировании в поток данных перед самим вектором помещается его реальный размер. Размер задаётся в форме числа, занимающего столько байтов, сколько требуется для хранения максимального (ceiling) размера вектора. Вектор переменной длины, имеющий нулевой размер, указывается как пустой вектор.

      T T'<floor..ceiling>;

В приведённом ниже примере mandatory представляет собой вектор типа opaque размером от 300 до 400 байтов. Такой вектор никогда не может быть пустым. Поле размера занимает два байта (uint16), что достаточно для записи максимальной длины вектора 400 (3.3. Числа). Вектор longer может представлять до 800 байтов данных или до 400 элементов uint16 и может быть пустым. Кодирование вектора включает двухбайтовое поле размера, предшествующее вектору. Размер кодированного вектора должен быть кратным размеру одного элемента (например, значение 17 для вектора uint16 будет некорректным).

      opaque mandatory<300..400>;
            /* поле размера занимает 2 байта, вектор не может быть пустым */
      uint16 longer<0..800>;
            /* от 0 до 400 16-битовых целых чисел без знака */

3.5. Перечисляемые значения

Используется также дополнительный тип данных — перечисляемые значения enum. Каждое определение задаёт новый тип. Сравниваться и присваиваться могут только перечисляемые значения одного типа. Каждому элементу перечисляемого типа должно быть присвоено значение, как показано в приведённом ниже примере. Поскольку элементы перечисляемого типа не упорядочены, каждый элемент должен иметь уникальное значение.

      enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te;

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

Перечисляемые значения занимают в потоке байтов столько места, сколько нужно для записи значения самого большого элемента данного перечисляемого типа. Элементы определённого ниже перечисляемого типа Color будут занимать в потоке по 1 байту.

      enum { red(3), blue(5), white(7) } Color;

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

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

      enum { sweet(1), sour(2), bitter(4), (32000) } Taste;

Имена элементов перечисляемого типа доступны только в контексте данного типа. В первом примере полная ссылка на второй элемент типа Color будет иметь вид Color.blue. Полная форма представления не требуется, если целью присваивания является полностью определённый элемент.

      Color color = Color.blue;     /* полная форма, корректно */
      Color color = blue;           /* корректно, тип задан неявно */

Имена перечисляемых элементов не обязаны быть уникальными. Числовое значение может описывать диапазон, к которому применимо одно имя. Значение включает минимальное и максимальное (включительно) значения диапазона, разделённые двумя точками. Это полезно в основном для резервирования областей в пространстве значений.

      enum { sad(0), meh(1..254), happy(255) } Mood;

3.6. Составные типы

Из примитивов могут создаваться составные типы. Каждая спецификация составного типа задаёт новый уникальный тип. Синтаксис похож на синтаксис структур языка C.

      struct {
          T1 f1;
          T2 f2;
          ...
          Tn fn;
      } T;

Разрешены векторные поля фиксированного и переменного размера, использующие стандартный синтаксис векторов. Структуры V1 и V2 в параграфе 3.8. Варианты показывают это.

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

3.7. Константы

Полям и переменным могут назначаться фиксированные значения с использованием знака равенства =

      struct {
          T1 f1 = 8;  /* T.f1 всегда должно иметь значение 8 */
          T2 f2;
      } T;

3.8. Варианты

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

      struct {
          T1 f1;
          T2 f2;
          ....
          Tn fn;
          select (E) {
              case e1: Te1 [[fe1]];
              case e2: Te2 [[fe2]];
              ....
              case en: Ten [[fen]];
          };
      } Tv;

Например,

      enum { apple(0), orange(1) } VariantTag;

      struct {
          uint16 number;
          opaque string<0..10>; /* переменный размер */
      } V1;

      struct {
          uint32 number;
          opaque string[10];    /* фиксированный размер */
      } V2;

      struct {
          VariantTag type;
          select (VariantRecord.type) {
              case apple:  V1;
              case orange: V2;
          };
      } VariantRecord;

4. Протокол согласования

Протокол Handshake служит для согласования параметров защиты соединения. Сообщения согласования передаются уровню записи TLS, где они инкапсулируются в одну или несколько структур TLSPlaintext или TLSCiphertext, которые обрабатываются и передаются в соответствии с активным в данный момент состоянием.

      enum {
          client_hello(1),
          server_hello(2),
          new_session_ticket(4),
          end_of_early_data(5),
          encrypted_extensions(8),
          certificate(11),
          certificate_request(13),
          certificate_verify(15),
          finished(20),
          key_update(24),
          message_hash(254),
          (255)
      } HandshakeType;

      struct {
          HandshakeType msg_type;    /* тип согласования */
          uint24 length;             /* оставшиеся байты сообщения */
          select (Handshake.msg_type) {
              case client_hello:          ClientHello;
              case server_hello:          ServerHello;
              case end_of_early_data:     EndOfEarlyData;
              case encrypted_extensions:  EncryptedExtensions;
              case certificate_request:   CertificateRequest;
              case certificate:           Certificate;
              case certificate_verify:    CertificateVerify;
              case finished:              Finished;
              case new_session_ticket:    NewSessionTicket;
              case key_update:            KeyUpdate;
          };
      } Handshake;

Протокольные сообщения должны передаваться в порядке, заданном в параграфе 4.4.1. Transcript-Hash и показанном на рисунках в разделе 2. Обзор протокола. Партнёр, получивший сообщения согласования в неожиданном порядке, должен прервать согласование с сигналом unexpected_message.

Новые сообщения согласования назначаются IANA, как описано в разделе 11. Взаимодействие с IANA.

4.1. Сообщения обмена ключами

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

4.1.1. Криптографическое согласование

В TLS криптографическое согласование выполняется клиентом и предлагает перечисленные ниже 4 набора опций в сообщении ClientHello.

  • Список шифров, указывающий алгоритм AEAD/хэш-пары HKDF, которые поддерживает клиент.

  • Расширение supported_groups (4.2.7. Поддерживаемые группы), которое показывает поддерживаемые клиентом группы (EC)DHE и расширение key_share (4.2.8. Совместное использование ключа), содержащее общие значения (EC)DHE для всех или части этих групп.

  • Расширение signature_algorithms (4.2.3. Алгоритмы подписи), указывающее алгоритмы подписи, которые клиент может воспринимать. Расширение signature_algorithms_cert (4.2.3. Алгоритмы подписи) может добавляться для указания специфических для сертификата алгоритмов подписи.

  • Расширение pre_shared_key (4.2.11. Расширение PSK) со списком отождествлений симметричных ключей, известных клиенту, и расширение psk_key_exchange_modes (4.2.9. Режимы обмена ключами PSK), которое указывает режимы обмена ключами, подходящие для использования с PSK.

Если сервер не выбирал PSK, первые 3 параметра будут ортогональны — сервер независимо выбирает шифр, группу (EC)DHE и ключ, применяемый для создания ключа, а также пару алгоритм-сертификат, используемую для подтверждения своей подлинности клиенту. Если нет пересечений между полученным supported_groups и поддерживаемыми сервером группами, сервер должен прервать согласование с возвратом сигнала handshake_failure или insufficient_security.

Если сервер выбрал PSK, он должен также выбрать режим организации ключей из набора, указанного в клиентском расширении psk_key_exchange_modes (только PSK или PSK вместе с (EC)DHE). Отметим, что при использовании PSK без (EC)DHE отсутствие пересечения параметров supported_groups не будет критичным, как при отказе от PSK, описанном выше. Если сервер выбрал группу (EC)DHE, а клиент не предложил совместимого расширения key_share в начальном ClientHello, сервер должен ответить сообщением HelloRetryRequest (4.1.4. Запрос повтора Hello).

Если сервер выбрал параметры и не требуется передавать HelloRetryRequest, он указывает выбранные параметры в ServerHello, как показано ниже.

  • При использовании PSK сервер передаёт расширение pre_shared_key, указывающее выбранный ключ.

  • При использовании (EC)DHE сервер включает расширение key_share. Если PSK не будет применяться, всегда используется (EC)DHE и аутентификация на основе сертификатов.

  • При аутентификации по сертификату сервер будет передавать сообщения Certificate (4.4.2. Сообщение Certificate) и CertificateVerify (4.4.3. Сообщение CertificateVerify). В TLS 1.3 в соответствии с данным документом всегда применяется PSK или сертификат, но не могут использоваться сразу оба. Будущие документы могут определить совместное использование.

Если сервер не может согласовать набор параметров (т. е. параметры клиента и сервера не пересекаются), он должен прервать согласование с критическим сигналом handshake_failure или insufficient_security (6. Протокол Alert).

4.1.2. Клиентское сообщение Hello

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

  • Если в HelloRetryRequest было указано расширение key_share, список секретов заменяется списком с одной записью KeyShareEntry из указанной группы.

  • При наличии расширения early_data (4.2.10. Индикация ранних данных) оно удаляется. Ранняя передача данных не разрешена после HelloRetryRequest.

  • Включается расширение cookie, если оно присутствует в HelloRetryRequest.

  • При наличии расширения pre_shared_key оно обновляется путём повторного расчёта obfuscated_ticket_age и значений привязок, а также (необязательно) удаления PSK, не совместимых с указанным сервером шифром.

  • Необязательное добавление, удаление или изменение размера расширения padding [RFC7685].

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

Поскольку TLS 1.3 запрещает повторное согласование, сервер должен прервать соединение с возвратом сигнала unexpected_message, если он согласовал TLS 1.3 и потом получил сообщение ClientHello.

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

Структура сообщения приведена ниже.

      uint16 ProtocolVersion;
      opaque Random[32];

      uint8 CipherSuite[2];    /* Селектор криптографического набора (шифра) */

      struct {
          ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
          Random random;
          opaque legacy_session_id<0..32>;
          CipherSuite cipher_suites<2..2^16-2>;
          opaque legacy_compression_methods<1..2^8-1>;
          Extension extensions<8..2^16-1>;
      } ClientHello;

legacy_version

В прежних версиях TLS это поле служило для согласования версии и указывало старший номер поддерживаемой клиентом версии. Опыт показал, что многие серверы некорректно реализуют согласование версий, что ведёт к «непереносимости», когда сервер отвергает приемлемое по остальным параметрам сообщение ClientHello с номером версии выше поддерживаемого сервером. В TLS 1.3 клиент указывает предпочитаемую версию в расширении supported_versions (4.2.1. Поддерживаемые версии), а в поле legacy_version должно быть указано значение 0x0303, соответствующее TLS 1.2. Сообщения TLS 1.3 ClientHello идентифицируются по полю legacy_version = 0x0303 и расширению supported_versions со значением 0x0304 в качестве старшего поддерживаемого номера версии (совместимость с ранними версиями рассмотрена в Приложении D).

random

32 байта, созданные защищённым генератором случайных чисел (Приложение C).

legacy_session_id

Версии TLS до 1.3 поддерживали функцию возобновления сессии (session resumption), которая в данной версии была объединена с PSK (2.2. Восстановление и PSK). Клиенту, который имеет кэшированный идентификатор сессии, установленный сервером более ранней (до TLS 1.3), следует поместить в поле значение этого идентификатора. В режиме совместимости (Приложение D.4) это поле должно быть непустым, поэтому клиент, не предлагающий сессию до TLS 1.3, должен создать новое 32-байтовое значение. Это значение не обязано быть случайным, но ему следует быть непредсказуемым для предотвращения реализаций, фиксирующих определённое значение (называется окостенением — ossification). В остальных случаях значением должен быть вектор нулевого размера (однобайтовое поле со значением 0).

cipher_suites

Список опций симметричного шифра, поддерживаемых клиентом, в частности алгоритм защиты записей (включая размер секретного ключа) и алгоритм хэширования для использования с HKDF, в порядке убывания предпочтений клиента. Значения определены в Приложении B.4. Если список содержит непонятные, неподдерживаемые или нежелательные для сервера шифры, сервер должен игнорировать их и обрабатывать остальные как обычно. Если клиент пытается организовать ключ PSK, ему следует анонсировать хотя бы один шифр, указывающий значение Hash, связанное с PSK.

legacy_compression_methods

Версии TLS до 1.3 использовали компрессию и передавали в этом поле список поддерживаемых методов сжатия. Для каждого сообщения TLS 1.3 ClientHello этот вектор должен содержать в точности 1 байт со значением 0, который указывал отсутствие (null) сжатия в предыдущих версиях TLS. Если принято сообщение TLS 1.3 ClientHello с другим значением в этом поле, сервер должен прервать согласование с сигналом illegal_parameter. Отметим, что серверы TLS 1.3 могут получать сообщения ClientHellos TLS 1.2 и других версий с указанием методов компрессии (если согласована предыдущая версия протокола) и должны считать их действительными.

extensions

Клиенты запрашивают у сервера расширение функциональности с помощью поля расширений, формат которого определён в параграфе 4.2. Расширения. В TLS 1.3 использование некоторых расширений обязательно, поскольку функциональность была перенесена в расширения с целью сохранения совместимости сообщений ClientHello с прежними версиями TLS. Серверы должны игнорировать непонятные расширения.

Все версии TLS разрешают помещать поле extensions вслед за compression_methods. Сообщения TLS 1.3 ClientHello всегда содержат расширения (как минимум supported_versions, поскольку иначе они будут считаться сообщениями TLS 1.2). Однако серверы TLS 1.3 могут получать сообщения ClientHello без поля extensions от клиентов с прежними версиями TLS. Наличие расширений можно обнаружить по байтам после поля compression_methods в конце ClientHello. Отметим, что этот способ обнаружения необязательных данных отличается от обычного в TLS использования полей переменного размера и выбран для совместимости с определёнными раньше расширениями. Серверы TLS 1.3 должны сразу выполнять такую проверку и попытаться согласовать TLS 1.3 лишь при наличии расширения supported_versions. Если согласована версия TLS до 1.3, сервер должен убедиться, что сообщение не содержит данных после поля legacy_compression_methods или содержит там пригодный блок расширений, за которым не следует данных. В противном случае он должен прервать согласование с сигналом decode_error.

Если сервер не поддерживает запрошенную в расширении функциональность, клиент может прервать согласование.

После отправки сообщения ClientHello клиент ждёт в ответ ServerHello или HelloRetryRequest. Если используется ранняя передача данных, клиент может передать Application Data (2.3. Данные 0-RTT) до следующего согласующего сообщения.

4.1.3. Серверное сообщение Hello

Сервер будет передавать это сообщение в ответ на ClientHello для выполнения процедуры согласования подходящего набора параметров на основе ClientHello.

Структура сообщения приведена ниже.

      struct {
          ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
          Random random;
          opaque legacy_session_id_echo<0..32>;
          CipherSuite cipher_suite;
          uint8 legacy_compression_method = 0;
          Extension extensions<6..2^16-1>;
      } ServerHello;

legacy_version

В прежних версиях TLS это поле служило для согласования версий и содержало номер выбранной для соединения версии. Однако некоторые промежуточные устройства сталкивались с отказами при добавлении новой версии. В TLS 1.3 сервер указывает версию в расширении supported_versions (4.2.1. Поддерживаемые версии), а поле legacy_version должно иметь значение 0x0303 (TLS 1.2). Вопросы совместимости рассмотрены в Приложении D.

random

32 байта, созданные защищённым генератором случайных чисел (Приложение C). Последние 8 байтов должны переписываться, как указано ниже, если согласована версия TLS 1.2 или TLS 1.1, но остальные биты должны быть случайными. Эта структура генерируется сервером и должна создаваться независимо от ClientHello.random.

legacy_session_id_echo

Содержимое клиентского поля legacy_session_id. Отметим, что это поле возвращается даже в том случае, когда клиентское значение соответствует кэшированной версии до TLS 1.3, которую сервер решил не восстанавливать. Клиент, получивший значение legacy_session_id_echo, которое не соответствует переданному им в ClientHello, должен прервать согласование с сигналом illegal_parameter.

cipher_suite

Один шифр, выбранный сервером из списка ClientHello.cipher_suites. Клиент, получивший шифр, который он не предлагал, должен прервать согласование с сигналом illegal_parameter.

legacy_compression_method

Однобайтовое поле, которое должно иметь значение 0.

extensions

Список расширений. Сообщение ServerHello должно включать лишь те расширения, которые требуются для организации криптографического контекста и согласования версии протокола. Все сообщения TLS 1.3 ServerHello должны включать расширение supported_versions. В настоящее время сообщения ServerHello содержат также расширение pre_shared_key или key_share и могут включать оба (при использовании PSK с организацией ключа (EC)DHE). Остальные расширения (4.2. Расширения) передаются в отдельном сообщении EncryptedExtensions.

Для совместимости с промежуточными устройствами прежних версий (Приложение D.4), сообщение HelloRetryRequest имеет такую же структуру как ServerHello, но в поле Random указывается значение SHA-256 из HelloRetryRequest

     CF 21 AD 74 E5 9A 61 11 BE 1D 8C 02 1E 65 B8 91
     C2 A2 11 16 7A BB 8C 5E 07 9E 09 E2 C8 A8 33 9C

При получении сообщения с типом server_hello реализация должна сначала проверить значение Random и при совпадении с указанным выше выполнять обработку в соответствии с параграфом 4.1.4. Запрос повтора Hello.

TLS 1.3 имеет механизм защиты от понижения версии, встроенный в случайное значение сервера. Сервер TLS 1.3, который согласовал версию TLS 1.2 или ниже в ответ на ClientHello, должен установить специальное значение в последних 8 байтах поля Random в сообщении ServerHello.

Если согласована версия TLS 1.2, сервер TLS 1.3 должен установить

     44 4F 57 4E 47 52 44 01

Если согласована версия TLS 1.1 или ниже, сервер TLS 1.3 должен, а серверу TLS 1.2 следует установить для 8 последних байтов ServerHello.Random значение

     44 4F 57 4E 47 52 44 00

Клиенты TLS 1.3, получившие сообщение ServerHello, указывающее версию TLS 1.2 или ниже, должны проверить последние 8 байтов случайного значения на предмет совпадения с любой из указанных выше последовательностей. Клиентам TLS 1.2 следует проверить последние 8 на предмет совпадения со вторым значением, если в ServerHello указана версия TLS 1.1 или ниже. При совпадении значений клиент должен прервать согласование с сигналом illegal_parameter. Этот механизм обеспечивает ограниченную защиту от атак на понижение версии в дополнение к защите с помощью обмена Finished — поскольку сообщение ServerKeyExchange, присутствующее в TLS 1.2 и ниже, включает подпись учитывающую оба шифрованных значения, активный атакующий не сможет незаметно поменять случайные значения при использовании эфемерных шифров. При использовании статического шифра RSA защиты от понижения версии не обеспечивается.

Примечание. Это отличается от [RFC5246], поэтому на практике многие клиенты и серверы TLS 1.2 не будут вести себя, как указано выше.

Устаревший клиент TLS, выполняющий повторное согласование с TLS 1.2 или более ранней версией и получивший при этом сообщение TLS 1.3 ServerHello, должен прервать согласование с сигналом protocol_version. Отметим, что при выборе версии TLS 1.3 повторное согласование невозможно.

4.1.4. Запрос повтора Hello

Сервер передаёт сообщение HelloRetryRequest в ответ на ClientHello, если он смог найти подходящий набор параметров, но в ClientHello недостаточно информации для обработки согласования. Как указано в параграфе 4.1.3, HelloRetryRequest имеет такой же формат, как сообщение ServerHello, а поля legacy_version, legacy_session_id_echo, cipher_suite и legacy_compression_method имеют такой же смысл. Однако для удобства HelloRetryRequest рассматривается здесь как отдельное сообщение.

Расширения сервера должны содержать supported_versions, а также следует включать минимальный набор расширений, требуемых клиенту для генерации корректной пары ClientHello. Как и для ServerHello в сообщения HelloRetryRequest недопустимо включать какие-либо расширения, которые не были предложены клиентом в сообщении ClientHello, за исключением необязательного расширения cookie (4.2.2. Cookie).

При получении HelloRetryRequest клиент должен проверить поля legacy_version, legacy_session_id_echo, cipher_suite и legacy_compression_method, как указано в параграфе 4.1.3, а затем обработать расширения, начав с определения версии из поля supported_versions. Клиент должен прервать согласование с сигналом illegal_parameter, если HelloRetryRequest не будет приводить к какому-либо изменению ClientHello. Если клиент получает второе сообщение HelloRetryRequest в том же соединении (т. е. в ответ сообщение ClientHello, которое уже является ответом на HelloRetryRequest), он должен прервать согласование с сигналом unexpected_message.

В остальных случаях клиент должен обработать все расширения в HelloRetryRequest и передать второе (обновлённое) сообщение ClientHello. Определённые этой спецификацией для HelloRetryRequest расширения включают:

  • supported_versions (4.2.1. Поддерживаемые версии);
  • cookie (4.2.2. Cookie);
  • key_share (4.2.8. Совместное использование ключа).

Клиент, получивший шифр, который он не предлагал, должен прервать согласование. Серверы должны гарантировать согласование того же шифра при получении соответствующего обновлённого сообщения ClientHello (если сервер выбрал шифр на первом этапе согласования, это произойдёт автоматически). При получении ServerHello клиенты должны проверить совпадение шифра в ServerHello с предложенным в HelloRetryRequest и при расхождении прервать согласование с сигналом illegal_parameter.

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

Значение selected_version из расширения supported_versions в сообщении HelloRetryRequest должно сохраняться в ServerHello и клиент должен прерывать согласование с сигналом illegal_parameter, если получено другое значение.

4.2. Расширения

Многие сообщения TLS содержат расширения в формате TLV17.

    struct {
        ExtensionType extension_type;
        opaque extension_data<0..2^16-1>;
    } Extension;

    enum {
        server_name(0),                             /* RFC 6066 */
        max_fragment_length(1),                     /* RFC 6066 */
        status_request(5),                          /* RFC 6066 */
        supported_groups(10),                       /* RFC 8422, 7919 */
        signature_algorithms(13),                   /* RFC 8446 */
        use_srtp(14),                               /* RFC 5764 */
        heartbeat(15),                              /* RFC 6520 */
        application_layer_protocol_negotiation(16), /* RFC 7301 */
        signed_certificate_timestamp(18),           /* RFC 6962 */
        client_certificate_type(19),                /* RFC 7250 */
        server_certificate_type(20),                /* RFC 7250 */
        padding(21),                                /* RFC 7685 */
        pre_shared_key(41),                         /* RFC 8446 */
        early_data(42),                             /* RFC 8446 */
        supported_versions(43),                     /* RFC 8446 */
        cookie(44),                                 /* RFC 8446 */
        psk_key_exchange_modes(45),                 /* RFC 8446 */
        certificate_authorities(47),                /* RFC 8446 */
        oid_filters(48),                            /* RFC 8446 */
        post_handshake_auth(49),                    /* RFC 8446 */
        signature_algorithms_cert(50),              /* RFC 8446 */
        key_share(51),                              /* RFC 8446 */
        (65535)
    } ExtensionType;
  • extension_type указывает конкретный тип расширения.

  • extension_data содержит информацию, относящуюся к определённому типу расширения.

Список типов расширений поддерживается IANA, как описано в разделе 11.

Расширения обычно представлены парами запрос-отклик, но некоторые являются просто указаниями без соответствующих откликов. Клиент передаёт свои запросы расширений в сообщении ClientHello, а сервер возвращает отклики в сообщениях ServerHello, EncryptedExtensions, HelloRetryRequest и Certificate. Сервер передаёт запросы расширений в сообщении CertificateRequest, на которое клиент может ответить сообщением Certificate. Сервер может также передавать незапрошенные расширения в NewSessionTicket, хотя клиент не отвечает на них непосредственно.

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

Приведённая ниже таблица указывает сообщения, в которых может присутствовать каждое из расширений (CH — ClientHello, SH — ServerHello, EE — EncryptedExtensions, CT — Certificate, CR — CertificateRequest, NST — NewSessionTicket, HRR — HelloRetryRequest). Если реализация получает расширение, которое понятно, но не предназначено для данного сообщения, она должна прервать согласование с сигналом illegal_parameter.

 

Расширение

TLS 1.3

server_name [RFC6066]

CH, EE

max_fragment_length [RFC6066]

CH, EE

status_request [RFC6066]

CH, CR, CT

supported_groups [RFC7919]

CH, EE

signature_algorithms (RFC 8446)

CH, CR

use_srtp [RFC5764]

CH, EE

heartbeat [RFC6520]

CH, EE

application_layer_protocol_negotiation [RFC7301]

CH, EE

signed_certificate_timestamp [RFC6962]

CH, CR, CT

client_certificate_type [RFC7250]

CH, EE

server_certificate_type [RFC7250]

CH, EE

padding [RFC7685]

CH

key_share (RFC 8446)

CH, SH, HRR

pre_shared_key (RFC 8446)

CH, SH

psk_key_exchange_modes (RFC 8446)

CH

early_data (RFC 8446)

CH, EE, NST

cookie (RFC 8446)

CH, HRR

supported_versions (RFC 8446)

CH, SH, HRR

certificate_authorities (RFC 8446)

CH, CR

oid_filters (RFC 8446)

CR

post_handshake_auth (RFC 8446)

CH

signature_algorithms_cert (RFC 8446)

CH, CR

 

При наличии разнотипных расширений они могут размещаться в произвольном порядке, за исключением того, что расширение pre_shared_key (4.2.11. Расширение PSK) должно быть последним в сообщении ClientHello (но может указываться в любом месте блока расширений ServerHello). В блоке расширений недопустимо наличие нескольких однотипных расширений.

В TLS 1.3 (в отличие от TLS 1.2) расширения согласуются для каждого «приветствия» (handshake) даже в режиме resumption-PSK. Однако при расхождении параметров 0-RTT с согласованными в предыдущем приветствии может потребоваться отвергнуть 0-RTT (4.2.10. Индикация ранних данных).

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

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

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

4.2.1. Поддерживаемые версии

      struct {
          select (Handshake.msg_type) {
              case client_hello:
                   ProtocolVersion versions<2..254>;

              case server_hello: /* и HelloRetryRequest */
                   ProtocolVersion selected_version;
          };
      } SupportedVersions;

Расширение supported_versions используется клиентами для указания поддерживаемых версий TLS и серверами для указания используемой версии. Расширение содержит список поддерживаемых версий в порядке снижения предпочтений. Реализации данной спецификации должны передавать это расширение в ClientHello с указанием всех версий TLS, которые они готовы согласовать (для данной спецификации это означает значение 0x0304, но при поддержке других версий TLS они также должны быть указаны). Если этого расширения нет и сервер, соответствующий данной спецификации, поддерживает также TLS 1.2, он должен согласовывать TLS 1.2 и более ранние версии в соответствии с [RFC5246], даже если ClientHello.legacy_version содержит 0x0304 или более позднюю версию. Сервер может прервать согласование при получении ClientHello с legacy_version = 0x0304 или выше.

Если это расширение включено в ClientHello, серверу недопустимо использовать значение ClientHello.legacy_version для согласования версии и он должен применять для определения клиентских предпочтений лишь расширение supported_versions. Сервер должен выбирать только версию TLS, предложенную в этом расширении, и должен игнорировать все неизвестные версии из расширения. Отметим, что этот механизм позволяет согласовать версии до TLS 1.2, если одна сторона поддерживает «разреженный» диапазон. Реализациям TLS 1.3, которые выбрали поддержку предыдущих версий TLS, следует поддерживать TLS 1.2. Серверы должны быть готовы к приёму сообщений ClientHello, включающих это расширение без значения 0x0304 в числе поддерживаемых версий.

Сервер, который согласует версию TLS до TLS 1.3, должен установить ServerHello.version, а передача расширения supported_versions для него недопустима. Сервер, согласующий TLS 1.3, должен отвечать отправкой расширения supported_versions, содержащего значение выбранной версии (0x0304). Он должен установить в поле ServerHello.legacy_version значение 0x0303 (TLS 1.2). Клиенты должны проверять это расширение до обработки остальной части ServerHello (хотя они должны разобрать ServerHello для считывания этого расширения). Если данное расширение присутствует, клиент должен игнорировать значение ServerHello.legacy_version и должен применять для определения выбранной версии лишь расширение supported_versions. Если расширение supported_versions в ServerHello содержит версию, не предлагавшуюся клиентом, или версию до TLS 1.3, клиент должен прервать согласование с сигналом illegal_parameter.

4.2.2. Cookie

      struct {
          opaque cookie<1..2^16-1>;
      } Cookie;

Расширение cookie служит двум основным целям.

  • Разрешить серверу заставлять клиента демонстрировать доступность по видимому сетевому адресу (некоторая мера защиты от DoS-атак). Это полезно в первую очередь для транспорта без организации соединений (пример представлен в [RFC6347]).

  • Разрешить серверу выгрузку состояния клиенту, позволяющую передавать HelloRetryRequest без сохранения состояния. Сервер может делать это, включая хэш ClientHello в поле cookie сообщения HelloRetryRequest (с подходящей защитой целостности).

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

Когда сервер не хранит состояния, он может получить незащищённую запись типа change_cipher_spec между первым и вторым сообщениями ClientHello (5. Протокол Record). Поскольку сервер не хранит состояния, это будет выглядеть как первое принятое сообщение. При работе без сохранения состояний сервер должен игнорировать такие записи.

4.2.3. Алгоритмы подписи

TLS 1.3 поддерживает два расширения для индикации алгоритмов, которые могут применяться в цифровых подписях. Расширение signature_algorithms_cert применяется для подписей в сертификатах, а signature_algorithms, изначально включённое в TLS 1.2, — для подписей в сообщениях CertificateVerify. Ключи в сертификатах должны иметь тип, подходящий для используемых алгоритмов подписи. Для ключей RSA и подписей PSS возникает отдельный вопрос, рассмотренный ниже. При отсутствии расширения signature_algorithms_cert к подписям в сертификатах применяется расширение signature_algorithms. Клиенты, которые хотят, чтобы сервер подтвердил свою подлинность с помощью сертификата, должны передавать расширение signature_algorithms. Если сервер аутентифицируется по сертификату, а клиент не передал расширений signature_algorithms, сервер должен прервать согласование с сигналом missing_extension (см. 9.2. Обязательные расширения).

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

Поле extension_data в этом расширении содержит список SignatureSchemeList, показанный ниже.

      enum {
          /* Алгоритмы RSASSA-PKCS1-v1_5 */
          rsa_pkcs1_sha256(0x0401),
          rsa_pkcs1_sha384(0x0501),
          rsa_pkcs1_sha512(0x0601),

          /* Алгоритмы ECDSA */
          ecdsa_secp256r1_sha256(0x0403),
          ecdsa_secp384r1_sha384(0x0503),
          ecdsa_secp521r1_sha512(0x0603),

          /* Алгоритмы RSASSA-PSS с открытым ключом OID rsaEncryption*/
          rsa_pss_rsae_sha256(0x0804),
          rsa_pss_rsae_sha384(0x0805),
          rsa_pss_rsae_sha512(0x0806),

          /* Алгоритмы EdDSA */
          ed25519(0x0807),
          ed448(0x0808),

          /* Алгоритмы RSASSA-PSS с открытым ключом OID RSASSA-PSS */
          rsa_pss_pss_sha256(0x0809),
          rsa_pss_pss_sha384(0x080a),
          rsa_pss_pss_sha512(0x080b),

          /* Унаследованные алгоритмы */
          rsa_pkcs1_sha1(0x0201),
          ecdsa_sha1(0x0203),

          /* Резервные коды */
          private_use(0xFE00..0xFFFF),
          (0xFFFF)
      } SignatureScheme;

      struct {
          SignatureScheme supported_signature_algorithms<2..2^16-2>;
      } SignatureSchemeList;

Примечание. Этот перечисляемый тип (enum) назван SignatureScheme потому, что уже имеется тип SignatureAlgorithm (TLS 1.2), который он заменяет. В тексте документа применяется термин «алгоритм подписи».

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

RSASSA-PKCS1-v1_5

Указывает алгоритм подписи, использующий RSASSA-PKCS1-v1_5 [RFC8017] с соответствующим алгоритмом хэширования, как определено в [SHS]. Эти значения относятся исключительно к подписям в сертификатах (4.4.2.2. Выбор сертификата сервера) и не определены для применения в подписанных сообщениях согласования TLS, хотя могут указываться в signature_algorithms и signature_algorithms_cert для совместимости с TLS 1.2.

ECDSA

Указывает алгоритм подписи, использующий ECDSA [ECDSA] с соответствующей кривой, как определено в ANSI X9.62 [ECDSA] и FIPS 186-4 [DSS], а также алгоритмом хэширования, как определено в [SHS]. Подпись представляется в форме структуры ECDSA-Sig-Value с DER-кодированием [X690] .

RSASSA-PSS RSAE

Указывает алгоритм подписи, использующий RSASSA-PSS [RFC8017] с функцией генерации маски 1. Дайджест, применяемый в функции генерации маски и подписываемый дайджест соответствуют алгоритму хэширования, определённому в [SHS]. Размер Salt должен совпадать с выходным размером алгоритма дайджеста. Если открытый ключ передаётся в сертификате X.509, он должен использовать rsaEncryption OID [RFC5280].

EdDSA

Указывает алгоритм подписи, использующий EdDSA, как указано в [RFC8032] и обновлениях. Отметим, что это соответствует алгоритмам PureEdDSA, а не вариантам prehash.

RSASSA-PSS PSS

Указывает алгоритм подписи, использующий RSASSA-PSS [RFC8017] с функцией генерации маски 1. Дайджест, применяемый в функции генерации маски, и подписываемый дайджест соответствуют алгоритму хэширования, определённому в [SHS]. Размер Salt должен совпадать с выходным размером алгоритма дайджеста. Если открытый ключ передаётся в сертификате X.509, он должен использовать RSASSA-PSS OID [RFC5756]. При использовании в подписях сертификатов для параметров алгоритма должно применяться DER-кодирование. При наличии параметров соответствующего открытого ключа параметры в подписи должны быть идентичны этим параметрам.

Устаревшие алгоритмы

Указывает алгоритмы, от использования которых отказались по причине наличия известных недостатков. В частности, это SHA-1 , который применяется в данном контексте с (1) RSA, использующим RSASSA-PKCS1-v1_5, или (2) ECDSA. Эти значения относятся исключительно к подписям, которые присутствуют в сертификатах (4.4.2.2. Выбор сертификата сервера), и не определены для подписанных сообщений согласования TLS, хотя могут появляться в signature_algorithms и signature_algorithms_cert для совместимости с TLS 1.2. Конечным точкам не следует согласовывать эти алгоритмы, но они разрешены для совместимости со старыми версиями. Предлагающие эти значения клиенты должны перечислять их с самым низким приоритетом (после всех других алгоритмов в SignatureSchemeList). Серверам TLS 1.3 недопустимо предлагать сертификаты с подписями SHA-1, если можно создать действительную цепочку подписей без таких сертификатов (параграф 4.4.2.2).

Подписи в самоподписанных сертификатах и сертификатах с привязками доверия не проверяются, поскольку они являются началом пути сертификации ([RFC5280], параграф 3.2). Сертификаты, начинающиеся с пути сертификации, могут использовать алгоритм подписи, который не анонсируется как поддерживаемый в расширении signature_algorithms.

Отметим, что в TLS 1.2 это расширение определено иначе. Реализации TLS 1.3, желающие согласовать TLS 1.2, должны вести себя в соответствии с требованиями [RFC5246] при согласовании этой версии.

  • В TLS 1.2 ClientHello это расширение можно пропускать.

  • В TLS 1.2 расширение содержит пары хэш-подпись. Эти пары кодируются двумя октетами, поэтому значения SignatureScheme были выбраны с учётом кодирования TLS 1.2. Некоторые устаревшие пары остались не выделенными, а соответствующие алгоритмы запрещены в TLS 1.3. Их недопустимо предлагать или согласовывать в реализации. В частности, недопустимо применять MD5 [SLOTH], SHA-224 и DSA.

  • Схемы подписи ECDSA соответствуют парам хэш-подпись TLS 1.2 ECDSA. Однако старая семантика не ограничивала кривые для подписей. При согласовании TLS 1.2 реализация должна быть готова к восприятию подписи, использующей любые кривые, которые анонсированы в расширении supported_groups.

  • Реализации, анонсирующие поддержку RSASSA-PSS (обязательная в TLS 1.3), должны быть готовы воспринимать подписи, использующие эту схему, даже при согласованной версии TLS 1.2. В TLS 1.2 алгоритм RSASSA-PSS используется с шифрами RSA.

4.2.4. Удостоверяющие центры

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

Телом расширения certificate_authorities является структура CertificateAuthoritiesExtension.

      opaque DistinguishedName<1..2^16-1>;

      struct {
          DistinguishedName authorities<3..2^16-1>;
      } CertificateAuthoritiesExtension;

authorities

Список отличительных имён [X501] воспринимаемых удостоверяющих центров в формате DER [X690]. Этот список задаёт отличительные имена для привязок доверия и подчинённых CA, поэтому сообщение может служить для описания известных привязок доверия, а также желаемого пространства полномочий.

Клиент может передавать расширение certificate_authorities в сообщении ClientHello, а сервер может передавать его в CertificateRequest.

Расширение trusted_ca_keys [RFC6066], которое служит для аналогичных целей, но более сложно, не применяется в TLS 1.3 (хотя может появляться в сообщениях ClientHello от клиентов, предлагающих прежние версии TLS).

4.2.5. Фильтры OID

Расширение oid_filters позволяет серверам представить набор пар OID-значение для сопоставления с сертификатами клиентов. Это расширение, если сервер его применяет, должно передаваться только в сообщении CertificateRequest.

      struct {
          opaque certificate_extension_oid<1..2^8-1>;
          opaque certificate_extension_values<0..2^16-1>;
      } OIDFilter;

      struct {
          OIDFilter filters<0..2^16-1>;
      } OIDFilterExtension;

filters

Список OID [RFC5280] расширений сертификатов с разрешёнными значениями в формате DER [X690]. Некоторые OID могут иметь несколько значений (например, Extended Key Usage). Если сервер указал непустой список фильтров, включенный в отклик сертификат клиента должен содержать все указанные OID расширений, которые клиент распознал. Для каждого OID расширения, распознанного клиентом, все указанные значения должны быть представлены в клиентском сертификате (сертификат может иметь и другие значения). Однако клиент должен игнорировать и пропускать нераспознанные OID расширений сертификатов. Если клиент игнорирует некоторые их требуемых OID и представляет сертификат, который не соответствует запросу, сервер может по своему усмотрению продолжить соединение без аутентификации клиента или прервать согласование с сигналом unsupported_certificate. Любое данное значение OID недопустимо включать в список фильтров более одного раза.

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

Этот документ определяет правила сопоставления для 2 стандартных расширений сертификатов, заданных в [RFC5280].

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

  • Расширение Extended Key Usage в сертификате соответствует запросу, когда все OID назначения ключа из запроса имеются также в расширении сертификата Extended Key Usage. В запросе недопустимо применять anyExtendedKeyUsage OID.

Правила для других расширений сертификатов могут быть определены в отдельных документах.

4.2.6. Аутентификация клиента после согласования

Расширение post_handshake_auth служит для индикации желания клиента выполнить аутентификацию post-handshake (4.6.2. Аутентификация после согласования). Серверам недопустимо передавать CertificateRequest после согласования клиентам, которые не предлагают это расширение. Серверам недопустимо передавать это расширение.

      struct {} PostHandshakeAuth;

Поле extension_data в расширении post_handshake_auth имеет нулевой размер.

4.2.7. Поддерживаемые группы

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

Примечание. В версиях TLS до TLS 1.3 это расширение называлось elliptic_curves и содержало лишь группы эллиптических кривых (см. [RFC8422] и [RFC7919]). Расширение применялось также для согласования кривых ECDSA. Алгоритмы подписи сейчас согласуются независимо (4.2.3. Алгоритмы подписи).

Поле extension_data этого расширения содержит значение NamedGroupList, показанное ниже.

      enum {
          /* Группы эллиптических кривых (ECDHE) */
          secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
          x25519(0x001D), x448(0x001E),

          /* Группы конечных полей (DHE) */
          ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
          ffdhe6144(0x0103), ffdhe8192(0x0104),

          /* Резервные коды */
          ffdhe_private_use(0x01FC..0x01FF),
          ecdhe_private_use(0xFE00..0xFEFF),
          (0xFFFF)
      } NamedGroup;

      struct {
          NamedGroup named_group_list<2..2^16-1>;
      } NamedGroupList;

Elliptic Curve Groups (ECDHE)

Указывает поддержку соответствующей именованной кривой, определённой в FIPS 186-4 [DSS] или [RFC7748]. Значения 0xFE00 — 0xFEFF зарезервированы для приватного использования [RFC8126].

Finite Field Groups (DHE)

Указывает поддержку соответствующей группы конечных полей, определённой в [RFC7919]. Значения 0x01FC — 0x01FF зарезервированы для приватного использования.

Элементы в named_group_list упорядочиваются по снижению предпочтительности для отправителя.

Начиная с TLS 1.3, серверам разрешено передавать клиенту расширение supported_groups. Клиентам недопустимо действовать в соответствии с информацией из supported_groups до завершения согласования, но они могут использовать информацию полученную после успешного согласования для смены групп, используемых в расширении key_share при последующих соединениях. Если на сервере есть группа, которую он предпочитает указанным в расширении key_share, но сервер все равно готов воспринять ClientHello, ему следует передать supported_groups для обновления клиентского представления о предпочтениях. В это расширение следует включать все группы, поддерживаемые сервером, независимо от их поддержки клиентом в данный момент.

4.2.8. Совместное использование ключа

Расширение key_share содержит криптографические параметры конечной точки. Клиенты могут передавать пустой вектор client_shares для запроса выбора группы сервером за счёт дополнительного кругового обхода (4.1.4. Запрос повтора Hello).

      struct {
          NamedGroup group;
          opaque key_exchange<1..2^16-1>;
      } KeyShareEntry;

group

Именованная группа для ключа.

key_exchange

Информация обмена ключами. Содержимое этого поля задаёт указанная группа и соответствующее определение. Параметры Finite Field Diffie-Hellman [DH76] описаны в параграфе 4.2.8.1. Параметры Diffie-Hellman, а Elliptic Curve Diffie-Hellman — в параграфе 4.2.8.2. Параметры ECDHE.

В сообщении ClientHello поле extension_data этого расширения содержит значение KeyShareClientHello.

      struct {
          KeyShareEntry client_shares<0..2^16-1>;
      } KeyShareClientHello;

client_shares

Список предлагаемых значений KeyShareEntry в порядке снижения предпочтительности для клиента.

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

Клиенты могут предлагать столько значений KeyShareEntry, сколько они указали поддерживаемых групп, каждая из которых представляет один набор параметров обмена ключами. Например, клиент может предложить совместное использование нескольких эллиптических кривых или групп FFDHE. Значения key_exchange для каждой KeyShareEntry должны генерироваться независимо. Клиентам недопустимо предлагать несколько значений KeyShareEntry для одной группы и недопустимо предлагать значения KeyShareEntry для групп, не указанных в клиентском расширении supported_groups. Серверы могут проверять эти правила и при нарушении прерывать согласование с сигналом illegal_parameter.

В сообщении HelloRetryRequest поле extension_data этого расширения содержит значение KeyShareHelloRetryRequest.

      struct {
          NamedGroup selected_group;
      } KeyShareHelloRetryRequest;

selected_group

Поддерживаемая обеими сторонами группа, которую сервер намерен согласовать и запрашивает повтор ClientHello/KeyShare.

При получении этого расширения в HelloRetryRequest клиент должен проверить, что (1) поле selected_group соответствует группе, которая была указана в расширении supported_groups исходного ClientHello, и (2) не соответствует группе, указанной в расширении key_share исходного ClientHello. Если любое из этих условий не выполняется, клиент должен прервать согласование с сигналом illegal_parameter. В остальных случаях при отправке нового ClientHello клиент должен заменить исходное расширение key_share другим, которое содержит лишь новое значение KeyShareEntry для группы, указанной в поле selected_group вызвавшего процесс сообщения HelloRetryRequest.

В сообщении ServerHello поле extension_data этого расширения содержит значение KeyShareServerHello.

      struct {
          KeyShareEntry server_share;
      } KeyShareServerHello;

server_share

Одно значение KeyShareEntry, относящееся к одной из общих с клиентом групп.

При использовании (EC)DHE для организации ключей сервер предлагает в точности 1 значение KeyShareEntry в ServerHello. Это значение должно быть из той же группы, что и KeyShareEntry, предложенное клиентом и выбранное сервером для согласованного обмена ключами. Серверу недопустимо передавать KeyShareEntry для какой-либо группы, не указанной в клиентском расширении supported_groups, а также недопустимо передавать KeyShareEntry при использовании psk_ke PskKeyExchangeMode. Если используется организация ключей (EC)DHE и клиентом получено сообщение HelloRetryRequest с расширением key_share, клиент должен убедиться в том, что выбранная группа NamedGroup в ServerHello совпадает с группой в HelloRetryRequest. Если это не выполняется, сервер должен прервать согласование с сигналом illegal_parameter.

4.2.8.1. Параметры Diffie-Hellman

Параметры Diffie-Hellman [DH76] для клиентов и серверов кодируются в неинтерпретируемом (opaque) поле key_exchange записи KeyShareEntry в структуре KeyShare. Поле содержит неинтерпретируемое открытое значение Diffie-Hellman (Y = gX mod p) для указанной группы (см. определения в [RFC7919]), представленное в виде целого числа (big-endian), дополняемого слева нулями до размера p байтов.

Примечание. Для данной группы Diffie-Hellman результат заполнения для всех открытых ключей будет давать одинаковый размер.

Партнёры должны проверить открытый ключ другой стороны Y, который должен иметь значение 1 < Y < p-1. Эта проверка гарантирует, что удалённый партнёр ведёт себя корректно и не вынуждает локальную систему входить в мелкую подгруппу.

4.2.8.2. Параметры ECDHE

Параметры ECDHE для клиентов и серверов кодируются в неинтерпретируемом (opaque) поле key_exchange записи KeyShareEntry в структуре KeyShare.

Для secp256r1, secp384r1 и secp521r1 содержимое является сериализованным представлением структуры

      struct {
          uint8 legacy_form = 4;
          opaque X[coordinate_length];
          opaque Y[coordinate_length];
      } UncompressedPointRepresentation;

X и Y, соответственно, являются двоичными представлениями значений x и y с сетевым порядком байтов. Здесь нет внутренних маркеров размера, поэтому каждое значение занимает число октетов, определяемое параметрами кривой. Для P-256 это означает, что X и Y используют по 32 октета с дополнением нулями слева при необходимости. Для P-384 они будут занимать по 48 октетов, для P-521 — по 66.

Для кривых secp256r1, secp384r1 и secp521r1 партнёры должны проверять, что значение открытого ключа другой стороны Q является действительной точкой эллиптической кривой. Подходящие процедуры проверки определены в параграфе 4.3.7 [ECDSA] и параграфе 5.6.2.3 [KEYAGREEMENT]. Проверка состоит из трёх этапов — (1) Q не является точкой в бесконечности (O), (2) для Q = (x, y) оба целых числа x и y находятся в корректном интервале и (3) пара (x, y) является корректным решением для уравнения эллиптической кривой. Для этих кривых от разработчиков не нужна проверка принадлежности к корректной подгруппе.

Для X25519 и X448 содержимым открытых значений являются байтовые строки ввода и вывода соответствующих функций, определённых в [RFC7748] — 32 байта для X25519 и 56 для X448.

Примечание. Версии TLS до 1.3 разрешают согласование формата точек, в версии TLS 1.3 от этого отказались в пользу одного формата для каждой кривой.

4.2.9. Режимы обмена ключами PSK

Для использования PSK клиент должен также передать расширение psk_key_exchange_modes. Семантика этого расширения заключается в том, что клиент поддерживает использование PSK только в режимах, которые ограничиваются набором из числа включённых в данное сообщение ClientHello и поддерживаемых сервером через NewSessionTicket.

Клиент должен представить расширение psk_key_exchange_modes, если он предлагает расширение pre_shared_key. Если клиент предлагает pre_shared_key без расширения psk_key_exchange_modes, сервер должен прервать согласование. Серверу недопустимо выбирать режим обмена ключами, не указанный клиентом. Это расширение также ограничивает режимы, используемые при восстановлении PSK. Серверам не следует передавать NewSessionTicket с квитанцией, которая не совместима с анонсированными режимами, однако если сервер делает это, эффект должен проявляться лишь в виде отказа при попытке восстановления клиентом.

Серверам недопустимо передавать расширение psk_key_exchange_modes.

      enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;

      struct {
          PskKeyExchangeMode ke_modes<1..255>;
      } PskKeyExchangeModes;

psk_ke

Организация ключей с использованием только PSK. В этом режиме серверу недопустимо представлять значение key_share.

psk_dhe_ke

Организация ключей на основе PSK с (EC)DHE. В этом режиме сервер должен представлять значения key_share, как описано в параграфе 4.2.8. Совместное использование ключа.

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

4.2.10. Индикация ранних данных

Когда применяется PSK и ранние данные для этого PSK разрешены, клиент может передавать данные приложений в первой отправке сообщений. Если клиент делает это, он должен представить оба расширения pre_shared_key и early_data.

Поле extension_data этого расширения содержит значение EarlyDataIndication.

      struct {} Empty;

      struct {
          select (Handshake.msg_type) {
              case new_session_ticket:   uint32 max_early_data_size;
              case client_hello:         Empty;
              case encrypted_extensions: Empty;
          };
      } EarlyDataIndication;

Использование поля max_early_data_size подробно описано в параграфе 4.6.1. Сообщение NewSessionTicket.

Параметры для данных 0-RTT (версия, симметричный шифр, протокол ALPN18 [RFC7301] и т. п.) связаны с применяемым PSK. Для внешних PSK связанные значения представляются вместе с ключом. Для PSK, организованных через сообщения NewSessionTicket, связанные значения согласуются в соединении, где организуется PSK. Ключ PSK, используемый для шифрования ранних данных, должен быть первым PSK в клиентском расширении pre_shared_key.

Для PSK, предоставленных с помощью NewSessionTicket, сервер должен убедиться, что возраст квитанции для отождествления выбранного PSK (рассчитывается вычитанием ticket_age_add из PskIdentity.obfuscated_ticket_age по модулю 232) находится в пределах небольшого допуска от времени, прошедшего с момента выдачи квитанции (8. 0-RTT и Anti-Replay). Если это не так, серверу следует обработать согласование, но отвергнуть 0-RTT, и не следует предпринимать других действий, предполагающих свежесть данного ClientHello.

Сообщения 0-RTT, передаваемые в первой отправке, имеют те же типы (шифрованного) содержимого, что и сообщения того же типа в других отправках (handshake и application_data), но защищены другими ключами. После получения серверного сообщения Finished, если сервер принял ранние данные, будет передаваться сообщение EndOfEarlyData для индикации смены ключа. Это сообщение шифруется с ключами трафика 0-RTT.

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

  • Игнорировать расширение и вернуть обычный отклик 1-RTT. Затем сервер пропускает ранние данные, пытаясь снять защиту полученных записей с использованием ключа трафика согласования и отбрасывая данные, защиту которых снять не удалось (вплоть до настроенного max_early_data_size). После успешного снятия защиты с записи она считается началом второй отправки клиента и сервер обрабатывает её как обычное согласование 1-RTT.

  • Запросить у клиента передачу другого ClientHello, отправив ему HelloRetryRequest. Клиенту недопустимо включать расширение early_data в последующее сообщение ClientHello. Затем сервер игнорирует ранние данные, пропуская все записи с внешним содержимым типа application_data (указывает, что данные зашифрованы) вплоть до настроенного max_early_data_size.

  • Возвратить своё расширение early_data в EncryptedExtensions, указав, что оно предназначено для обработки ранних данных. Для сервера невозможно воспринять лишь часть сообщений с ранними данными. Хотя сервер передаёт сообщение о восприятии ранних данных, сами эти данные могут ещё находиться в сети, когда сервер генерирует это сообщение.

Для восприятия ранних данных сервер должен иметь воспринятый шифронабор PSK и выбранный первый ключ, предложенный в клиентском расширении pre_shared_key. Кроме того, он должен проверить, что перечисленные ниже значения совпадают со связанными с выбранным PSK.

  • Номер версии TLS.

  • Выбранный шифронабор.

  • Выбранный протокол ALPN [RFC7301] (если он есть).

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

Будущие расширения должны определять взаимодействие с 0-RTT.

Если любое из приведённых выше условий не выполняется, серверу недопустимо отвечать с расширением и он должен отбросить все данные первой отправки, используя один из двух указанных выше механизмов (возвращаясь тем самым к 1-RTT или 2-RTT). Если клиент пытается выполнить согласование 0-RTT, но сервер отвергает его, у сервера обычно нет ключей защиты записи 0-RTT и он должен взамен использовать «пробную» расшифровку (с помощью ключей согласования 1-RTT или путём поиска открытого ClientHello в случае HelloRetryRequest), чтобы найти первое сообщение, не являющееся 0-RTT.

Если сервер решает принять расширение early_data, он должен соответствовать тем же требованиям к обработке ошибок, которые заданы для ранних данных. В частности, если серверу не удаётся расшифровать запись 0-RTT, следующую за принятым расширением early_data, он должен прервать соединение с сигналом bad_record_mac (5.2. Защита данных Record).

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

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

4.2.11. Расширение PSK

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

Поле extension_data в этом расширении содержит значение PreSharedKeyExtension.

      struct {
          opaque identity<1..2^16-1>;
          uint32 obfuscated_ticket_age;
      } PskIdentity;

      opaque PskBinderEntry<32..255>;

      struct {
          PskIdentity identities<7..2^16-1>;
          PskBinderEntry binders<33..2^16-1>;
      } OfferedPsks;

      struct {
          select (Handshake.msg_type) {
              case client_hello: OfferedPsks;
              case server_hello: uint16 selected_identity;
          };
      } PreSharedKeyExtension;

identity

Метка ключа. Например, квитанция (B.3.4. Создание квитанции) или метка полученного извне общего ключа.

obfuscated_ticket_age

Запутанная версия возраста ключа. В параграфе 4.2.11.1 описано формирование этого значения для элементов, созданных с помощью сообщения NewSessionTicket. Для полученных извне элементов следует применять obfuscated_ticket_age = 0, а серверы должны игнорировать это значение.

identities

Список элементов, которые клиент хочет согласовать с сервером. При передаче вместе с расширением early_data (4.2.10. Индикация ранних данных) первый элемент списка используется для данных 0-RTT.

binders

Последовательность значений HMAC (1 для каждого элемента в списке identities с сохранением порядка), рассчитанных, как описано ниже.

selected_identity

Выбранный сервером элемент, указанный номером в клиентском списке identities (отсчёт с 0).

Каждый PSK связан с одним алгоритмом хэширования. Для PSK, полученных с помощью механизма квитанций (4.6.1. Сообщение NewSessionTicket), это алгоритм KDF Hash в соединении, где была создана квитанция. Для полученных извне PSK алгоритм Hash должен быть установлен при создании PSK или используется SHA-256, если такой алгоритм не задан. Сервер должен гарантировать совместимость PSK (если он есть) и шифра.

В TLS версий до TLS 1.3 значение SNI19 было предназначено для связывания сессии (раздел 3 [RFC6066]), при этом от сервера требовалось обеспечить соответствие связанного с сессией SNI одному из значений, заданных при согласовании восстановления. Однако в действительности реализации оказались непоследовательны при выборе одного из двух предлагаемых значений SNI и это приводило к тому, что требования совместимости фактически применялись клиентами. В TLS 1.3 значение SNI всегда явно задаётся в согласовании восстановления и серверу не требуется связывать значение SNI с квитанцией. Однако клиентам следует сохранять SNI с PSK для выполнения требований параграфа 4.6.1. Сообщение NewSessionTicket.

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

До восприятия организации ключа PSK сервер должен проверить соответствующее значение привязки (binder, параграф 4.2.11.2). Если такого значения нет или оно не действительно, сервер должен прервать согласование. Серверам не следует пытаться проверить множество привязок, скорее следует выбрать один PSK и проверить только привязку, соответствующую этому PSK. В параграфе 8.2. Запись ClientHello и приложении E.6. Раскрытие отождествления PSK приведено обоснование этого с точки зрения безопасности. Для восприятия организации PSK сервер передаёт расширение pre_shared_key, указывающее выбранный объект.

Клиент должен убедиться, что полученное от сервера значение selected_identity находится в диапазоне, указанном клиентом, сервер выбрал шифр, указывающий Hash, связанный с PSK, а серверное расширение key_share присутствует, если оно затребовано расширением psk_key_exchange_modes в ClientHello. Если эти значения не согласованы, клиент должен прервать согласование с сигналом illegal_parameter.

Если сервер представил расширение early_data, клиент должен убедиться, что сервер указал selected_identity = 0 и в противном случае он должен прервать согласование с сигналом illegal_parameter.

Расширение pre_shared_key должно быть последним в ClientHello (это упрощает реализацию, как описано ниже). Серверы должны проверять это и при наличии других расширений после указанного прерывать согласование с сигналом illegal_parameter.

4.2.11.1. Возраст квитанции

Возраст квитанции с точки зрения клиента определяется временем с момента получения NewSessionTicket. Клиентам недопустимо пытаться использовать квитанции с возрастом больше значения ticket_lifetime в квитанции. Поле obfuscated_ticket_age в каждом PskIdentity содержит запутанную версию возраста квитанции, сформированную из возраста в миллисекундах, сложенного со значением ticket_age_add из квитанции (4.6.1. Сообщение NewSessionTicket) по модулю 232. Это добавление препятствует пассивным наблюдателям при сопоставлении соединений, если квитанции не используются многократно. Отметим, что поле ticket_lifetime в сообщении NewSessionTicket указывает время в секундах, а obfuscated_ticket_age — в миллисекундах. Поскольку сроки действия квитанций ограничены неделей, 32 битов достаточно для представления любого срока действия даже в миллисекундах.

4.2.11.2. Привязка PSK

Значение привязки PSK формирует связь между PSK и текущим согласованием, а также между согласованием, где был создан PSK (через сообщение NewSessionTicket) и текущим согласованием. Каждая запись в списке привязок рассчитывается как HMAC для хэша стенограммы (4.4.1. Transcript-Hash), включающего часть ClientHello до поля PreSharedKeyExtension.identities, включительно, т. е. значение учитывает ClientHello без самих привязок. Поля размера для сообщения (включая общий размер, размеры блоков расширений и pre_shared_key) установлены как при наличии привязок корректного размера.

PskBinderEntry рассчитывается так же, как сообщение Finished (4.4.4. Сообщение Finished), но в качестве BaseKey используется значение binder_key, выведенное через планирование ключей из соответствующего PSK, который будет предлагаться (7.1. Планирование ключей).

Если согласование включает HelloRetryRequest, сообщения ClientHello и HelloRetryRequest включаются в стенограмму вместе с новым ClientHello. Например, если клиент передаёт ClientHello1, привязка рассчитывается для Transcript-Hash(Truncate(ClientHello1)), где Truncate() удаляет список привязок из ClientHello. Если сервер отвечает сообщением HelloRetryRequest и клиент после этого шлёт ClientHello2, его привязка рассчитывается в форме Transcript-Hash(ClientHello1, HelloRetryRequest, Truncate(ClientHello2)).

Полные сообщения ClientHello1/ClientHello2 включаются во все другие расчёты хэш-значений согласования. Отметим, что в первой отправке Truncate(ClientHello1) хэшируется напрямую, но во второй хэшируется ClientHello1 и затем повторно инжектируется как сообщение message_hash (4.4.1. Transcript-Hash).

4.2.11.3. Порядок обработки

Клиентам разрешено передавать данные 0-RTT до получения от сервера сообщения Finished, после этого передавая сообщение EndOfEarlyData, за которым следует остальная часть согласования. Для предотвращения блокировок в случае восприятия early_data сервер должен обработать клиентское сообщение ClientHello и сразу после этого отправлять свои сообщения вместо ожидания от клиента сообщения EndOfEarlyData до отправки своего ServerHello.

4.3. Параметры сервера

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

4.3.1. Шифрованные расширения

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

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

Ниже показана структура сообщения.

      struct {
          Extension extensions<0..2^16-1>;
      } EncryptedExtensions;

extensions

Список расширений (см. таблицу в параграфе 4.2).

4.3.2. Запрос сертификата

При аутентификации по сертификатам сервер может запросить сертификат у клиента. При передаче такого сообщения оно должно следовать за EncryptedExtensions.

Структура сообщения показана ниже.

      struct {
          opaque certificate_request_context<0..2^8-1>;
          Extension extensions<2..2^16-1>;
      } CertificateRequest;

certificate_request_context

Неинтерпретируемая (opaque) строка, которая указывает запрос сертификата и будет возвращаться в клиентском сообщении Certificate. Значение certificate_request_context должно быть уникальным в рамках соединения (чтобы предотвратить повторное использование сообщений). Это поле нужно сохранять пустым, если оно не применяется в аутентификационных обменах после согласования, как описано в параграфе 4.6.2. При запросе аутентификации после согласования серверу следует сделать контекст непредсказуемым для клиента (например, путём случайной генерации), чтобы воспрепятствовать атакам за счёт получения временного доступа к секретному ключу клиента из заранее созданных действительных сообщений CertificateVerify.

extensions

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

В предшествующих версиях TLS сообщение CertificateRequest содержало список алгоритмов подписи и удостоверяющих центров, которые сервер будет воспринимать. В TLS 1.3 первый список указывается расширением signature_algorithms и необязательным расширением signature_algorithms_cert, а второй — расширением certificate_authorities (4.2.4. Удостоверяющие центры).

При аутентификации с помощью PSK серверу недопустимо передавать CertificateRequest в основном согласовании, хотя он может передать это сообщение в аутентификации post-handshake (4.6.2. Аутентификация после согласования) при условии, что клиент передал post_handshake_auth (4.2.6. Аутентификация клиента после согласования).

4.4. Аутентификационные сообщения

Как отмечено в разделе 2, TLS в общем случае использует для проверки подлинности, подтверждения ключей и защиты целостности согласования набор сообщений Certificate, CertificateVerify и Finished (для привязки PSK также выполняется аналогичное подтверждение ключей). Эти три сообщения всегда передаются последними в отправке согласования. Сообщения Certificate и CertificateVerify передаются лишь в некоторых случаях, описанных ниже. Сообщение Finished передаётся всегда как часть блока аутентификации. Эти сообщения шифруются с ключом, выведенным из [sender]_handshake_traffic_secret.

Для расчётов аутентификационных сообщений используются однотипные входные данные:

  • сертификат и ключ подписи;

  • контекст согласования, состоящих из набора сообщений, включаемых в хэширование стенограммы;

  • базовый ключ, применяемый для расчёта ключа MAC.

На основе этих данных создаются сообщения, включающие перечисленные ниже элементы.

Certificate

Сертификат, который будет использоваться для аутентификации, и все поддерживающие сертификаты в цепочке. Аутентификация клиентов на основе сертификатов недоступна в потоке согласования PSK (включая 0-RTT).

CertificateVerify

Подпись для значения Transcript-Hash(Handshake Context, Certificate).

Finished

MAC для значения Transcript-Hash(Handshake Context, Certificate, CertificateVerify) с использованием ключа MAC, выведенного из базового ключа (Base Key).

В таблице приведён контекст согласования (Handshake Context) и базовый ключ MAC для каждого варианта.

 

Режим

Контекст согласования

Базовый ключ

Server

ClientHello … после EncryptedExtensions/CertificateRequest

server_handshake_traffic_secret

Client

ClientHello … после серверного Finished/EndOfEarlyData

client_handshake_traffic_secret

Post-Handshake

ClientHello … клиентские Finished + CertificateRequest

client_application_traffic_secret_N

 

4.4.1. Transcript-Hash

Многие криптографические расчёты в TLS используют хэш стенограммы (transcript hash). Это значение рассчитывается путём хеширования конкатенации всех входящих в согласование сообщений, включая заголовок, указывающий тип и размер сообщений согласования, но не включая заголовков уровня записей.

    Transcript-Hash(M1, M2, ... Mn) = Hash(M1 || M2 || ... || Mn)

Исключением из общего правила является случай, когда сервер отвечает на ClientHello сообщением HelloRetryRequest — значение ClientHello1 заменяется синтетическим сообщением согласования типа message_hash, содержащим Hash(ClientHello1).

  Transcript-Hash(ClientHello1, HelloRetryRequest, ... Mn) =
      Hash(message_hash ||        /* Тип согласования */
           00 00 Hash.length  ||  /* Размер сообщения Handshake в байтах */
           Hash(ClientHello1) ||  /* Хэш-значение ClientHello1 */
           HelloRetryRequest  || ... || Mn)

Такая конструкция создана для того, чтобы позволить серверу выполнять HelloRetryRequest без учёта состояния, сохраняя лишь хэш ClientHello1 в значении cookie вместо экспорта всего промежуточного состояния хэша (4.2.2. Cookie).

Для конкретности хэш стенограммы всегда создаётся для указанной далее последовательности сообщений согласования, начиная с первого ClientHello и включая лишь те сообщения, которые были были переданы: ClientHello, HelloRetryRequest, ClientHello, ServerHello, EncryptedExtensions, серверные сообщения CertificateRequest, Certificate, CertificateVerify и Finished, EndOfEarlyData, клиентские сообщения Certificate, CertificateVerify и Finished.

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

4.4.2. Сообщение Certificate

Это сообщение передаёт партнёру цепочку сертификатов конечной точки.

Сервер должен передавать Certificate всякий раз, когда согласованный метод обмена ключами применяет сертификаты для проверки подлинности (все методы, определённые в этом документе, за исключением PSK).

Клиент должен передавать сообщение Certificate тогда и только тогда, когда сервер запросил аутентификацию сообщением CertificateRequest (4.3.2. Запрос сертификата). Если сервер запросил проверку подлинности клиента, но подходящий сертификат недоступен, клиент должен передать сообщение Certificate без сертификатов (т. е. с полем certificate_list размером 0). Сообщение Finished должно передаваться независимо от того, является ли сообщение Certificate пустым.

Структура сообщения показана ниже.

      enum {
          X509(0),
          RawPublicKey(2),
          (255)
      } CertificateType;

      struct {
          select (certificate_type) {
              case RawPublicKey:
                /* Из RFC 7250 ASN.1_subjectPublicKeyInfo */
                opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;

              case X509:
                opaque cert_data<1..2^24-1>;
          };
          Extension extensions<0..2^16-1>;
      } CertificateEntry;

      struct {
          opaque certificate_request_context<0..2^8-1>;
          CertificateEntry certificate_list<0..2^24-1>;
      } Certificate;

certificate_request_context

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

certificate_list

Цепочка структур CertificateEntry, каждая из которых содержит сертификат и набор расширений.

extensions

Набор расширений в CertificateEntry, формат которых определён в параграфе 4.2. Расширения. Пригодными расширениями для сертификатов сервера сейчас являются OCSP Status [RFC6066] и SignedCertificateTimestamp [RFC6962], а в будущем могут быть определены расширения и для этого сообщения. Расширения в сообщении Certificate от сервера должны соответствовать расширениям в сообщении ClientHello. Расширения в сообщении Certificate от клиента должны соответствовать расширениям в сообщении CertificateRequest от сервера. Если расширение относится ко всей цепочке, его следует включать в первую запись CertificateEntry.

Если соответствующее расширение типа сертификата (server_certificate_type или client_certificate_type) не согласовано в EncryptedExtensions или тип сертификата X.509 не был согласован, каждая запись CertificateEntry содержит сертификат X.509 в DER-представлении. Сертификат отправителя должен быть первым в списке CertificateEntry. Всем остальным сертификатам следует напрямую удостоверять своего предшественника. Поскольку проверка сертификатов требует независимого распространения привязок доверия, указывающий привязку сертификат может не включаться в цепочку при условии, что поддерживающему партнёру известны все пропущенные сертификаты.

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

Если был согласован тип сертификата RawPublicKey, поле certificate_list должно содержать не более 1 записи CertificateEntry, которая включает значение ASN1_subjectPublicKeyInfo, как определено в разделе 3 [RFC7250].

Сертификаты типа OpenPGP [RFC6091] недопустимо использовать в TLS 1.3.

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

4.4.2.1. Статус OCSP и расширения SCT

В [RFC6066] и [RFC6961] определены расширения для согласования передачи сервером откликов OCSP. В TLS 1.2 и более ранних версиях сервер отвечает пустым расширением для индикации согласования этого расширения, а информация OCSP передаётся в сообщении CertificateStatus. В TLS 1.3 серверная информация OCSP передаётся в расширении CertificateEntry, содержащем связанный сертификат. В частности, телом расширения status_request от сервера должна быть структура CertificateStatus, заданная в [RFC6066], которая интерпретируется в соответствии с [RFC6960].

Примечание. Расширение status_request_v2 [RFC6961] отменено. Серверам TLS 1.3 недопустимо действовать в зависимости от его наличия или информации в нем при обработке ClientHello. В частности, недопустимо передавать расширение status_request_v2 в сообщениях EncryptedExtensions, CertificateRequest, Certificate. Сервер TLS 1.3 должен быть способен обрабатывать сообщения ClientHello с этим расширением, поскольку его могут передавать клиенты, желающие применять более ранние версии протокола.

Сервер может запросить у клиента представление отклика OCSP с сертификатом путём передачи пустого расширения status_request в сообщении CertificateRequest. Если клиент решает передать отклик OCSP, телом расширения status_request в нем должна быть структура CertificateStatus, определённая в [RFC6066].

[RFC6962] определяет для сервера механизм передачи временной метки SCT20 как расширения в ServerHello для TLS 1.2 и более ранних версий. В TLS 1.3 серверная информация SCT передаётся в расширении CertificateEntry.

4.4.2.2. Выбор сертификата сервера

Приведённые ниже правила применяются для сертификатов, переданных сервером.

  • Сертификат должен иметь тип X.509v3 [RFC5280], если явно не указано иное (например, [RFC7250]).

  • Открытый ключ (и связанные с ним ограничения) сертификата конечного объекта для сервера должен быть совместим с выбранным алгоритмом аутентификации из клиентского расширения signature_algorithms (в настоящее время RSA, ECDSA или EdDSA).

  • Сертификат должен разрешать использование ключа для подписи (т. е. бит digitalSignature должен быть установлен, если присутствует расширение Key Usage) со схемой подписи, указанной в расширениях signature_algorithms/signature_algorithms_cert (4.2.3. Алгоритмы подписи).

  • Расширения server_name [RFC6066] и certificate_authorities служат для руководства выбором сертификата. Поскольку сервер может требовать наличия расширения server_name, клиентам следует передавать это расширения, когда оно применимо.

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

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

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

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

4.4.2.3. Выбор сертификата клиента

Приведённые ниже правила применяются для сертификатов, переданных сервером.

  • Сертификат должен иметь тип X.509v3 [RFC5280], если явно не указано иное (например, [RFC7250]).

  • Если расширение certificate_authorities присутствует в CertificateRequest, хотя бы одному из сертификатов в цепочке сертификации следует выпущенным одним из указанных в списке CA.

  • Сертификат должен быть подписан с использованием подходящего алгоритма, как указано в параграфе 4.3.2. Запрос сертификата. Это смягчает требования к алгоритмам подписи сертификатов прежних версий TLS.

  • Если сообщение CertificateRequest содержит непустое расширение oid_filters, сертификат конечного объекта должен соответствовать OID, которые распознаются клиентом, как описано в параграфе 4.2.5.

4.4.2.4. Приём сообщения Certificate

В общем случае детализация процедур проверки пригодности сертификатов выходит за рамки TLS (см. [RFC5280]). В этом параграфе представлены относящиеся к TLS требования.

Если сервер передаёт пустое сообщение Certificate, клиент должен прервать согласование с сигналом decode_error.

Если клиент не передаёт никаких сертификатов (пустое сообщение Certificate), сервер может по своему усмотрению продолжить согласование без аутентификации клиента или прервать его с сигналом certificate_required. Если какая-то часть цепочки сертификатов неприемлема (например, не подписана известным, доверенным CA), сервер может по своему усмотрению продолжить (считая клиента непроверенным) или прервать согласование.

Любая конечная точка, получившая какой-либо сертификат, который требуется проверить с использованием любого алгоритма, применяющего хэш MD5, должна прервать согласование с сигналом bad_certificate. Алгоритм SHA-1 устарел и конечной точке, получившей сертификат, который нужно проверить с использованием алгоритма подписи, применяющего SHA-1, рекомендуется прервать согласование с сигналом bad_certificate. Проще говоря, это означает, что конечная точка может воспринимать эти алгоритмы для самоподписанных сертификатов и сертификатов с привязкой доверия.

Всем конечным точкам рекомендуется перейти на SHA-256 или лучший алгоритм для обеспечения совместимости с реализациями, которые постепенно отказываются от поддержки SHA-1.

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

4.4.3. Сообщение CertificateVerify

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

Структура сообщения показана ниже.

      struct {
          SignatureScheme algorithm;
          opaque signature<0..2^16-1>;
      } CertificateVerify;

Поле algorithm задаёт применяемый алгоритм подписи (4.2.3. Алгоритмы подписи). Подписью служит цифровая подпись, созданная с использованием этого алгоритма. Содержимое, покрываемое подписью, является выводом хэш-функции, как описано в параграфе 4.4.1. Transcript-Hash, а именно Transcript-Hash(Handshake Context, Certificate)

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

Эта структура предназначена для предотвращения атак на прежние версии TLS, в которых формат ServerKeyExchange позволял атакующему получить подпись с выбранным 32-байтовым префиксом (ClientHello.random). Начальное 64-байтовое заполнение очищает этот префикс вместе с контролируемым сервером значением ServerHello.random.

Строкой контекста для подписи сервера является «TLS 1.3, server CertificateVerify», а для клиента — «TLS 1.3, client CertificateVerify». Она служит разделителем между подписями, сделанными в разных контекстах, что защищает от возможных кросс-протокольных атак.

Например, если хэш стенограммы представлял собой 32 байта 01 (этот размер будет иметь смысл для SHA-256), содержимое, покрываемое цифровой подписью для серверного CertificateVerify будет иметь вид

      2020202020202020202020202020202020202020202020202020202020202020
      2020202020202020202020202020202020202020202020202020202020202020
      544c5320312e332c207365727665722043657274696669636174655665726966
      79
      00
      0101010101010101010101010101010101010101010101010101010101010101

На стороне отправителя процесс расчёта поля signature в сообщении CertificateVerify принимает на входе содержимое, охватываемое цифровой подписью, и секретный ключ подписи, соответствующий сертификату, переданному в предыдущем сообщении.

Если сервером передано сообщение CertificateVerify, алгоритмом подписи должен быть один из предложенных в клиентском расширении signature_algorithms, если никакая действительная цепочка сертификации не может быть создана без неподдерживаемых алгоритмов (4.2.3. Алгоритмы подписи).

При отправке сообщения клиентом алгоритмом подписи должен быть один из присутствующих в поле supported_signature_algorithms расширения signature_algorithms в сообщении CertificateRequest.

В дополнение к этому алгоритм подписи должен быть совместим с ключом в сертификате конечного объекта передающей стороны. Подписи RSA должны использовать алгоритм RSASSA-PSS, независимо от присутствия алгоритмов RSASSA-PKCS1-v1_5 в signature_algorithms. Алгоритм SHA-1 недопустимо применять в каких-либо подписях сообщений CertificateVerify.

Все алгоритмы SHA-1 в этой спецификации определены исключительно для применения в унаследованных сертификатах и не пригодны для подписей CertificateVerify.

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

Если проверка дала отрицательный результат, получатель должен прервать согласование с сигналом decrypt_error.

4.4.4. Сообщение Finished

Сообщение Finished завершает обмен в блоке проверки подлинности (Authentication Block). Оно важно для аутентификации согласования и рассчитанных ключей.

Получатель сообщения Finished должен проверить корректность его содержимого и при обнаружении несоответствия прервать согласование с сигналом decrypt_error.

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

  1. Клиент передал данные 0-RTT, как описано в параграфе 4.2.10. Индикация ранних данных.

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

Ключ, применяемый для создания сообщения Finished, рассчитывается из базового ключа (Base Key), определённого в параграфе 4.4. Аутентификационные сообщения, с использованием HKDF (7.1. Планирование ключей). В частности,

finished_key = HKDF-Expand-Label(BaseKey, "finished", "", Hash.length)

Структура сообщения показана ниже.

      struct {
          opaque verify_data[Hash.length];
      } Finished;

Значение verify_data определяется выражением

      verify_data =
          HMAC(finished_key,
               Transcript-Hash(Handshake Context,
                               Certificate21, CertificateVerify1))

HMAC [RFC2104] использует алгоритм Hash для согласования. Как отмечено выше, входные данные HMAC в общем случае могут быть получены с помощью текущего хэша, т. е. хэша согласования в этой точке.

В предыдущих версиях TLS размер verify_data всегда составлял 12 октетов, но в TLS 1.3 это размер вывода HMAC для функции Hash, используемой при согласовании.

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

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

4.5. Сообщение EndOfEarlyData

      struct {} EndOfEarlyData;

Если сервер передал расширение early_data в EncryptedExtensions, клиент должен передать сообщение EndOfEarlyData после приёма серверного сообщения Finished. Если сервер не передал расширения early_data в EncryptedExtensions, клиенту недопустимо передавать сообщение EndOfEarlyData. Это сообщение указывает, что все сообщения 0-RTT application_data (если они были) переданы и последующие данные будут защищены с согласованными ключами трафика. Серверу недопустимо передавать это сообщение, а получивший такое сообщение клиент должен прервать согласование с сигналом unexpected_message. Сообщение шифруется с ключами, выведенными из client_early_traffic_secret.

4.6. Сообщения после согласования

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

4.6.1. Сообщение NewSessionTicket

В любой момент после получения сервером клиентского сообщения Finished он может передать сообщение NewSessionTicket, которое создаёт уникальную ассоциацию между значением квитанции и секретным PSK, выведенным из первичного секрета (7. Криптографические расчёты).

Клиент может применять этот PSK в будущих согласованиях, включая квитанцию в расширение pre_shared_key своего ClientHello (4.2.11. Расширение PSK). Серверы могут передавать несколько квитанций в одном соединении сразу одну за другой, либо после конкретных событий (C.4. Предотвращение отслеживания клиентов). Например, сервер может передать новую квитанцию после аутентификации post-handshake, чтобы инкапсулировать дополнительное состояние аутентификации клиента. Множество квитанций полезно для клиентов по разным причинам, включая:

  • создание множества параллельных соединений HTTP;

  • организацию одновременных соединений через разные интерфейсы и семейства адресов, например, с помощью Happy Eyeballs [RFC8305] или других технологий.

Любая квитанция должна возобновляться лишь с шифром, имеющим такой же набор алгоритмов хэширования KDF, какой применялся для организации исходного соединения.

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

Если при восстановлении значение SNI сообщается вызывающему приложению, реализации должны использовать значение, переданное в восстанавливающем ClientHello, а не значение из предыдущей сессии. Отметим, что если реализация сервера отвергает отождествления PSK с разными значениями SNI, эти два значения всегда совпадают.

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

      struct {
          uint32 ticket_lifetime;
          uint32 ticket_age_add;
          opaque ticket_nonce<0..255>;
          opaque ticket<1..2^16-1>;
          Extension extensions<0..2^16-2>;
      } NewSessionTicket;

ticket_lifetime

Указывает время жизни (в секундах) с момента выпуска квитанции 32-битовым целым числом без знака с сетевым порядком байтов. Серверам недопустимо использовать значение больше 604800 секунд (7 дней). Нулевое значение указывает, что квитанцию следует отбросить сразу же. Клиентам недопустимо кэшировать квитанции больше, чем на 7 дней, независимо от значения ticket_lifetime, и они могут удалять квитанции раньше в соответствии с локальной политикой. Сервер может считать квитанцию действительной в течение времени, которое меньше указанного в ticket_lifetime.

ticket_age_add

Созданное защищённым способом случайное 32-битовое значение, которое служит для сокрытия возраста квитанции, указанного клиентом в расширении pre_shared_key. Возраст квитанции на клиентской стороне складывается с этим значением по модулю 232 для получения значения, которое передаётся клиенту. Сервер должен генерировать новое значение для каждой передаваемой квитанции.

ticket_nonce

Значение для квитанции, уникальное в каждой квитанции данного соединения.

ticket

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

extensions

Набор расширений для квитанции, формат расширения описан в параграфе 4.2. Клиент должен игнорировать непонятные расширения.

Для NewSessionTicket в настоящее время определено единственное расширение early_data, показывающее, что квитанцию можно применять для передачи данных 0-RTT (4.2.10. Индикация ранних данных). Оно содержит описанное ниже значение.

max_early_data_size

Максимальное число байтов данных 0-RTT, которые клиенту разрешено передать с применением этой квитанции. Учитываются только данные приложений (т. е. открытые данные без заполнения и внутреннего байта типа). Серверу, получившему больше max_early_data_size байтов данных 0-RTT, следует прервать соединение с сигналом unexpected_message. Отметим, что серверы, отвергающие ранние данные по причине отсутствия криптографического материала, не смогут отличить заполнение от содержимого, поэтому клиентам не следует полагаться на возможность передачи большого объёма заполнения в записях с ранними данными.

Связанный с квитанцией PSK рассчитывается как

HKDF-Expand-Label(resumption_master_secret, "resumption", ticket_nonce, Hash.length)

Поскольку значение ticket_nonce отличается для каждого сообщения NewSessionTicket, каждая квитанция будет иметь свой PSK.

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

4.6.2. Аутентификация после согласования

Если клиент передал расширение post_handshake_auth (параграф 4.2.6), сервер может запросить аутентификацию клиента в любой момент после завершения согласования путём передачи сообщения CertificateRequest. Клиент должен ответить подходящими сообщениями Authentication (параграф 4.4). Если клиент выбрал аутентификацию, он должен передать сообщения Certificate, CertificateVerify и Finished. Если аутентификация отвергнута, клиент должен передать сообщение Certificate без сертификатов, а затем — сообщение Finished. Все клиентские сообщения для данного отклика должны передаваться в линию последовательно, без промежуточных сообщений других типов.

Клиент, который получил сообщение CertificateRequest, но не передавал расширения post_handshake_auth, должен передать критический сигнал unexpected_message.

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

4.6.3. Обновление ключа и вектора инициализации

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

      enum {
          update_not_requested(0), update_requested(1), (255)
      } KeyUpdateRequest;

      struct {
          KeyUpdateRequest request_update;
      } KeyUpdate;

request_update

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

Если поле request_update имеет значение update_requested, получатель должен передать своё сообщение KeyUpdate с request_update = update_not_requested до отправки следующей записи с данными приложения. Этот механизм позволяет любой из сторон форсировать полное обновление соединения, но реализация, получившая несколько сообщений KeyUpdate во время своего молчания будет отвечать лишь одним обновлением. Отметим, что реализации могут получить произвольное число сообщений между отправкой KeyUpdate с request_update set = update_requested и получением партнерского KeyUpdate, поскольку эти сообщения уже были в сети. Однако ключи приёма и передачи выводятся из независимых секретов трафика, поэтому сохранение приёмного секрета не угрожает защите данных, отправленных до смены ключей отправителем.

Если реализации независимо отправляют свои KeyUpdate с request_update = update_requested и эти сообщения «пересекаются» в пути, каждая из сторон передаст отклик и в результате произойдёт двухкратная смена ключей.

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

5. Протокол Record

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

Записи TLS типизованы, что позволяет мультиплексировать множество протоколов вышележащих уровней через один уровень записи. Этот документ задаёт 4 типа — согласование (handshake), данные приложений (application_data), сигналы (alert) и смену шифра (change_cipher_spec). Запись change_cipher_spec служит для обеспечения совместимости (D.4. Режим совместимости с промежуточными устройствами).

Реализация может получить нешифрованную запись типа change_cipher_spec, состоящую из одного байта 0x01, в любой момент после передачи или приёма первого сообщения ClientHello и до получения от партнёра сообщения Finished и должна просто отбросить ее без обработки. Отметим, что эта запись может появиться во время согласования, где реализация ожидает защищённые записи, поэтому необходимо обнаружить это до попытки снять защиту записи. Реализация, получившая любое другое значение change_cipher_spec или защищённую запись change_cipher_spec, должна прервать согласование с сигналом unexpected_message. Если реализация обнаруживает запись change_cipher_spec, принятую до первого сообщения ClientHello или после сообщения Finished от партнёра, она должна трактовать её как запись неожиданного типа (хотя серверы без учёта состояния могут не отличить этот случай от дозволенных).

Реализациям недопустимо передавать записи не заданных в этом документе типов, пока это не согласовано тем или иным расширением. Если реализация TLS получает запись неожиданного типа, она должна прервать соединение с сигналом unexpected_message. Значения новых типов записей выделяются IANA в реестре TLS ContentType, как описано в разделе 11.

5.1. Уровень Record

Уровень записи фрагментирует блоки информации в записи TLSPlaintext, передающие данные блоками размером до 214 байтов. Границы сообщений обрабатываются по-разному в зависимости от ContentType. Все будущие типы содержимого должны задавать подходящие правила. Отметим, что эти правила жёстче принятых в TLS 1.2.

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

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

  • Для согласующих сообщений недопустим переход через смену ключей. Реализации должны проверять, что все сообщения, непосредственно предшествующие смене ключа, относятся к одной записи. В противном случае соединение должно разрываться с сигналом unexpected_message. Поскольку сообщения ClientHello, EndOfEarlyData, ServerHello, Finished и KeyUpdate могут непосредственно предшествовать смене ключей, реализации должны передавать эти сообщения с выравниванием по границе записи.

Реализациям недопустимо передавать фрагменты типа Handshake размера 0, даже если они содержат заполнение.

Сигнальные сообщения (6. Протокол Alert) недопустимо фрагментировать между записями и несколько сигнальных сообщений недопустимо собирать в одну запись TLSPlaintext. Иными словами запись с типом Alert должна содержать в точности одно сообщение.

Сообщения Application Data содержат данные, которые TLS не анализирует. Эти сообщения всегда защищены. Фрагменты Application Data с нулевым размером можно передавать, поскольку они полезны в качестве противодействия анализу трафика. Фрагменты Application Data можно разделять между разными записями или собирать в одну запись.

      enum {
          invalid(0),
          change_cipher_spec(20),
          alert(21),
          handshake(22),
          application_data(23),
          (255)
      } ContentType;

      struct {
          ContentType type;
          ProtocolVersion legacy_record_version;
          uint16 length;
          opaque fragment[TLSPlaintext.length];
      } TLSPlaintext;

type

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

legacy_record_version

Должно иметь значение 0x0303 для всех записей, генерируемых реализацией TLS 1.3, за исключением начального ClientHello (т. е. не отклика на HelloRetryRequest), где это поле может иметь также значение 0x0301 для обеспечения совместимости. Это поле устарело и должно игнорироваться при обработке. Предыдущие версии TLS будут применять другие значения этого поля при некоторых обстоятельствах.

length

Размер (в байтах) следующего TLSPlaintext.fragment. Недопустим размер, превышающий 214 байтов. Конечная точка, получившая запись избыточного размера, должна прервать соединение с сигналом record_overflow.

fragment

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

Этот документ описывает TLS 1.3, где используется версия 0x0304. Номер версии обусловлен исторически, поскольку ранее применялось значение 0x0301 для TLS 1.0 и 0x0300 для SSL 3.0. Для максимальной совместимости с прежними версиями в записи с начальным ClientHello следует указывать версию 0x0301 (соответствует TLS 1.0), а в записи со вторым ClientHello или ServerHello должен быть номер версии 0x0303 (соответствует TLS 1.2). При согласовании более ранних версий TLS конечные точки следуют процедуре и требованиям, представленным в приложении D.

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

5.2. Защита данных Record

Функции защиты записей преобразуют структуру TLSPlaintext в TLSCiphertext, функции снятия защиты выполняют обратное преобразование. В TLS 1.3, в отличие от прежних версий, все шифры моделируются как AEAD [RFC5116]. Функции AEAD обеспечивают унифицированную операцию шифрования и аутентификации, которая преобразует открытые данные в шифрованные и аутентифицированные, а также обратно. Каждая шифрованная запись содержит открытый заголовок, за которым следует шифрованное тело, содержащее тип и необязательное заполнение.

      struct {
          opaque content[TLSPlaintext.length];
          ContentType type;
          uint8 zeros[length_of_padding];
      } TLSInnerPlaintext;

      struct {
          ContentType opaque_type = application_data; /* 23 */
          ProtocolVersion legacy_record_version = 0x0303; /* TLS v1.2 */
          uint16 length;
          opaque encrypted_record[TLSCiphertext.length];
      } TLSCiphertext;

content

Значение TLSPlaintext.fragment, содержащее байтовое представление согласующего или сигнального сообщения или необработанные байты данных приложения для передачи.

type

Значение TLSPlaintext.type, указывающее тип содержимого записи.

zeros

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

opaque_type

Внешнее поле opaque_type в записи TLSCiphertext всегда имеет значение 23 (application_data) для совместимости с промежуточными устройствами, настроенными на разбор предыдущих версий TLS. Реальный тип содержимого записи определяется из поля TLSInnerPlaintext.type после расшифровки.

legacy_record_version

Поле legacy_record_version всегда имеет значение 0x0303. Структуры TLS 1.3 TLSCiphertext не генерируются до завершения согласования TLS 1.3, поэтому не возникает проблем совместимости при получении других значений. Отметим, что протокол согласования, включая сообщения ClientHello и ServerHello, аутентифицирует версию протокола, поэтому данное значение является избыточным.

length

Размер (в байтах) следующего поля TLSCiphertext.encrypted_record, который определяется суммой размеров содержимого и заполнения, а также размера внутреннего типа содержимого (1) и расширений, добавленных алгоритмом AEAD. Недопустимы значения length, превышающие 214 + 256 байтов. Конечная точка, получившая запись избыточного размера, должна прервать соединение с сигналом record_overflow.

encrypted_record

Зашифрованная с помощью AEAD форма последовательного представления структуры TLSInnerPlaintext.

Алгоритмы AEAD принимают на входе один ключ, nonce, открытые данные (plaintext) и дополнительные данные для включения в проверку подлинности, как описано в параграфе 2.1 [RFC5116]. Ключом служит client_write_key или server_write_key, nonce выводится из порядкового номера и client_write_iv или server_write_iv (5.3. Nonce для отдельной записи), а дополнительными данными — заголовок записи

      additional_data = TLSCiphertext.opaque_type ||
                        TLSCiphertext.legacy_record_version ||
                        TLSCiphertext.length

Открытые данные на входе алгоритма AEAD кодируются в структуру TLSInnerPlaintext, создание ключей трафика описано в параграфе 7.3. Расчёт ключей трафика.

Выводом AEAD являются шифроданные, возвращаемые операцией шифрования AEAD. Размер открытых данных больше соответствующего значения TLSPlaintext.length в результате включения TLSInnerPlaintext.type и предоставленного отправителем заполнения. Размер вывода AEAD в общем случае превышает размер открытых данных, а величина этого превышения зависит от алгоритма AEAD. Шифры могут включать заполнение, поэтому превышение может меняться в зависимости от размера открытых данных.

AEADEncrypted = AEAD-Encrypt(write_key, nonce, additional_data, plaintext)

В поле encrypted_record структуры TLSCiphertext указывается значение AEADEncrypted.

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

      расшифровка encrypted_record =
          AEAD-Decrypt(peer_write_key, nonce, additional_data, AEADEncrypted)

При отказе в расшифровке получатель должен прервать соединение с сигналом bad_record_mac.

Алгоритмам AEAD, используемым в TLS 1.3, недопустимо при шифровании увеличивать размер более, чем на 255 октетов. Конечная точка, получившая от партнёра запись с TLSCiphertext.length больше (214 + 256) октетов, должна прервать соединение с сигналом record_overflow. Это ограничение выведено из максимального размера TLSInnerPlaintext (214 октетов) + 1 октет ContentType + максимальное расширение при шифровании AEAD (255 октетов).

5.3. Nonce для отдельной записи

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

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

Каждый алгоритм AEAD будет задавать диапазон возможных размеров nonce для записи от N_MIN до N_MAX байтов [RFC5116]. Размер nonce для записи TLS (iv_length) устанавливается больше 8 и N_MIN байтов для алгоритмов AEAD (раздел 4 в [RFC5116]). Алгоритмы AEAD с N_MAX меньше 8 байтов недопустимо применять в TLS. Значение nonce для записи в конструкции AEAD формируется, как показано ниже.

  1. 64-битовый порядковый номер кодируется с сетевым порядком байтов и дополняется слева нулями до размера iv_length.

  2. Выполняется операция XOR для дополненного порядкового номера и статического значения client_write_iv или server_write_iv (в зависимости от роли).

Полученное в результате значение размером iv_length используется в качестве nonce для записи.

Примечание. Это отличается от TLS 1.2, где применялись частично явные значения nonce.

5.4. Дополнение записей

Все шифрованные записи TLS могут дополняться для увеличения размера TLSCiphertext. Это позволяет отправителю скрыть истинный размер трафика от наблюдателя.

При генерации TLSCiphertext реализации могут применять заполнение. Недополненная запись считается записью с заполнением нулевого размера. Заполнение является строкой байтов 0, добавленной после поля ContentType до шифрования. Реализации должны устанавливать нулевое значения байтов заполнения перед шифрованием.

Записи Application Data могут содержать пустое поле TLSInnerPlaintext.content, если отправитель этого хочет. Это позволяет генерировать правдоподобный трафик в контексте, где наличие или отсутствие активности может быть важно. Реализациям недопустимо передавать записи Handshake и Alert с пустым полем TLSInnerPlaintext.content и при получении такой записи приёмная сторона должна разорвать соединение с сигналом unexpected_message.

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

Реализации должны завершать сканирование на открытых данных, возвращённых после расшифровки AEAD. Если принимающая сторона не нашла отличных от 0 октетов в открытых данных, она должна разорвать соединение с сигналом unexpected_message.

Наличие заполнения не меняет ограничений на общий размер записи — полной записи TLSInnerPlaintext недопустимо быть больше (214 + 1) октетов. Если размер фрагмента снижен (например, с помощью расширения record_size_limit из [RFC8449]), это ограничение относится ко всем открытым данным, включая тип содержимого и заполнение.

Выбор политики заполнения, указывающей когда и сколько октетов можно добавлять, является сложным вопросом и выходит за рамки этого документа. Если протокол прикладного уровня над TLS использует своё заполнение, может оказаться предпочтительным дополнять записи TLS с данными приложения в рамках прикладного уровня. Заполнение шифрованных записей Handshake и Alert должно выполняться на уровне TLS. Будущие документы могут определять алгоритмы выбора или механизмы запроса политики заполнения с помощью расширений TLS или иными средствами.

5.5. Ограничения на использование ключей

Имеются криптографические ограничения на объем открытых данных, которые можно безопасно шифровать с данным набором ключей. В [AEAD-LIMITS] приведён анализ этих ограничений для случая, когда базовый примитив (AES или ChaCha20) не имеет слабых мест. Реализациям следует обновлять ключи в соответствии с параграфом 4.6.3. Обновление ключа и вектора инициализации до достижения этих пределов.

Для AES-GCM можно шифровать до 224,5 полноразмерных записей (около 24 миллионов) в данном соединении, сохраняя запас по безопасности приблизительно 2-57 для аутентифицированного шифрования. Для ChaCha20/Poly1305 порядковые номера достигнут максимума раньше, чем наступит предел безопасного шифрования.

6. Протокол Alert

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

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

Сигналы об ошибках указывают разрыв соединения (6.2. Сигналы ошибок). При получении такого сигнала реализации TLS следует передать ошибку приложению, а продолжение передачи или приёма данных через соединение недопустимо. Серверы и клиенты должны забыть секретные значения и ключи разорванного соединения за исключением PSK, связанных с квитанциями сессии, которые по возможности следует отбросить.

Все сигналы, указанные в параграфе 6.2, должны передаваться с AlertLevel=fatal и должны считаться сигналами об ошибках независимо от AlertLevel в сообщении. Неизвестные типы Alert должны считаться сигналами об ошибках.

Примечание. TLS определяет 2 базовых сигнала (раздел 6) для использования при отказах в разборе сообщений. Партнёры, получившие сообщение, которое не удаётся разобрать в соответствии с синтаксисом (например, недопустимо длинное), должны прерывать соединение с сигналом decode_error. Партнёры, получившие синтаксически корректное, но семантически недействительное сообщение (например, DHE с p = 1 или некорректное перечисляемое значение), должны прерывать соединение с сигналом illegal_parameter.

      enum { warning(1), fatal(2), (255) } AlertLevel;

      enum {
          close_notify(0),
          unexpected_message(10),
          bad_record_mac(20),
          record_overflow(22),
          handshake_failure(40),
          bad_certificate(42),
          unsupported_certificate(43),
          certificate_revoked(44),
          certificate_expired(45),
          certificate_unknown(46),
          illegal_parameter(47),
          unknown_ca(48),
          access_denied(49),
          decode_error(50),
          decrypt_error(51),
          protocol_version(70),
          insufficient_security(71),
          internal_error(80),
          inappropriate_fallback(86),
          user_canceled(90),
          missing_extension(109),
          unsupported_extension(110),
          unrecognized_name(112),
          bad_certificate_status_response(113),
          unknown_psk_identity(115),
          certificate_required(116),
          no_application_protocol(120),
          (255)
      } AlertDescription;

      struct {
          AlertLevel level;
          AlertDescription description;
      } Alert;

6.1. Сигналы о закрытии

Клиент и сервер должны иметь общую информацию о закрытии соединения во избежание атак с отсечкой (truncation).

close_notify

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

user_canceled

Этот сигнал информирует получателя о том, что отправитель отверг согласование по причинам, не связанным с протокольным отказом, и обычно имеет AlertLevel=warning. Если пользователь прервал операцию уже после согласования, лучше закрывать соединение с сигналом close_notify. После сигнала user_canceled следует передавать close_notify.

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

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

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

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

6.2. Сигналы ошибок

Обработка ошибок в TLS очень проста — обнаружившая ошибку сторона передаёт сообщение партнёру. При передаче или приёме сигнала о критической ошибке обе стороны должны сразу же разорвать соединение.

Всякий раз, когда реализация сталкивается с критической ошибкой, ей следует передать подходящий сигнал и она должна закрыть соединение без передачи или приёма дополнительных данных. В оставшейся части документа использование слов «разрыв соединения» и «прерывание согласования» без уточнения причины означает, что реализации следует передать сигнал, указанный приведёнными ниже описаниями. Фразы «разорвать соединение с сигналом X» и «прервать согласование с сигналом X» означают, что реализация должна передать сигнал X, если она передаёт какой-либо сигнал. Все сигналы, определённые далее в этом параграфе, а также все неизвестные сигналы считаются критическими в TLS 1.3 (6. Протокол Alert). Реализациям следует обеспечивать способ записи в системный журнал информации об отправке и получении сигналов.

Ниже перечислены определяемые спецификацией сигналы об ошибках.

unexpected_message

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

bad_record_mac

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

record_overflow

Полученная запись TLSCiphertext имеет размер больше (214 + 256) байтов или расшифрованная запись TLSPlaintext по размеру превышает 214 (или иное согласованное значение). Такие сигналы не должны появляться во взаимодействии между корректными реализациями за исключением случаев повреждения данных в сети.

handshake_failure

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

bad_certificate

Сертификат повреждён, содержит подписи, которые не удалось проверить и т. п.

unsupported_certificate

Неподдерживаемый тип сертификата.

certificate_revoked

Сертификат был отозван подписавшей его стороной.

certificate_expired

Срок действия сертификата истёк или сертификат недействителен по иной причине.

certificate_unknown

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

illegal_parameter

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

unknown_ca

Получена пригодная цепочка или часть цепочки сертификатов, но сертификат не принят, поскольку сертификат CA не удалось найти или он не соответствует известным привязкам доверия.

access_denied

Получен пригодный сертификат или PSK, но при контроле доступа отправитель решил не выполнять согласование.

decode_error

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

decrypt_error

Отказ криптографической операции при согласовании (не на уровне Record), включая невозможность проверить синтаксис, сообщение Finished или привязку PSK.

protocol_version

Предлагаемая партнёром версия протокола распознана, но не поддерживается (см. Приложение D).

insufficient_security

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

internal_error

Внутренняя ошибка, не связанная с партнёром или корректностью протокола (например, ошибка при выделении памяти), которая не позволяет продолжить работу.

inappropriate_fallback

Передаётся сервером в ответ на некорректную попытку повторного соединения от клиента (см. [RFC7507]).

missing_extension

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

unsupported_extension

Передаётся конечной точкой, получившей согласующее сообщение с запрещённым для этого типа расширением, ServerHello или Certificate с расширением, не предложенным в соответствующем ClientHello или CertificateRequest.

unrecognized_name

Передаётся сервером, если он не идентифицируется именем, указанным в расширении server_name ([RFC6066]).

bad_certificate_status_response

Передаётся клиентом при получении от сервера некорректного или неприемлемого отклика OCSP в расширении status_request ([RFC6066]).

unknown_psk_identity

Передаётся сервером, когда желательна организация ключа PSK, но клиент не предоставил приемлемого отождествления PSK. Передача этого сигнала необязательна и сервер может передать decrypt_error для указания непригодного отождествления PSK.

certificate_required

Передаётся сервером, когда сертификат клиента желателен, но не предоставлен клиентом.

no_application_protocol

Передаётся сервером, когда клиентское расширение application_layer_protocol_negotiation анонсирует лишь неподдерживаемые сервером протоколы (см. [RFC7301]).

Новые значения Alert назначаются IANA в соответствии с разделом 11.

7. Криптографические расчёты

Согласование TLS создаёт один или множество входных секретов, которые объединяются для генерации реального ключевого материала, как описано ниже. Процесс вывода ключей включает входные секреты и стенограмму (transcript) согласования. Отметим, что в результате наличия в стенограмме согласования случайных значений из сообщений Hello каждое согласование будет создавать разные секреты для трафика даже при использовании одинаковых входных секретов как в случае использования одного PSK для множества соединений.

7.1. Планирование ключей

Процесс вывода ключей использует функции HKDF-Extract и HKDF-Expand, определённые для HKDF [RFC5869], а также функции, определённые ниже

HKDF-Expand-Label(Secret, Label, Context, Length) = HKDF-Expand(Secret, HkdfLabel, Length)

где HkdfLabel имеет вид

       struct {
           uint16 length = Length;
           opaque label<7..255> = "tls13 " + Label;
           opaque context<0..255> = Context;
       } HkdfLabel;

       Derive-Secret(Secret, Label, Messages) =
            HKDF-Expand-Label(Secret, Label, Transcript-Hash(Messages), Hash.length)

Функция Hash, используемая Transcript-Hash и HKDF, является хэш-функцией шифра. Hash.length указывает выходной размер в байтах. Сообщения являются конкатенацией указанных согласующих сообщений, включая их поля типа и размера, но не включая заголовков уровня Record. Отметим, что в некоторых случаях в HKDF-Expand-Label передаётся Context нулевого размера (указывается строкой «»). Заданные в этом документе метки являются строками ASCII без NUL-символа в конце.

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

Ключи выводятся из двух входных секретов с использованием функций HKDF-Extract и Derive-Secret. Общий шаблон для добавления нового секрета использует HKDF-Extract с текущим состоянием секрета в качестве Salt и новым секретом IKM22, который будет добавлен. Входные секреты для TLS 1.3 приведены ниже.

  • PSK (заранее известный общий ключ, полученный извне или выведенный из значения resumption_master_secret в предыдущем соединении).

  • Общий секрет (EC)DHE (7.4. Расчёт общего секрета (EC)DHE).

Это создаёт полную процедуру вывода ключа, показанную ниже. Используемые обозначения приведены ниже.

  • HKDF-Extract создаётся принятием аргумента Salt «сверху» и аргумента IKM «слева» с выводом «вниз» и выходным именем «справа».

  • Аргумент Secret в Derive-Secret указывается входящей стрелкой. Например, Early Secret является Secret для генерации client_early_traffic_secret.

  • 0 указывает строку с Hash.length = 0.

             0
             |
             v
   PSK ->  HKDF-Extract = Early Secret
             |
             +-----> Derive-Secret(., "ext binder" | "res binder", "")
             |                     = binder_key
             |
             +-----> Derive-Secret(., "c e traffic", ClientHello)
             |                     = client_early_traffic_secret
             |
             +-----> Derive-Secret(., "e exp master", ClientHello)
             |                     = early_exporter_master_secret
             v
       Derive-Secret(., "derived", "")
             |
             v
   (EC)DHE -> HKDF-Extract = Handshake Secret
             |
             +-----> Derive-Secret(., "c hs traffic",
             |                     ClientHello...ServerHello)
             |                     = client_handshake_traffic_secret
             |
             +-----> Derive-Secret(., "s hs traffic",
             |                     ClientHello...ServerHello)
             |                     = server_handshake_traffic_secret
             v
       Derive-Secret(., "derived", "")
             |
             v
   0 -> HKDF-Extract = Master Secret
             |
             +-----> Derive-Secret(., "c ap traffic",
             |                     ClientHello...Finished от сервера)
             |                     = client_application_traffic_secret_0
             |
             +-----> Derive-Secret(., "s ap traffic",
             |                     ClientHello...Finished от сервера)
             |                     = server_application_traffic_secret_0
             |
             +-----> Derive-Secret(., "exp master",
             |                     ClientHello...Finished от сервера)
             |                     = exporter_master_secret
             |
             +-----> Derive-Secret(., "res master",
                                   ClientHello...Finished от клиента)
                                   = resumption_master_secret

Общая схема заключается в том, что секреты, показанные слева, являются просто необработанной энтропией без контекста, тогда как секреты справа включают контекст согласования и поэтому могут использоваться для создания рабочих ключей без дополнительного контекста. Отметим, что разные вызовы Derive-Secret могут давать различные аргументы Messages даже с одним секретом. В обмене 0-RTT вызовы Derive-Secret делаются с 4 разными стенограммами (transcript), а в 1-RTT вызовы используют три разных стенограммы.

При недоступности заданного секрета используется 0-значение, представляющее собой строку нулей размером Hash.length байтов. Отметим, что это не означает пропуска циклов (раундов), поэтому Early Secret все равно будет оставаться HKDF-Extract(0, 0), если PSK не используется. Для вычисления binder_key меткой служит «ext binder» для внешних PSK (полученных не от TLS) и «res binder» для восстановительных PSK (представляются как основной секрет из предыдущего согласования). Разные метки предотвращают замену одного PSK другим.

Имеется много возможных значений Early Secret в зависимости от выбранного сервером PSK. Клиент должен рассчитать одно значение для каждого возможного PSK, а если PSK не выбран, нужно рассчитать Early Secret, соответствующий нулевому PSK.

После вывода всех нужных значений из данного секрета этот секрет следует уничтожить.

7.2. Обновление секретов трафика

Когда согласование завершено, любая из сторон может обновить свои ключи трафика для передачи, используя согласующее сообщение KeyUpdate, определённое в параграфе 4.6.3. Новые ключи трафика создаётся путём генерации client_/server_application_traffic_secret_N+1 из client_/server_application_traffic_secret_N, как описано в предыдущем параграфе с последующим выводом ключей трафика, описанным в параграфе7.3.

Следующее значение значение application_traffic_secret рассчитывается как

application_traffic_secret_N+1 =
    HKDF-Expand-Label(application_traffic_secret_N, "traffic upd", "", Hash.length)

После расчёта client_/server_application_traffic_secret_N+1 и связанных ключей трафика реализации следует удалить client_/server_application_traffic_secret_N и связанные ключи трафика.

7.3. Расчёт ключей трафика

Ключевой материал для трафика создаётся с использованием перечисленных ниже входных значений.

  • Значение секрета.
  • Назначение создаваемого материала.
  • Размер создаваемого ключа.

Для генерации ключевого материала из входных значений применяются приведённые ниже расчёты.

   [sender]_write_key = HKDF-Expand-Label(Secret, "key", "", key_length)
   [sender]_write_iv  = HKDF-Expand-Label(Secret, "iv", "", iv_length)

где [sender] указывает передающую сторону. Значения Secret для каждого типа записи показаны в таблице.

 

Тип записи

Секрет

0-RTT Application

client_early_traffic_secret

Handshake

[sender]_handshake_traffic_secret

Application Data

[sender]_application_traffic_secret_N

 

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

7.4. Расчёт общего секрета (EC)DHE

7.4.1. Конечное поле Diffie-Hellman

Для групп конечных полей выполняется традиционный расчёт Diffie-Hellman [DH76]. Согласованный ключ (Z) преобразуется в строку байтов с кодированием big-endian и дополнением нулями слева до заданного размера простого числа. Эта строка служит общим секретом при планировании ключей, как указано выше.

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

7.4.2. Эллиптическая кривая Diffie-Hellman

Для secp256r1, secp384r1 и secp521r1 расчёты ECDH (включая генерацию параметра и ключа, а также расчёт общего секрета) выполняются в соответствии с [IEEE1363] по схеме ECKAS-DH1 с отображением отождествления в качестве функции вывода ключей (Key derivation function или KDF), так что общий секрет является координатой x точки эллиптической кривой общего секрета ECDH, представленной в виде строки октетов. Отметим, что эта строка (Z в терминологии IEEE 1363) как вывод FE2OSP23 имеет постоянный размер для любого данного поля и отбрасывание нулей в начале строки недопустимо.

Использование отождествления KDF является технической деталью. Полная картина включает использование ECDH с нетривиальной KDF, поскольку TLS не использует этот секрет напрямую нигде, кроме расчёта других секретов.

Для X25519 и X448 расчёты ECDH описаны ниже.

  • Открытый ключ для включения в структуру KeyShareEntry.key_exchange является результатом применения функции скалярного умножения ECDH к секретному ключу подходящего размера (вход скаляра) и стандартной открытой базовой точке (вход u-координаты).

  • Общий секрет ECDH является результатом применения функции скалярного умножения ECDH к секретному ключу подходящего размера (вход скаляра) и открытому ключу партнёра (вход u-координаты). Результат используется в необработанном виде (raw).

Для этих кривых реализации следует применять подход, описанный в [RFC7748] для расчёта общего секрета Diffie-Hellman. Реализация должна проверить, не является ли рассчитанный общий секрет Diffie-Hellman нулевым значением и в этом случае прерывать расчёт, как описано в разделе 6 [RFC7748]. Если разработчики применяют альтернативную реализацию этих кривых, им следует выполнять дополнительные проверки, как указано в разделе 7 [RFC7748].

7.5. Экспортёры

[RFC5705] определяет экспортёров ключевого материала для TLS в терминах псевдослучайной функции TLS (PRF). Этот документ заменяет PRF на HKDF, для чего требуется новая конструкция. Интерфейс экспортёра не меняется.

Значение экспортёра определяется выражением

   TLS-Exporter(label, context_value, key_length) =
       HKDF-Expand-Label(Derive-Secret(Secret, label, ""),
                         "exporter", Hash(context_value), key_length)

Значением Secret является early_exporter_master_secret или exporter_master_secret. Реализации должны использовать exporter_master_secret, если приложение явно не задаёт иное. Значение early_exporter_master_secret определено для использования в тех случаях, когда экспортёр требуется для данных 0-RTT. Для раннего экспортёра рекомендуется отдельный интерфейс, это избавляет от непреднамеренного использования одного экспортёра вместо другого.

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

Требования к формату меток экспортёров определены в разделе 4 [RFC5705].

8. 0-RTT и Anti-Replay

Как отмечено в параграфе 2.3 и приложении E.5, TLS не обеспечивает встроенной защиты от повторного использования для данных 0-RTT. С этим связаны две угрозы, которые следует принимать во внимание.

  • Атакующие в сети, которые могут организовать replay-атаку, просто дублируя поток данных 0-RTT.

  • Атакующие в сети, которые используют поведение повторов клиента, чтобы организовать получение сервером нескольких копий прикладного сообщения. Эта угроза уже существует в неком виде, поскольку клиенты, желающие обеспечить отказоустойчивость, реагируют на сетевые ошибки попытками повторять запросы. Однако 0-RTT добавляет дополнительное измерение для любой серверной системы, которая не поддерживает глобально согласованное состояние сервера. В частности, если серверная система имеет множество зон и квитанции из зоны A не принимаются зоной B, атакующий может дублировать ClientHello и ранние данные, предназначенные для зоны A, также и в зону B. В зоне A данные будут восприняты в 0-RTT, но зона B на сервере будет отвергать данные 0-RTT и форсирует полное согласование. Если атакующий заблокирует ServerHello от A, клиент будет завершать согласование с B и может повторить запрос, ведущий к дублированию на серверной системе в целом.

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

В дополнение к прямому влиянию повторов имеется класс атак, где даже операции, обычно считающиеся идемпотентными, могут использоваться в большом числе повторов (timing-атаки, истощение ресурсов и др., как описано в приложении E.5). Это можно смягчить путём обеспечения возможности воспроизведения данных 0-RTT лишь ограниченное число раз. Сервер должен гарантировать, что любой экземпляр (машина, процесс или иной элемент, относящийся к инфраструктуре сервера) будет воспринимать 0-RTT для одного и того же согласования 0-RTT не более 1 раза — это ограничит число повторов числом экземпляров сервера. Такая гарантия может быть достигнута путём локальной записи данных из недавно полученных ClientHello и отклонения повторов или иным методом, обеспечивающим такую же или более строгую гарантию. «Не более одного раза на экземпляр сервера» является минимальным требованием, серверам следует дополнительно ограничивать повторы 0-RTT, когда это возможно.

Второй тип атак невозможно предотвратить на уровне TLS и это должны делать все приложения. Отметим, что любое приложение, чьи клиенты реализуют какие-либо повторы, уже должны поддерживать ту или иную защиту от повторного использования (anti-replay).

8.1. Одноразовые квитанции

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

Если квитанция не является автономной и служит ключом базы данных, соответствующий PSK исключается из употребления при организации соединения с этим PSK для обеспечения эффективной защиты. Это повышает уровень защищенности для всех данных 0-RTT и PSK при использовании PSK без (EC)DHE.

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

8.2. Запись ClientHello

Другим вариантом защиты от повторного использования является запись уникального значения, выведенного из ClientHello (обычно это случайное значение или привязка PSK), и отклонение дубликатов. Запись всех ClientHello ведёт к безграничному росту состояния, но сервер может записывать сообщения в заданном временном окне и применять obfuscated_ticket_age для гарантии того, что квитанции не будут повторно применяться за пределами этого окна.

Для реализации этого сервер при получении ClientHello сначала проверяет привязку PSK, как описано в параграфе 4.2.11. Расширение PSK. Затем рассчитывается expected_arrival_time, как описано в следующем параграфе, и отвергаются 0-RTT, выходящие за пределы окна записи, с переходом к согласованию 1-RTT.

Если expected_arrival_time попадает в окно, сервер проверяет, записано ли соответствующее сообщение ClientHello. Если сообщение найдено, сервер прерывает согласование с сигналом illegal_parameter или воспринимает PSK, отвергая 0-RTT. Если соответствующего ClientHello не найдено, сервер воспринимает 0-RTT и сохраняет ClientHello, пока expected_arrival_time находится в окне. Сервер может также реализовать хранение данных с ложными срабатываниями, таких как фильтры Bloom, которые в этом случае должны реагировать на возможный повтор, отвергая 0-RTT, но прерывать согласование недопустимо.

Сервер должен выводить ключи хранилища только из проверенных разделов ClientHello. Если ClientHello содержит несколько отождествлений PSK, атакующий может создать множество ClientHello с другим значением привязки для менее предпочтительного отождествления в предположении, что сервер не проверит его (как рекомендовано в параграфе 4.2.11). Т. е. если клиент передаёт PSK A и B, но сервер предпочитает A, атакующий может изменить привязку для B, не влияя на привязку для A. Если привязка B является частью ключа хранилища, это сообщение ClientHello не будет казаться дубликатом, что приведёт к его восприятию и может вызывать побочные эффекты (например, загрязнение кэша), хотя данные 0-RTT не будут расшифрованы в результате использования другого ключа. Если в качестве ключа хранилища используется проверенная привязка или ClientHello.random, такая атака становится невозможной.

Поскольку этот механизм не требует хранить все остающиеся квитанции, его реализация может оказаться проще в распределенных системах с высокой скоростью восстановления и 0-RTT за счёт возможно снижения уровня защиты от повторов из-за сложности надёжного хранения и извлечения принятых сообщений ClientHello. Во многих таких системах непрактично поддерживать глобально согласованное хранилище всех полученных ClientHello. В этом случае лучшая защита от повторного использования обеспечивается наличием одной зоны хранения, полномочной для данной квитанции и отвергающей 0-RTT с квитанциями из других зон. Этот подход предотвращает простые повторы от атакующих, поскольку лишь одна зона будет воспринимать данные 0-RTT. Более слабым решением будет реализация отдельного хранилища для каждой зоны и восприятие 0-RTT в любой зоне. Такой подход ограничивает число повторов до одного на зону. Разумеется, дублирование прикладных сообщений остаётся возможным в обоих вариантах.

При новом запуске реализации ей следует отвергать 0-RTT, пока окно записи включает время старта. Иначе возникает риск получения повтора пакетов, которые были отправлены в течение этого интервала.

Примечание. Если часы клиента работают быстрее часов сервера, сообщение ClientHello может быть получено за пределами окна (в будущем) и в этом случае оно может быть воспринято для 1-RTT, что вынудит клиента к повтору и последующему восприятию 0-RTT. Это является другим вариантом второго типа атак, описанного в параграфе 8.

8.3. Проверка свежести

Поскольку в ClientHello указано время отправки, можно убедиться в том, что сообщение отправлено недавно и принимать 0-RTT лишь для свежих ClientHello, используя для остальных согласование 1-RTT. Это требуется для механизма хранения ClientHello, описанного в параграфе 8.2, поскольку иначе серверу придётся хранить неограниченное число ClientHello, а также полезно для оптимизации автономных одноразовых квитанций, поскольку позволяет отвергать ClientHello, которые нельзя использовать для 0-RTT.

Для реализации этого механизма серверу нужно сохранять время генерации сеансовой квитанции, смещённое на оценку времени кругового обхода между клиентом и сервером adjusted_creation_time = creation_time + estimated_RTT. Это значение можно закодировать в квитанции, избавляясь от необходимости хранить каждую выпущенную квитанцию. Сервер может определить клиентское представление возраста квитанции, вычитая значение ticket_age_add в квитанции из obfuscated_ticket_age в клиентском расширении pre_shared_key. Сервер может определить expected_arrival_time для ClientHello как expected_arrival_time = adjusted_creation_time + clients_ticket_age. При получении нового ClientHello значение expected_arrival_time сравнивается с текущим временем сервера и при разнице больше определённого значения 0-RTT отвергается, хотя завершение согласования 1-RTT может быть разрешено.

Существует несколько источников ошибок, которые могут приводить к несоответствию expected_arrival_time и измеренного времени. Различия в скорости хода часов клиента и сервера вероятно будут минимальными, хотя абсолютное отклонение может быть очень большим. Задержки в сети являются наиболее вероятной причиной расхождения. Сообщения NewSessionTicket и ClientHello могут передаваться повторно, что ведёт к задержке, которая может быть скрыта протоколом TCP. Для клиентов в Internet это предполагает окно порядка 10 секунд с учётом расхождения часов и погрешностей измерения. В других случаях размер окна может отличаться. Распределение сдвига часов не является симметричным, поэтому оптимальным компромиссом будет асимметричный диапазон допустимых значений рассогласования.

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

9. Требования соответствия

9.1. Обязательные шифронаборы

В отсутствие стандарта профиля приложения, задающего иное, должны выполняться приведённые ниже условия.

Соответствующее TLS приложение должно реализовать шифр TLS_AES_128_GCM_SHA256 [GCM] и следует реализовать шифры TLS_AES_256_GCM_SHA384 [GCM] и TLS_CHACHA20_POLY1305_SHA256 [RFC8439] (Приложение B.4).

Соответствующее TLS приложение должно поддерживать цифровые подписи rsa_pkcs1_sha256 (сертификаты), rsa_pss_rsae_sha256 (CertificateVerify и сертификаты) и ecdsa_secp256r1_sha256. Соответствующее TLS приложение должно поддерживать обмен ключами secp256r1 (NIST P-256) и следует поддерживать обмен X25519 [RFC7748].

9.2. Обязательные расширения

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

  • Поддерживаемые версии (supported_versions, 4.2.1. Поддерживаемые версии).

  • Cookie (cookie, 4.2.2. Cookie).

  • Алгоритмы подписи (signature_algorithms, 4.2.3. Алгоритмы подписи).

  • Сертификаты алгоритма подписи (signature_algorithms_cert, 4.2.3. Алгоритмы подписи).

  • Согласованные группы (supported_groups, 4.2.7. Поддерживаемые группы).

  • Общий ключ (key_share, 4.2.8. Совместное использование ключа).

  • Указание имени сервера (server_name, параграф 3 of [RFC6066]).

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

  • supported_versions требуется для всех сообщений ClientHello, ServerHello, HelloRetryRequest.

  • signature_algorithms требуется для аутентификации сертификатов.

  • supported_groups требуется для сообщений ClientHello, использующих обмен ключами DHE или ECDHE.

  • key_share требуется для обмена ключами DHE или ECDHE.

  • pre_shared_key требуется для согласования ключа PSK.

  • psk_key_exchange_modes требуется для согласования ключа PSK.

Считается, что клиент пытается выполнить согласование с использованием этой спецификации, если ClientHello содержит supported_versions со значением 0x0304 в теле. Такое сообщение ClientHello должно соответствовать приведённым ниже требованиям.

  • Если нет расширения pre_shared_key, сообщение должно включать signature_algorithms и supported_groups.

  • При наличии расширения supported_groups сообщение должно также содержать key_share и наоборот. Разрешается указывать пустой вектор KeyShare.client_shares.

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

Кроме того, все реализации должны поддерживать использование расширения server_name с приложениями, которые способны его использовать. Серверы могут требовать от клиентов передачи пригодного расширения server_name. Требующим это расширение серверам следует отвечать на ClientHello без расширения server_name прерыванием соединения с сигналом missing_extension.

9.3. Инварианты протокола

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

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

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

  • Клиент, передавший ClientHello, должен поддерживать все анонсированные в нем параметры. Иначе могут возникнуть проблемы, если сервер выберет один из неподдерживаемых параметров.

  • Сервер, получивший ClientHello, должен корректно игнорировать все нераспознанные шифры, расширения и другие параметры. Иначе может возникнуть отказ при работе с более новым клиентом. В TLS 1.3 клиент, получивший CertificateRequest или NewSessionTicket, должен игнорировать все неизвестные расширения.

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

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

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

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

Разработка TLS 1.3 ограничивалась широким распространением не соответствующих TLS промежуточных устройств (Приложение D.4), однако это не отменяет инварианты. Эти промежуточные устройства остаются несоответствующими.

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

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

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

В этом документе используется несколько реестров, созданных в [RFC4346] и обновлённых в [RFC8447]. Агентство IANA обновило реестры в соответствии с этим документом. Реестры и правила для них указаны ниже.

  • TLS Cipher Suites — значения с первым байтом из диапазона 0-254 (десятичные) выделяются по процедуре Specification Required [RFC8126], значения с первым байтом 255 (десятичное) служат для приватных приложений [RFC8126]. Агентство IANA добавило в реестр шифры, указанные в Приложении B.4. Столбцы Value и Description взяты из таблицы, в столбцах DTLS-OK и Recommended для новых шифров указано значение Y.

  • TLS ContentType — новые значения выделяются по процедуре Standards Action [RFC8126].

  • TLS Alerts — новые значения выделяются по процедуре Standards Action [RFC8126]. Агентство IANA внесло в этот реестр значения из приложения B.2. В колонке DTLS-OK указано Y для всех этих значений. Для значений, указанных как _RESERVED, приведены комментарии с описанием их применения.

  • — новые значения выделяются по процедуре Standards Action [RFC8126]. Агентство IANA обновило этот реестр, переименовав элемент 4 (NewSessionTicket) в new_session_ticket, и заполнило значениями из Приложения B.3. В колонке DTLS-OK указано Y для всех этих значений. Для значений, указанных как _RESERVED, приведены комментарии с описанием их применения.

Этот документ использует реестр TLS ExtensionType Values, созданный в [RFC4366]. Агентство IANA обновило реестр в соответствии с этим документом. Изменения приведены ниже.

  • Изменена политика регистрации. Значения с первым байтом из диапазона 0-254 (десятичные) назначаются по процедуре Specification Required [RFC8126], значения с первым байтом 255 (десятичное) служат для приватных приложений [RFC8126].

  • Добавлены расширения key_share, pre_shared_key, psk_key_exchange_modes, early_data, cookie, supported_versions, certificate_authorities, oid_filters, post_handshake_auth и signature_algorithms_cert со значениями, заданными у этом документе и Recommended = Y.

  • Включена колонка TLS 1.3, где указываются сообщения, в которых может присутствовать расширение. Эта колонка заполнена значениями в соответствии с таблицей из параграфа 4.2, а отсутствующие в этой таблице расширения помечены символом «-», указывающим, что они не применяются в TLS 1.3.

Этот документ обновляет запись в реестре TLS Certificate Types, созданную в [RFC6091] и обновлённую в [RFC8447]. Агентство IANA обновило запись для значения 1, указав имя OpenPGP_RESERVED, Recommended = N и комментарий «Used in TLS versions prior to 1.3.» (используется в TLS до версии 1.3).

Этот документ обновляет реестр TLS Certificate Status Types, созданный в [RFC6961]. Агентство IANA обновило запись для значения 2, указав имя ocsp_multi_RESERVED и комментарий «Used in TLS versions prior to 1.3.» (используется в TLS до версии 1.3).

Этот документ обновляет две записи в реестре TLS Supported Groups (создан в [RFC4492] с другим именем, сейчас поддерживается [RFC8422]), а также обновлён в [RFC7919] и [RFC8447]. Записи для значений 29 и 30 (x25519 и x448) обновлены со ссылкой на этот документ.

Кроме того, этот документ определяет два новых реестра, поддерживаемых IANA.

  • TLS SignatureScheme. Значения с первым байтом из диапазона 0-253 (десятичные) назначаются по процедуре Specification Required [RFC8126]. Значения с первым байтом 254 или 255 (десятичные) зарезервированы как Private Use [RFC8126]. Значения с первым байтом из диапазона 0-6 или вторым байтом из диапазона 0-3 в настоящее время не выделены и зарезервированы для совместимости с прежними версиями. Этот реестр имеет колонку Recommended (рекомендовано). В реестр изначально включены значения, описанные в параграфе 4.2.3. Рекомендованы значения ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512 и ed25519. В колонке Recommended указывается значение N (нет), пока явно не запрошено значение Y (да), для чего требуется процедура Standards Action [RFC8126]. Для замены Y->N требуется процедура IESG Approval.

  • TLS PskKeyExchangeMode. Значения из диапазона 0-253 (десятичные) выделяются по процедуре Specification Required [RFC8126]. Значения 254 и 255 (десятичные) зарезервированы как Private Use [RFC8126]. Этот реестр имеет колонку Recommended (рекомендовано). В реестр изначально включены значения psk_ke (0) и psk_dhe_ke (1), указанные как рекомендуемые. В колонке Recommended указывается N (нет), пока явно не запрошено значение Y (да), для чего требуется процедура Standards Action [RFC8126]. Для замены Y->N требуется процедура IESG Approval.

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

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

[DH76] Diffie, W. and M. Hellman, «New directions in cryptography», IEEE Transactions on Information Theory, Vol. 22 No. 6, pp. 644-654, DOI 10.1109/TIT.1976.1055638, November 1976.

[ECDSA] American National Standards Institute, «Public Key Cryptography for the Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA)», ANSI ANS X9.62-2005, November 2005.

[GCM] Dworkin, M., «Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC», NIST Special Publication 800-38D, DOI 10.6028/NIST.SP.800-38D, November 2007.

[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, «HMAC: Keyed-Hashing for Message Authentication», RFC 2104, DOI 10.17487/RFC2104, February 1997, <https://www.rfc-editor.org/info/rfc2104>.

[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>.

[RFC5116] McGrew, D., «An Interface and Algorithms for Authenticated Encryption», RFC 5116, DOI 10.17487/RFC5116, January 2008, <https://www.rfc-editor.org/info/rfc5116>.

[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, «Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile», RFC 5280, DOI 10.17487/RFC5280, May 2008, <https://www.rfc-editor.org/info/rfc5280>.

[RFC5705] Rescorla, E., «Keying Material Exporters for Transport Layer Security (TLS)», RFC 5705, DOI 10.17487/RFC5705, March 2010, <https://www.rfc-editor.org/info/rfc5705>.

[RFC5756] Turner, S., Brown, D., Yiu, K., Housley, R., and T. Polk, «Updates for RSAES-OAEP and RSASSA-PSS Algorithm Parameters», RFC 5756, DOI 10.17487/RFC5756, January 2010, <https://www.rfc-editor.org/info/rfc5756>.

[RFC5869] Krawczyk, H. and P. Eronen, «HMAC-based Extract-and-Expand Key Derivation Function (HKDF)», RFC 5869, DOI 10.17487/RFC5869, May 2010, <https://www.rfc-editor.org/info/rfc5869>.

[RFC6066] Eastlake 3rd, D., «Transport Layer Security (TLS) Extensions: Extension Definitions», RFC 6066, DOI 10.17487/RFC6066, January 2011, <https://www.rfc-editor.org/info/rfc6066>.

[RFC6655] McGrew, D. and D. Bailey, «AES-CCM Cipher Suites for Transport Layer Security (TLS)», RFC 6655, DOI 10.17487/RFC6655, July 2012, <https://www.rfc-editor.org/info/rfc6655>.

[RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., Galperin, S., and C. Adams, «X.509 Internet Public Key Infrastructure Online Certificate Status Protocol — OCSP», RFC 6960, DOI 10.17487/RFC6960, June 2013, <https://www.rfc-editor.org/info/rfc6960>.

[RFC6961] Pettersen, Y., «The Transport Layer Security (TLS) Multiple Certificate Status Request Extension», RFC 6961, DOI 10.17487/RFC6961, June 2013, <https://www.rfc-editor.org/info/rfc6961>.

[RFC6962] Laurie, B., Langley, A., and E. Kasper, «Certificate Transparency», RFC 6962, DOI 10.17487/RFC6962, June 2013, <https://www.rfc-editor.org/info/rfc6962>.

[RFC6979] Pornin, T., «Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA)», RFC 6979, DOI 10.17487/RFC6979, August 2013, <https://www.rfc-editor.org/info/rfc6979>.

[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, «Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension», RFC 7301, DOI 10.17487/RFC7301, July 2014, <https://www.rfc-editor.org/info/rfc7301>.

[RFC7507] Moeller, B. and A. Langley, «TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks», RFC 7507, DOI 10.17487/RFC7507, April 2015, <https://www.rfc-editor.org/info/rfc7507>.

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

[RFC7919] Gillmor, D., «Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS)», RFC 7919, DOI 10.17487/RFC7919, August 2016, <https://www.rfc-editor.org/info/rfc7919>.

[RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch, «PKCS #1: RSA Cryptography Specifications Version 2.2», RFC 8017, DOI 10.17487/RFC8017, November 2016, <https://www.rfc-editor.org/info/rfc8017>.

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

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

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

[RFC8439] Nir, Y. and A. Langley, «ChaCha20 and Poly1305 for IETF Protocols», RFC 8439, DOI 10.17487/RFC8439, June 2018, <https://www.rfc-editor.org/info/rfc8439>.

[SHS] Dang, Q., «Secure Hash Standard (SHS)», National Institute of Standards and Technology report, DOI 10.6028/NIST.FIPS.180-4, August 2015.

[X690] ITU-T, «Information technology — ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)», ISO/IEC 8825-1:2015, November 2015.

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

[AEAD-LIMITS] Luykx, A. and K. Paterson, «Limits on Authenticated Encryption Use in TLS», August 2017, <http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>.

[BBFGKZ16] Bhargavan, K., Brzuska, C., Fournet, C., Green, M., Kohlweiss, M., and S. Zanella-Beguelin, «Downgrade Resilience in Key-Exchange Protocols», Proceedings of IEEE Symposium on Security and Privacy (San Jose), DOI 10.1109/SP.2016.37, May 2016.

[BBK17] Bhargavan, K., Blanchet, B., and N. Kobeissi, «Verified Models and Reference Implementations for the TLS 1.3 Standard Candidate», Proceedings of IEEE Symposium on Security and Privacy (San Jose), DOI 10.1109/SP.2017.26, May 2017.

[BDFKPPRSZZ16] Bhargavan, K., Delignat-Lavaud, A., Fournet, C., Kohlweiss, M., Pan, J., Protzenko, J., Rastogi, A., Swamy, N., Zanella-Beguelin, S., and J. Zinzindohoue, «Implementing and Proving the TLS 1.3 Record Layer», Proceedings of IEEE Symposium on Security and Privacy (San Jose), May 2017, <https://eprint.iacr.org/2016/1178>.

[Ben17a] Benjamin, D., «Presentation before the TLS WG at IETF 100», November 2017, <https://datatracker.ietf.org/meeting/100/materials/slides-100-tls-sessa-tls13/>.

[Ben17b] Benjamin, D., «Additional TLS 1.3 results from Chrome», message to the TLS mailing list, 18 December 2017, <https://www.ietf.org/mail-archive/web/tls/current/msg25168.html>.

[Blei98] Bleichenbacher, D., «Chosen Ciphertext Attacks against Protocols Based on RSA Encryption Standard PKCS #1», Proceedings of CRYPTO ’98, 1998.

[BMMRT15] Badertscher, C., Matt, C., Maurer, U., Rogaway, P., and B. Tackmann, «Augmented Secure Channels and the Goal of the TLS 1.3 Record Layer», ProvSec 2015, September 2015, <https://eprint.iacr.org/2015/394>.

[BT16] Bellare, M. and B. Tackmann, «The Multi-User Security of Authenticated Encryption: AES-GCM in TLS 1.3», Proceedings of CRYPTO 2016, July 2016, <https://eprint.iacr.org/2016/564>.

[CCG16] Cohn-Gordon, K., Cremers, C., and L. Garratt, «On Post-compromise Security», IEEE Computer Security Foundations Symposium, DOI 10.1109/CSF.2016.19, July 2015.

[CHECKOWAY] Checkoway, S., Maskiewicz, J., Garman, C., Fried, J., Cohney, S., Green, M., Heninger, N., Weinmann, R., Rescorla, E., and H. Shacham, «A Systematic Analysis of the Juniper Dual EC Incident», Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security — CCS ’16, DOI 10.1145/2976749.2978395, October 2016.

[CHHSV17] Cremers, C., Horvat, M., Hoyland, J., Scott, S., and T. van der Merwe, «Awkward Handshake: Possible mismatch of client/server view on client authentication in post-handshake mode in Revision 18», message to the TLS mailing list, 10 February 2017, <https://www.ietf.org/mail-archive/web/tls/current/msg22382.html>.

[CHSV16] Cremers, C., Horvat, M., Scott, S., and T. van der Merwe, «Automated Analysis and Verification of TLS 1.3: 0-RTT, Resumption and Delayed Authentication», Proceedings of IEEE Symposium on Security and Privacy (San Jose), DOI 10.1109/SP.2016.35, May 2016, <https://ieeexplore.ieee.org/document/7546518/>.

[CK01] Canetti, R. and H. Krawczyk, «Analysis of Key-Exchange Protocols and Their Use for Building Secure Channels», Proceedings of Eurocrypt 2001, DOI 10.1007/3-540-44987-6_28, April 2001.

[CLINIC] Miller, B., Huang, L., Joseph, A., and J. Tygar, «I Know Why You Went to the Clinic: Risks and Realization of HTTPSTraffic Analysis», Privacy Enhancing Technologies, pp. 143-163, DOI 10.1007/978-3-319-08506-7_8, 2014.

[DFGS15] Dowling, B., Fischlin, M., Guenther, F., and D. Stebila, «A Cryptographic Analysis of the TLS 1.3 Handshake Protocol Candidates», Proceedings of ACM CCS 2015, October 2015, <https://eprint.iacr.org/2015/914>.

[DFGS16] Dowling, B., Fischlin, M., Guenther, F., and D. Stebila, «A Cryptographic Analysis of the TLS 1.3 Full and Pre-shared Key Handshake Protocol», TRON 2016, February 2016, <https://eprint.iacr.org/2016/081>.

[DOW92] Diffie, W., van Oorschot, P., and M. Wiener, «Authentication and authenticated key exchanges», Designs, Codes and Cryptography, DOI 10.1007/BF00124891, June 1992.

[DSS] National Institute of Standards and Technology, U.S. Department of Commerce, «Digital Signature Standard (DSS)», NIST FIPS PUB 186-4, DOI 10.6028/NIST.FIPS.186-4, July 2013.

[FG17] Fischlin, M. and F. Guenther, «Replay Attacks on Zero Round-Trip Time: The Case of the TLS 1.3 Handshake Candidates», Proceedings of EuroS&P 2017, April 2017, <https://eprint.iacr.org/2017/082>.

[FGSW16] Fischlin, M., Guenther, F., Schmidt, B., and B. Warinschi, «Key Confirmation in Key Exchange: A Formal Treatment and Implications for TLS 1.3», Proceedings of IEEE Symposium on Security and Privacy (San Jose), DOI 10.1109/SP.2016.34, May 2016, <https://ieeexplore.ieee.org/document/7546517/>.

[FW15] Weimer, F., «Factoring RSA Keys With TLS Perfect Forward Secrecy», September 2015.

[HCJC16] Husak, M., Cermak, M., Jirsik, T., and P. Celeda, «HTTPS traffic analysis and client identification using passive SSL/TLS fingerprinting», EURASIP Journal on Information Security, Vol. 2016, DOI 10.1186/s13635-016-0030-7, February 2016.

[HGFS15] Hlauschek, C., Gruber, M., Fankhauser, F., and C. Schanes, «Prying Open Pandora’s Box: KCI Attacks against TLS», Proceedings of USENIX Workshop on Offensive Technologies, August 2015.

[IEEE1363] IEEE, «IEEE Standard Specifications for Public Key Cryptography», IEEE Std. 1363-2000, DOI 10.1109/IEEESTD.2000.92292.

[JSS15] Jager, T., Schwenk, J., and J. Somorovsky, «On the Security of TLS 1.3 and QUIC Against Weaknesses in PKCS#1 v1.5 Encryption», Proceedings of ACM CCS 2015, DOI 10.1145/2810103.2813657, October 2015, <https://www.nds.rub.de/media/nds/veroeffentlichungen/2015/08/21/Tls13QuicAttacks.pdf>.

[KEYAGREEMENT] Barker, E., Chen, L., Roginsky, A., Vassilev, A., and R. Davis, «Recommendation for Pair-Wise Key Establishment Schemes Using Discrete Logarithm Cryptography», National Institute of Standards and Technology, DOI 10.6028/NIST.SP.800-56Ar3, April 2018.

[Kraw10] Krawczyk, H., «Cryptographic Extraction and Key Derivation: The HKDF Scheme», Proceedings of CRYPTO 2010, August 2010, <https://eprint.iacr.org/2010/264>.

[Kraw16] Krawczyk, H., «A Unilateral-to-Mutual Authentication Compiler for Key Exchange (with Applications to Client Authentication in TLS 1.3», Proceedings of ACM CCS 2016, October 2016, <https://eprint.iacr.org/2016/711>.

[KW16] Krawczyk, H. and H. Wee, «The OPTLS Protocol and TLS 1.3», Proceedings of EuroS&P 2016, March 2016, <https://eprint.iacr.org/2015/978>.

[LXZFH16] Li, X., Xu, J., Zhang, Z., Feng, D., and H. Hu, «Multiple Handshakes Security of TLS 1.3 Candidates», Proceedings of IEEE Symposium on Security and Privacy (San Jose), DOI 10.1109/SP.2016.36, May 2016, <https://ieeexplore.ieee.org/document/7546519/>.

[Mac17] MacCarthaigh, C., «Security Review of TLS1.3 0-RTT», March 2017, <https://github.com/tlswg/tls13-spec/issues/1001>.

[PS18] Patton, C. and T. Shrimpton, «Partially specified channels: The TLS 1.3 record layer without elision», 2018, <https://eprint.iacr.org/2018/634>.

[PSK-FINISHED] Scott, S., Cremers, C., Horvat, M., and T. van der Merwe, «Revision 10: possible attack if client authentication is allowed during PSK», message to the TLS mailing list, 31 October 2015, <https://www.ietf.org/mail-archive/web/tls/current/msg18215.html>.

[REKEY] Abdalla, M. and M. Bellare, «Increasing the Lifetime of a Key: A Comparative Analysis of the Security of Re-keying Techniques», ASIACRYPT 2000, DOI 10.1007/3-540-44448-3_42, October 2000.

[Res17a] Rescorla, E., «Preliminary data on Firefox TLS 1.3 Middlebox experiment», message to the TLS mailing list, 5 December 2017, <https://www.ietf.org/mail-archive/web/tls/current/msg25091.html>.

[Res17b] Rescorla, E., «More compatibility measurement results», message to the TLS mailing list, 22 December 2017, <https://www.ietf.org/mail-archive/web/tls/current/msg25179.html>.

[RFC3552] Rescorla, E. and B. Korver, «Guidelines for Writing RFC Text on Security Considerations», BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, <https://www.rfc-editor.org/info/rfc3552>.

[RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, «Randomness Requirements for Security», BCP 106, RFC 4086, DOI 10.17487/RFC4086, June 2005, <https://www.rfc-editor.org/info/rfc4086>.

[RFC4346] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.1», RFC 4346, DOI 10.17487/RFC4346, April 2006, <https://www.rfc-editor.org/info/rfc4346>.

[RFC4366] Blake-Wilson, S., Nystrom, M., Hopwood, D., Mikkelsen, J., and T. Wright, «Transport Layer Security (TLS) Extensions», RFC 4366, DOI 10.17487/RFC4366, April 2006, <https://www.rfc-editor.org/info/rfc4366>.

[RFC4492] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., and B. Moeller, «Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)», RFC 4492, DOI 10.17487/RFC4492, May 2006, <https://www.rfc-editor.org/info/rfc4492>.

[RFC5077] Salowey, J., Zhou, H., Eronen, P., and H. Tschofenig, «Transport Layer Security (TLS) Session Resumption without Server-Side State», RFC 5077, DOI 10.17487/RFC5077, January 2008, <https://www.rfc-editor.org/info/rfc5077>.

[RFC5246] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.2», RFC 5246, DOI 10.17487/RFC5246, August 2008, <https://www.rfc-editor.org/info/rfc5246>.

[RFC5764] McGrew, D. and E. Rescorla, «Datagram Transport Layer Security (DTLS) Extension to Establish Keys for the Secure Real-time Transport Protocol (SRTP)», RFC 5764, DOI 10.17487/RFC5764, May 2010, <https://www.rfc-editor.org/info/rfc5764>.

[RFC5929] Altman, J., Williams, N., and L. Zhu, «Channel Bindings for TLS», RFC 5929, DOI 10.17487/RFC5929, July 2010, <https://www.rfc-editor.org/info/rfc5929>.

[RFC6091] Mavrogiannopoulos, N. and D. Gillmor, «Using OpenPGP Keys for Transport Layer Security (TLS) Authentication», RFC 6091, DOI 10.17487/RFC6091, February 2011, <https://www.rfc-editor.org/info/rfc6091>.

[RFC6101] Freier, A., Karlton, P., and P. Kocher, «The Secure Sockets Layer (SSL) Protocol Version 3.0», RFC 6101, DOI 10.17487/RFC6101, August 2011, <https://www.rfc-editor.org/info/rfc6101>.

[RFC6176] Turner, S. and T. Polk, «Prohibiting Secure Sockets Layer (SSL) Version 2.0», RFC 6176, DOI 10.17487/RFC6176, March 2011, <https://www.rfc-editor.org/info/rfc6176>.

[RFC6347] Rescorla, E. and N. Modadugu, «Datagram Transport Layer Security Version 1.2», RFC 6347, DOI 10.17487/RFC6347, January 2012, <https://www.rfc-editor.org/info/rfc6347>.

[RFC6520] Seggelmann, R., Tuexen, M., and M. Williams, «Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension», RFC 6520, DOI 10.17487/RFC6520, February 2012, <https://www.rfc-editor.org/info/rfc6520>.

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

[RFC7250] Wouters, P., Ed., Tschofenig, H., Ed., Gilmore, J., Weiler, S., and T. Kivinen, «Using Raw Public Keys in Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)», RFC 7250, DOI 10.17487/RFC7250, June 2014, <https://www.rfc-editor.org/info/rfc7250>.

[RFC7465] Popov, A., «Prohibiting RC4 Cipher Suites», RFC 7465, DOI 10.17487/RFC7465, February 2015, <https://www.rfc-editor.org/info/rfc7465>.

[RFC7568] Barnes, R., Thomson, M., Pironti, A., and A. Langley, «Deprecating Secure Sockets Layer Version 3.0», RFC 7568, DOI 10.17487/RFC7568, June 2015, <https://www.rfc-editor.org/info/rfc7568>.

[RFC7627] Bhargavan, K., Ed., Delignat-Lavaud, A., Pironti, A., Langley, A., and M. Ray, «Transport Layer Security (TLS) Session Hash and Extended Master Secret Extension», RFC 7627, DOI 10.17487/RFC7627, September 2015, <https://www.rfc-editor.org/info/rfc7627>.

[RFC7685] Langley, A., «A Transport Layer Security (TLS) ClientHello Padding Extension», RFC 7685, DOI 10.17487/RFC7685, October 2015, <https://www.rfc-editor.org/info/rfc7685>.

[RFC7924] Santesson, S. and H. Tschofenig, «Transport Layer Security (TLS) Cached Information Extension», RFC 7924, DOI 10.17487/RFC7924, July 2016, <https://www.rfc-editor.org/info/rfc7924>.

[RFC8305] Schinazi, D. and T. Pauly, «Happy Eyeballs Version 2: Better Connectivity Using Concurrency», RFC 8305, DOI 10.17487/RFC8305, December 2017, <https://www.rfc-editor.org/info/rfc8305>.

[RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, «Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlier», RFC 8422, DOI 10.17487/RFC8422, August 2018, <https://www.rfc-editor.org/info/rfc8422>.

[RFC8447] Salowey, J. and S. Turner, «IANA Registry Updates for TLS and DTLS», RFC 8447, DOI 10.17487/RFC8447, August 2018, <https://www.rfc-editor.org/info/rfc8447>.

[RFC8449] Thomson, M., «Record Size Limit Extension for TLS», RFC 8449, DOI 10.17487/RFC8449, August 2018, <https://www.rfc-editor.org/info/rfc8449>.

[RSA] Rivest, R., Shamir, A., and L. Adleman, «A Method for Obtaining Digital Signatures and Public-Key Cryptosystems», Communications of the ACM, Vol. 21 No. 2, pp. 120-126, DOI 10.1145/359340.359342, February 1978.

[SIGMA] Krawczyk, H., «SIGMA: The ‘SIGn-and-MAc’ Approach to Authenticated Diffie-Hellman and its Use in the IKE Protocols», Proceedings of CRYPTO 2003, DOI 10.1007/978-3-540-45146-4_24, August 2003.

[SLOTH] Bhargavan, K. and G. Leurent, «Transcript Collision Attacks: Breaking Authentication in TLS, IKE, and SSH», Network and Distributed System Security Symposium (NDSS 2016), DOI 10.14722/ndss.2016.23418, February 2016.

[SSL2] Hickman, K., «The SSL Protocol», February 1995.

[TIMING] Boneh, D. and D. Brumley, «Remote Timing Attacks Are Practical», USENIX Security Symposium, August 2003.

[TLS13-TRACES] Thomson, M., «Example Handshake Traces for TLS 1.3», Work in Progress24, draft-ietf-tls-tls13-vectors-06, July 2018.

[X501] ITU-T, «Information Technology — Open Systems Interconnection — The Directory: Models», ITU-T X.501, October 2016, <https://www.itu.int/rec/T-REC-X.501/en>.

Приложение A. Конечные автоматы

В этом приложении дана сводка допустимых переходов при согласовании для клиента и сервера. Состояния (заглавные буквы, например START) не имеют формального значения и приведены для упрощения восприятия. Действия, происходящие лишь при определённых обстоятельствах, указаны в квадратных скобках []. Обозначение K_{send,recv} = foo указывает установку для ключа приёма/передачи указанного значения.

A.1. Клиент

                              START <----+
           Передача ClientHello |        | Приём HelloRetryRequest
       [K_send = ранние данные] |        |
                                v        |
           /                 WAIT_SH ----+
           |                    | Приём ServerHello
           |                    | K_recv = согласование
     Можно |                    V
передавать |                 WAIT_EE
    ранние |                    | Приём EncryptedExtensions
    данные |           +--------+--------+
           |Применение |                 | Применение сертификата
           |       PSK |                 v
           |           |            WAIT_CERT_CR
           |           |       Приём |       | Приём CertificateRequest
           |           | Certificate |       v
           |           |             |    WAIT_CERT
           |           |             |       | Приём Certificate
           |           |             v       v
           |           |              WAIT_CV
           |           |                 | Приём CertificateVerify
           |           +> WAIT_FINISHED <+
           |                  | Приём Finished
           \                  | [Передача EndOfEarlyData]
                              | K_send = согласование
                              | [Передача Certificate [+ CertificateVerify]]
    Можно передавать          | Передача Finished
    данные приложения -->     | K_send = K_recv = приложение
    после этого               v
                          CONNECTED

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

A.2. Сервер

                              START <-----+
              Приём ClientHello |         | Передача HelloRetryRequest
                                v         |
                             RECVD_CH ----+
                                | Выбор параметров
                                v
                             NEGOTIATED
                                | Передача ServerHello
                                | K_send = согласование
                                | Передача EncryptedExtensions
                                | [Передача CertificateRequest]
 После этого                    | [Передача Certificate + CertificateVerify]
 можно передавать               | Передача Finished
 данные  -->                    | K_send = приложение
 приложений            +--------+--------+
             Нет 0-RTT |                 | 0-RTT
                       |                 |
K_recv = согласование  |                 | K_recv = ранние данные
[Пропуск ошиб. расшиф.]|    +------> WAIT_EOED -+
                       |    |      Приём |      | Приём EndOfEarlyData
                       |    |ранних данн.|      | K_recv = согласование
                       |    +------------+      |
                       |                        |
                       +> WAIT_FLIGHT2 <--------+
                                |
                       +--------+--------+
    Нет аутентификации |                 | Аутентификация клиента
                       |                 |
                       |                 v
                       |             WAIT_CERT
                       |       Приём |       | Приём Certificate
                       |     пустого |       v
                       | Certificate |    WAIT_CV
                       |             |       | Приём
                       |             v       | CertificateVerify
                       +-> WAIT_FINISHED <---+
                                | Приём Finished
                                | K_recv = приложение
                                v
                            CONNECTED

Приложение B. Структуры данных и константы протокола

В этом приложении представлены нормативные типы протоколов и определения констант. Значения с пометкой _RESERVED использовались в прежних версиях TLS и приведены здесь для полноты. Реализациям TLS 1.3 недопустимо передавать такие значения, но они могут получать их от старых реализаций TLS.

B.1. Уровень Record

      enum {
          invalid(0),
          change_cipher_spec(20),
          alert(21),
          handshake(22),
          application_data(23),
          heartbeat(24),  /* RFC 6520 */
          (255)
      } ContentType;
      struct {
          ContentType type;
          ProtocolVersion legacy_record_version;
          uint16 length;
          opaque fragment[TLSPlaintext.length];
      } TLSPlaintext;
      struct {
          opaque content[TLSPlaintext.length];
          ContentType type;
          uint8 zeros[length_of_padding];
      } TLSInnerPlaintext;
      struct {
          ContentType opaque_type = application_data; 	/* 23 */
          ProtocolVersion legacy_record_version = 0x0303; 	/* TLS v1.2 */
          uint16 length;
          opaque encrypted_record[TLSCiphertext.length];
      } TLSCiphertext;

B.2. Сообщения Alert

      enum { warning(1), fatal(2), (255) } AlertLevel;

      enum {
          close_notify(0),
          unexpected_message(10),
          bad_record_mac(20),
          decryption_failed_RESERVED(21),
          record_overflow(22),
          decompression_failure_RESERVED(30),
          handshake_failure(40),
          no_certificate_RESERVED(41),
          bad_certificate(42),
          unsupported_certificate(43),
          certificate_revoked(44),
          certificate_expired(45),
          certificate_unknown(46),
          illegal_parameter(47),
          unknown_ca(48),
          access_denied(49),
          decode_error(50),
          decrypt_error(51),
          export_restriction_RESERVED(60),
          protocol_version(70),
          insufficient_security(71),
          internal_error(80),
          inappropriate_fallback(86),
          user_canceled(90),
          no_renegotiation_RESERVED(100),
          missing_extension(109),
          unsupported_extension(110),
          certificate_unobtainable_RESERVED(111),
          unrecognized_name(112),
          bad_certificate_status_response(113),
          bad_certificate_hash_value_RESERVED(114),
          unknown_psk_identity(115),
          certificate_required(116),
          no_application_protocol(120),
          (255)
      } AlertDescription;

      struct {
          AlertLevel level;
          AlertDescription description;
      } Alert;

B.3. Протокол Handshake

      enum {
          hello_request_RESERVED(0),
          client_hello(1),
          server_hello(2),
          hello_verify_request_RESERVED(3),
          new_session_ticket(4),
          end_of_early_data(5),
          hello_retry_request_RESERVED(6),
          encrypted_extensions(8),
          certificate(11),
          server_key_exchange_RESERVED(12),
          certificate_request(13),
          server_hello_done_RESERVED(14),
          certificate_verify(15),
          client_key_exchange_RESERVED(16),
          finished(20),
          certificate_url_RESERVED(21),
          certificate_status_RESERVED(22),
          supplemental_data_RESERVED(23),
          key_update(24),
          message_hash(254),
          (255)
      } HandshakeType;

      struct {
          HandshakeType msg_type;    /* тип согласования */
          uint24 length;             /* число байтов в сообщении */
          select (Handshake.msg_type) {
              case client_hello:          ClientHello;
              case server_hello:          ServerHello;
              case end_of_early_data:     EndOfEarlyData;
              case encrypted_extensions:  EncryptedExtensions;
              case certificate_request:   CertificateRequest;
              case certificate:           Certificate;
              case certificate_verify:    CertificateVerify;
              case finished:              Finished;
              case new_session_ticket:    NewSessionTicket;
              case key_update:            KeyUpdate;
          };
      } Handshake;

B.3.1. Сообщения обмена ключами

    uint16 ProtocolVersion;
    opaque Random[32];

    uint8 CipherSuite[2];    /* Селектор шифра */

    struct {
        ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
        Random random;
        opaque legacy_session_id<0..32>;
        CipherSuite cipher_suites<2..2^16-2>;
        opaque legacy_compression_methods<1..2^8-1>;
        Extension extensions<8..2^16-1>;
    } ClientHello;

    struct {
        ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
        Random random;
        opaque legacy_session_id_echo<0..32>;
        CipherSuite cipher_suite;
        uint8 legacy_compression_method = 0;
        Extension extensions<6..2^16-1>;
    } ServerHello;

    struct {
        ExtensionType extension_type;
        opaque extension_data<0..2^16-1>;
    } Extension;

    enum {
        server_name(0),                             /* RFC 6066 */
        max_fragment_length(1),                     /* RFC 6066 */
        status_request(5),                          /* RFC 6066 */
        supported_groups(10),                       /* RFC 8422, 7919 */
        signature_algorithms(13),                   /* RFC 8446 */
        use_srtp(14),                               /* RFC 5764 */
        heartbeat(15),                              /* RFC 6520 */
        application_layer_protocol_negotiation(16), /* RFC 7301 */
        signed_certificate_timestamp(18),           /* RFC 6962 */
        client_certificate_type(19),                /* RFC 7250 */
        server_certificate_type(20),                /* RFC 7250 */
        padding(21),                                /* RFC 7685 */
        RESERVED(40),                               /* Применяется, но не выделено*/
        pre_shared_key(41),                         /* RFC 8446 */
        early_data(42),                             /* RFC 8446 */
        supported_versions(43),                     /* RFC 8446 */
        cookie(44),                                 /* RFC 8446 */
        psk_key_exchange_modes(45),                 /* RFC 8446 */
        RESERVED(46),                               /* Применяется, но не выделено*/
        certificate_authorities(47),                /* RFC 8446 */
        oid_filters(48),                            /* RFC 8446 */
        post_handshake_auth(49),                    /* RFC 8446 */
        signature_algorithms_cert(50),              /* RFC 8446 */
        key_share(51),                              /* RFC 8446 */
        (65535)
    } ExtensionType;

    struct {
        NamedGroup group;
        opaque key_exchange<1..2^16-1>;
    } KeyShareEntry;

    struct {
        KeyShareEntry client_shares<0..2^16-1>;
    } KeyShareClientHello;

    struct {
        NamedGroup selected_group;
    } KeyShareHelloRetryRequest;

    struct {
        KeyShareEntry server_share;
    } KeyShareServerHello;

    struct {
        uint8 legacy_form = 4;
        opaque X[coordinate_length];
        opaque Y[coordinate_length];
    } UncompressedPointRepresentation;

    enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;

    struct {
        PskKeyExchangeMode ke_modes<1..255>;
    } PskKeyExchangeModes;

    struct {} Empty;

    struct {
        select (Handshake.msg_type) {
            case new_session_ticket:   uint32 max_early_data_size;
            case client_hello:         Empty;
            case encrypted_extensions: Empty;
        };
    } EarlyDataIndication;

    struct {
        opaque identity<1..2^16-1>;
        uint32 obfuscated_ticket_age;
    } PskIdentity;

    opaque PskBinderEntry<32..255>;

    struct {
        PskIdentity identities<7..2^16-1>;
        PskBinderEntry binders<33..2^16-1>;
    } OfferedPsks;

    struct {
        select (Handshake.msg_type) {
            case client_hello: OfferedPsks;
            case server_hello: uint16 selected_identity;
        };
    } PreSharedKeyExtension;
B.3.1.1. Расширение Version
      struct {
          select (Handshake.msg_type) {
              case client_hello:
                   ProtocolVersion versions<2..254>;

              case server_hello: /* и HelloRetryRequest */
                   ProtocolVersion selected_version;
          };
      } SupportedVersions;
B.3.1.2. Расширение Cookie
      struct {
          opaque cookie<1..2^16-1>;
      } Cookie;
B.3.1.3. Расширение Signature Algorithm
      enum {
          /* Алгоритмы RSASSA-PKCS1-v1_5 */
          rsa_pkcs1_sha256(0x0401),
          rsa_pkcs1_sha384(0x0501),
          rsa_pkcs1_sha512(0x0601),

          /* Алгоритмы ECDSA */
          ecdsa_secp256r1_sha256(0x0403),
          ecdsa_secp384r1_sha384(0x0503),
          ecdsa_secp521r1_sha512(0x0603),
          /* Алгоритмы RSASSA-PSS с OID открытого ключа rsaEncryption */
          rsa_pss_rsae_sha256(0x0804),
          rsa_pss_rsae_sha384(0x0805),
          rsa_pss_rsae_sha512(0x0806),

          /* EdDSA algorithms */
          ed25519(0x0807),
          ed448(0x0808),

          /* Алгоритмы RSASSA-PSS с OID открытого ключа RSASSA-PSS */
          rsa_pss_pss_sha256(0x0809),
          rsa_pss_pss_sha384(0x080a),
          rsa_pss_pss_sha512(0x080b),

          /* Устаревшие алгоритмы */
          rsa_pkcs1_sha1(0x0201),
          ecdsa_sha1(0x0203),

          /* Резервные коды */
          obsolete_RESERVED(0x0000..0x0200),
          dsa_sha1_RESERVED(0x0202),
          obsolete_RESERVED(0x0204..0x0400),
          dsa_sha256_RESERVED(0x0402),
          obsolete_RESERVED(0x0404..0x0500),
          dsa_sha384_RESERVED(0x0502),
          obsolete_RESERVED(0x0504..0x0600),
          dsa_sha512_RESERVED(0x0602),
          obsolete_RESERVED(0x0604..0x06FF),
          private_use(0xFE00..0xFFFF),
          (0xFFFF)
      } SignatureScheme;

      struct {
          SignatureScheme supported_signature_algorithms<2..2^16-2>;
      } SignatureSchemeList;
B.3.1.4. Расширение Supported Groups
      enum {
          unallocated_RESERVED(0x0000),

          /* Группы эллиптических кривых (ECDHE) */
          obsolete_RESERVED(0x0001..0x0016),
          secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
          obsolete_RESERVED(0x001A..0x001C),
          x25519(0x001D), x448(0x001E),

          /* Группы конечных полей (DHE) */
          ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
          ffdhe6144(0x0103), ffdhe8192(0x0104),

          /* Резервные коды */
          ffdhe_private_use(0x01FC..0x01FF),
          ecdhe_private_use(0xFE00..0xFEFF),
          obsolete_RESERVED(0xFF01..0xFF02),
          (0xFFFF)
      } NamedGroup;

      struct {
          NamedGroup named_group_list<2..2^16-1>;
      } NamedGroupList;

Значения obsolete_RESERVED использовались в прежних версиях TLS и их недопустимо предлагать или согласовывать реализациям TLS 1.3. Устаревшие кривые имеют известные или предсказанные недостатки (слабость) или применялись очень редко, в некоторых случаях лишь по причине непреднамеренных проблем в конфигурации серверов. Они больше не считаются подходящими для общего пользования и их следует считать потенциально небезопасными. Указанного здесь набора кривых достаточно для обеспечения совместимости со всеми развёрнутыми в настоящее время и корректно настроенными реализациями TLS.

B.3.2. Сообщения с параметрами сервера

      opaque DistinguishedName<1..2^16-1>;

      struct {
          DistinguishedName authorities<3..2^16-1>;
      } CertificateAuthoritiesExtension;

      struct {
          opaque certificate_extension_oid<1..2^8-1>;
          opaque certificate_extension_values<0..2^16-1>;
      } OIDFilter;

      struct {
          OIDFilter filters<0..2^16-1>;
      } OIDFilterExtension;

      struct {} PostHandshakeAuth;

      struct {
          Extension extensions<0..2^16-1>;
      } EncryptedExtensions;

      struct {
          opaque certificate_request_context<0..2^8-1>;
          Extension extensions<2..2^16-1>;
      } CertificateRequest;

B.3.3. Аутентификационные сообщения

      enum {
          X509(0),
          OpenPGP_RESERVED(1),
          RawPublicKey(2),
          (255)
      } CertificateType;

      struct {
          select (certificate_type) {
              case RawPublicKey:
                /* Из RFC 7250 ASN.1_subjectPublicKeyInfo */
                opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;

              case X509:
                opaque cert_data<1..2^24-1>;
          };
          Extension extensions<0..2^16-1>;
      } CertificateEntry;

      struct {
          opaque certificate_request_context<0..2^8-1>;
          CertificateEntry certificate_list<0..2^24-1>;
      } Certificate;

      struct {
          SignatureScheme algorithm;
          opaque signature<0..2^16-1>;
      } CertificateVerify;

      struct {
          opaque verify_data[Hash.length];
      } Finished;

B.3.4. Создание квитанции

      struct {
          uint32 ticket_lifetime;
          uint32 ticket_age_add;
          opaque ticket_nonce<0..255>;
          opaque ticket<1..2^16-1>;
          Extension extensions<0..2^16-2>;
      } NewSessionTicket;

B.3.5. Обновление ключей

      struct {} EndOfEarlyData;

      enum {
          update_not_requested(0), update_requested(1), (255)
      } KeyUpdateRequest;

      struct {
          KeyUpdateRequest request_update;
      } KeyUpdate;

B.4. Шифры

Симметричный шифр определяет пару алгоритмов AEAD и хэширования для использования с HKDF. Имя шифра следует соглашению

      CipherSuite TLS_AEAD_HASH = VALUE;

 

Компонента

Содержимое

TLS

Строка «TLS»

AEAD

Алгоритм AEAD, используемый для защиты записи

HASH

Алгоритм хэширования, используемый с HKDF

VALUE

Двухбайтовый идентификатор шифра

Данная спецификация определяет перечисленные ниже шифры для использования с TLS 1.3.

 

Описание

Значение

TLS_AES_128_GCM_SHA256

{0x13,0x01}

TLS_AES_256_GCM_SHA384

{0x13,0x02}

TLS_CHACHA20_POLY1305_SHA256

{0x13,0x03}

TLS_AES_128_CCM_SHA256

{0x13,0x04}

TLS_AES_128_CCM_8_SHA256

{0x13,0x05}

 

Соответствующие алгоритмы AEAD_AES_128_GCM, AEAD_AES_256_GCM и AEAD_AES_128_CCM определены в [RFC5116], AEAD_CHACHA20_POLY1305 — в [RFC8439], AEAD_AES_128_CCM_8 — в [RFC6655]. Алгоритмы хэширования определены в [SHS].

Хотя TLS 1.3 использует то же пространство шифров, что и предыдущие версии TLS, шифронаборы TLS 1.3 определены путём указания только симметричных шифров и не могут применяться для TLS 1.2. Аналогично, шифры для TLS 1.2 и ниже не могут использоваться в TLS 1.3.

Новые значения, выделенные IANA для шифров, описаны в разделе 11. Взаимодействие с IANA.

Приложение C. Примечания для разработчиков

Протокол TLS не может предотвратить многие распространённые ошибки защиты. В этом приложении даны некоторые рекомендации, способные помочь разработчикам. В [TLS13-TRACES] представлены тестовые векторы для согласования TLS 1.3.

C.1. Генерация случайных чисел и затравки

TLS требует криптографически защищённого генератора псевдослучайных чисел (CSPRNG25). В большинстве случаев операционная система предоставляет подходящие средства (например /dev/urandom), которые следует использовать в отсутствие других (например, производительность) соображений. Рекомендуется применять имеющуюся реализацию CSPRNG, а не создавать новую. Уже доступно много адекватных криптографических библиотек с приемлемыми условиями лицензирования. Если они не подходят, следует использовать рекомендации [RFC4086] по созданию псевдослучайных значений.

TLS использует случайные значения (1) в открытых полях протокола (например, Random) сообщений ClientHello и ServerHello, а также (2) для генерации ключевого материала. При корректной работе CSPRNG не возникает проблем безопасности, поскольку нет возможности определить состояние CSPRNG по его выходным данным. Однако при повреждённом CSPRNG у атакующего может появиться возможность использовать общедоступный вывод для определения внутреннего состояния CSPRNG и, следовательно, предсказания ключевого материала, как указано в [CHECKOWAY]. Реализации могут обеспечить дополнительную защиту от этой формы атак, используя разные CSPRNG для генерации общедоступных и приватных значений.

C.2. Сертификаты и проверка подлинности

Реализации отвечают за проверку целостности сертификатов и в общем случае должны поддерживать сообщения с отзывом сертификатов. При отсутствии конкретного указания в профиле приложения сертификаты следует проверять всегда для обеспечения надлежащей подписи доверенного удостоверяющего центра (CA). Выбор и добавление привязок доверия следует выполнять очень осторожно. Пользователям следует иметь возможность видеть информацию о сертификате и привязке доверия. Приложениям следует также исполнять требования к минимальному и максимальному размеру ключей. Например, путь сертификации, содержащий ключи или подписи слабее 2048-битовых RSA или 224-битовых ECDSA, не применим для защищённых приложений.

C.3. Подводные камни реализации

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

Протокол TLS

  • Корректно ли обрабатываются согласующие сообщения, фрагментированные в несколько записей TLS (5.1. Уровень Record)? Корректно ли обрабатываются важные случаи, такие как сообщения ClientHello, разбитые на несколько мелких фрагментов? Фрагментируются ли сообщения, размер которых превышает максимальный размер фрагмента (в частности, сообщения Certificate и CertificateRequest могут достаточно велики и требовать фрагментирования)?

  • Игнорируется ли номер версии уровня TLS во всех незашифрованных записях TLS (Приложение D)?

  • Имеется ли уверенность в полном удалении SSL, RC4, шифров EXPORT и MD5 (через расширение signature_algorithms) из всех возможных конфигураций, которые поддерживают TLS 1.3 и выше, а также в корректном отказе при попытке использования этих устаревших возможностей (Приложение D)?

  • Обрабатываются ли корректно расширения TLS в ClientHello, включая неизвестные расширения?

  • При недоступности запрошенного сервером сертификата отправляется ли корректно пустое сообщение Certificate (4.4.2. Сообщение Certificate)?

  • При обработке данных, расшифрованных AEAD-Decrypt, и сканировании с конца в поиске ContentType, предотвращается ли сканирование после начала открытых данных, если узел ошибочно заполнил открытые данные только нулями?

  • Игнорируются ли корректно неопознанные шифры (4.1.2. Клиентское сообщение Hello), расширения при согласовании (4.2. Расширения), именованные группы (4.2.7. Поддерживаемые группы), общие ключи (4.2.8. Совместное использование ключа), поддерживаемые версии (4.2.1. Поддерживаемые версии) и алгоритмы подписи (4.2.3. Алгоритмы подписи) в ClientHello?

  • Передаёт ли реализация сервера сообщения HelloRetryRequest клиентам, которые поддерживают совместимую группу (EC)DHE, но не прогнозируют её в расширении key_share? Обрабатывает ли реализация клиента корректно сообщения HelloRetryRequest от сервера?

Криптографические детали

  • Какие меры предусмотрены для предотвращения timing-атак [TIMING]?

  • При обмене ключами Diffie-Hellman обрабатываются ли корректно начальные 0 в согласованном ключе (7.4.1. Конечное поле Diffie-Hellman)?

  • Проверяет ли клиент TLS приемлемость переданных сервером параметров Diffie-Hellman (4.2.8.1. Параметры Diffie-Hellman)?

  • Используется ли сильный и, наиболее важно, правильно подобранный генератор случайных чисел (Приложение C.1) при создании приватных значений Diffie-Hellman, параметра ECDSA «k» и других важных для безопасности значений? Реализациям рекомендуется применять «детерминированный ECDSA», как указано в [RFC6979].

  • Используются ли дополненные 0 до размера группы открытые ключи Diffie-Hellman и общие секреты (параграфы 4.2.8.1. Параметры Diffie-Hellman и 7.4.1. Конечное поле Diffie-Hellman)?

  • Проверяются ли подписи после их создания для предотвращения утечки ключа RSA-CRT [FW15]?

C.4. Предотвращение отслеживания клиентов

Клиентам не следует применять одну квитанцию для нескольких соединений. Повторное использование квитанции позволяет пассивному наблюдателю сопоставлять разные соединения. Серверам, выпускающим квитанции, следует предлагать число квитанций не меньше числа соединений, которые может использовать клиент. Например, браузер HTTP/1.1 [RFC7230] может создавать 6 соединений с сервером. Серверам следует выпускать новую квитанцию для каждого соединения. Это позволит клиенту применять в каждом соединении свою квитанцию.

C.5. Неаутентифицированные операции

Прежние версии TLS предлагали явно неаутентифицированные шифры на основе анонимного согласования Diffie-Hellman. Эти режимы были исключены в TLS 1.3. Однако остаётся возможность согласовать параметры, которые не обеспечивают проверяемой аутентификации сервера несколькими способами, включая:

  • необработанные (raw) открытые ключи [RFC7250];

  • использование открытого ключа из сертификата без проверки его содержимого или цепочки сертификации.

Любой из этих методов уязвим для MITM-атак26 и поэтому небезопасен для общего пользования. Однако можно связать такие соединения с внешним механизмом аутентификации с помощью проверки по отдельному каналу (out-of-band) открытого ключа сервера, доверия при первом применении или такого механизма, как привязка канала (хотя привязка, описанная в [RFC5929], не определена для TLS 1.3). Если такие механизмы не используются, соединение не будет защищено от MITM-атак и приложениям недопустимо использовать TLS таким способом при отсутствии явной конфигурации или конкретного профиля приложения.

Приложение D. Совместимость с прежними версиями

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

TLS 1.x и SSL 3.0 применяют несовместимые сообщения ClientHello. Серверы могут обслуживать клиентов, пытающихся применять будущие версии TLS, пока формат ClientHello остаётся совместимым и есть хотя бы одна версия, поддерживаемая клиентом и сервером.

Прежние версии TLS использовали номер версии уровня записи (TLSPlaintext.legacy_record_version и TLSCiphertext.legacy_record_version) для разных целей. Начиная с TLS 1.3, это поле отменено. Значение TLSPlaintext.legacy_record_version должно игнорироваться реализациями. TLSCiphertext.legacy_record_version включается в дополнительные данные для снятия защиты, но может игнорироваться в иных случаях или может проверяться на совпадение с фиксированной константой. Согласование версий выполняется с использованием лишь версии согласования (ClientHello.legacy_version и ServerHello.legacy_version), а также расширения supported_versions в ClientHello, HelloRetryRequest и ServerHello). Для максимальной совместимости со старыми конечными точками реализациям, согласующим применение TLS 1.0-1.2, следует устанавливать для номера версии уровня записи согласованный номер версии в ServerHello и последующих записях.

Для максимальной совместимости с прежним нестандартным поведением и некорректно настроенными реализациями, следует поддерживать проверку путей сертификации на основе ожиданий даже при обработке согласования с прежними версиями TLS (параграф 4.4.2.2).

Версии TLS 1.2 и ранее поддерживают расширение Extended Master Secret [RFC7627], которое переводило большие части стенограммы согласования в основной секрет. Поскольку в TLS 1.3 стенограмма всегда хэшируется вплоть до серверного сообщения Finished, реализациям, поддерживающим TLS 1.3 и более ранние версии, следует указывать использование Extended Master Secret в своих API всякий раз при использовании TLS 1.3.

D.1. Согласование со старым сервером

Клиент TLS 1.3 при согласовании с сервером, не поддерживающим TLS 1.3, будет передавать обычное сообщение TLS 1.3 ClientHello с 0x0303 (TLS 1.2) в поле ClientHello.legacy_version, но с корректными версиями в расширении supported_versions. Сервер, не поддерживающий TLS 1.3, будет отвечать сообщением ServerHello с номером старой версии. Если клиент согласен использовать эту версию, согласование будет продолжаться в соответствии с выбранным протоколом. Клиенту, применяющему квитанцию для восстановления, следует инициировать соединение, используя согласованную ранее версию.

Отметим, что данные 0-RTT не совместимы со старыми серверами и их не следует передавать при отсутствии информации о поддержке сервером TLS 1.3 (Приложение D.3).

Если выбранная сервером версия не поддерживается клиентом (или неприемлема), клиент должен прервать согласование с сигналом protocol_version.

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

D.2. Согласование со старым клиентом

Сервер TLS может получать ClientHello с номером версии, ниже поддерживаемой сервером максимальной версии. При наличии расширения supported_versions сервер должен выполнить согласование с использованием этого расширения, как описано в параграфе 4.2.1. Поддерживаемые версии. Если расширения supported_versions нет, сервер должен согласовать меньшее из ClientHello.legacy_version и TLS 1.2. Например, если сервер поддерживает TLS 1.0, 1.1 и 1.2, а legacy_version указывает TLS 1.0, сервер будет продолжать с TLS 1.0 ServerHello. Если расширение supported_versions отсутствует и сервер поддерживает лишь версии больше ClientHello.legacy_version, он должен прервать согласование с сигналом protocol_version.

Отметим, что ранние версии TLS не всегда чётко указывают номер версии уровня записи (TLSPlaintext.legacy_record_version). Серверы будут получать разные версии TLS 1.x в этом поле, но они должны игнорироваться.

D.3. Совместимость 0-RTT с прежними версиями

Данные 0-RTT несовместимы со старыми версиями. Старый сервер будет отвечать на ClientHello старым ServerHello, но он не будет корректно пропускать данные 0-RTT и согласование завершится отказом. Это может вызывать проблемы при попытке клиента использовать 0-RTT, особенно в среде с множеством серверов. Например, система может поэтапно внедрять TLS 1.3 и некоторые серверы будут поддерживать TLS 1.3, а другие — TLS 1.2 или для серверов TLS 1.3 версия может быть снижена до TLS 1.2.

Клиент, пытающийся передать данные 0-RTT, должен разорвать соединение, если он получит ServerHello с TLS 1.2 или ниже. Клиент может затем повторить попытку соединения с запретом 0-RTT. Для предотвращения атак на понижение версии клиенту не следует отменять TLS 1.3, достаточно отключить 0-RTT.

Для предотвращения таких ошибок системам с множеством серверов следует обеспечить однородное и стабильное развёртывание TLS 1.3 без 0-RTT и лишь после этого разрешать 0-RTT.

D.4. Режим совместимости с промежуточными устройствами

Исследования [Ben17a] [Ben17b] [Res17a] [Res17b] показали, что значительная часть промежуточных устройств некорректно ведёт себя при согласовании клиентом и сервером TLS 1.3. Реализации могут повысить шансы согласования через такие устройства, сделав согласование TLS 1.3 более похожим на TLS 1.2, как указано ниже.

  • Клиент всегда указывает непустой идентификатор сессии в ClientHello, как описано в параграфе 4.1.2. Клиентское сообщение Hello (legacy_session_id ).

  • Если не используются ранние данные, клиент передаёт фиктивную запись change_cipher_spec (см. третий абзац в разделе 5) непосредственно перед своей второй отправкой (перед вторым ClientHello или перед шифрованным согласующим сообщением). При использовании ранних данных фиктивная запись передаётся сразу после первого ClientHello.

  • Сервер передаёт фиктивную запись change_cipher_spec сразу после первого согласующего сообщения (ServerHello или HelloRetryRequest).

В совокупности эти изменения делают согласование TLS 1.3 похожим на восстановление сессии TLS 1.2, что повышает шансы успешного соединения через промежуточные устройства. Такой «режим совместимости» согласуется частично — клиент может указать или не указать идентификатор сессии, а сервер возвращает его (эхо). Любая сторона может передать change_cipher_spec в любой момент согласования, но если клиент передал непустой идентификатор сессии, сервер должен передать change_cipher_spec, как указано здесь.

D.5. Ограничения защиты, связанные с совместимостью

Реализации, согласующий более старые версии TLS, следует предпочитать «прямую секретность» (forward secret) и шифры AEAD, когда это доступно.

Безопасность шифров RC4 считается недостаточной по причинам, указанным в [RFC7465]. Реализациям недопустимо предлагать или согласовывать шифры RC4 для любой версии TLS по любым причинам.

Старые версии TLS допускали применение шифров с очень ограниченной стойкостью. Шифры со стойкостью менее 112 битов недопустимо предлагать или согласовывать для любой версии TLS по любым причинам.

Безопасность SSL 3.0 [RFC6101] считается недостаточной по причинам, указанным в [RFC7568], и недопустимо согласовывать эту версию по любым причинам.

Безопасность SSL 2.0 [SSL2] считается недостаточной по причинам, указанным в [RFC6176], и недопустимо согласовывать эту версию по любым причинам.

Реализации недопустимо передавать CLIENT-HELLO, совместимые с SSL 2.0. Реализации недопустимо согласовывать 1.3 или выше с использованием совместимых с SSL 2.0 сообщений CLIENT-HELLO. Реализации не рекомендуется воспринимать совместимые с SSL 2.0 CLIENT-HELLO для согласования ранних версий TLS.

Реализациям недопустимо передавать ClientHello.legacy_version или ServerHello.legacy_version 0x0300 или меньше. Любая конечная точка, получившая сообщение с ClientHello.legacy_version или ServerHello.legacy_version 0x0300, должна прервать согласование с сигналом protocol_version.

Реализациям недопустимо передавать какие-либо записи с версией меньше 0x0300. Реализациям не следует воспринимать какие-либо записи с версией меньше 0x0300 (они могут сделать это непреднамеренно при полном игнорировании версии записи).

Реализациям недопустимо использовать расширение Truncated HMAC, определённое в разделе 7 [RFC6066], поскольку оно не применимо к алгоритмам AEAD и показало свою небезопасность в некоторых ситуациях.

Приложение E. Обзор защитных свойств

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

Отдельно рассматриваются свойства согласования и уровня записи.

E.1. Согласование

Согласование TLS является протоколом аутентифицированного обмена ключами (Authenticated Key Exchange или AKE), который предназначен для односторонней (сервер) и взаимной (клиент и сервер) проверки подлинности. По завершении согласования каждая сторона выводит своё представление указанных ниже значений.

  • Набор «сеансовых ключей» (различные секреты, выведенные из первичного), из которого будет выводиться набор рабочих ключей.

  • Набор криптографических параметров (алгоритмы и т. п.).

  • Отождествления взаимодействующих сторон.

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

Создание одинаковых сеансовых ключей

Согласование должно давать одинаковые наборы сеансовых ключей на обеих сторонах при условии полного завершения согласования на каждой из сторон ([CK01], определение 1, часть 1).

Секретность сеансовых ключей

Общие сеансовые ключи следует знать только взаимодействующим сторонам, но не атакующему ([CK01], определение 1, часть 2). Отметим, что при односторонней аутентификации соединения атакующий может организовать свой сеансовый ключ с сервером, но этот ключ будет отличаться от созданного клиентом.

Проверка подлинности партнёра

Представление клиента об идентификации партнёра должно отражать отождествление сервера. Если клиент аутентифицирован, представление сервера о его идентификации должно совпадать с отождествлением клиента.

Уникальность сеансовых ключей

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

Защита от понижения версии

Криптографические параметры должны быть одинаковыми на обеих сторонах и им следует быть такими же, какие были бы согласованы в отсутствие атаки ([BBFGKZ16], определения 8 и 9).

Секрет для долгосрочных ключей

Если долгосрочный ключевой материал (ключи подписи в режиме аутентификации по сертификатам или внешний/восстановительный PSK в режиме PSK с (EC)DHE) скомпрометированы после завершения согласования, это не снижает защиту сеансового ключа (см. [DOW92]), пока сам ключ не уничтожен. Свойство forward secrecy не выполняется, когда PSK применяется в режиме psk_ke PskKeyExchangeMode.

Устойчивость к компрометации ключей (KCI27)

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

Защита отождествлений конечных точек

Отождествлению сервера (сертификат) следует быть защищённым от пассивных атак. Отождествлению клиента следует быть защищённым от пассивных и активных атак.

Неформально, основанные на подписи режимы TLS 1.3 обеспечивают создание уникального, секретного общего ключа с помощью обмена ключами (EC)DHE, аутентифицированного подписью сервера для стенограммы согласования и привязанного к отождествлению сервера с помощью MAC. Если клиент аутентифицирован по сертификату, он тоже подписывает стенограмму согласования и привязывает MAC к обоим отождествлениям. В [SIGMA] приведено устройство и анализ этого типа протокола обмена ключами. Если для каждого соединения применяются свежие ключи (EC)DHE, ключи на выходе будут иметь надёжную защиту (forward secret).

Внешний и восстановительный PSK загружаются из долгосрочного общего секрета в уникальный для соединения набор краткосрочных сеансовых ключей. Этот секрет может быть организован в предшествующем соединении. При использовании (EC)DHE для создания PSK сеансовые ключи будут также надёжным секретом (forward secret). Восстановительный PSK устроен так, что первичный секрет восстановления, рассчитанный в соединении N и требуемый для организации соединения N+1, отделен от ключей трафика, используемых соединением N, что обеспечивает надёжную секретность между соединениями. В дополнение к этому при создании множества квитанций для одного соединения они связываются с разными ключами, поэтому компрометация PSK, связанного с одной квитанцией, не будет угрожать соединениям, использующим PSK, связанные с другими квитанциями. Это свойство наиболее интересно при хранении квитанций в базе данных (могут быть удалены) вместо их самошифровки.

Значение привязки PSK формирует связь PSK с текущим согласованием, а также между сессией, создавшей PSK, и текущей сессией. Эта привязка транзитивно включает копию исходного согласования, поскольку эта копия преобразуется в значения, которые создают первичный секрет восстановления. Это требует от KDF, используемой для создания первичного секрета, и функции MAC, используемой для расчёта привязки, устойчивости к конфликтам (Приложение E.1.1).

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

TLS в настоящее время не позволяет серверу передавать сообщение certificate_request при согласовании, не основанном на сертификатах (например, PSK). Если в будущем это ограничения будет смягчено, подпись клиента не будет напрямую охватывать сертификат сервера. Однако при организации PSK с помощью NewSessionTicket подпись клиента будет транзитивно охватывать сертификат сервера за счёт привязки PSK. В [PSK-FINISHED] описана конкретная атака на конструкции без привязки к сертификату сервера (см. также [Kraw16]). Небезопасно применять аутентификацию клиентов на основе сертификатов, когда клиент может использовать пару «PSK — идентификатор ключа» совместно двумя разными конечными точками. Реализациям недопустимо комбинировать внешние PSK с аутентификацией на основе сертификата клиента или сервера, пока это не согласовано тем или иным расширением.

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

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

Для всех режимов согласования Finished MAC (и подпись при её наличии) предотвращает атаки на понижение версии. В дополнение к этому использование определённых битов в случайных nonce, как описано в параграфе 4.1.3. Серверное сообщение Hello, позволяет обнаружить понижение до одной из предыдущих версий TLS. В работе [BBFGKZ16] рассмотрены дополнительные детали TLS 1.3 и понижения версии.

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

E.1.1. Вывод ключей и HKDF

Вывод ключей в TLS 1.3 использует функцию HKDF, как определено в [RFC5869], и две её компоненты — HKDF-Extract и HKDF-Expand. Полное обоснование конструкции HKDF приведено в [Kraw10], а обоснование способа применения в TLS 1.3 — в [KW16]. В этом документе каждое применение HKDF-Extract сопровождается одним или несколькими вызовами HKDF-Expand. Этот порядок следует соблюдать всегда (включая будущие пересмотры этого документа), в частности не следует использовать вывод HKDF-Extract в качестве входных данных при другом вызове HKDF-Extract без применения HKDF-Expand между ними. Допускается многократное применение HKDF-Expand к одним и тем же входным данным, если их можно различить по ключу или меткам.

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

E.1.2. Аутентификация клиента

Клиент, отправивший данные аутентификации на сервер в процессе согласования или аутентификации после согласования, не может быть уверен в том, что сервер в дальнейшем будет считать клиента аутентифицированным. Если клиенту нужно определить, считает сервер соединение аутентифицированным с одной стороны или взаимно, это должно выполняться на прикладном уровне (см. [CHHSV17]). Кроме того, анализ аутентификации после согласования в работе [Kraw16] показывает, что клиент, идентифицированный сертификатом, отправленным после аутентификации, владеет ключом трафика. Следовательно, эта сторона является клиентом, участвовавшем в исходном согласовании, или клиентом, которому исходный клиент передал ключ трафика (в предположении, что этот ключ не скомпрометирован).

E.1.3. 0-RTT

Режим 0-RTT в общем случае обеспечивает защитные свойства, аналогичные режиму данных 1-RTT с двумя исключениями, — ключи шифрования 0-RTT надёжной секретности (forward secrecy) и сервер не способен гарантировать уникальность согласования (без возможности воспроизведения) без сохранения потенциально ненадёжного избыточного числа состояний. Механизмы ограничения раскрытия для повторного использования описаны в разделе 8. 0-RTT и Anti-Replay.

E.1.4. Независимость экспортёров

Значения exporter_master_secret и early_exporter_master_secret выводятся независимо от ключей трафика и поэтому не представляют угрозы безопасности трафика, зашифрованного с этими ключами. Однако эти значения можно использовать для расчёта значения любого экспортёра, их следует уничтожать как можно быстрей. Если известен полный набор меток экспортёра, реализации следует предварительно вычислить внутреннюю стадию Derive-Secret расчёта экспортёров для всех этих меток, а затем уничтожить [early_]exporter_master_secret, за которым следует каждое внутреннее значение,как только станет ясно, что больше секрет не потребуется.

E.1.5. Безопасность после компрометации

TLS не обеспечивает защиты для согласований, которые происходят после раскрытия долгосрочного секрета партнёра (ключ подписи или внешний PSK). Поэтому не обеспечивается защиты после компрометации [CCG16], которую иногда называют обратной или будущей секретностью (backward or future secrecy). Это отличается от стойкости KCI, где описываются гарантии защиты, которые сторона имеет после раскрытия её долгосрочного секрета.

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

Дополнительный анализ согласования TLS можно найти в работах [DFGS15], [CHSV16], [DFGS16], [KW16], [Kraw16], [FGSW16], [LXZFH16], [FG17], [BBK17].

E.2. Уровень Record

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

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

Атакующий не сможет определить открытое содержимое данной записи.

Целостность

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

Защита порядка и невоспроизводимость

Атакующий не сможет вынудить получателя к восприятию записи, которая уже воспринята или заставить его воспринять запись N+1, не обработав до этого запись N.

Сокрытие размера

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

Прогрессивная защита после смены ключа

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

Неформально TLS 1.3 обеспечивает эти свойства защитой AEAD для открытых данных со стойким ключом. Шифрование AEAD [RFC5116] обеспечивает конфиденциальность и целостность данных. Невозможность воспроизведения обеспечивается с помощью своего значения nonce в каждой записи и выводом nonce из порядковых номеров записей (5.3. Nonce для отдельной записи) с независимой нумерацией на каждой стороне. Таким образом, записи доставленные с нарушением порядка, столкнутся с отказом при снятии защиты AEAD. Для предотвращения массового криптоанализа, когда одни и те же открытые данные шифруются разными пользователями с одним ключом (как это обычно происходит в HTTP) значения nonce формируются путём смешивания порядкового номера с секретным вектором инициализации (свой вектор для соединения), создаваемым вместе с ключами трафика. Анализ этой конструкции приведён в [BT16].

Метод смены ключей в TLS 1.3 (7.2. Обновление секретов трафика) использует конструкцию последовательного генератора, описанную в [REKEY], которая показала, что смена ключей позволяет применять кличи для большего числа операций шифрования, нежели возможно без смены. Это зависит от безопасности функции HKDF-Expand-Label в качестве PRF. Кроме того, пока эта функция действительно необратима, нет возможности рассчитать ключи трафика по использованным до смены (прогрессивная секретность — forward secrecy).

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

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

Дополнительный анализ уровня записи TLS приведён в [BMMRT15], [BT16], [BDFKPPRSZZ16], [BBK17], [PS18].

E.3. Анализ трафика

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

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

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

E.4. Атаки по побочным каналам

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

  • В отличие от прежних версий TLS, где применялась составная структура «MAC, затем шифрование», TLS 1.3 использует только алгоритмы AEAD, позволяя реализациям применять самодостаточные реализации примитивов с постоянным временем.

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

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

E.5. Атаки на 0-RTT с повторным использованием

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

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

  • Атакующий может сохранить и воспроизвести сообщения 0-RTT для нарушения порядка среди других сообщений (например, удаляя их после создания).

  • Использование поведения синхронизации кэша для раскрытия содержимого сообщений 0-RTT путём воспроизведения сообщения 0-RTT на другом узле кэша и использование отдельного соединения для измерения задержки запроса с целью проверки принадлежности обоих запросов к одному ресурсу.

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

В конечном счёте, серверы несут ответственность за защиту самих себя от атак с использованием репликации данных 0-RTT. Описанные в разделе 8 механизмы предназначены для предотвращения повторного использования на уровне TLS, но не обеспечивают полной защиты от получения множества копий данных клиента. TLS 1.3 возвращается к согласованию 1-RTT, когда у сервера нет никакой информации о клиенте, например, по причине размещения в другом кластере, который не имеет общего состояния, или в результате удаления квитанции, как описано в параграфе 8.1. Если протокол прикладного уровня повторно передаёт данные в такой системе, атакующий может вызвать дублирование сообщения путём передачи ClientHello в исходный кластер (который сразу обработает данные) и другой кластер, который вернётся к 1-RTT и обработает данные повторно на прикладном уровне. Масштаб такой атаки ограничен желанием клиента повторять транзакции и поэтому допускает лишь ограниченное число дубликатов, при этом каждый из них появляется на сервере как новое соединение.

При корректной реализации механизмы, описанные в параграфах 8.1 и 8.2, предотвращают многократное восприятие воспроизведённых ClientHello и связанных с ними данных 0-RTT любым кластером с согласованием состояний. Для серверов, ограничивающих использование 0-RTT одним кластером для одной квитанции, данное сообщение ClientHello и связанные с ним данные 0-RTT будут восприняты лишь один раз. Однако при неполной согласованности состояний атакующий сможет получить несколько копий данных, воспринятых в окне репликации. Поскольку клиент не знает точных деталей поведения сервера, ему недопустимо передавать в ранних данных сообщения, воспроизведение которых небезопасно и которые они не хотят повторять через множество соединений 1-RTT.

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

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

E.5.1. Воспроизведение и экспортёры

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

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

E.6. Раскрытие отождествления PSK

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

E.7. Общее использование PSK

TLS 1.3 использует осторожный подход к PSK, связывая их с конкретной функцией KDF. В отличие от этого, TLS 1.2 разрешает применять PSK с любой хэш-функцией и TLS 1.2 PRF. Таким образом, любой PSK, применяемый с TLS 1.2 и TLS 1.3, должен использоваться только с одним хэшем в TLS 1.3, что не совсем оптимально, если пользователи хотят предоставить один PSK. Конструкции в TLS 1.2 и TLS 1.3 различаются, хотя обе основаны на HMAC. Пока не известно, каким образом один PSK мог бы давать связанный вывод в обеих версиях, анализ будет ограниченным. Реализации могут обеспечить безопасность кросс-протокольного вывода, не применяя один PSK в TLS 1.3 и TLS 1.2.

E.8. Атаки на статический шифр RSA

Хотя TLS 1.3 не использует транспортировку ключей RSA и в результате не подвержен атакам Bleichenbacher [Blei98], при поддержке сервером TLS 1.3 статического RSA в контексте прежних версий TLS можно выдать себя за сервер для соединений TLS 1.3 [JSS15]. Реализации TLS 1.3 могут предотвратить такие атаки путём запрета поддержки статического RSA для всех версий TLS. В принципе, реализации также могут разделять сертификаты с разными битами keyUsage для статической расшифровки и подписи RSA, но этот метод основан на отказе клиентов воспринимать подписи, использующие ключи из сертификатов, в которых не установлен бит digitalSignature, а многие клиенты не применяют это ограничение.

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

Адрес автора

Eric Rescorla

Mozilla

Email: ekr@rtfm.com


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

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

nmalykh@protokols.ru

1Transport Layer Security — защита на транспортном уровне.

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

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

4Elliptic Curve Digital Signature Algorithm — алгоритм цифровой подписи на основе эллиптических кривых.

5Edwards-Curve Digital Signature Algorithm — алгоритм цифровой подписи на основе кривой Эдвардса.

6Pre-shared key.

7Online Certificate Status Protocol — протокол состояния сертификата в сети.

8Authenticated Encryption with Associated Data — аутентифицированное шифрование со связанными данными.

9Message authentication code — код аутентификации сообщения.

10A zero round-trip time — нулевой круговой обход.

11Extract-and-Expand Key Derivation Function — функция создания ключей «извлечь и расширить».

12RSA Probabilistic Signature Scheme — схема вероятностной подписи RSA.

13Digital Signature Algorithm — алгоритм цифровой подписи.

14Ephemeral Diffie-Hellman — эфемерная группа Diffie-Hellman.

15Network или big endian, когда первым указывается старший байт.

16Неинтерпретируемые данные – Прим. перев.

17Tag-length-value — тег, размер, значение.

18Application-Layer Protocol Negotiation — согласование протокола прикладного уровня.

19Server Name Intdication — индикация имени сервера.

20Signed Certificate Timestamp — временная метка подписанного сертификата.

21Только при наличии этого сообщения.

22Input Keying Material — входной ключевой материал.

23The Field Element to Octet String Conversion Primitive — примитив для преобразования поля в строку октетов.

24Опубликовано в RFC 8448. Прим. перев.

25Cryptographically secure pseudorandom number generator.

26Man-in-the-middle — перехват и изменение пакетов с участием человека.

27Key Compromise Impersonation.

Рубрика: RFC | Комментарии к записи RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3 отключены