RFC 9009 Efficient Route Invalidation

Internet Engineering Task Force (IETF)                  R.A. Jadhav, Ed.
Request for Comments: 9009                                        Huawei
Category: Standards Track                                     P. Thubert
ISSN: 2070-1721                                                    Cisco
                                                              R.N. Sahoo
                                                                  Z. Cao
                                                                  Huawei
                                                              April 2021

Efficient Route Invalidation

Эффективное аннулирование маршрутов

PDF

Аннотация

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

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

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

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

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

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

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

Протокол RPL5, определённый в [RFC6550], задаёт проактивную схему маршрутизации на основе вектора удалённости. RPL включает необязательные сообщения в форме DAO6, которые могут применять маршрутизаторы 6LBR7 и 6LR8 для изучения маршрутов к нисходящим узлам. 6LoWPAN является сокращением для IPv6 через беспроводные персональные сети с недостаточным электропитанием. В режиме сохранения (Storing) сообщения DAO приводят к созданию маршрутных записей на всех промежуточных 6LR от родительского узла ко всем 6LBR.

RPL позволяет использовать сообщения NPDAO для аннулирования пути, соответствующего данному адресату, с освобождением используемых для этого пути ресурсов. NPDAO является сообщением DAO с нулевым сроком действия маршрута, которое исходит от целевого узла и перемещается в восходящем направлении к 6LBR. В этом документе разъясняются проблемы, связанные с использованием сообщения NPDAO в [RFC6550], а также требования по оптимизации схемы сообщений об аннулировании маршрутов. Кроме того, документ определяет новое сообщение о проактивном аннулировании маршрутов DCO, соответствующее требованиям к оптимизированной схеме сообщений.

Этот документ относится лишь к режиму хранения RPL (Storing MOP9). Режим Non-Storing MOP не требует использования NPDAO для аннулирования маршрутов, поскольку маршрутные записи не поддерживаются в 6LR.

1.1. Уровни требований и термины

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

От читателей этой спецификации требуется знакомство с терминами и концепциями документа «RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks» [RFC6550].

Low-Power and Lossy Network (LLN) — сеть с недостаточным электропитанием и большими потерями

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

6LoWPAN Router (6LR) — маршрутизатор 6LoWPAN

Промежуточный маршрутизатор, способный передавать и принимать сообщения RA (Router Advertisement) и RS (Router Solicitation), а также пересылать и маршрутизировать пакеты IPv6.

Directed Acyclic Graph (DAG) — направленный ациклический граф

Направленный граф, в котором все ребра ориентированы так, что не возникает петель.

Destination-Oriented DAG (DODAG) — ориентированный на получателя граф DAG

DAG, маршрутизируемый у одного получателя, т. е. корень DAG без исходящих рёбер.

6LoWPAN Border Router (6LBR) — маршрутизатор 6LoWPAN

Граничный маршрутизатор, служащий корнем DODAG и граничным узлом для трафика 6LoWPAN.

Destination Advertisement Object (DAO) — объект анонсирования получателя

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

DODAG Information Object (DIO) — объект с информацией DODAG

Сообщения DIO позволяют организовать восходящие маршруты к 6LBR. DIO инициируются в корне DAO.

Common ancestor node — узел общего предка

Первый общий узел 6LR или 6LBR для двух путей к целевому узлу.

No-Path DAO (NPDAO) – сообщение DAO об отсутствии пути

Сообщение DAO с нулевым сроком действия, служащее для аннулирования маршрутов.

Destination Cleanup Object (DCO) — объект “очистки” адресата

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

Regular DAO — обычное сообщение DAO

Сообщение DAO с ненулевым сроком действия, служащее для создания или обновления отношений смежности.

Target node — целевой узел

Узел, меняющий родителя, для которого обновляется (создание или удаление) маршрутная смежность.

1.2. Сообщения RPL NPDAO

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

   (6LBR)
     |
     |
     |
    (A)
    / \
   /   \
  /     \
(G)     (H)
 |       |
 |       |
 |       |
(B)     (C)
  \      ;
   \    ;
    \  ;
     (D)
     / \
    /   \
   /     \
 (E)     (F)

Рисунок 1. Простая топология.


Узел D подключён через предпочитаемого родителя B и имеет дополнительный путь к 6LBR через C. Узел A является общим предком D для путей через B-G и C-H. При переключении D с узла B на узел C протокол RPL позволяет передать сообщение NPDAO узлу B и обычное сообщение DAO узлу C.

1.3. Важность сообщений NPDAO

Ресурсы узлов LLN обычно ограничены. Узел имеет ограниченную память, а маршрутные записи является основным содержимым динамической памяти узлов. Аннулирование маршрутов помогает узлам 6LR принимать решение об удалении маршрутных записей для более эффективного использования ограниченных ресурсов. Поэтому требуется механизм эффективного аннулирования маршрутов. Отметим, что одна смена родителя может приводить к смене предка для субдерева. Таким образом, аннулирование маршрутов должно происходить от имени субдерева, а не только от имени меняющего родителя узла. В приведённом выше примере, где узел D меняет своего родителя, требуется обновить маршрутные записи узлов C, H, A, G и B, где адресатами являются D, E, F. Без эффективного аннулирования маршрутов 6LR может сохранять ненужные маршрутные записи.

2. Проблемы, связанные с RPL NPDAO

2.1. Потеря NPDAO в результате обрыва канала к прежнему родителю

При смене узлом родителя передаётся сообщение NPDAO прежнему родителю и обычное сообщение DAO — новому родителю. При смене родителя в результате отказа узла или канала, сообщение NPDAO может не отправляться.

2.2. Аннулирование маршрутов зависимых узлов

RPL не задаёт механизм аннулирования маршрутов для зависимых узлов в суб-DAG меняющего родителя узла, что может приводить к сохранению на зависимых узлах устаревших записей. Для 6LR единственным способом аннулирования маршрутных записей является срок действия маршрутов, что может быть очень важно для сетей LLN.

В приведённом примере при смене родителя узлом D этот узел создаёт сообщение NPDAO от своего имени. Зависимые узлы E и F не создают сообщений NPDAO для своих прежних путей через D к узлам B и G, в результате чего на узлах B и G сохраняются устаревшие записи для E и F.

2.3. Возможность простоя маршрута из-за асинхронности NPDAO и DAO

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

В приведённом примере узел D меняет родителя B на C и сообщение NPDAO, переданное по прежнему пути, может аннулировать предыдущий маршрут и невозможно определить обновление записей на новом пути сообщением DAO.

3. Требования к оптимизации NPDAO

3.1. Требование 1 — независимость от канала к прежнему родителю

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

3.2. Требование 2 — аннулирование маршрута для зависимых узлов

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

3.3. Требование 3 — независимость трафика данных от аннулирования пути

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

4. Изменение сигнализации RPL

4.1. Смена семантики аннулирования маршрутов в RPL

Как указано в параграфе 1.2, сообщения NPDAO исходят от меняющего родителя узла и передаются в восходящем к корню направлении. Для решения проблемы, отмеченной в разделе 2, этот документ определяет новое сообщение DCO, анонсирующее удаление маршрута, которой исходит от общего узла-предка и передаётся по прежнему пути в нисходящем направлении. Общий предок создаёт сообщение DCO при удалении следующего интервала на пути к цели. Например, в качестве отложенного отклика на получение обычного DAO от другого дочернего узла с той же или более новым Path Sequence для цели, передача DCO отменяется.

Маршрутизаторы 6LR в пути DCO аннулируют маршрут на основе данных DCO, а затем передают другое сообщение DCO с теми же сведениями следующему маршрутизатору или маршрутизаторам в нисходящем направлении. Эта операция похожа на обработку DAO промежуточными 6LR в режиме Storing MOP [RFC6550]. Подобно DAO в Storing MOP, сообщение DCO передаётся с использованием локального для канала индивидуального адреса IPv6 link-local для отправителя и получателя, но в отличие от DAO, передаваемых в восходящем направлении, сообщения DCO передаются в нисходящем направлении.

В приведённом на рисунке 1 примере дочерний узел D при смене родителя B на C передаёт обычное сообщение DAO узлу C с информацией о доступности, включающей адрес D как цель и инкрементированное значение Path Sequence. Узел C обновляет таблицу маршрутизации на основе сведений о доступности из DAO, затем создаёт новое сообщение DAO с теми же данными о доступности, пересылаемое узлу H. На узле H выполняется такая же процедура, как на узле C и передаётся сообщение узлу A. Когда A получает обычное сообщение DAO, он видит, что в таблице маршрутизации уже имеется целевой адрес (Target Address) узла D. Однако он будет видеть, что информация о следующем интервале на пути к узлу D изменилась, что говорит о смене пути узлом D. В этом случае узел A, который является общим предком для двух путей к D (прежний и новый), может создать сообщение DCO, передаваемое в нисходящем направлении по старому пути к цели. Узел A выполняет обычную пересылку DAO маршрутизатору 6LBR, как требует [RFC6550].

4.2. Изменение опции Transit Information

Каждое сообщение RPL делится на базовые поля и опции, как описано в разделе 6 [RFC6550]. Базовые поля относятся к сообщению в целом, а опции добавляют зависимые от сообщения и варианта использования атрибуты. Например, сообщение DAO может включать одну или несколько опций RPL Target, которые указывают к каким целям относятся сведения о доступности. С набором опций RPL Target может быть связана опция Transit Information.

Этот документ меняет спецификацию опции Transit Information путём включения флага аннулирования прежнего маршрута I10, который информирует общего предка о необходимости создать сообщение DCO от имени целевого узла с полем RPL Status 195, указывающим перемещение адреса. Флаг I передаётся в опции Transit Information, которая дополняет сведения о доступности для данного набора RPL Target. Опцию Transit Information с флагом I следует передавать в сообщении DAO при аннулировании маршрута к соответствующим целям.

Значение 195 представляет установленные биты U и A в поле RPL Status (см. рисунок 6 в [RFC9010]), где 6 младших битов содержат значение 6LoWPAN Neighbor Discovery (ND) EARO11 Status 3, указывающее состояние Moved в соответствии с таблицей 1 в [RFC8505].

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x06 | Option Length |E|I|  Flags    | Path Control  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Path Sequence | Path Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 2. Обновлённая опция Transit Information (новый флаг I).


I (Invalidate previous route)

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

[RFC6550] позволяет передавать адрес родителя в опции Transit Information в зависимости от MOP. В случае Storing MOP это поле обычно не требуется, а для DCO включение поля Parent Address недопустимо.

При получении сообщения DAO с опцией Transit Information, имеющей флаг I, в качестве отложенного отклика, удаляющего маршрутную смежность с указанной в опции Transit Information цели, узлу общего предка следует генерировать сообщения DCO для следующего интервала, связанного с этой смежностью. Флаг I предоставляет целевому узлу контроль над аннулированием его маршрутов, служа сигналом для генерации сообщения DCO.

4.3. Объект «очистки» адресата (DCO)

Определён новый код управляющего сообщения ICMPv6 RPL, названного DCO, которое служит для проактивной очистки состояния и маршрутных данных, сохраняемые в 6LR от имени целевого узла. Сообщения DCO передаются в нисходящем направлении и сбрасывают маршрутные данные и другие сведения о состоянии, связанные с данной целью. Формат сообщения DCO показан на рисунке 3.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPLInstanceID |K|D|   Flags   |   RPL Status  | DCOSequence   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                    DODAGID (необязательно)                    +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Опции...
+-+-+-+-+-+-+-+-+

Рисунок 3. Базовый объект DCO.


RPLInstanceID

8-битовое поле, указывающее связанный с DODAG экземпляр топологии, определённый из DIO.

K

Флаг K указывает, что от получателя сообщения DCO ожидается отправка подтверждения DCO-ACK. Если сообщение DCO-ACK не даже при установке флага K, реализация может позднее повторить DCO. Число повторов зависит от реализации и предполагается значение, близкое к числу повторов DAO [RFC6550]. Вопрос числа попыток DCO рассматривается в параграфе 4.6.3. Узел, получивший сообщение DCO без флага K, может отвечать сообщением DCO-ACK, особенно для информирования об ошибках. Примером такой ошибки может служить ситуация, когда передающий DCO-ACK узел не нашёл маршрутной записи для указанной цели. Отказ отправителя от установки флага K говорит о том, что отправитель не ждёт ответа и ему не следует повторять DCO.

D

Флаг наличия поля DODAGID, который должен устанавливаться при использовании локального RPLInstanceID.

Flags

Оставшиеся 6 битов поля Flags зарезервированы на будущее. Отправитель должен устанавливать в них 0, а получатель должен игнорировать.

RPL Status

Статус, определённый в [RFC6550] и обновленный в [RFC9010]. Корневой узел или общий предок, генерирующий DCO, полномочен устанавливать сведения о статусе, которые не меняются при нисходящем распространении DODAG. Этот документ не задаёт дифференциации действий в зависимости от RPL Status.

DCOSequence

8-битовое поле, инкрементируемое для каждого уникального сообщения DCO от узла, которое включается в сообщение DCO-ACK. Начальное значение DCOSequence узел может выбирать произвольно. Обработка DCOSequence описана в параграфе 4.4.

DODAGID

128-битовое целое число без знака, устанавливаемое корнем DODAG для однозначной идентификации DODAG. Поле должно присутствовать при установке флага D и недопустимо при сброшенном флаге D. Значение DODAGID применяется при использовании локального RPLInstanceID для указания DODAGID, связанного с RPLInstanceID.

4.3.1. Secure DCO

Сообщение Secure DCO следует формату, заданному на рисунке 7 в [RFC6550]. Базовый формат сообщения DCO показан на рисунке 3.

4.3.2. Опции DCO

Сообщение DCO должно включать по меньшей мере одну опцию RPL Target и Transit Information, а также может включать иные опции. Данная спецификация позволяет включать в DCO опции:

  • 0x00 Pad1;

  • 0x01 PadN;

  • 0x05 RPL Target;

  • 0x06 Transit Information;

  • 0x09 RPL Target Descriptor.

Указанные опции определены в параграфе 6.7 [RFC6550]. Сообщение DCO содержит опцию RPL Target и связанную с ней опцию Transit Information со сроком действия 0x00000000 для индикации потери связности с указанной целью.

4.3.3. Последовательность путей в DCO

Сообщение DCO содержит опцию Transit Information для каждого аннулируемого пути. Значение счётчика Path Sequence в опции Transit Information позволяет определить свежесть сообщения DCO по сравнению с самым новым, известным маршрутизаторам 6LR на удаляемом пути. Если сообщение DCO создано общим предком в ответ на сообщение DAO, опция Transit Information в DCO должна использовать значение Path Sequence из новейшей опции Transit Information, которая была получена для цели общим предком. Если 6LR на нисходящем пути получает DCO с Path Sequence не новее Path Sequence из опции Transit Information в сообщении DAO, маршрутизатору 6LR недопустимо удалять своё текущее состояние маршрутизации и недопустимо пересылать DCO вниз по пути, где сообщение не является более свежим. Если DCO новее, маршрутизатор 6LR может сохранить временное состояние, чтобы обеспечить игнорирование DAO, полученного позднее с опцией Transit Information, содержащей более старый порядковый номер. Опция Transit Information в сообщении DAO, которая соответствует или новее, чем чем в DCO, означает, что указанный в DAO установлен и сообщение DAO распространено. При распространении DCO в результате приёма DCO от восходящего родителя, значение Path Sequence должно копироваться из полученного DCO.

4.3.4. Подтверждение DCO-ACK

Сообщение DCO-ACK получателю DCO следует передавать в индивидуальном пакете в ответ на индивидуальное сообщение DCO с флагом K. Если флаг K не установлен, получатель сообщения DCO может передать DCO-ACK, особенно при возникновении ошибки. Формат сообщения DCO-ACK показан на рисунке 4.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPLInstanceID |D|   Flags     |  DCOSequence  | DCO-ACK Status|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                    DODAGID (необязательно)                    +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 4. Базовый объект DCO-ACK.


RPLInstanceID

8-битовое поле, указывающее связанный с DODAG экземпляр топологии, определённый из DIO.

D

Флаг наличия поля DODAGID, который должен устанавливаться при использовании локального RPLInstanceID.

Flags

7 резервных битов поля Flags. Отправитель должен устанавливать в них 0, а получатель должен игнорировать.

DCOSequence

8-битовое поле. Значение DCOSequence в DCO-ACK копируется из DCOSequence в принятом сообщении DCO.

DCO-ACK Status

Указывает статус завершения. Поле DCO-ACK Status определено на основе рисунка 6 в [RFC9010], указывающего формат RPL Status. StatusValue = 0 при сброшенном (0) флаге U указывает безусловное восприятие. StatusValue = 1 с установленным (1) флагом U говорит об отсутствии маршрутной записи, как указано в параграфе 5.3.

DODAGID

128-битовое целое число без знака, устанавливаемое корнем DODAG для однозначного указания DODAG. Поле должно присутствовать при установленном флаге D и недопустимо при сброшенном флаге D. Поле DODAGID применяется при использовании локального RPLInstanceID для указания DODAGID, связанного с RPLInstanceID.

4.3.5. Secure DCO-ACK

Формат сообщения Secure DCO-ACK следует приведённому на рисунке 7 в [RFC6550], а базовый формат сообщения DCO-ACK показан на рисунке 4.

4.4. Базовые правила DCO

  1. Если узел передаёт сообщение DCO с более новой или просто отличающейся от переданной в предыдущем DCO информацией, он должен инкрементировать поле DCOSequence. При передаче сообщения DCO, идентичного переданному ранее, узел может инкрементировать DCOSequence. Счётчик DCOSequence работает в соответствии с правилами параграфа 7.2 в [RFC6550].

  2. Поля RPLInstanceID и DODAGID в сообщении DCO должны содержать значения соответствующих полей сообщения DAO, в ответ на которое узел общего предка создаёт сообщение DCO.

  3. Узел может установить флаг K в индивидуальном сообщении DCO для запроса индивидуального DCO-ACK с целью подтверждения попытки.

  4. Узлу, получившему индивидуальное сообщение DCO с флагом K, следует отвечать сообщением DCO-ACK. При сброшенном флага K в полученном сообщении DCO узел может передать DCO-ACK, особенно при наличии ошибки.

  5. Узел, получивший индивидуальное сообщение DCO, должен проверить сохранённое значение Path Sequence в контексте данной цели. Если сохранённое значение Path Sequence не старее полученного в DCO, сообщение DCO должно отбрасываться.

  6. Узел, установивший флаг K в индивидуальном сообщении DCO, но не получивший в ответ DCO-ACK, может запланировать повтор сообщения DCO вплоть до заданного реализацией числа попыток.

  7. Узел, получивший индивидуальное сообщение DCO со своим адресом в опции RPL Target, должен вырезать опцию Target. Если эта опция Target является единственной в сообщении DCO, сообщение DCO должно отбрасываться.

Диапазон значения DCOSequence уникален для узла, генерирующего сообщения.

4.5. Незапрошенные DCO

Маршрутизатор 6LR может создавать сообщения DCO без запроса для односторонней очистки пути от имени целевой записи. 6LR имеет все сведения о состоянии, а именно Target Address и Path Sequence, требуемые для генерации DCO по его таблице маршрутизации. Условия, при которых 6LR может генерировать DCO без запроса, выходят за рамки этой спецификации, но могут включать перечисленные ниже.

  1. По завершении срока действия записи 6LR может аккуратно очистить её, инициируя сообщение DCO.

  2. 6LR должен поддерживать записи с более высоким приоритетом и заполнение таблицы требует удаления имеющихся записей. Это удаление может быть выполнено путём создания DCO.

Сообщение DCO, созданное независимо от DAO (асинхронно) и предназначено для сброса всех состояний на пути независимо от Path Sequence, должно использовать в Path Sequence значение 240 (см. параграф 7.2 в [RFC6550]). Это значение позволяет DCO «выиграть» у любого установленного пути DAO, но проигрывает устанавливаемому пути DAO. Если предок инициирует одностороннюю очистку на созданном пути с использованием DCO м Path Sequence 240, сообщение DCO в конечном итоге достигнет целевого узла, который в результате узнает об аннулировании пути.

4.6. Другие вопросы

4.6.1. Аннулирование зависимых узлов

Спецификация RPL [RFC6550] не включает механизма аннулирования маршрутов для зависимых узлов. Этот документ позволяет зависимым узлам аннулировать маршруты. Зависимые узлы генерируют соответствующие сообщения DAO для обновления путей и предыдущее аннулирование маршрутов для этих узлов должно работать подобно описанному выше для узла, меняющего родителя. Зависимый узел может установить флаг I в опции Transit Information как часть обычного DAO для запроса аннулирования прежнего маршрута от общего предка.

Зависимые узлы не имеют указаний по части возможной смены их родителями своих родителей. Таким образом, для аннулирования маршрута зависимый узел может устанавливать флаг I во всех опциях Transit Information своих сообщений DAO. Установка флага I не препятствует работе, даже при отсутствии аннулирования прежнего маршрута.

4.6.2. NPDAO и DCO в одной сети

Механизм NPDAO, предусмотренный в [RFC6550], по-прежнему можно использовать в одной сети с DCO. Сообщения NPDAO могут применяться, например, по истечении срока действия маршрута целевого объекта или при решении узла корректно завершить сессию RPL при отключении узла (shutdown). Кроме того, в сети может использоваться сочетание узлов, поддерживающих DCO и имеющийся механизм NPDAO. Возможно также использование одним узлом сигнализации NPDAO и DCO для аннулирования маршрутов.

В параграфе 9.8 [RFC6550] сказано: «При удалении узлом другого узла из числа родителей DAO ему следует передать сообщение No-Path DAO (параграф 6.4.3) этому удаляемому родителю DAO для аннулирования имеющегося маршрута.» Этот документ добавляет более оптимальный способ аннулирования маршрута, сохраняя возможность использования сообщений NPDAO. В результате реализация имеет 2 варианта аннулирования маршрута.

  1. Использование NPDAO для аннулирования прежнего маршрута и отправка обычного DAO по новому пути.

  2. Передача по новому пути обычного DAO с флагом I в опции Transit Information, чтобы общий предок инициировал нисходящее сообщение DCO для аннулирования прежнего маршрута.

Этот документ рекомендует использовать вариант 2 по причинам, указанным в разделе 3.

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

4.6.3. Повторы DCO

Отправитель сообщения DCO может повторит его, если был установлен флаг K, а ответного DCO-ACK не получено. Время повтора DCO может зависеть от глубины сети и средней задержки на этапе пересылки (hop) и составляет 2 — 120 секунд в зависимости от сети. Если пределы задержки не известны, реализации недопустимо повторять передачу чаще 1 раза за 3 секунды и недопустимо использовать более трёх повторов.

Число повторов может также зависеть от критичности аннулирования маршрутов для сети и настройки повторов на канальном уровне. Для сетей, поддерживающих лишь потоки MP2P12 и P2MP13, таких как AMI14 и телеметрия, маршрутизаторы 6LR могут не очень стремиться аннулировать маршруты, если у них нет сильных ограничений на память. Для сетей автоматизации зданий и жилых помещений, где может присутствовать значительная доля трафика P2P, маршрутизаторы 6LR могут быть заинтересованы в быстром аннулировании маршрутов, поскольку это может влиять на эффективность пересылки.

4.6.4. DCO с множеством предпочтительных родителей

[RFC6550] позволяет узлу выбрать множество предпочтительных родителей для организации маршрутов. В параграфе 9.2.1 [RFC6550] сказано: «Все DAO, созданные одновременно для одной цели Target, должны передаваться с одним значением Path Sequence в опции Transit Information». Впоследствии, при необходимости инициировать аннулирование маршрута можно использовать сообщение NPDAO, которое может быть инициировано обновлением Path Sequence для всех родительских узлов, через которые проходит аннулируемый маршрут (см. [RFC6550]).

В случае DCO сам целевой узел не инициирует аннулирование маршрута, оставляя это узлу общего предка. При обнаружении узлом общего предка DAO с новым следующим интервалом он инициирует DCO. Реализациям рекомендуется инициировать DCO с некоторой задержкой (DelayDCO), чтобы узел общего предка мог получить обновлённые DAO от всех возможных next-hop. Это поможет снизить связанные с DCO издержки, т. е. общий предок может дождаться обновлённых DAO со всех возможных направления перед инициированием DCO для аннулирования маршрута. После ожидания требуется создать DCO для всех next-hop, где нужно аннулировать маршруты.

Этот документ рекомендует использовать для таймера DelayDCO значение в 1 секунду, основанное на принятом по умолчанию таком же значении для таймера DelayDAO в [RFC6550]. Это основано на предположении, что DAO от всех возможных наборов родителей будут получены общим предком в этом интервале времени.

Возможность генерации DCO до получения обновлённых DAO от всех путей сохраняется. В этом случае узел-предок начнёт процедуру аннулирования для путей, от которых получены обновлённые DAO. Создаваемое при этом сообщение DCO будет запускать аннулирования сегментов, на путях, где обновлённые DAO не приняты. Но при достижении сообщениями DAO этих сегментов состояние маршрутизации для них будет обновляться и несогласованности состояний маршрутизации не возникает.

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

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

Агентство IANA выделило коды для сообщений DCO и DCO-ACK в реестре RPL Control Codes (таблица 1).

Таблица 1. Новые коды для сообщений DCO и DCO-ACK.

 

Код

Описание

Документ

0x07

Destination Cleanup Object

Данный документ

0x08

Destination Cleanup Object Acknowledgment

Данный документ

0x87

Secure Destination Cleanup Object

Данный документ

0x88

Secure Destination Cleanup Object Acknowledgment

Данный документ

 

Выделен также бит 1 из реестра Transit Information Option Flags для флага I (4.2. Изменение опции Transit Information).

5.1. Новый реестр для флагов DCO

Агентство IANA создало реестр для 8-битового поля флагов DCO, названный Destination Cleanup Object (DCO) Flags и размещённый в реестре Routing Protocol for Low Power and Lossy Networks (RPL). Новые флаги в этом реестре могут выделяться лишь по процедуре IETF Review [RFC8126]. Для каждого бита отслеживаются 3 параметра:

  • номер (отсчёт с 0 для старшего бита);

  • описание возможности;

  • определяющий флаг документ RFC.

Выделенные к настоящему времени биты указаны в таблице 2.

Таблица 2. Базовые флаги DCO.

 

Номер бита

Описание

Документ

0

Запрос DCO-ACK (K)

Данный документ

1

Поле DODAGID присутствует (D)

Данный документ

 

5.2. Новый реестр для флагов подтверждения DCO

Агентство IANA создало реестр для 8-битового поля флагов DCO-ACK, названный Destination Cleanup Object (DCO) Acknowledgment Flags и размещённый в реестре Routing Protocol for Low Power and Lossy Networks (RPL).Новые флаги в этом реестре могут выделяться лишь по процедуре IETF Review [RFC8126]. Для каждого бита отслеживаются 3 параметра:

  • номер (отсчёт с 0 для старшего бита);

  • описание возможности;

  • определяющий флаг документ RFC.

Выделенный к настоящему времени флаг указан в таблице 3.

Таблица 3. Базовый флаг DCO-ACK.

 

Номер бита

Описание

Документ

0

Поле DODAGID присутствует (D)

Данный документ

 

5.3. Значения RPL Rejection Status

Этот документ добавляет значение в реестр RPL Rejection Status, созданный в [RFC9010] (параграф 12.6).

Таблица 4. Базовый флаг DCO-ACK.

 

Значение

Смысл

Документ

1

Нет маршрутной записи

Данный документ

 

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

Этот документ предоставляет узлу общего предка возможность аннулировать маршрут от имени целевого узла. Общий предок может делать это по наличию флага I в опции Transit Information сообщения DCO от целевого узла. Однако общий предок может аннулировать маршрут и по своей инициативе, поскольку он обладает всеми нужными сведениями, а именно Target Address и соответствующее значение Path Sequence. Это позволяет мошенническому узлу общего предка аннулировать маршруты и влиять на трафик к целевому узлу.

DCO передаёт значение RPL Status, являющееся информативным. С течение времени могут выделяться новые значения статуса и узел будет игнорировать неизвестные значения. Это позволяет использовать поле RPL Status для создания скрытого канала. Но канал работает лишь 1 раз, поскольку сообщение уничтожает свою среду (маршрут).

В этом документе определён флаг I, устанавливаемый целевым узлом и применяемый узлом-предком для инициирования сообщения DCO, если предок видит обновление смежности в маршрутизации. Однако флаг может быть подделан вредоносным маршрутизатором 6LR на пути и вызвать аннулирование имеющегося активного маршрута. Аннулирование будет срабатывать лишь при выполнении условия Path Sequence для цели, к которой предпринимается попытка аннулировать маршрут. При этом злонамеренный 6LR может подделать сообщение DAO от имени потомка, установив в нем флаг I для аннулирования маршрута от имени этого потомка. Следует отметить, что при использовании механизмов, предложенных в [RFC6550], вредоносный маршрутизатор 6LR может также создать поддельное сообщение DAO с нулевым сроком действия или вызвать отказ в обслуживании путём полного отбрасывания трафика, поэтому предложенный в данном документе механизм не ведёт к существенному росту рисков.

В этом документе предполагается использование механизмов защиты, заданных в [RFC6550], в соответствии с которыми узел общего предка и все маршрутизаторы 6LR являются частью сети RPL, поскольку имеют все требуемые свидетельства. В незащищённой сети RPL требуется учитывать отмеченные выше риски, а также риски, указанные в [RFC6550].

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

Этот документ добавляет сообщения DCO и DCO-ACK, синтаксически похожие на имеющиеся сообщения RPL, такие как DAO и DAO-ACK. Защищённые версии DCO и DCO-ACK используют методы, похожие на методы защиты других сообщений RPL (таких как DAO и DAO-ACK).

RPL поддерживает 3 режима защиты, описанных в параграфе 10.1 [RFC6550].

Unsecured — без защиты

В этом режиме RPL использует базовые сообщения DIS, DIO, DAO, DAO-ACK без разделов Security. Поскольку в сети могут применяться иные методы защиты (например, защита на канальном уровне), использование этого режима не означает полного отсутствия защиты сообщений.

Preinstalled — с предустановленным ключом

В этом режиме RPL применяет защищённые сообщения, поэтому должны использоваться защищённые варианты DCO и DCO-ACK.

Authenticated — с проверкой подлинности

В этом режиме RPL применяет защищённые сообщения, поэтому должны использоваться защищённые варианты DCO и DCO-ACK.

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

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

[RFC6550] Winter, T., Ed., Thubert, P., Ed., Brandt, A., Hui, J., Kelsey, R., Levis, P., Pister, K., Struik, R., Vasseur, JP., and R. Alexander, «RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks», RFC 6550, DOI 10.17487/RFC6550, March 2012, <https://www.rfc-editor.org/info/rfc6550>.

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

[RFC8505] Thubert, P., Ed., Nordmark, E., Chakrabarti, S., and C. Perkins, «Registration Extensions for IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Neighbor Discovery», RFC 8505, DOI 10.17487/RFC8505, November 2018, <https://www.rfc-editor.org/info/rfc8505>.

[RFC9010] Thubert, P., Ed. and M. Richardson, «Routing for RPL (Routing Protocol for Low-Power and Lossy Networks) Leaves», RFC 9010, DOI 10.17487/RFC9010, April 2021, <https://www.rfc-editor.org/info/rfc9010>.

Приложение A. Примеры сообщений

A.1. Пример сообщений DCO

В этом примере узел D (рисунок 1) меняет родителя B на C. В примере предполагается наличие у узла D своего маршрута через B-G-A-6LBR, использующего pathseq=x. В примере используются соглашения о сообщениях DAO и DCO и указаны лишь требуемые для разъяснения примера параметры, а именно, tgt (опция Target), значение которого задаёт адрес целевого узла, pathseq (Path Sequence) в опции Transit Information и I_flag (флаг I) в той же опции. Последовательность действий приведена ниже.

  1. Узел D меняет родителя B на C.

  2. D передаёт обычное сообщение DAO(tgt=D,pathseq=x+1,I_flag=1) в обновленный путь к C.

  3. C проверяет наличие маршрутной записи от D (которой нет), создаёт новую запись и пересылает сведения о доступности целевого узла D узлу H в сообщении DAO(tgt=D,pathseq=x+1,I_flag=1).

  4. Подобно C, узел H проверяет наличие маршрутной записи от D (её нет), создаёт запись и пересылает информацию о доступности цели D узлу A в сообщении DAO(tgt=D,pathseq=x+1,I_flag=1).

  5. Узел A получает DAO(tgt=D,pathseq=x+1,I_flag=1) и проверяет наличие записи от узла D. Эта запись имеется и A проверяет в ней следующий интервал пересылки (next-hop) для D, который является другим (узел G). Затем A проверяет I_flag и создаёт сообщение DCO(tgt=D,pathseq=x+1) на прежний next-hop для цели D (узел G). Далее узел A обновляет маршрутную запись и пересылает сведения о доступности цели D в восходящем направлении, используя DAO(tgt=D,pathseq=x+1,I_flag=1).

  6. Узел G получает DCO(tgt=D,pathseq=x+1) и сравнивает Path Sequence с сохраненным значением. Если новое значение свежее, G аннулирует маршрутную запись для цели D и пересылает сведения о (не)доступности в нисходящем направлении узлу B в сообщении DCO(tgt=D,pathseq=x+1).

  7. Узел B аналогичным способом обрабатывает DCO(tgt=D,pathseq=x+1), аннулируя маршрутную запись для цели D и пересылает сведения о (не)доступности вниз узлу D.

  8. Узел D игнорирует сообщение DCO(tgt=D,pathseq=x+1), поскольку сам является целью.

  9. Распространение DCO будет останавливаться на любом узле, у которого нет маршрутной информации для цели. Если применяется кэширование маршрутных данных и кэшированное значение Path Sequence больше значения в DCO, сообщение DCO отбрасывается.

A.2. Пример сообщений DCO с несколькими предпочтительными родителями

На рисунке 5 показан выбор узлом (N41) нескольких предпочтительных родителей (N32) и (N33).

  1.        (6LBR)
             |
             |
             |
           (N11)
            / \
           /   \
          /     \
       (N21)   (N22)
         /      / \
        /      /   \
       /      /     \
    (N31)  (N32)  (N33)
        :    |    /
         :   |   /
          :  |  /
           (N41)

    Рисунок 5. Пример топологии 2.


    (N41) передаёт сообщение DAO(tgt=N41,PS=x,I_flag=1) узлам (N32) и (N33). Значение I_flag указывает флаг аннулирования (Invalidation), а PS — Path Sequence в опции Transit Information.

  2. (N32) передаёт DAO(tgt=N41,PS=x,I_flag=1) узлу (N22), а (N33) передаёт этому же узлу сообщение DAO(tgt=N41,PS=x,I_flag=1). (N22) узнает несколько маршрутов к одному получателю (N41) через разные next-hop. Узел (N22) может получить сообщения DAO от (N32) и (N33) с флагом I_flag в любом порядке. Реализации следует использовать таймер DelayDCO перед инициированием DCO. Если (N22) получает обновлённое сообщение DAO от всех путей, инициировать DCO не нужно. Таким образом, таблица маршрутизации N22 должна содержать (Dst,NextHop,PS): { (N41,N32,x), (N41,N33,x) }.

  3. (N22) передаёт DAO(tgt=N41,PS=x,I_flag=1) узлу (N11).

  4. (N11) передаёт DAO(tgt=N41,PS=x,I_flag=1) граничному маршрутизатору (6LBR). Это создаёт полный путь.

  5. (N41) принимает решение о смене набора предпочтительных родителей { N32, N33 } на { N31, N32 }.

  6. (N41) передаёт DAO(tgt=N41,PS=x+1,I_flag=1) узлу (N32) и DAO(tgt=N41,PS=x+1,I_flag=1) узлу (N31).

  7. (N32) передаёт DAO(tgt=N41,PS=x+1,I_flag=1) узлу (N22). Узел (N22) имеет несколько маршрутов к адресату (N41). Он видит новое значение Path Sequence для Target=N41 и ждёт в течение заданного интервала (DelayDCO) перед аннулированием другого маршрута { (N41),(N33),x }. По истечении срока ожидания (N22) передаёт DCO(tgt=N41,PS=x+1) узлу (N33) и обычное сообщение DAO(tgt=N41,PS=x+1,I_flag=1) узлу (N11).

  8. (N33) принимает DCO(tgt=N41,PS=x+1). Полученное значение Path Sequence является более поздним и аннулирует запись, связанную с целью (N41). Затем (N33) передаёт DCO(tgt=N41,PS=x+1) узлу (N41). Узел (N41) видит себя в качестве цели и отбрасывает DCO.

  9. После п. 6 узел (N31) получает DAO(tgt=N41,PS=x+1,I_flag=1), в результате чего создаёт маршрутную запись и передаёт DAO(tgt=N41,PS=x+1,I_flag=1) узлу (N21), который получает DAO и в результате передаёт DAO(tgt=N41,PS=x+1,I_flag=1) узлу (N11).

  10. (N11) получает DAO(tgt=N41,PS=x+1,I_flag=1) от (N21) и ждёт в течение DelayDCO, поскольку у него имеется несколько маршрутов к (N41). Узел (N41) получит DAO(tgt=N41,PS=x+1,I_flag=1) от (N22) (п. 7). Таким образом, (N11) получит обычные сообщения DAO(tgt=N41,PS=x+1,I_flag=1) от всех путей и не будет инициировать DCO.

  11. (N11) пересылает DAO(tgt=N41,PS=x+1,I_flag=1) маршрутизатору (6LBR) и это создаёт полный путь.

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

Большое спасибо Alvaro Retana, Cenk Gundogan, Simon Duquennoy, Georgios Papadopoulos и Peter van der Stok за их рецензии и комментарии. Alvaro Retana помог создать окончательный вариант документа, внеся важные замечания.

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

Rahul Arvind Jadhav (editor)

Huawei

Whitefield

Kundalahalli Village

Bangalore 560037

Karnataka

India

Phone: +91-080-49160700

Email: rahul.ietf@gmail.com

Pascal Thubert

Cisco Systems, Inc.

Building D

45 Allee des Ormes — BP1200

06254 MOUGINS — Sophia Antipolis

France

Phone: +33-497-23-26-34

Email: pthubert@cisco.com

Rabi Narayan Sahoo

Huawei

Whitefield

Kundalahalli Village

Bangalore 560037

Karnataka

India

Phone: +91-080-49160700

Email: rabinarayans0828@gmail.com

Zhen Cao

Huawei

W Chang’an Ave

Beijing

China

Email: zhencao.ietf@gmail.com


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

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

nmalykh@protokols.ru

1No-Path Destination Advertisement Object — анонс отсутствия пути к адресату.

2Destination Cleanup Object — объект «очистки» адресата.

3Internet Engineering Task Force.

4Internet Engineering Steering Group.

5Routing Protocol for Low-Power and Lossy Networks — протокол маршрутизации для сетей с недостаточным электропитанием и значительными потерями.

6Destination Advertisement Object — объект анонсирования адресата.

76LoWPAN Border Router — граничный маршрутизатор 6LoWPAN.

86LoWPAN Router — маршрутизатор 6LoWPAN.

9Mode of Operation — режим работы.

10Invalidate previous route.

11Extended Address Registration Option — опция расширенной регистрации адреса.

12Multi-Point to Point — множество с одним.

13Point-to-Multipoint — один со многими.

14Advanced Metering Infrastructure — расширенная инфраструктура измерений.

15Message Authentication Code — код проверки подлинности сообщения.

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

RFC 9008 Using RPI Option Type, Routing Header for Source Routes, and IPv6-in-IPv6 Encapsulation in the RPL Data Plane

Internet Engineering Task Force (IETF)                       M.I. Robles
Request for Comments: 9008                                 UTN-FRM/Aalto
Updates: 6550, 6553, 8138                                  M. Richardson
Category: Standards Track                                            SSW
ISSN: 2070-1721                                               P. Thubert
                                                                   Cisco
                                                              April 2021

Using RPI Option Type, Routing Header for Source Routes, and IPv6-in-IPv6 Encapsulation in the RPL Data Plane

Применение типа опции RPI, Routing Header для Source Route и инкапсуляции IPv6-in-IPv6 в плоскости данных RPL

PDF

Аннотация

В этом документе рассматриваются различные потоки данных через сети LLN1, использующие протокол RPL2 для организации маршрутов. Рассматриваются варианты, где в плоскости данных требуются тип опций RPI3 (RFC 6553), заголовки RPL Source Route (RFC 6554), и инкапсуляция IPv6-in-IPv6. Анализ обеспечивает базу для разработки эффективной компрессии этих заголовков. Документ обновляет RFC 6553 путем добавления RPI Option Type, RFC 6550 путем определения флага в опцию конфигурации DIO4 для указания внесённого изменения и RFC 8138 путем добавления типа опции при декомпрессии RPL Option.

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

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

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

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

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

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

Протокол RPL [RFC6550] используется для маршрутизации в сетях с ограниченными возможностями. В [RFC6553] определена опция RPL, передаваемая в заголовке IPv6 Hop-by-Hop Options для переноса RPLInstanceID и быстрого обнаружения несогласованности (петли) сетевой топологии. Опцию RPL обычно называют RPI7, хотя RPI — это информация, определённая в [RFC6550] и передаваемая в RPL Option. В RFC 6554 [RFC6554] определён заголовок RH38, являющийся заголовком расширения IPv6 для доставки дейтаграмм в домене маршрутизации RPL, в частности для режима Non-Storing (без сохранения).

Эти элементы называют артефактами RPL (artifact) и они наблюдаются во всем трафике плоскости данных сетей с маршрутизацией RPL. Как правило артефакты не возникают в плоскости управления RPL, где обычно передаётся пошаговый (hop-by-hop) трафик (единственным исключением служат сообщения DAO в режиме Non-Storing).

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

Рабочая группа ROLL9 проанализировала применение правил IPv6 [RFC2460] к режимам Storing и Non-Storing протокола RPL. В результате было выделено 24 варианта использования плоскости данных, полностью рассмотренных здесь во избежание неоднозначностей. Во время подготовки этого документа в [RFC8200] были опубликованы новые правила и документ был обновлён с учётом нормативных изменений.

Документ обновляет [RFC6553], меняя Option Type для RPL Option, чтобы маршрутизаторы, совместимые с [RFC8200], игнорировали эту опцию, если она им не понятна.

Routing Header Dispatch для 6LoWPAN10 (6LoRH) [RFC8138] определяет механизм сжатия данных RPL Option и Routing Header типа 3 (RH3) [RFC6554], а также эффективную инкапсуляцию IPv6-in-IPv6.

Большинство из описанных здесь вариантов применения используют инкапсуляцию пакетов IPv6-in-IPv6. При инкапсуляции и декапсуляции пакетов должны применяться правила [RFC6040] для сопоставления поля явной индикации перегрузки (explicit congestion notification или ECN) во внутреннем и внешнем заголовке. Рекомендуется изучить документ [TUNNELS], разъясняющий связь между туннелями IP и существующими уровнями протоколов, а также проблемы, связанные с туннелированием IP.

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

1.1. Обзор

Раздел 2 посвящён используемой в документе терминологии, раздел 3 содержит обзор RPL, раздел 4 описывает обновления RFC 6553, RFC 6550, RFC 8138. В разделе 5 рассмотрена топология, используемая в примерах применения, раздел 6 перечисляет рассмотренные варианты применения, раздел 7 посвящён вариантам режима Storing, раздел 8 — вариантам режима Non-Storing. В разделе 9 рассматриваются операционные вопросы поддержки не осведомленных о RPL листьев, в разделе 10 — операционные вопросы, связанные с изменением RPI Option Type. Раздел 11 посвящён реестрам IANA, а раздел 12 — вопросам безопасности.

2. Терминология и уровни требований

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

В [RFC7102] определены используемые в этом документе термины LLN, RPL, RPL domain, ROLL.

Consumed

Routing Header «потребляется» при нулевом значении поля Segments Left, означающем, что получатель в заголовке IPv6 является конечным адресатом пакета и все интервалы пересылки из Routing Header пройдены.

RPL Leaf — лист RPL

Хост IPv6, подключенный к маршрутизатору RPL и получающий связность через RPL DODAG11. Предполагается, что лист RPL будет игнорировать поглощённый Routing Header как узел IPv6 и заголовок Hop-by-Hop Options — как хост IPv6. В результате лист RPL может корректно получать пакеты с артефактами RPL, при этом не предполагается, что он не будет создавать артефакты RPL или поддерживать инкапсуляцию IP-in-IP. Далее в документе для сокращения используется термин «лист» вместо «лист RPL».

RPL Packet Information (RPI) — информация пакета RPL

Информация, абстрактно определённая в [RFC6550], для размещения в пакетах IP. Этот термин обычно служит (в том числе здесь) для обозначения RPL Option [RFC6553] с этой абстрактной информацией в заголовке IPv6 Hop-by-Hop Options. В [RFC8138] представлено более сжатое форматирования той же абстрактной информации.

RPL-Aware Node (RAN) — понимающий RPL узел

Устройство, реализующее протокол RPL. Такие устройства могут находиться как в сетях LLN, так и вне их.

RPL-Aware Leaf (RAL) — понимающий RPL лист

Не знающий о RPL узел, который является также листом RPL.

RPL-Unaware Node — не понимающий RPL узел

Устройство, не реализующее RPL. Отметим, что такие устройства могут быть в составе LLN.

RPL-Unaware Leaf (RUL) — не понимающий RPL лист

Знающий о RPL узел, который является также листом RPL.

6LoWPAN Node (6LN) — узел 6LoWPAN

Определение из [RFC6775]: «Узлом 6LoWPAN является любой хост или маршрутизатор, участвующий в LoWPAN. Термин применяется, когда хост или маршрутизатор может играть описанную роль». В этом документе 6LN является листом.

6LoWPAN Router (6LR) — маршрутизатор 6LoWPAN

Определение из [RFC6775]: «Промежуточный маршрутизатор в LoWPAN, способный передавать и принимать Router Advertisement (RA) и Router Solicitation (RS), а также пересылать и маршрутизировать пакеты IPv6. Маршрутизаторы 6LoWPAN присутствуют лишь в топологиях route-over».

6LoWPAN Border Router (6LBR) — граничный маршрутизатор 6LoWPAN

Определение из [RFC6775]: «Граничный маршрутизатор, расположенный на стыке сетей 6LoWPAN или между сетью 6LoWPAN и другой сетью IP. На границе сети 6LoWPAN может быть один или несколько маршрутизаторов 6LBR. Они отвечают за распространение префиксов IPv6 для обслуживаемых сетей 6LoWPAN. Изолированная сеть LoWPAN также включает маршрутизатор 6LBR, предоставляющий префиксы для неё».

Flag Day — “день флага”

Время, когда конфигурация сети меняется так, что узлы со старой конфигурацией не могут взаимодействовать с обновлёнными узлами. Примером может служить переход ARPANET от IP версии 3 к IP версии 4 1 января 1983 г. [RFC0801]. В контексте этого документа — переход от RPI Option Type (0x63) к Option Type (0x23), представляющий собой серьёзную замену. Для снижения времени на такой переход в параграфе 4.1.3 представлен механизм, позволяющий обновлять узлы постепенно.

Non-Storing Mode (Non-SM) — режим без хранения

Режим работы RPL, при котором понимающие RPL узлы передают корню сведения о своих родителях, что позволяет корню знать топологию. Благодаря этому знанию, промежуточным маршрутизаторам 6LR не нужно поддерживать состояние маршрутизации и требуется заданный источником маршрут.

Storing Mode (SM) — режим с хранением

Режим работы RPL, при котором понимающие RPL узлы (6LR) поддерживают состояние маршрутизации (от потомков) и источнику не требуется задавать маршрут.

3. Обзор RPL

RPL определяет управляющее сообщение (плоскость управления), которое является сообщением ICMPv6 [RFC4443] типа 155. Сообщения DIS (DODAG Information Solicitation), DIO (DODAG Information Object), DAO (Destination Advertisement Object) являются управляющими сообщениями RPL и имеют свои коды. Стек RPL показан на рисунке 1.

+--------------+
| Вышележащие  |
|   уровни     |
+--------------+
|   RPL        |
+--------------+
|   ICMPv6     |
+--------------+
|   IPv6       |
+--------------+
|   6LoWPAN    |
+--------------+
|   PHY-MAC    |
+--------------+

Рисунок 1. Стек RPL.


RPL поддерживает два режима внутреннего нисходящего (Downward) трафика. Режим Storing (SM) полностью поддерживает состояние, в Non-Storing (non-SM) маршрутизацию задаёт источник. Экземпляр RPL работает в режиме Storing или Non-Storing, а RPL Instance с комбинацией узлов Storing и Non-Storing не поддерживается текущей спецификацией. Внешние маршруты анонсируются сообщениями non-SM даже в сети SM (4.1.1. Анонсирование внешних маршрутов с сигнализацией режима Non-Storing).

4. Обновления RFC 6550, RFC 6553, RFC 8138

4.1. Обновления RFC 6550

4.1.1. Анонсирование внешних маршрутов с сигнализацией режима Non-Storing

В параграфе 6.7.8 [RFC6550] определён флаг E для указания того, что маршрутизатор 6LR, создающий DAO распространяет внешние маршруты (цели) в сеть RPL. Внешней считается цель, полученная от другого протокола (например, префикс вне домена RPL), но доступная через 6LR. Находясь за пределами домена RPL, доступный через внешнюю цель узел не может гарантировать игнорирование артефактов RPL. От такого узла также не ожидается корректная обработка сжатия, заданного в [RFC8138]. Это означает, что артефакты RPL следует помещать в инкапсуляцию IP-in-IP, которая удаляется маршрутизатором 6LR, а сжатие следует обрабатывать на 6LR до пересылки пакета за пределы домена RPL.

Эта спецификация обновляет [RFC6550], указывая, что рекомендуется анонсировать внешние цели с использованием сообщений DAO режима Non-Storing даже при работе сети в режиме Storing. Таким образом, внешние маршруты не анонсируются внутри DODAG и все пакеты для внешней цели достигают корня как обычный трафик в режиме Non-Storing. Сообщения DAO режима Non-Storing сообщают корню адрес маршрутизатора 6LR, добавившего внешний маршрут, и корень использует инкапсуляцию IP-in-IP для 6LR, который завершает туннель IP-in-IP и пересылает исходный пакет за пределы домена RPL без артефактов RPL.

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

Лист RUL является особым случаем внешней цели, которая в действительности является хостом и заведомо поддерживает потребляемый заголовок Routing, а также игнорирует заголовок Hop-by-Hop Options, как предписано [RFC8200]. Узнать о цели можно от внешнего протокола маршрутизации или путем её регистрации на 6LR с использованием [RFC8505].

Для включения IP-in-IP на всем пути к 6LN полезна поддержка декапсуляции IP-in-IP в 6LN, но [RFC8504] не предполагает этого. Если 6LN является RUL, инкапсулирующему пакеты корню следует завершать туннель в родительском 6LR. Корень может инкапсулировать пакеты для всего пути к RUL, если он знает, что RUL поддерживает инкапсуляцию IP-in-IP и артефакты в цепочке внешних заголовков.

От доступного по внешнему маршруту узла не ожидается поддержка [RFC8138]. Независимо от выполнения декапсуляции и доставки маршрутизатором 6LR пакетов листу RUL, вносящий внешний маршрут 6LR должен выполнить декомпрессию пакета, сжатого в соответствии с [RFC8138], перед его пересылкой по внешнему маршруту.

4.1.2. Опции конфигурации и режим работы

В параграфе 6.7.6 [RFC6550] описана опция DODAG Configuration, содержащая набор флагов в первом октете. В преддверии будущих работ по пересмотру RPL в части настройки конфигурации LLN и DODAG этот документ меняет название субреестра IANA DODAG Configuration Option Flags так, чтобы он применялся лишь к режимам работы (Mode of Operation или MOP) от 0 до 6, оставляя невыделенными флаги для режима MOP = 7. Режимы MOP описаны в параграфе 6.3.1 [RFC6550]. Кроме того, этот документ резервирует значение MOP = 7 для будущих расширений (см. параграфы 11.2 и 11.3).

4.1.3. Индикация нового RPI во флаге опции DODAG Configuration

Для предотвращения проблем, связанных с отсутствием взаимодействия между узлами (flag day) с новым RPI Option Type (0x23) и старым RPI Option Type (0x63) в этом параграфе определён флаг опции DODAG Configuration, указывающий возможность безопасного применения нового типа RPI Option. Флаг указывает значение Option Type, которое сеть будет использовать для RPL Option. Таким образом, при вхождении узла в сеть он будет получать используемое значение. Благодаря этому узлы с поддержкой RPL узнают, можно ли применять тип 0x23 при создании новой опции RPL. Пересылающему пакет с RPI узлу недопустимо менять Option Type в RPL Option.

Это делается с помощью флага опции DODAG Configuration, указывающего «включение RPI 0x23» и распространяемого по сети. В параграфе 6.3.1 [RFC6550] определено 3-битовое поле режима работы (MOP) в базовом объекте DIO. Флаг определён лишь для значений MOP от 0 до 6. Для MOP = 7 узел должен применять RPI 0x23.

Как указано в [RFC6550], опция DODAG Configuration передаётся в сообщениях DIO и содержит данные конфигурации. Опция обычно статична и не меняется внутри графа DODAG. Конфигурацию задаёт корень DODAG и она распространяется по DODAG в опциях DODAG Configuration. Узлы, не являющиеся корнем DODAG, не меняют содержимого опции DODAG Configuration.

В настоящее время для неиспользуемых битов опции DODAG Configuration в [RFC6550] сказано: «Отправитель должен устанавливать 0, а получатель должен игнорировать поле». При получении сообщения с нулевым полем флагов (принято по умолчанию) новые узлы будут сохранять совместимость с RFC 6553 — исходящий трафик имеет старое значение RPI Option Type (0x63). Если получен флаг со значением 1, должно устанавливаться RPL Option 0x23.

Бит 3 в поле Flags опции DODAG Configuration должен использоваться в соответствии с таблицей 1 (совпадает с таблицей 36 и приведена здесь для удобства).

Таблица 1. Флаг опции DODAG Configuration для индикации RPI Flag Day.

Номер бита

Описание

Документ

3

Тип RPI 0x23 разрешён

Данный документ

При перезагрузке узел (6LN или 6LR) не запоминает тип RPI Option (т. е. состояние флага), поэтому он не будет вызывать сообщений DIO до получения DIO, указывающего используемое значение RPI. Узел будет применять значение 0x23, если сеть поддерживает это.

4.2. Обновление RFC 6553 — индикация нового типа RPI Option

Это изменение требуется для обеспечения возможности передачи, например, пакетов IPv6 из понимающего RPL листа узлу, не поддерживающему RPL, через сеть Internet (7.2.1. Поток от RAL в Internet) без инкапсуляции IPv6-in-IPv6.

В разделе 6 [RFC6553] сказано (см. таблицу 2), что в поле Option Type опции RPL два старших бита должны иметь значение 01, а третий бит — 1. Первые два бита указывают, что узел IPv6 должен отбрасывать пакеты с неизвестным Option Type, а третий указывает возможность смены Option Data на маршруте. Остальные биты задают Option Type.

Таблица 2. Option Type в опции RPL.

Шестнадцатеричное значение

Двоичное значение

Описание

Документ

act

chg

rest

0x63

01

1

00011

RPL Option

[RFC6553]

В этом документе показано, что источник не всегда может быть уверен в прохождении пакета лишь через домен RPL. В момент публикации [RFC6553] перетекание заголовка Hop-by-Hop Options во внешнюю цепочку заголовков IPv6 могла влиять на маршрутизаторы ядра в Internet. По этой причине было принято решение инкапсулировать все пакеты с RPL Option в формат IPv6-in-IPv6 во всех случаях, когда не было ясно, останется ли пакет в домене RPL. В исключительных случаях, когда пакеты будут уходить, Option Type гарантирует, что первый маршрутизатор Internet, не распознавший её, отбросит пакет и защитит остальную сеть.

Даже со сжатием заголовка IPv6-in-IPv6 [RFC8138] это ведёт к добавлению байтов в пакет, связанному с потреблением дополнительной энергии и пропускной способности, росту потерь и возможности фрагментации на уровне 6LoWPAN. Это влияет на повседневную работу устройств с ограничениями в случаях, которые обычно достаточно редки и не оказывает существенного влияния на ядро в целом.

Хотя намерение заключается в том, чтобы заголовок Hop-by-Hop Options с RPL Option не выходил за пределы домена RPL, данная спецификация меняет поведение с целью снижения зависимости от инкапсуляции IPv6-in-IPv6 и защиты устройств с ограничениями. В разделе 4 [RFC8200] разъяснено поведение маршрутизаторов в Internet следующим образом: «сейчас предполагается, что промежуточные узлы будут проверять и обрабатывать Hop-by-Hop Options только в тех случаях, когда это явно задано в их конфигурации.»

Когда перемещение пакета непонятно, отправителю предпочтительно не инкапсулировать его, принимая во внимание возможность выхода пакета из сети RPL на пути к адресату. В этом случае пакет должен прийти к получателю, а не быть Если узле Internet настроен на обработку заголовка Hop-by-Hop Options и встречает Option Type с двумя первыми битами 01, он отбросит пакет в соответствии с [RFC8200]. Хостам следует делать это независимо от конфигурации.

Поэтому данный документ обновляет Option Type в RPL Option [RFC6553], называемый для простоты RPI Option Type (таблица 3). Два старших бита должны иметь значение 00, а третий — 1. Первые два бита указывают, что узел IPv6 должен пропустить эту опцию и продолжить обработку заголовка ([RFC8200], параграф 4.2), если он не понимает Option Type, а третий бит устанавливается для индикации возможности смены Option Data на пути. Значения 5 битов справа не меняется — 0x3 (00011). Это гарантирует, что пакет, покинувший домен RPL в сети LLN (или саму сеть LLN), не будет отброшен в результате наличия опции RPL.

С новым Option Type при получении (промежуточным) узлом IPv6 (не знающим RPL) пакета с RPL Option ему следует игнорировать Hop-by-Hop RPL Option (пропустить опцию и продолжить обработку заголовка). Это актуально в случаях наличия потока от RAL в Internet (7.2.1. Поток от RAL в Internet). Это существенно меняет [RFC6553].

Таблица 3. Пересмотр Option Type в опции RPL.

Шестнадцатеричное значение

Двоичное значение

Описание

Документ

act

chg

rest

0x23

00

1

00011

RPL Option

Данный документ

Без описанной ниже сигнализации это изменение будет препятствовать взаимодействию (flag day) в имеющихся сетях, использующих 0x63 в качестве значения RPI Option Type. Переход к значению 0x23 не будет понятен в этих сетях. Реализациям RPL предлагается при обработке заголовка воспринимать оба значения 0x63 и 0x23.

При пересылке пакетов реализациям следует использовать значение RPI Type, которое было получено. Это требование обусловлено тем, что RPI Option Type не меняется на пути ([RFC8200], параграф 4.2). Это позволяет постепенно обновлять сеть, а корень DODAG будет знать, какие части сети были обновлены.

При создании новых пакетов реализации следует иметь возможность определить значение для включения в пакет. Это контролируется опцией DODAG Configuration (4.1.3. Индикация нового RPI во флаге опции DODAG Configuration).

Смена RPI Option Type 0x63 на 0x23 делает все узлы, соответствующие параграфу 4.2 [RFC8200], устойчивыми к артефактам RPL и больше не требуется удалять артефакты при передаче трафика в Internet. Это изменение проясняет, когда использовать заголовки IPv6-in-IPv6 и как адресовать их — заголовок Hop-by-Hop Options с RPI должен добавляться, когда 6LR порождает пакеты (без заголовков IPv6-in-IPv6), а заголовки IPv6-in-IPv6 должны добавляться, когда 6LR определяет, что нужно вставить заголовок Hop-by-Hop Options с RPL Option. Заголовок IPv6-in-IPv6 адресуется корню RPL для восходящего направления и хосту для нисходящего.

В режиме Non-Storing работа с не понимающими RPL узлами-листьями много проще, поскольку 6LBR (корень DODAG) имеет полные сведения о соединениях всех узлов DODAG и весь трафик идёт через корневой узел. 6LBR может распознавать не понимающие RPL узлы-листья, поскольку он будет получать сообщения DAO и них от 6LR, расположенного непосредственно над узлом, не понимающим RPL.

Режим Non-Storing не требует смены типа 0x63 на 0x23, поскольку корень всегда может создать правильный пакет. Смена Type не оказывает негативного влияния в режиме Non-Storing (см. параграф 4.1.3).

4.3. Обновление RFC 8138 — индикация способа декомпрессии

Это обновление требуется для обеспечения возможности декомпрессии RPL Option с новым Option Type 0x23.

Заголовок RPI-6LoRH содержит сжатую форму RPL RPI (см. раздел 6 в [RFC8138]). Узел, выполняющий декомпрессию, должен делать это используя активное значение RPI Option Type, т. е. выбрать 0x23 (новое) или 0x63 (старое). Узел выбирает значение на основе флага в опции DODAG Configuration, определённого в параграфе 4.1.3. Например, если сеть использует 0x23 (в опции DIO), при декомпрессии следует задавать 0x23. Сжатие заголовка IPv6-in-IPv6 описано в разделе 7 [RFC8138].

Использование единого кода при обработке заголовков IPv6-in-IPv6 может обеспечивать существенные преимущества.

В режиме Storing при переходе потока от RAL к RUL и от RUL к RUL применяется сжатие заголовков IPv6-in-IPv6 и RPI. В таких случаях должен применяться заголовок IPv6-in-IPv6, который следует сжимать в соответствии с разделом 7 [RFC8138]. На рисунке 2 показан пример для режима Storing, где пакет принимается из Internet, затем корневой узел инкапсулирует пакет для передачи в RPI. В этом примере для листа неизвестно о поддержке RFC 8138 и пакет инкапсулируется для маршрутизатора 6LR, который является родителем и последним интервалом пересылки.

+-+ ... -+-+ ... +-+- ... -+-+- +-+-+-+ ... +-+-+ ... -+++ ... +-...
|11110001|SRH-6LoRH| RPI-  |IP-in-IP| NH=1      |11110CPP| UDP | UDP
|Page 1  |Type1 S=0| 6LoRH |6LoRH   |LOWPAN_IPHC| UDP    | hdr |Payld
+-+ ... -+-+ ... +-+- ... -+-+-.+-+-+-+-+ ... +-+-+ ... -+ ... +-...
         <-4 байта->                      <-        RFC 6282      ->
                                               Нет артефактов RPL

Рисунок 2. Опция RPI, вставленная корнем в режиме Storing.


На рисунке 2 инкапсуляция IPv6-in-IPv6 выполняется корнем, поэтому он не включён в IP-in-IP 6LoRH. Получателем является родительский 6LR адресата во внутреннем пакете, поэтому его нельзя исключить. Он указывается отдельной записью в заголовке Source Route 6LoRH (SRH-6LoRH) как первый 6LoRH. Запись одна, поэтому SRH-6LoRH Size имеет значение 0. В этом примере Type = 1, поэтому адрес 6LR сжимается до двух байтов, а общий размер SRH-6LoRH составляет 4 байта. Далее следует заголовок RPI-6LoRH, затем IP-in-IP 6LoRH. При удалении IP-in-IP 6LoRH удаляются также все предшествующие ему заголовки маршрутизатора Может удаляться и Paging Dispatch [RFC8025], если предыдущая страница не была заменена страницей, отличной от 0 или 1, поскольку LOWPAN_IPHC кодируется одинаково на принятой по умолчанию странице 0 и Page 1. Результирующим пакетом для адресата является внутренний пакет, сжатый в соответствии с [RFC6282].

5. Эталонная топология

             +------------+
             |  INTERNET  ----------+
             +------------+         |
                                  A |
                              +-------+
                              |6LBR   |
                  +-----------|(root) |-------+
                  |           +-------+       |
                  |                           |
                  | B                         |C
              +---|---+                   +---|---+
              |  6LR  |                   |  6LR  |
    +---------|       |--+             +---       ---+
    |         +-------+  |             |  +-------+  |
    |                    |             |             |
    | D                  |  E          |             |
  +-|-----+          +---|---+         |             |
  |  6LR  |          |  6LR  |         |             |
  |       |    +------       |         |             |
  +---|---+    |     +---|---+         |             |
      |        |         |             |             |
      |        |         +--+          |             |
      |        |            |        I |          J  |
   F  |        | G          | H        |             |
+-----+-+    +-|-----+  +---|--+   +---|---+     +---|---+
|  RAL  |    | RUL   |  | RAL  |   |  RAL  |     | RUL   |
|  6LN  |    |  6LN  |  | 6LN  |   |  6LN  |     |  6LN  |
+-------+    +-------+  +------+   +-------+     +-------+

Рисунок 3. Эталонная топология RPL.


В общем случае сеть RPL включает 6LBR, магистральные маршрутизаторы (Backbone Router или 6BBR), 6LR, а также 6LN в качестве листьев, логически организованных в граф DODAG.

На рисунке 3 показана эталонная топология RPL, используемая в этом документе. Для узлов применяются символьные метки, которые позволяют в дальнейшем ссылаться на них. 6LR представляет полный маршрутизатор, 6LN — понимающий RPL маршрутизатор или хост (лист). Для упрощения предполагается, что 6LBR имеет прямой доступ в Internet и служит корнем DODAG, поэтому 6BBR на рисунке не показаны. Листья 6LN, помеченные как RAL (F, H, I), являются узлами RPL без дочерних хостов. Листья, помеченные как RUL (G и J), являются устройствами, не поддерживающими RPL, но использующими анонсы RA (Router Advertisement), запросы дубликатов адресов 6LoWPAN (Duplicate Address Request), подтверждения дубликатов (Duplicate Address Confirmation или DAR/DAC) и обнаружение соседей 6LoWPAN лишь для участия в работе сети [RFC8505]. 6LBR (A) на рисунке является корнем Global DODAG.

6. Варианты применения

Далее анализируются комбинации RFC 6553, RFC 6554 и инкапсуляции IPv6-in-IPv6 для репрезентативных потоков трафика. Варианты включают потоки:

  • между понимающими RPL узлами и корнем (6LBR);

  • между понимающими RPL узлами и Internet;

  • между узлами RUL внутри LLN (см. например, 7.1.4. Пример потока от RUL к корню);

  • внутри LLN когда адрес конечного получателя находится вне LLN (см. например, 7.2.3. Поток от RUL в Internet).

Рассматриваемые варианты приведены ниже.

Взаимодействие между листом и корнем:

RAL -> root

root -> RAL

RUL -> root

root -> RUL

Взаимодействие между листом и Internet:

RAL -> Internet

Internet -> RAL

RUL -> Internet

Internet -> RUL

Взаимодействие между листьями:

RAL -> RAL

RAL -> RUL

RUL -> RAL

RUL -> RUL

Этот документ следует правилу, в соответствии с которым заголовок не может быть удалён или вставлен «на лету» внутри маршрутизируемого пакета IPv6. Это фундаментальное правило архитектуры IPv6 задано в [RFC8200].

Поскольку значение Rank в артефактах RPI меняется при каждой пересылке, оно обычно достигает 0 по прибытии в корень DODAG. При передаче пакетов в Internet корень DODAG должен обнулять это поле, поэтому в Internet значение SenderRank недоступно.

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

RPL Option и RH3 могут быть изменены маршрутизаторами на пути пакетов очень специфическими способами без добавления и удаления заголовков инкапсуляции. Оба заголовка разработаны с учётом такого изменения и помечены как изменяемые, но восстанавливаемые. Поэтому IPsec AH (Authentication Header) можно применять к этим заголовкам, но это не будет защищать от изменения.

Опция RPI должна присутствовать в каждом отдельном пакете данных RPL. До выхода [RFC8138] существовал значительный интерес к заданию исключений из этого правила, и удаления RPI для потоков Downward в режиме Non-Storing. Это исключение охватывало очень небольшое число случаев и вызвало существенные проблемы взаимодействия, добавив интереса к коду и тестам. Возможность сжать RPI до 3 байтов или меньше в значительной мере устранила потребность в исключении опции. В последующих параграфах рассматриваются примеры, подобранные на основе указанных ниже требований IPv6 и RPL.

Опция RPI должна быть в каждом пакете, проходящем через LLN.

  • Приведённое выше требование заставляет инкапсулировать все пакеты, приходящие из Internet.

  • Заголовок нельзя вставить или удалить «на лету» для маршрутизируемого пакета IPv6.

  • Заголовки расширения может добавлять и удалять лишь отправитель или получатель.

  • Заголовки RPI и RH3 маршрутизаторы на пути пакета могут изменять без необходимости добавления и удаления инкапсулирующего заголовка.

  • RH3 или RPL Option может удаляться промежуточным маршрутизатором лишь из инкапсулирующего заголовка IPv6, адресованного этому маршрутизатору.

  • Режим Non-Storing в нисходящем направлении требует для RH3 инкапсуляции корнем.

Варианты применения определены на основе приведённых ниже допущений для случая использования в LLN неотбрасываемого типа RPI Option Type (0x23).

  • Каждый узел IPv6 (включая маршрутизаторы Internet) следует [RFC8200], что позволяет безопасно вставлять RPI Option Type 0x23 .

  • Все маршрутизаторы 6LR соответствуют [RFC8200].

  • RPI игнорируются получателями IPv6 (RUL dst).

  • В некоторых случаях предполагается, что RAL поддерживает инкапсуляцию IP-in-IP.

  • Поддержка узлами RUL инкапсуляции IP-in-IP не предполагается.

  • Для исходящего из RUL трафика при добавлении неанализируемого RPI узлу 6LR, служащему граничным маршрутизатором RPL, следует переписывать RPI, указывая выбранный экземпляр и задавая флаги.

  • Описания RAL применяются к RAN в целом.

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

  • Сжатие основано на [RFC8138].

  • Метки потока [RFC6437] не требуются в RPL.

7. Режим Storing

В режиме Storing (SM) с полным учётом состояния отправитель может определить, находится ли адресат в LLN, сравнивая адрес получателя с опцией PIO в сообщении DIO. В таблице 4 показаны заголовки, требуемые в разных случаях и указано, требуется ли добавлять заголовок IPv6-in-IPv6 и кому он должен быть адресован:

  1. конечный получатель (целевой узел RAL (tgt));

  2. «корень»;

  3. родитель 6LR для RUL.

Для случаев, где заголовок IPv6-in-IPv6 не требуется, указано «Нет», а для адресата — «-» (неприменимо). Во всех случаях требуется опция RPI, поскольку она показывает несогласованность маршрутной топологии (петли). В общем случае заголовок RH3 не требуется, поскольку он не применяется в режиме Storing, однако при передаче от корня к RUL в режиме SM, где RH3 может использоваться, этот заголовок указывает RUL (таблица 8).

Лист может быть маршрутизатором 6LR или хостом и оба обозначаются как 6LN. Корень указывает 6LBR (рисунок 3).

Таблица 4. Инкапсуляция IPv6-in-IPv6 в режиме Storing.

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

Направление

IPv6-in-IPv6

Адресат IPv6-in-IPv6

Leaf — Root

RAL -> корень

Нет

корень -> RAL

Нет

корень -> RUL

Требуется

6LR

RUL -> корень

Требуется

корень

Leaf — Internet

RAL -> Internet

Требуется

корень

Internet -> RAL

Требуется

RAL (tgt)

RUL -> Internet

Требуется

корень

Internet -> RUL

Требуется

6LR

Leaf — Leaf

RAL -> RAL

Нет

RAL -> RUL

Нет (вверх)

Требуется (вниз)

6LR

RUL -> RAL

Требуется (вверх)

корень

Требуется (вниз)

RAL

RUL -> RUL

Требуется (вверх)

корень

Требуется (вниз)

6LR

7.1. Взаимодействие между листом и корнем

В этом параграфе рассматриваются потоки в режиме Storing (SM):

RAL -> корень

корень -> RAL

RUL -> корень

корень -> RUL

7.1.1. Пример потока от RAL к корню

В режиме Storing опция RPI [RFC6553] применяется для передачи RPLInstanceID и Rank. Поток имеет вид RAL (6LN) -> 6LR_i -> корень (6LBR), например, Узел F (6LN) -> Узел D (6LR_i) -> Узел B (6LR_i) -> Узел A (корень 6LBR).

RAL (узел F) вставляет RPI и передаёт пакет 6LR (узел D), который уменьшает Rank в RPI и передаёт пакет вверх. При поступлении пакета в 6LBR (узел A) опция RPI восстанавливается и пакет обрабатывается. Заголовок IPv6-in-IPv6 не требуется. 6LBR может удалить RPI, поскольку пакет адресован ему. Для использования этого варианта узел RAL должен знать, что он взаимодействует 6LBR. RAL может знать адрес 6LBR поскольку ему известен корень из DODAGID в сообщениях DIO. В таблице 5 показаны заголовки, которые требуется использовать.

Таблица 5. Использование заголовков при передаче от RAL к корню в режиме SM.

Заголовок

RAL src

6LR_i

6LBR dst

Добавленные заголовки

RPI

Изменённые заголовки

RPI

Удалённые заголовки

RPI

Неизменные заголовки

7.1.2. Пример потока от корня к RAL

В этом случае поток имеет вид: корень (6LBR) -> 6LR_i -> RAL (6LN), например, Узел A (корень, 6LBR) -> Узел B (6LR_i) -> Узел D (6LR_i) -> Узел F (6LN). Маршрутизатор 6LBR вставляет RPI и передаёт пакет вниз. 6LR увеличивает Rank в RPI (проверяется RPLInstanceID для выбора таблицы пересылки). Пакет обрабатывается в RAL и RPI удаляется. Заголовок IPv6-in-IPv6 не требуется. В таблице 6 показаны заголовки, которые требуется использовать.

Таблица 6. Использование заголовков при передаче от корня к RAL в режиме SM.

Заголовок

6LBR src

6LR_i

RAL dst

Добавленные заголовки

RPI

Изменённые заголовки

RPI

Удалённые заголовки

RPI

Неизменные заголовки

7.1.3. Пример потока от корня к RUL

Поток имеет вид: корень (6LBR) -> 6LR_i -> RUL (получатель IPv6), например, Узел A (6LBR) -> Узел B (6LR_i) -> Узел E (6LR_n) -> Узел G (RUL). 6LR_i (узел B) представляет промежуточные маршрутизаторы от источника (6LBR) к получателю (RUL), а 1 <= i <= n, где n — число маршрутизаторов (6LR), через которые пакет проходит от 6LBR (узел A) к RUL (узел G). 6LBR инкапсулирует пакет в заголовок IPv6-in-IPv6 и помещает в начало (prepend) RPI. Заголовок IPv6-in-IPv6 содержит адрес родителя 6LR для RUL (6LR_n). Родитель 6LR узла RUL удаляет заголовок и передаёт пакет RUL. В таблице 7 показаны заголовки, которые требуется использовать.

Таблица 7. Использование заголовков при передаче от корня к RUL в режиме SM.

Заголовок

6LBR src

6LR_i

6LR_n

RUL dst

Добавленные заголовки

IP6-IP612 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

IP6-IP6

Инкапсуляции IP-in-IP при взаимодействии корня с RUL можно избежать. В режиме SM её можно заменить заголовком RH3, указывающим RUL и в этом случае пакет направляется маршрутизатору 6LR как в обычной операции SM, затем 6LR пересылает его RUL на основе заголовка RH3, а RUL игнорирует потреблённые RH3 и RPI как в режиме Non-Storing. В таблице 8 показаны заголовки, которые требуется использовать.

Таблица 8. Использование заголовков при передаче от корня к RUL в режиме SM без инкапсуляции.

Заголовок

6LBR src

6LR_i i=(1,..,n-1)

6LR_n

RUL dst

Добавленные заголовки

RPI, RH3

Изменённые заголовки

RPI

RPI, RH3 (потребляется)

Удалённые заголовки

Неизменные заголовки

RH3

RPI, RH3 (оба игнорируются)

7.1.4. Пример потока от RUL к корню

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_i -> корень (6LBR). Например, Узел G (RUL) -> Узел E (6LR_1) -> Узел B (6LR_i) -> Узел A (корень, 6LBR). 6LR_i представляет промежуточные маршрутизаторы на пути от источника (RUL) к адресату (6LBR), а 1 <= i <= n, где n — число маршрутизаторов (6LR) через которые пакет проходит от RUL к 6LBR.

Когда пакет приходит от RUL (узел G) в 6LR_1 (узел E), маршрутизатор 6LR_1 инкапсулирует его в заголовок IPv6-in-IPv6 с RPI, адресованный корню (узел A). Корень удаляет заголовок и обрабатывает пакет. В таблице 9 показаны заголовки, которые нужны в случае, когда заголовок IPv6-in-IPv6 адресован корню (узел A).

Таблица 9. Использование заголовков при передаче от RUL к корню в режиме SM.

Заголовок

RUL src

6LR_1

6LR_i

6LBR dst

Добавленные заголовки

IP6-IP6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

IP6-IP6

7.2. Взаимодействие между листом и Internet

В этом параграфе описано взаимодействие в режиме Storing (SM) для случаев:

RAL -> Internet

Internet -> RAL

RUL -> Internet

Internet -> RUL

7.2.1. Поток от RAL в Internet

В этом случае поток имеет вид RAL (6LN) -> 6LR_i -> корень (6LBR) -> Internet, например, Узел F (RAL) -> Узел D (6LR_i) -> Узел B (6LR_i) -> Узел A (корень, 6LBR) -> Internet. 6LR_i представляет промежуточные маршрутизаторы на пути от источника (RAL) к корню (6LBR), , а 1 <= i <= n, где n — число маршрутизаторов (6LR) через которые пакет проходит от RAL к 6LBR.

Информация RPL из RFC 6553 может уходить в Internet, поскольку узлы, не настроенные на поддержку RPL, будут игнорировать её. Заголовок IPv6-in-IPv6 не требуется. С другой стороны, RAL может вставлять RPI с инкапсуляцией в заголовок IPv6-in-IPv6 для корня, который будет удалять RPI и передавать пакет в Internet. В этом случае используется узел-лист, но этот вариант применим также к любому типу узлов, понимающих RPL (например, 6LR).

В таблице 10 показаны заголовки, которые нужно использовать при отсутствии инкапсуляции. Отметим, что 6LBR изменяет RPI, устанавливая SenderRank = 0, если поле имеет иное значение. В таблице 11 показаны заголовки, которые требуется использовать при наличии инкапсуляции.

Таблица 10. Использование заголовков при передаче от RAL в Internet в режиме SM без инкапсуляции.

Заголовок

RAL src

6LR_i

6LBR

Internet dst

Добавленные заголовки

RPI

Изменённые заголовки

RPI

RPI

Удалённые заголовки

Неизменные заголовки

RPI (игнорируется)

Таблица 11. Использование заголовков при передаче от RAL в Internet в режиме SM с инкапсуляцией в корень (6LBR).

Заголовок

RAL src

6LR_i

6LBR

Internet dst

Добавленные заголовки

IP6-IP6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

IP6-IP6

7.2.2. Поток из Internet к RAL

Поток имеет вид Internet -> корень (6LBR) -> 6LR_i -> RAL (6LN), например, Internet -> Узел A (корень, 6LBR) -> Узел B (6LR_1) -> Узел D (6LR_n) -> Узел F (RAL). При поступлении пакета из Internet в 6LBR опция RPI добавляется во внешний заголовок IPv6-in-IPv6 (с адресом получателя RAL) и пакет передаётся 6LR, где меняется Rank в RPI. При поступлении пакета в RAL он декапсулируется и RPI удаляется до обработки пакета. В таблице 12 показаны заголовки, которые требуется использовать.

Таблица 12. Использование заголовков при передаче из Internet в RAL в режиме SM.

Заголовок

Internet src

6LBR

6LR_i

RAL dst

Добавленные заголовки

IP6-IP6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

7.2.3. Поток от RUL в Internet

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_i -> корень (6LBR) -> Internet, например, Узел G (RUL) -> Узел E (6LR_1) -> Узел B (6lR_i) -> Узел A (корень, 6LBR) -> Internet. Узел 6LR_1 (i=1) добавляет заголовок IPv6-in-IPv6 (RPI), адресованный корню, который может удалить RPI до передачи наверх. На промежуточных 6LR изменяется значение Rank в RPI.

В идеале исходный узел оставит нулевую метку потока IPv6 для лучшего сжатия пакета в LLN. 6LBR установит ненулевую метку потока при отправке пакета в Internet (см. [RFC6437]). В таблице 13 показаны заголовки, которые требуется использовать.

Таблица 13. Использование заголовков при передаче от RUL в Internet в режиме SM.

Заголовок

IPv6 src (RUL)

6LR_1

6LR_i i=(2,..,n)

6LBR

Internet dst

Добавленные заголовки

IP6-IP6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

7.2.4. Поток из Internet к RUL

Поток имеет вид Internet -> корень (6LBR) -> 6LR_i -> RUL (узел IPv6 dst), например, Internet -> Узел A (корень, 6LBR) -> Узел B (6LR_i) -> Узел E (6LR_n) -> Узел G (RUL). 6LBR добавляет RPI в заголовок IPv6-in-IPv6. Заголовок инкапсуляции IPv6-in-IPv6 адресован родителю 6LR узла RUL. Подробности этого варианта рассмотрены в [RFC9010], где описана маршрутизация RPL на 6LN, выступающем в качестве хоста и не понимающем RPL. 6LBR может устанавливать нулевую метку потока во внутреннем заголовке IPv6-in-IPv6 в целях сжатия [RFC8138] [RFC6437]. В таблице 14 показаны заголовки, которые требуется использовать.

Таблица 14. Использование заголовков при передаче из Internet в RUL в режиме SM.

Заголовок

Internet src

6LBR

6LR_i i=(1,..,n-1)

6LR_n

RUL dst

Добавленные заголовки

IP6-IP6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

7.3. Взаимодействие между листьями

В этом параграфе рассматривается режим Storing (SM) для потоков:

RAL -> RAL

RAL -> RUL

RUL -> RAL

RUL -> RUL

7.3.1. Поток от RAL к RAL

Протокол RPL [RFC6550] разрешает простую оптимизацию одной пересылки (one-hop) для сетей Storing и Non-Storing. Узел может передать пакет соседу one-hop напрямую (см. раздел 9 в [RFC6550]).

Когда узлы не соединены непосредственно, поток в режиме Storing имеет вид RAL src (6LN) -> 6LR_ia -> общий родитель (6LR_x) -> 6LR_id -> RAL dst (6LN), например, Узел F (RAL src) -> Узел D (6LR_ia) -> Узел B (6LR_x) -> Узел E (6LR_id) -> Узел H (RAL dst). 6LR_ia (узел D) представляет промежуточные маршрутизаторы на пути от источника к общему родителю 6LR_x (узел B), 1 <= ia <= n, где n — число маршрутизаторов (6LR) на пути от RAL (узел F) к общему родителю 6LR_x (узел B). 6LR_id (узел E) представляет промежуточные маршрутизаторы на пути от общего родителя 6LR_x (узел B) к адресату RAL (узел H), 1 <= id <= m, где m — число маршрутизаторов (6LR) между общим родителем (6LR_x) и адресатом RAL (узел H).

Предполагается, что два узла расположены в одном домене RPL (общий корень DODAG). На узле общего корня (узел B) флаг направление (O) в RPI меняется (снижение ранга заменяется его ростом). Хотя узлы 6LR обновляют RPI, им не требуется добавлять или удалять RPI, поэтому заголовки IPv6-in-IPv6 не нужны. В таблице 15 показаны заголовки, которые требуется использовать.

Таблица 15. Использование заголовков при передаче между RAL в режиме SM.

Заголовок

RAL src

6LR_ia

6LR_x (общий родитель)

6LR_id

RAL dst

Добавленные заголовки

RPI

Изменённые заголовки

RPI

RPI

RPI

Удалённые заголовки

RPI

Неизменные заголовки

7.3.2. Поток от RAL к RUL

В этом случае поток имеет вид RAL src (6LN) -> 6LR_ia -> общий предок (6LBR, корень) -> 6LR_id -> RUL (узел IPv6 dst), например, Узел F (RAL) -> Узел D -> Узел B -> Узел A -> Узел B -> Узел E -> Узел G (RUL). 6LR_ia представляет промежуточные маршрутизаторы на пути от источника (RAL) к общему родителю (корень), 1 <= ia <= n, где n — число маршрутизаторов (6LR) на пути от RAL к корню. 6LR_id (узел E) представляет промежуточные маршрутизаторы на пути от корня (узел B) к адресату RUL (узел G). Здесь 1 <= id <= m и m задаёт число маршрутизаторов (6LR) на пути от корня к адресату RUL.

Пакет от RAL приходит в 6LBR, поскольку маршрут к RUL не вводится в RPL SM и RAL вставляет опцию RPI (RPI1), адресованную корню (6LBR). Корень не удаляет RPI1 (это невозможно при отсутствии инкапсуляции) и инкапсулирует пакет в IPv6-in-IPv6 с RPI2, а затем передаёт его родителю 6LR для RUL, который удаляет инкапсуляцию и RPI2 до передачи пакета RUL. В таблице 16 показаны заголовки, которые требуется использовать.

Таблица 16. Использование заголовков при передаче от RAL к RUL в режиме SM.

Заголовок

RAL src

6LR_ia

6LBR

6LR_id

6LR_m

RUL dst

Добавленные заголовки

RPI1

IP6-IP6 (RPI2)

Изменённые заголовки

RPI1

RPI2

Удалённые заголовки

IP6-IP6 (RPI2)

Неизменные заголовки

RPI1

RPI1

RPI1

RPI1 (игнорируется)

7.3.3. Поток от RUL к RAL

Поток имеет вид RUL (узел IPv6 src) -> 6LR_ia -> 6LBR -> 6LR_id -> RAL dst (6LN), например, Узел G (RUL) -> Узел E -> Узел B -> Узел A -> Узел B -> Узел D -> Node F (RAL). 6LR_ia (узел E) представляет промежуточные маршрутизаторы на пути от источника RUL (узел G) к корню(узел A). 1 <= ia <= n, где n — число маршрутизаторов (6LR) на пути от источника к корню. 6LR_id представляет промежуточные маршрутизаторы на пути от корня (узел A) к адресату RAL (узел F). Здесь 1 <= id <= m, а m — число маршрутизаторов (6LR) на пути от корня к получателю RAL.

6LR_1 (узел E) получает пакет от RUL (узел G) и вставляет в него RPI (RPI1) с инкапсуляцией в заголовок IPv6-in-IPv6 для корня. Корень удаляет внешний заголовок с RPI (RPI1) и вставляет RPI (RPI2) для адресата RAL (узел F). В таблице 17 показаны заголовки, которые требуется использовать.

Таблица 17. Использование заголовков при передаче от RUL к RAL в режиме SM.

Заголовок

RUL src

6LR_1

6LR_ia

6LBR

6LR_id

RAL dst

Добавленные заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RPI2)

Изменённые заголовки

RPI1

RPI2

Удалённые заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RPI2)

Неизменные заголовки

7.3.4. Поток от RUL к RUL

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_ia -> 6LBR -> 6LR_id -> RUL (узел IPv6 dst), например, Узел G (RUL src) -> Узел E -> Узел B -> Узел A (корень) -> Узел C -> Узел J (RUL dst). Внутренний узел 6LR_ia (например, E или B) — это промежуточный маршрутизатор на пути от источника RUL (узел G) к корню (6LBR) (узел A), 1 <= ia <= n, где n — число маршрутизаторов (6LR) между RUL и корнем. 6LR_1 соответствует ia=1. 6LR_id (узел C) представляет промежуточные маршрутизаторы от корня (узел A) до получателя RUL (узел J), 1 <= id <= m, где m — число маршрутизаторов (6LR) на пути от корня до адресата RUL.

6LR_1 (узел E) получает пакет от RUL (узел G) и добавляет RPI (RPI1) в инкапсуляцию IPv6-in-IPv6 для корня, который удаляет внешний заголовок с RPI (RPI1) и помещает RPI (RPI2) в новый заголовок, адресованный родителю 6LR получателя RUL. В таблице 18 показаны заголовки, которые требуется использовать.

Таблица 18. Использование заголовков при передаче между RUL в режиме SM.

Заголовок

RUL src

6LR_1

6LR_ia

6LBR

6LR_id

6LR_n

RUL dst

Добавленные заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RPI1)

Изменённые заголовки

RPI1

RPI2

Удалённые заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RPI2)

Неизменные заголовки

8. Режим Non-Storing

В режиме Non-Storing (Non-SM) с полным заданием маршрута источником маршрутизатор 6LBR (корень DODAG) имеет полные сведения о связности всех узлов DODAG и всех потоках трафика через корневой узел. Поэтому остальным узлам не нужно знать о наличии узлов, не понимающих RPL, поскольку соответствующие действия выполняет 6LBR.

В таблице 19 указаны заголовки, требуемые в разных вариантах применения, и показано, когда вставляются заголовки RPI, RH3, IPv6-in-IPv6. В последнем столбце указан целевой адресат в заголовка IPv6-in-IPv6: 6LN (RAL), 6LR (родитель RUL) или корень. Если заголовок IPv6-in-IPv6 не нужен, в соответствующей ячейке указано «Нет». В RPL не предполагается возможность пропуска RPI, поскольку эти данные нужны для маршрутизации, качества обслуживания и сжатия. Эта спецификация предполагает, что RPI присутствует всегда. Термин «возможно(вверх)» указывает, что заголовок IPv6-in-IPv6 может потребоваться для направления Upward, «требуется(вверх)» говорит, что заголовок IPv6-in-IPv6 требуется для направления Upward, а «требуется(вниз)» — для Downward.

Лист может быть маршрутизатором 6LR или хостом и указан как 6LN (рисунок 3). В таблице 19 (1) указывает случай 6TiSCH [RFC8180], где RPI все ещё может требоваться для того, чтобы идентификатор RPLInstanceID был доступен при выборе канала или приоритета на каждом узле пересылки.

Таблица 19. Заголовки, требуемые в режиме Non-Storing: RPI, RH3, инкапсуляция IPv6-in-IPv6.

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

Направление

RPI

RH3

IPv6-in-IPv6

IPv6-in-IPv6 dst

Leaf — Root

RAL -> корень

Да

Нет

Нет

Нет

корень -> RAL

Да

Да

Нет

Нет

корень -> RUL

Да (1)

Да

Нет

6LR

RUL -> корень

Да

Нет

Требуется

корень

Leaf — Internet

RAL -> Internet

Да

Да

Возможно (вверх)

корень

Internet -> RAL

Да

Да

Требуется

RAL

RUL -> Internet

Да

Нет

Требуется

корень

Internet -> RUL

Да

Да

Требуется

6LR

Leaf — Leaf

RAL -> RAL

Да

Да

Возможно (вверх)

корень

Требуется (вниз)

RAL

RAL -> RUL

Да

Да

Возможно (вверх)

корень

Требуется (вниз)

6LR

RUL -> RAL

Да

Да

Требуется (вверх)

корень

Требуется (вниз)

RAL

RUL -> RUL

Да

Да

Требуется (вверх)

корень

Требуется (вниз)

6LR

8.1. Взаимодействие между листом и корнем

В этом параграфе описан режим Non-Storing (Non-SM) для потоков:

RAL -> root

root -> RAL

RUL -> root

root -> RUL

8.1.1. Пример потока от RAL в корень

В режиме Non-Storing узел-лист использует принятую по умолчанию маршрутизацию для передачи трафика в корень. Опция RPI должна включаться, поскольку она содержит значение Rank, используемое для обнаружения и предотвращения петель. Поток имеет вид RAL (6LN) -> 6LR_i -> корень (6LBR), например, Узел F -> Узел D -> Узел B -> Узел A (корень). 6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем, 1 <= i <= n, где n — число маршрутизаторов (6LR) на пути от источника (RAL) к получателю (6LBR). Ситуация не отличается от режима Storing. В таблице 20 показаны заголовки, которые требуется использовать.

Таблица 20. Использование заголовков при передаче от RAL к корню в режиме Non-SM.

Заголовок

RAL src

6LR_i

6LBR dst

Добавленные заголовки

RPI

Изменённые заголовки

RPI

Удалённые заголовки

RPI

Неизменные заголовки

8.1.2. Пример потока от корня к RAL

Поток имеет вид: корень (6LBR) -> 6LR_i -> RAL (6LN), например, Узел A (корень) -> Узел B -> Узел D -> Узел F. 6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем, 1 <= i <= n, где n — число маршрутизаторов (6LR) на пути от источника (6LBR) к адресату (RAL). 6LBR вставляет RH3 и RPI, инкапсуляция IPv6-in-IPv6 не нужна, поскольку трафик исходит от понимающего RPL узла 6LBR. Получатель заведомо понимает RPL, поскольку корень знает всю топологию в режиме Non-Storing. В таблице 21 показаны заголовки, которые требуется использовать.

Таблица 21. Использование заголовков при передаче от корня к RAL в режиме Non-SM.

Заголовок

6LBR src

6LR_i

RAL dst

Добавленные заголовки

RPI, RH3

Изменённые заголовки

RPI, RH3

Удалённые заголовки

RPI, RH3

Неизменные заголовки

8.1.3. Пример потока от корня к RUL

Поток имеет вид: корень (6LBR) -> 6LR_i -> RUL (узел IPv6 dst), например, Узел A (корень) -> Узел B -> Узел E -> Узел G (RUL). 6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем, 1 <= i <= n, где n — число маршрутизаторов (6LR) на пути от источника (6LBR) к адресату (RUL).

6LBR добавляет заголовок RH3, который меняется на каждом промежуточном 6LR (6LR_1 и т. д.) и полностью воспринимается последним 6LR (6LR_n), но остаётся на месте. При добавлении RPI узел RUL, не понимающий RPI, будет игнорировать его (в соответствии с [RFC8200]), поэтому инкапсуляция не нужна. В таблице 22 показаны заголовки, которые требуется использовать.

Таблица 22. Использование заголовков при передаче от корня к RUL в режиме Non-SM.

Заголовок

6LBR src

6LR_i i=(1,..,n-1)

6LR_n

RUL dst

Добавленные заголовки

RPI, RH3

Изменённые заголовки

RPI, RH3

RPI, RH3 (потребляется)

Удалённые заголовки

Неизменные заголовки

RPI, RH3 (оба игнорируются)

8.1.4. Пример потока от RUL к корню

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_i -> корень (6LBR), например, Узел G -> Узел E -> Узел B -> Узел A (корень). 6LR_i представляет промежуточные маршрутизаторы между источником и получателем, 1 <= i <= n, где n — число маршрутизаторов (6LR) на пути пакета от источника (RUL) к адресату. Например, 6LR_1 (i=1) — маршрутизатор, получающий пакеты от RUL. В этом случае RPI добавляет первый маршрутизатор 6LR (6LR_1, узел E), инкапсулируя в заголовок IPv6-in-IPv6, а следующие 6LR на пути меняют RPI. Корень воспринимает RPI и пакет в целом. В таблице 23 показаны заголовки, которые требуется использовать.

Таблица 23. Использование заголовков при передаче от RUL в корень в режиме Non-SM.

Заголовок

RUL src

6LR_1

6LR_i

6LBR dst

Добавленные заголовки

IPv6-in-IPv6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IPv6-in-IPv6 (RPI)

Неизменные заголовки

8.2. Режим Non-Storing — взаимодействие между листом и Internet

В этом параграфе рассматриваются потоки в режиме Non-Storing (Non-SM) для случаев:

RAL -> Internet

Internet -> RAL

RUL -> Internet

Internet -> RUL

8.2.1. Пример потока от RAL в Internet

Поток имеет вид RAL (6LN) src -> 6LR_i -> корень (6LBR) -> Internet dst, например, Узел F (RAL) -> Узел D -> Узел B -> Узел A -> Internet. Имея сведения RAL о домене RPL, пакет можно инкапсулировать в корень, если адресат находится вне домена RPL узла RAL.

6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем. 1 <= i <= n, где n — число маршрутизаторов (6LR) между источником (RAL) и 6LBR. В этом случае инкапсуляция от RAL к корню не обязательна. Простейшим случаем является выход RPI в Internet (таблица 24), с учётом игнорирования в Internet этой информации. Для метки потока IPv6 следует установить 0 с целью более эффективного сжатия [RFC8138], а 6LBR будет устанавливать отличное от 0 значение при передаче в направлении Internet [RFC6437]. В таблице 24 показаны заголовки, которые требуется использовать без инкапсуляции, в таблице 25 — с инкапсуляцией для корневого узла.

Таблица 24. Использование заголовков при передаче от RAL в Internet без инкапсуляции в режиме Non-SM.

Заголовок

RAL src

6LR_i

6LBR

Internet dst

Добавленные заголовки

RPI

Изменённые заголовки

RPI

RPI

Удалённые заголовки

Неизменные заголовки

RPI (игнорируется)

Таблица 25. Использование заголовков при передаче от RAL в Internet с инкапсуляцией в корень в режиме Non-SM.

Заголовок

RAL src

6LR_i

6LBR

Internet dst

Добавленные заголовки

IP6v6-in-IPv6 (RPI)

Изменённые заголовки

RPI

Удалённые заголовки

IP6v6-in-IPv6 (RPI)

Неизменные заголовки

8.2.2. Пример потока из Internet к RAL

Поток имеет вид Internet -> корень (6LBR) -> 6LR_i -> RAL dst (6LN), например, Internet -> Узел A (корень) -> Узел B -> Узел D -> Узел F (RAL). 6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем, 1 <= i <= n, где n и число маршрутизаторов (6LR) на пути от 6LBR к адресату (RAL). Маршрутизатор 6LBR должен добавлять заголовок RH3. Поскольку 6LBR знает путь к целевому узлу и его адрес, он может указать этот адрес в заголовке IPv6-in-IPv6. 6LBR будет указывать метку потока 0 для более эффективного сжатия [RFC8138]. В таблице 26 показаны заголовки, которые требуется использовать.

Таблица 26. Использование заголовков при передаче из Internet в RAL в режиме Non-SM.

Заголовок

Internet src

6LBR

6LR_i

RAL dst

Добавленные заголовки

IP6v6-in-IPv6 (RH3, RPI)

Изменённые заголовки

IP6v6-in-IPv6 (RH3, RPI)

Удалённые заголовки

IP6v6-in-IPv6 (RH3, RPI)

Неизменные заголовки

8.2.3. Пример потока от RUL в Internet

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_i -> корень (6LBR) -> Internet dst, например, Узел G -> Узел E -> Узел B -> Узел A -> Internet. 6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем, 1 <= i <= n, где n — число маршрутизаторов (6LR) на пути от источника (RUL) к 6LBR, например, 6LR_1 (i=1). Рекомендуется устанавливать в RUL метку потока 0. Поскольку родитель RUL добавляет заголовки RPL в пакет RUL, первый 6LR (6LR_1) будет добавлять RPI в новый заголовок IPv6-in-IPv6, адресуемый корню. Это идентично работе в режиме Storing (параграф 7.2.3). В таблице 27 показаны заголовки, которые требуется использовать.

Таблица 27. Использование заголовков при передаче от RUL в Internet в режиме Non-SM.

Заголовок

RUL src

6LR_i

6LR_i i=(2,..,n)

6LBR

Internet dst

Добавленные заголовки

IP6-IP6

Изменённые заголовки

RPI

Удалённые заголовки

IP6-IP6 (RPI)

Неизменные заголовки

8.2.4. Пример потока из Internet к RUL

Поток имеет вид Internet src -> корень (6LBR) -> 6LR_i -> RUL (узел IPv6 dst), например, Internet -> Узел A (корень) -> Узел B -> Узел E -> Узел G. 6LR_i представляет промежуточные маршрутизаторы между отправителем и получателем, 1 <= i <= n, где n — число маршрутизаторов (6LR) на пути пакета от 6LBR к RUL.

Маршрутизатор 6LBR должен добавлять заголовок RH3 в заголовок инкапсуляции IPv6-in-IPv6. 6LBR будет знать путь и понимать, что конечный узел не понимает RPL, поскольку он получит информацию DAO от ближайшего 6LR. Поэтому 6LBR может указать в заголовке IPv6-in-IPv6 получателем последний маршрутизатор 6LR. 6LBR будет помещать метку потока 0 для более эффективного сжатия [RFC8138]. В таблице 28 показаны заголовки, которые требуется использовать.

Таблица 28. Использование заголовков при передаче из Internet к RUL в режиме Non-SM.

Заголовок

Internet src

6LBR

6LR_i

6LR_n

RUL dst

Добавленные заголовки

IP6-IP6 (RH3, RPI)

Изменённые заголовки

IP6-IP6 (RH3, RPI)

Удалённые заголовки

IP6-IP6 (RH3, RPI)

Неизменные заголовки

8.3. Взаимодействие между листьями

В этом параграфе рассматриваются потоки в режиме Non-Storing (Non-SM) для случаев:

RAL -> RAL

RAL -> RUL

RUL -> RAL

RUL -> RUL

8.3.1. Пример потока от RAL к RAL

Поток имеет вид RAL src -> 6LR_ia -> корень (6LBR) -> 6LR_id -> RAL dst, например, Узел F (RAL src) -> Узел D -> Узел B -> Узел A (корень) -> Узел B -> Узел E -> Узел H (RAL dst). 6LR_ia представляет промежуточные маршрутизаторы между источником и корнем, 1 <= ia <= n, где n — число маршрутизаторов (6LR) на пути от RAL к корню. 6LR_id представляет маршрутизаторы между корнем и адресатом, 1 <= id <= m, где m — число промежуточных маршрутизаторов (6LR).

Здесь участвуют лишь узлы одного домена RPL. Узел-источник добавляет RPI в исходный пакет и передаёт пакет в восходящем направлении. Источник может поместить RPI (RPI1) в заголовок IPv6-in-IPv6, адресованный корню, чтобы 6LBR мог удалить этот заголовок. Если маршрутизатор этого не делает, RPI1 пересылается в нисходящем направлении во внутреннем заголовке (не имеет смысла). Маршрутизатор 6LBR должен вставить RH3 в заголовок инкапсуляции IPv6-in-IPv6. Он удаляет RPI (RPI1), поскольку опция содержится в полученном заголовке IPv6-in-IPv6. В иных случаях опция RPI может быть скрыта во внутреннем заголовке IP и её следует игнорировать. Корень вставляет RPI (RPI2) вместе с RH3.

Сети, использующие расширение RPL point-to-point [RFC6997], по сути являются Non-Storing DODAG и относятся к этому варианту или варианту параграфа 8.1.2 с узлом-источником, действующим как 6LBR.

В таблице 29 показаны заголовки, которые требуется использовать при инкапсуляции для корня, а в таблице 30 — для случая без инкапсуляции. Отметим, что в строке «Изменённые заголовки» по мере прохождения вверх каждый 6LR_ia меняет лишь RPI1. При движении вниз на каждом 6LR_id заголовок IPv6 меняется на RH3, поэтому изменяются оба вместе с RPI2.

Таблица 29. Использование заголовков при передаче между RAL с инкапсуляцией для корня в режиме Non-SM.

Заголовок

RAL src

6LR_ia

6LBR

6LR_id

RAL dst

Добавленные заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RH3 -> RAL, RPI2)

Изменённые заголовки

RPI1

Удалённые заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RH3, RPI2)

Неизменные заголовки

Таблица 30. Использование заголовков при передаче между RAL без инкапсуляции для корня в режиме Non-SM.

Заголовок

RAL src

6LR_ia

6LBR

6LR_id

RAL dst

Добавленные заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Изменённые заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Удалённые заголовки

IP6-IP6 (RH3, RPI2)

Неизменные заголовки

RPI1

RPI1

RPI1 (игнорируется)

8.3.2. Пример потока от RAL к RUL

Поток имеет вид RAL -> 6LR_ia -> корень (6LBR) -> 6LR_id -> RUL (узел IPv6 dst), например, Узел F (RAL) -> Узел D -> Узел B -> Узел A (root) -> Узел B -> Узел E -> Узел G (RUL). 6LR_ia представляет промежуточные маршрутизаторы между источником и корнем, 1 <= ia <= n, где n — число маршрутизаторов (6LR). 6LR_id представляет промежуточные маршрутизаторы между корнем и адресатом, 1 <= id <= m, где m — число маршрутизатором (6LR).

Как и в предыдущем случае, RAL (6LN) может вставлять RPI (RPI1) в заголовок IPv6-in-IPv6, адресованный корню, чтобы 6LBR мог удалить RPI. Затем 6LBR вставляет RH3 в новый заголовок IPv6-in-IPv6, адресованный последнему 6LR_id (6LR_id = m), вместе с RPI2.

Если узел-источник не помещает RPI (RPI1) в заголовок IPv6-in-IPv6 для корня, RPI1 пересылается вниз из корня во внутреннем заголовке (не имеет смысла).

В таблице 31 показаны заголовки, которые требуется использовать при инкапсуляции для корня, а в таблице 32 — для случая без инкапсуляции.

Таблица 31. Использование заголовков при передаче от RAL к RUL с инкапсуляцией для корня в режиме Non-SM.

Заголовок

RAL src

6LR_ia

6LBR

6LR_id

6LR_m

RUL dst

Добавленные заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RH3, RPI2)

Изменённые заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Удалённые заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RH3, RPI2)

Неизменные заголовки

RPI1

RPI1

Таблица 32. Использование заголовков при передаче от RAL к RUL без инкапсуляции для корня в режиме Non-SM.


Заголовок

RAL src

6LR_ia

6LBR

6LR_id

6LR_m

RUL dst

Добавленные заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Изменённые заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Удалённые заголовки

IP6-IP6 (RH3, RPI2)

Неизменные заголовки

RPI1

RPI1

RPI1

RPI1 (игнорируется)

8.3.3. Пример потока от RUL к RAL

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_ia -> корень (6LBR) -> 6LR_id -> RAL dst (6LN), например, Узел G (RUL) -> Узел E -> Узел B -> Узел A (корень) -> Узел B -> Узел E -> Узел H (RAL). 6LR_ia представляет промежуточные маршрутизаторы между источником и корнем, 1 <= ia <= n, где n — число маршрутизаторов (6LR). 6LR_id представляет промежуточные маршрутизаторы между корнем и получателем, 1 <= id <= m, где m — число маршрутизаторов (6LR).

RPI (RPI1) добавляется первым 6LR (6LR_1) в заголовок IPv6-in-IPv6, адресованный корню. 6LBR удаляет RPI и добавляет свой заголовок IPv6-in-IPv6 с RH3 и RPI (RPI2). В таблице 33 показаны заголовки, которые требуется использовать.

Таблица 33. Использование заголовков при передаче от RUL к RAL в режиме Non-SM.

Заголовок

RUL src

6LR_1

6LR_ia

6LBR

6LR_id

RAL dst

Добавленные заголовки

RPI1

IP6-IP6 (RPI1)

IP6-IP6 (RH3, RPI2)

Изменённые заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Удалённые заголовки

IP6-IP6 (RPI1)

Неизменные заголовки

8.3.4. Пример потока от RUL к RUL

Поток имеет вид RUL (узел IPv6 src) -> 6LR_1 -> 6LR_ia -> корень (6LBR) -> 6LR_id -> RUL (узел IPv6 dst), например, Узел G -> Узел E -> Узел B -> Узел A (корень) -> Узел C -> Узел J. 6LR_ia представляет промежуточные маршрутизаторы между источником и корнем, 1 <= ia <= n, где n — число маршрутизаторов (6LR). 6LR_id представляет промежуточные маршрутизаторы между корнем и получателем, 1 <= id <= m, где m — число маршрутизаторов (6LR).

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

Таблица 34. Использование заголовков при передаче между RUL в режиме Non-SM.

Заголовок

RUL src

6LR_1

6LR_ia

6LBR

6LR_id

6LR_m

RUL dst

Добавленные заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RH3, RPI2)

Изменённые заголовки

RPI1

IP6-IP6 (RH3, RPI2)

Удалённые заголовки

IP6-IP6 (RPI1)

IP6-IP6 (RH3, RPI2)

Неизменные заголовки

9. Операционные вопросы поддержки RUL

Примерно половина описанных в документе вариантов связана с листьями (хостами), не «говорящими» на RPL. Эти узлы делятся на 2 категории — одни отбрасывают пакеты с заголовками RPI или RH3, другие продолжают обработку пакетов с такими заголовками.

В [RFC8200] указаны новые правила, предполагающие, что узлам, не настроенным (явно) на проверку заголовков Hop-by-Hop Options, следует игнорировать эти заголовки и продолжать обработку пакета. Несмотря на это и на переход от типа 0x63 к 0x23, в сети могут быть узлы, ещё не соответствующие RFC 8200, которые будут отбрасывать пакеты. В которых сохраняются артефакты RPL. В общем случае поддержка таких узлов в RPL LLN является непростой задачей.

В некоторых конкретных случаях можно удалить артефакты RPL до пересылки пакеты хосту-листу. Важно, чтобы артефакты были вставлены корнем RPL в заголовок IPv6-in-IPv6 и этот заголовок был адресован маршрутизатору 6LR, расположенному непосредственно перед листом. В этом случае маршрутизатор удаляет заголовок IPv6-in-IPv6 вместе с артефактами RPL.

Описанный выше случай возникает всякий раз, когда приходит трафик извне LLN (Internet в приведённых выше вариантах) в режиме Non-Storing. В этом режиме корень RPL знает точную топологию (поскольку он должен создавать заголовок RH3) и, следовательно, знает, как маршрутизатор 6LR расположен перед листом. Например, на рисунке 3 узел E является 6LR перед листом G, а узел C — 6LR перед листом J.

Трафик от корня RPL (например, при совмещении системы сбора данных с корнем RPL) не требует заголовка IPv6-in-IPv6 (в режиме Storing или Non-Storing), поскольку пакеты исходят из корня, а тот может вставлять заголовки RPI и RH3 напрямую в создаваемый пакет. Такие пакеты немного меньше, но могут передаваться лишь узлам (независимо от поддержки ими RPL), воспринимающим артефакты RPL.

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

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

10. Операционные вопросы использования 0x23

В этом разделе рассматриваются операционные вопросы, связанные с внедрением нового типа RPI Option Type 0x23.

В процессе загрузки узел получает сообщение DIO с информацией о типе RPI Option, указывающее новый тип RPI в опции DODAG Configuration. Корень DODAG отвечает за настройку сети с новым значением с помощью сообщений DIO и определяет, когда на всех узлах установлено новое значение. Для DODAG следует сменить номер версии DODAG. В случае перезагрузки узел не помнит RPI Option Type, поэтому сообщения DIO передаются с флагом, указывающим новый тип RPI Option.

Опция DODAG Configuration передаётся в сообщении RPL DIO, содержащем уникальной значение счётчика DTSN13. Лист отвечает на это сообщение сообщением DAO с тем же значением DTSN. Это обычная часть маршрутизации RPL — в результате чего корень RPL знает, когда обновлённую опцию DODAG Configuration увидят все узлы.

До завершения перехода всем узлам, понимающим RPL, следует поддерживать оба значения. Процедура перехода запускается при передаче DIO с флагом, указывающим новый тип RPI Option. Использование типа 0x63 продолжается до тех пор, пока не будет уверенности в поддержке типа 0x23 во всей сети, после чего происходит одномоментный переход к типу 0x23. Опция RPI типа 0x23 позволяет передавать пакеты узлам без поддержки RPL. Этим узлам следует игнорировать опцию и продолжать обработку пакетов.

Как отмечено выше, указание новой опции RPI флагом в DODAG Configuration обеспечивает возможность избежать резкого перехода (flag day) с нарушением работы сети, использующей тип 0x63 для RPI Option. Реализациям RPL предлагается воспринимать оба типа 0x63 и 0x23 для RPI Option Type при обработке заголовков для поддержки взаимодействия.

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

11.1. Тип RPL Option

Этот документ обновляет регистрацию в субреестре «Destination Options and Hop-by-Hop Options» [RFC6553], как показано в таблице 35.

Таблица 35. Option Type в RPL Option

Шестнадцатеричное значение

Двоичное значение

Описание

Документ

act

chg

rest

0x23

00

1

00011

Тип RPL Option

Этот документ

0x63

01

1

00011

Тип RPL Option (устарел)

[RFC6553], этот документ

Субреестр «DODAG Configuration Option Flags for MOP 0..6» обновлён в соответствии с таблицей 36.

Таблица 36. Флаг опции DODAG Configuration для индикации RPI Flag Day.

Номер бита

Описание

Документ

3

Тип RPI 0x23 разрешён

Данный документ

11.2. Изменение реестра DODAG Configuration Option Flags

Агентство IANA переименовало субреестр «DODAG Configuration Option Flags» в «DODAG Configuration Option Flags for MOP 0..6» с указанием ссылки на этот документ.

11.3. Перевод MOP = 7 в статус Reserved

Агентство IANA изменило статус регистрации значения 7 в субреестре «Mode of Operation» с Unassigned на Reserved. Значение зарезервировано на будущее с указанием ссылки в субреестре на данный документ.

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

Вопросы безопасности, рассмотренные в [RFC6553] и [RFC6554], применимы к пакетам, находящимся в домене RPL.

Описанный в этом документе механизм IPv6-in-IPv6 более ограничен, нежели механизм общего назначения из [RFC2473]. Готовность каждого узла LLN декапсулировать пакеты и пересылать их может использоваться узлами для сокрытия источника атаки. Хотя типичная сеть LLN может быть очень слабым источником злонамеренного трафика (эти сети медленны, а узлы часто имеют ограниченные возможности), при достаточном числе узлов сети LLN могут оказывать существенное влияние, особенно при атаках на другие сети LLN. Кроме того, некоторые варианты применения RPL включают скоростные магистрали с оборудованием уровня ISP [ACP], которое может включать множество интерфейсов 100 Гбит/с.

Блокировка или тщательная фильтрация трафика IPv6-in-IPv6 на входе в LLN, как описано выше, гарантирует, что атака может быть организована лишь со взломанного узла внутри сети LLN. Использование входной фильтрации [BCP38] для исходящего трафика в корне RPL позволяет предупреждать оператора о возникновении атаки, а также отбрасывать вредоносный трафик. Поскольку в сети RPL обычно используется один префикс, назначаемый самой сетью RPL, входная фильтрация [BCP38] включает сравнение лишь с одним префиксом е её легко настроить автоматически.

В некоторых вариантах применения следует пропускать трафик IPv6-in-IPv6 через корень RPL, например, для обмена IPv6-in-IPv6 между новым подключением (узлом) и JRC14 при использовании [BRSKI] и [ZEROTOUCH-JOIN]. В этом случае корню RPL следует тщательно выполнять фильтрацию — координатор присоединения отделен от корня RPL.

При соблюдении указанных предосторожностей атаки с использованием туннелей IPv6-in-IPv6 становятся возможными лишь с узлов LLN по отношению к другим узлам LLN. Такие атаки можно организовать напрямую и они имеют смысл лишь при использовании фиктивных адресов источников или для усиления обратного трафика. Эти атаки возможны и без туннелей IPv6-in-IPv6 путём простой подмены адресов отправителей. Если для атаки нужна двухсторонняя связь, инкапсуляция IPv6-in-IPv6 не даёт преимуществ.

При каждом предложении использовать заголовки IPv6-in-IPv6 возникают вопросы, связанные с безопасностью. В разделе «Вопросы безопасности» [RFC2473] (раздел 9) было предложено обеспечивать безопасность конечных точек туннеля путём защиты пути IPv6 между ними. Эти рекомендации не подходят для сетей RPL. В [RFC5406] приведены дополнительные рекомендации по использованию IPsec. Хотя ESP15 предотвратит подмену адресов отправителей, при использовании [RFC8138] сжатие выполняется до шифрования, поскольку оно связано с потерей данных. После шифрования избыточности, которую можно устранить сжатием, уже не будет. Это небольшие проблемы. Основным вопросом является организация доверенных отношений для использования протокола обмена ключами (Internet Key Exchange Protocol Version 2) IKEv2. Это требует присутствия системы сертификатов на каждом узле, включая все узлы Internet, которым может потребоваться связь с LLN. В результате для использования IPsec в общем случае нужна глобальная инфраструктура PKI.

Ещё важнее то, что использование туннелей IPsec для защиты заголовков IPv6-in-IPv6 в общем случае будет расти в квадратичной зависимости от числа узлов. Это потребует значительных ресурсов узлов с ограничениями в сети с ограниченными ресурсами. А в результате туннели IPsec обеспечат лишь аутентификацию источников, подобную BCP38! Таким образом, IPsec обеспечит для точек выхода переходные гарантии того, что точка входа выполняет входную фильтрацию [BCP38] для приходящего трафика. Простая фильтрация BCP 38 на входе и выходе LLN обеспечивает близкий уровень защиты без проблем расширяемости и доверия, связанных с туннелями IPv6, как описано в [RFC2473]. Применение IPsec не рекомендуется.

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

Описанное здесь использование заголовков RH3 также допускает злоупотребления. Внешний злоумышленник может создать пакет с заголовком RH3, используемым не полностью, и инкапсулировать его для сокрытия RH3 от промежуточных узлов для маскировки источника трафика. В результате заголовок RH3 от атакующего будет скрыт от сети, пока пакет не придёт к адресату, где будет декапсулирован. Как указано в параграфе 4.2 [RFC6554], маршрутизаторы RPL отвечают за гарантию применения SRH лишь между собой. Поэтому при наличии не полностью использованного заголовка RH3 в инкапсулированном пакете декапсулирующий узел должен убедиться, что внешний пакет исходит из домена RPL, отбрасывая несоответствующие пакеты.

Как указано в разделе 2 [RFC6554], граничные маршрутизаторы RPL «не пропускают дейтаграммы с заголовком SRH через границу домена маршрутизации RPL.» Это утверждение должно трактоваться как относящееся к «не полностью использованным» заголовкам. Потреблённый (инертный) заголовок RH3 может присутствовать в пакете, вышедшем из одной сети LLN, прошедшем через Internet и входящем в другую LLN. В соответствии с этим документом такие заголовки не требуется удалять. Здесь не описан случай, когда RH3 вставляется в сети Non-Storing для трафика, покидающего LLN, однако этот документ не препятствую внедрение этого в будущем. Короче говоря, пакет, проходящий через границу домена RPL, может включать заголовок RH3, но этот заголовок должен быть использован полностью.

Если опцию RPI разрешено передавать в LLN через границу, злоумышленник может использовать её для изменения приоритета в пакете, выбирая другое значение RPLInstanceID, например, с более дорогой энергией. Возможны также случаи, когда не все узлы LLN будут доступны с использованием принятого по умолчанию RPLInstanceID, а смена RPLInstanceID позволит атакующему обойти такие фильтры. Подобно RH3, корень RPL вставляет опции RPI для входящего в LLN трафика путём добавления сначала заголовка IPv6-in-IPv6, поэтому RPI от злоумышленника сеть не увидит. У адресата наличие наличие второй опции RPI уже не имеет значения и она просто будет пропущена, поскольку пакет уже идентифицирован, как доставленный конечному получателю.

Для исходящего от RUL трафика при добавлении RUL неинициализированной опции RPI (например, со значением 0), 6LR, служащему граничным маршрутизатором RPL, следует переписать RPI для указания выбранного экземпляра и установки флагов. Это делается для предотвращения 1) передачи листом, который является внешним маршрутизатором, чужого пакета с не имеющей отношения к делу опцией RPI и 2) передачи от листа атакующего некорректной конфигурации и внедрения трафика в защищённый экземпляр. Это применимо также в случае, когда лист, знающий RPL Instance, пытается исправить RPI — маршрутизатору 6LR нужна конфигурация, разрешающая такому узлу выполнять вставку для этого экземпляра.

RH3 и RPI злоумышленник может использовать внутри сети для маршрутизации пакетов необычными путями, возможно для их сокрытия. Такое поведение похоже на обычную работу [RFC6997] и ограничить его нельзя. Это свойство системы, а не ошибка.

В [RFC7416] рассмотрено множество угроз для LLN, не связанных напрямую с заголовками IPv6-in-IPv6, и этот документ не влияет на приведённый там анализ.

Узлы LLN могут использовать механизм IPv6-in-IPv6 для организации атаки на другую часть LLN, скрывая себя как источник атаки. Механизм даже позволяет создать иллюзию атаки извне LLN и при отсутствии противодействия это можно применить для атаки DDOS на узлы Internet. В работе [DDOS-KREBS] приведены примеры уже известных атак этого типа.

Если атака идёт из LLN, её можно ослабить с помощью механизма SAVI16, используя [RFC8505] с [RFC8928]. Атакующий не сможет отправить трафик с незарегистрированного адреса, а процесс регистрации проверяет корректность топологии. Отметим, что в большинстве случаев подлинность проверяется на уровне L2. Если атака происходит извне LLN, инкапсуляцию IPv6-in-IPv6 можно использовать для сокрытия внутренних заголовков маршрутизации, но RH3 обычно использует лишь внутренние адреса LLN. Поэтому RH3 с CmprI < 8 следует считать частью атаки (см. раздел 3 в [RFC6554]).

Узлы за пределами LLN для организации таких атак должны передавать трафик IPv6-in-IPv6 через корень RPL. Для противодействия этому корню RPL следует ограничивать входящие пакеты IPv6-in-IPv6 (простейшее решение) или следует проходить по цепочке заголовков расширения IP для проверки данных верхнего уровня, как описано в [RFC7045]. В частности, корню RPL следует выполнять входную фильтрацию [BCP38] по адресам отправителей для всех заголовков IP, проверяемых в обоих направлениях.

Примечание. В некоторых случаях префикс может применяться в нескольких сетях LLN с использованием механизмов, подобных описанным в [RFC8929]. В таких случаях входная фильтрация [BCP38] должна учитывать это обстоятельство, должен происходить обмен информация между всеми LLN или входные фильтры [BCP38] должны быть перемещены в направлении Internet, чтобы наличие нескольких LLN не имело значения.

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

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

[BCP38] Ferguson, P. and D. Senie, «Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing», BCP 38, RFC 2827, May 2000. <https://rfc-editor.org/info/bcp38>

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

[RFC6040] Briscoe, B., «Tunnelling of Explicit Congestion Notification», RFC 6040, DOI 10.17487/RFC6040, November 2010, <https://www.rfc-editor.org/info/rfc6040>.

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

[RFC6550] Winter, T., Ed., Thubert, P., Ed., Brandt, A., Hui, J., Kelsey, R., Levis, P., Pister, K., Struik, R., Vasseur, JP., and R. Alexander, «RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks», RFC 6550, DOI 10.17487/RFC6550, March 2012, <https://www.rfc-editor.org/info/rfc6550>.

[RFC6553] Hui, J. and JP. Vasseur, «The Routing Protocol for Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information in Data-Plane Datagrams», RFC 6553, DOI 10.17487/RFC6553, March 2012, <https://www.rfc-editor.org/info/rfc6553>.

[RFC6554] Hui, J., Vasseur, JP., Culler, D., and V. Manral, «An IPv6 Routing Header for Source Routes with the Routing Protocol for Low-Power and Lossy Networks (RPL)», RFC 6554, DOI 10.17487/RFC6554, March 2012, <https://www.rfc-editor.org/info/rfc6554>.

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

[RFC8025] Thubert, P., Ed. and R. Cragie, «IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Paging Dispatch», RFC 8025, DOI 10.17487/RFC8025, November 2016, <https://www.rfc-editor.org/info/rfc8025>.

[RFC8138] Thubert, P., Ed., Bormann, C., Toutain, L., and R. Cragie, «IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Routing Header», RFC 8138, DOI 10.17487/RFC8138, April 2017, <https://www.rfc-editor.org/info/rfc8138>.

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

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

[ACP] Eckert, T., Behringer, M. H., and S. Bjarnason, «An Autonomic Control Plane (ACP)», Work in Progress, Internet-Draft, draft-ietf-anima-autonomic-control-plane-30, 30 October 2020, <https://tools.ietf.org/html/draft-ietf-anima-autonomic-control-plane-30>.

[BRSKI] Pritikin, M., Richardson, M. C., Eckert, T., Behringer, M. H., and K. Watsen, «Bootstrapping Remote Secure Key Infrastructures (BRSKI)», Work in Progress, Internet-Draft, draft-ietf-anima-bootstrapping-keyinfra-45, 11 November 2020, <https://tools.ietf.org/html/draft-ietf-anima-bootstrapping-keyinfra-45>.

[DDOS-KREBS] Goodin, D., «Record-breaking DDoS reportedly delivered by >145k hacked cameras», September 2016, <https://arstechnica.com/information-technology/2016/09/botnet-of-145k-cameras-reportedly-deliver-internets-biggest-ddos-ever/>.

[RFC0801] Postel, J., «NCP/TCP transition plan», RFC 801, DOI 10.17487/RFC0801, November 1981, <https://www.rfc-editor.org/info/rfc801>.

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

[RFC2473] Conta, A. and S. Deering, «Generic Packet Tunneling in IPv6 Specification», RFC 2473, DOI 10.17487/RFC2473, December 1998, <https://www.rfc-editor.org/info/rfc2473>.

[RFC4443] Conta, A., Deering, S., and M. Gupta, Ed., «Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification», STD 89, RFC 4443, DOI 10.17487/RFC4443, March 2006, <https://www.rfc-editor.org/info/rfc4443>.

[RFC5406] Bellovin, S., «Guidelines for Specifying the Use of IPsec Version 2», BCP 146, RFC 5406, DOI 10.17487/RFC5406, February 2009, <https://www.rfc-editor.org/info/rfc5406>.

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

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

[RFC6997] Goyal, M., Ed., Baccelli, E., Philipp, M., Brandt, A., and J. Martocci, «Reactive Discovery of Point-to-Point Routes in Low-Power and Lossy Networks», RFC 6997, DOI 10.17487/RFC6997, August 2013, <https://www.rfc-editor.org/info/rfc6997>.

[RFC7102] Vasseur, JP., «Terms Used in Routing for Low-Power and Lossy Networks», RFC 7102, DOI 10.17487/RFC7102, January 2014, <https://www.rfc-editor.org/info/rfc7102>.

[RFC7416] Tsao, T., Alexander, R., Dohler, M., Daza, V., Lozano, A., and M. Richardson, Ed., «A Security Threat Analysis for the Routing Protocol for Low-Power and Lossy Networks (RPLs)», RFC 7416, DOI 10.17487/RFC7416, January 2015, <https://www.rfc-editor.org/info/rfc7416>.

[RFC8180] Vilajosana, X., Ed., Pister, K., and T. Watteyne, «Minimal IPv6 over the TSCH Mode of IEEE 802.15.4e (6TiSCH) Configuration», BCP 210, RFC 8180, DOI 10.17487/RFC8180, May 2017, <https://www.rfc-editor.org/info/rfc8180>.

[RFC8504] Chown, T., Loughney, J., and T. Winters, «IPv6 Node Requirements», BCP 220, RFC 8504, DOI 10.17487/RFC8504, January 2019, <https://www.rfc-editor.org/info/rfc8504>.

[RFC8505] Thubert, P., Ed., Nordmark, E., Chakrabarti, S., and C. Perkins, «Registration Extensions for IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Neighbor Discovery», RFC 8505, DOI 10.17487/RFC8505, November 2018, <https://www.rfc-editor.org/info/rfc8505>.

[RFC8928] Thubert, P., Ed., Sarikaya, B., Sethi, M., and R. Struik, «Address-Protected Neighbor Discovery for Low-Power and Lossy Networks», RFC 8928, DOI 10.17487/RFC8928, November 2020, <https://www.rfc-editor.org/info/rfc8928>.

[RFC8929] Thubert, P., Ed., Perkins, C.E., and E. Levy-Abegnoli, «IPv6 Backbone Router», RFC 8929, DOI 10.17487/RFC8929, November 2020, <https://www.rfc-editor.org/info/rfc8929>.

[RFC9010] Thubert, P., Ed. and M. Richardson, «Routing for RPL (Routing Protocol for Low-Power and Lossy Networks) Leaves», RFC 9010, DOI 10.17487/RFC9010, April 2021, <https://www.rfc-editor.org/rfc/rfc9010>.

[TUNNELS] Touch, J. and M. Townsley, «IP Tunnels in the Internet Architecture», Work in Progress, Internet-Draft, draft-ietf-intarea-tunnels-10, 12 September 2019, <https://tools.ietf.org/html/draft-ietf-intarea-tunnels-10>.

[ZEROTOUCH-JOIN] Richardson, M., «6tisch Zero-Touch Secure Join protocol», Work in Progress, Internet-Draft, draft-ietf-6tisch-dtsecurity-zerotouch-join-04, 8 July 2019, <https://tools.ietf.org/html/draft-ietf-6tisch-dtsecurity-zerotouch-join-04>.

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

Эта работа была выполнена, благодаря гранту проекта StandICT.eu.

Большое спасибо C. M. Heard за помощь при написании раздела 4, где учтено множество его комментариев.

Авторы благодарны за рецензирование, отзывы и комментарии Dominique Barthel, Robert Cragie, Ralph Droms, Simon Duquennoy, Cenk Guendogan, Rahul Jadhav, Benjamin Kaduk, Matthias Kovatsch, Gustavo Mercado, Subramanian Moonesamy, Marcela Orbiscay, Cristian Perez, Charlie Perkins, Alvaro Retana, Peter van der Stok, Xavier Vilajosana, Éric Vyncke, Thomas Watteyne (в алфавитном порядке).

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

Maria Ines Robles

Universidad Tecno. Nac.(UTN)-FRM, Argentina /Aalto University Finland

Coronel Rodríguez 273

M5500 Mendoza

Provincia de Mendoza

Argentina

Email: mariainesrobles@gmail.com

Michael C. Richardson

Sandelman Software Works

470 Dawson Avenue

Ottawa ON K1Z 5V7

Canada

Email: mcr+ietf@sandelman.ca

URI: http://www.sandelman.ca/mcr/

Pascal Thubert

Cisco Systems, Inc

Building D

45 Allee des Ormes — BP1200

06254 MOUGINS — Sophia Antipolis

France

Phone: +33 497 23 26 34

Email: pthubert@cisco.com


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

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

nmalykh@protokols.ru


1Low-Power and Lossy Network — сеть с ограниченным электропитанием и потерями.

2IPv6 Routing Protocol for Low-Power and Lossy Networks — протокол маршрутизации IPv6 для сетей LLN.

3RPL Packet Information — информация о пакете RPL.

4DODAG Information Object — информационный объект DODAG.

5Internet Engineering Task Force.

6Internet Engineering Steering Group.

7RPL Packet Information — информация о пакете RPL.

8RPL Source Route Header.

9Routing Over Low power and Lossy networks — маршрутизация в сетях LLN.

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

11Destination-Oriented Directed Acyclic Graph — ориентированный на получателя ациклический направленный граф.

12Здесь и далее это обозначение служит сокращением для IPv6-in-IPv6.

13Destination Advertisement Trigger Sequence Number — порядковый номер триггера анонсирования адресатов.

14Join Registrar/Coordinator — координатор/регистратор присоединения.

15Encapsulating Security Payload — инкапсуляция данных защиты.

16Source Address Validation Improvement — улучшенная проверка адреса источника.

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

RFC 9035 A Routing Protocol for Low-Power and Lossy Networks (RPL) Destination-Oriented Directed Acyclic Graph (DODAG) Configuration Option for the 6LoWPAN Routing Header

Internet Engineering Task Force (IETF)                   P. Thubert, Ed.
Request for Comments: 9035                                       L. Zhao
Updates: 8138                                              Cisco Systems
Category: Standards Track                                     April 2021
ISSN: 2070-1721

A Routing Protocol for Low-Power and Lossy Networks (RPL)

Destination-Oriented Directed Acyclic Graph (DODAG) Configuration Option for the 6LoWPAN Routing Header

Протокол RPL — опция DODAG Configuration для заголовка 6LoWPAN Routing

PDF

Аннотация

Этот документ обновляет RFC 8138, задавая бит в опции RPL1 DODAG2 Configuration для индикации применения сжатия в RPL Instance и задания поведения узлов, соответствующих RFC 8138, при установленном и сброшенном флаге.

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

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

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

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

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

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

При создании сетей LLN5 обычно сосредотачиваются на экономии энергии, являющейся одним из наиболее дефицитных ресурсов. Оптимизация маршрутов в «RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks» [RFC6550], такая как маршрутизация по DODAG к корневому узлу и связанное с этим сжатие маршрутных заголовков, предложенное в [RFC8138], связаны с этой проблемой.

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

Этот документ дополняет [RFC8138] и указывает, следует ли использовать его в RPL DODAG с новым флагом опции RPL DODAG Configuration. Установка нового флага контролируется корнем и флаг распространяется по сети как обычные сигналы RPL. Флаг сбрасывается для отключения сжатия в процессе перехода, по завершении которого (например, по информации от системы управления сетью) флаг устанавливается для всего графа DODAG.

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

2.1. Связанные документы

Используемая в документе терминология включает определения из «Terms Used in Routing for Low-Power and Lossy Networks» [RFC7102]. Термины, связанные с LLN, определены в «Terminology for Constrained-Node Networks» [RFC7228].

Термины RPL, RPL Packet Information (RPI), RPL Instance (индексируется RPLInstanceID) определены в «RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks» [RFC6550]. RPI — это абстрактная информация, определяемая RPL для включения в пакеты данных, например, в опцию RPL [RFC6553] заголовка IPv6 Hop-By-Hop. Термин RPI часто применяется в расширенном смысле для обозначения RPL Option. Сообщения DODAG Information Solicitation (DIS), Destination Advertisement Object (DAO), DODAG Information Object (DIO) также определены в [RFC6550].

Термины RPL-Unaware Leaf (RUL) и RPL-Aware Leaf (RAL) применяются в соответствии с «Using RPI Option Type, Routing Header for Source Routes, and IPv6-in-IPv6 Encapsulation in the RPL Data Plane» [RFC9008]. RPL-Aware Node (RAN) указывает узел, являющийся RAL или маршрутизатором RPL и поддерживает доступность своих адресов и префиксов путём их вставки в RPL. RUL использует «Registration Extensions for IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Neighbor Discovery» [RFC8505] для получения услуг доступности от родительского маршрутизатора, как указано в «Routing for RPL (Routing Protocol for Low-Power and Lossy Networks) Leaves» [RFC9010].

2.2. Глоссарий

6LoRH

6LoWPAN Routing Header — заголовок маршрутизации 6LoWPAN.

6LoWPAN

IPv6 over Low-Power Wireless Personal Area Network — IPv6 в персональной беспроводной сети со слабым питанием.

DIO

DODAG Information Object — информационный объект DODAG (сообщение RPL).

DODAG

Destination-Oriented Directed Acyclic Graph — ориентированный на адресата ациклический направленный граф.

LLN

Low-Power and Lossy Network — сеть со слабым питанием и потерями.

MOP

RPL Mode of Operation — режим работы RPL.

RAL

RPL-Aware Leaf — понимающий протокол RPL лист.

RAN

RPL-Aware Node — понимающий протокол RPL узел (маршрутизатор RPL или понимающий RPL лист).

RPI

RPL Packet Information — информация пакета RPL.

RPL

Routing Protocol for Low-Power and Lossy Networks — протокол маршрутизации для сетей LLN.

RUL

RPL-Unaware Leaf — не понимающий протокол RPL лист.

SRH

Source Routing Header — заголовок заданной источником маршрутизации.

Sub-DODAG

Субграфом DODAG для узла является DODAG с корнем в узле, являющийся частью графа DODAG, к которому относится узел. Граф формируется другими узлами основного DODAG, чьи пути к корню основного DODAG идут через этот узел.

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

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

3. Расширение RFC 6550

Опция DODAG Configuration определена в параграфе 6.7.6 [RFC6550]. Назначение опции расширено для распространения конфигурационных данных, влияющих на создание и поддержку DODAG, а также распространение рабочих параметров RPL через DODAG. Исходная опция DODAG Configuration включала 4 резервных бита для будущих флагов.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x04 |Opt Length = 14| | |T| |A|       ...           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                     +
                                <- flags ->

Рисунок 1. Частичное представление опции DODAG Configuration.


В этой спецификации определён новый флаг сжатия RFC 8138 (T), устанавливаемый для включения поддержки [RFC8138] в графе DODAG. Флаг T занимает позицию 2 резервного поля флагов в опции DODAG Configuration (отсчёт с 0 для старшего бита) и сбрасывается (0) в унаследованных реализациях, как указано в параграфах 20.14 и 6.7.6 [RFC6550].

Параграф 4.1.2 в [RFC9008] обновляет [RFC6550] указанием применимости определения флагов лишь к режимам работы (Mode of Operation или MOP) от 0 до 6. Для MOP = 7 должно применяться сжатие заголовков 6LoWPAN [RFC8138], которое в других случаях недопустимо использовать.

Опция RPL DODAG Configuration обычно помещается в сообщения DIO, распространяемые вниз по DODAG для формирования и последующей поддержки графа. Опция DODAG Configuration копируется без изменений от родителей к потомкам. В [RFC6550] сказано: «Узлам, не являющимся корнем DODAG, недопустимо менять эту информацию при распространении опции DODAG Configuration.» Поэтому унаследованные родители распространяют установленный корнем флаг T и он попадает на все узлы DODAG.

4. Обновление RFC 8138

Узлу следует генерировать пакеты в сжатом формате [RFC8138] тогда и только тогда, когда установлен флаг T. Это поведение можно переопределить в конфигурации и системе управления сетью. Переопределение может потребоваться, например, для включения сжатия в сети, где все узлы поддерживают [RFC8138], но корень не поддерживает эту спецификацию и не может установить флаг T или сбросить его локально при наличии проблем.

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

Предполагается, что внешняя цель [RFC9008] не поддерживает [RFC8138]. В большинстве случаев пакеты для внешней цели и от неё туннелируются между граничным маршрутизатором (6LoWPAN Router или 6LR), обслуживающим эту цель, и корнем, независимо от режима MOP в RPL DODAG. Внутренний пакет обычно не сжимается с помощью [RFC8138], поэтому для исходящих пакетов граничному маршрутизатору нужно просто декапсулировать (сжатый) внешний заголовок и переслать (декомпрессированный) внутренний пакет в направлении внешней цели.

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

RUL [RFC9010] является одновременно листом и внешней целью. Узел RUL не участвует в RPL и зависит от внешнего маршрутизатора, обеспечивающего подключение. В случае RUL пересылка в направлении внешней цели реально означает доставку пакета.

5. Варианты перехода

Узел, поддерживающий [RFC8138], но не поддерживающий эту спецификацию, может использоваться лишь в однородной сети. Включение сжатия [RFC8138] без использования указывающей это сигнализации, требует перехода (flag day), в течение которого все узлы должны быть обновлены, а после этого сеть должна быть перезагружена с включением сжатия 6LoRH [RFC8138].

Целью этой спецификации является переход без использования flag day. В частности, цель заключается в отказе от флага T. Хотя возможен возврат к прежнему состоянию (см. параграф 5.3), операцию возврата следует завершить до того, как в сети появятся узлы, не поддерживающие [RFC8138].

5.1. Сосуществование

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

Узел, не поддерживающий [RFC8138], может взаимодействовать с узлами сети, где сжатие 6LoRH [RFC8138] отключено. Если сжатие включено, для всех RAN предполагается способность обработки сжатых пакетов. Узел, не способный сделать это, может оставаться подключённым к сети в качестве RUL, как описано в [RFC9010].

5.2. Несогласованность состояний при переходе

Когда корень устанавливает флаг T, информация постепенно распространяется через DODAG по мере отправки сообщений DIO. Некоторые узлы увидят флаг и начнут передавать пакеты в сжатом формате, а другие узлы в том же RPL DODAG ещё не будут знать о них. В режиме Non-Storing корень начнёт применять [RFC8138] с заголовком SRH 6LoRH (SRH-6LoRH), который направит все пути к родительскому маршрутизатору или листу.

Для гарантированной пересылки пакета через RPL DODAG в исходной форме все узлы RPL должны поддерживать [RFC8138] на момент переключения. Ответственность за установку флага T ложится на администратора сети. Предполагается, что имеющиеся средства управления сетью и обновления позволят администратору сети узнать, что все узлы, которые могут присоединиться к DODAG, были обновлены. Для экземпляра RPL с несколькими корнями все узлы, участвующие в RPL Instance. Могут присоединяться к любому графу DODAG. Сеть должна работать со сброшенным флагом T, пока все узлы RPL не будут обновлены для поддержки этой спецификации.

5.3. Возврат

При отключении сжатия 6LoRH [RFC8138] в сети администратор должен дождаться, пока все узлы сбросят флаг T перед тем, как разрешить отказ от сжатия в сети. Информацию о режиме сжатия следует раскрывать в интерфейсе управления узлом.

Узлы, не поддерживающие [RFC8138], не следует развёртывать в сети со включённым сжатием заголовков. Если такой узел подключён к сети, он может работать лишь в качестве RUL.

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

Эта спецификация обновляет реестр «DODAG Configuration Option Flags for MOP 0..6» [RFC9008] (ранее «DODAG Configuration Option Flags» [RFC6550]), путём выделения нового флага (таблица 1).

Таблица 1. Новый флаг опции DODAG Configuration.

Номер бита

Описание

Документ

2

Включение сжатия RFC 8138 (T)

RFC 9035

Агентство IANA добавило этот документ в качестве ссылки для строки MOP 7 в реестре RPL «Mode of Operation».

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

Следует отметить, что в RPL [RFC6550] каждый узел LLN, понимающий RPL и имеющий доступ в домен RPL, может организовать любую атаку, основанную на RPL (см. [RFC7416]). Этот документ обычно применяется к развёрнутым системам и не меняет для них требований к защите и операциям. Предполагается применение механизмов защиты, определённых для RPL.

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

Установка или сброс флага T может нарушать согласованность сети, но до завершения обновления всех узлов для поддержки [RFC8138] они могут пересылать обе формы. Источник отвечает за управление сжатием пакета, а все маршрутизаторы должны использовать выбранный источником формат. Поэтому результатом несогласованности может быть лишь присутствие в сети обеих форм пакетов, что ведёт к дополнительному расходу пропускной способности для пакетов без сжатия.

Атакующий может сбросить флаг T, чтобы вынудить дочерние или нижележащие узлы субграфа DODAG потреблять больше энергии. И наоборот, он может установить флаг T, чтобы узлы нисходящего направления сжимали пакеты даже при нежелательности компрессии, что может приводить к потере пакетов. В дереве атакующий может отбрасывать пакеты, идущие к объекту атаки или от него. Таким образом, упомянутые выше атаки будут более сложными и более заметными, чем простое отбрасывание выбранных пакетов. Узел нисходящего направления может иметь других родителей и видеть бит в обоих состояниях — такую ситуацию можно обнаружить и выдать сигнал.

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

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

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

[RFC6550] Winter, T., Ed., Thubert, P., Ed., Brandt, A., Hui, J., Kelsey, R., Levis, P., Pister, K., Struik, R., Vasseur, JP., and R. Alexander, «RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks», RFC 6550, DOI 10.17487/RFC6550, March 2012, <https://www.rfc-editor.org/info/rfc6550>.

[RFC7102] Vasseur, JP., «Terms Used in Routing for Low-Power and Lossy Networks», RFC 7102, DOI 10.17487/RFC7102, January 2014, <https://www.rfc-editor.org/info/rfc7102>.

[RFC8138] Thubert, P., Ed., Bormann, C., Toutain, L., and R. Cragie, «IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Routing Header», RFC 8138, DOI 10.17487/RFC8138, April 2017, <https://www.rfc-editor.org/info/rfc8138>.

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

[RFC8505] Thubert, P., Ed., Nordmark, E., Chakrabarti, S., and C. Perkins, «Registration Extensions for IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Neighbor Discovery», RFC 8505, DOI 10.17487/RFC8505, November 2018, <https://www.rfc-editor.org/info/rfc8505>.

[RFC9010] Thubert, P., Ed. and M. Richardson, «Routing for RPL (Routing Protocol for Low-Power and Lossy Networks) Leaves», RFC 9010, DOI 10.17487/RFC9010, April 2021, <https://www.rfc-editor.org/info/rfc9010>.

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

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

[RFC6553] Hui, J. and JP. Vasseur, «The Routing Protocol for Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information in Data-Plane Datagrams», RFC 6553, DOI 10.17487/RFC6553, March 2012, <https://www.rfc-editor.org/info/rfc6553>.

[RFC7228] Bormann, C., Ersue, M., and A. Keranen, «Terminology for Constrained-Node Networks», RFC 7228, DOI 10.17487/RFC7228, May 2014, <https://www.rfc-editor.org/info/rfc7228>.

[RFC7416] Tsao, T., Alexander, R., Dohler, M., Daza, V., Lozano, A., and M. Richardson, Ed., «A Security Threat Analysis for the Routing Protocol for Low-Power and Lossy Networks (RPLs)», RFC 7416, DOI 10.17487/RFC7416, January 2015, <https://www.rfc-editor.org/info/rfc7416>.

[RFC9008] Robles, M.I., Richardson, M., and P. Thubert, «Using RPI Option Type, Routing Header for Source Routes, and IPv6-in-IPv6 Encapsulation in the RPL Data Plane», RFC 9008, DOI 10.17487/RFC9008, April 2021, <https://www.rfc-editor.org/info/rfc9008>.

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

Авторы признательны Murray Kucherawy, Meral Shirazipour, Barry Leiba, Tirumaleswar Reddy, Nagendra Kumar Nainar, Stewart Bryant, Carles Gomez, Éric Vyncke, Roman Danyliw и особенно Benjamin Kaduk, Alvaro Retana, Dominique Barthel, Rahul Jadhav за глубокий обзор и конструктивные предложения.

Большое спасибо Michael Richardson, который всегда был готов прийти на помощь.

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

Pascal Thubert (редактор)

Cisco Systems, Inc.

Building D

45 Allee des Ormes — BP1200

06254 MOUGINS — Sophia Antipolis

France

Phone: +33 497 23 26 34

Email: pthubert@cisco.com

Li Zhao

Cisco Systems, Inc.

Xinsi Building

No. 926 Yi Shan Rd

Shanghai

200233

China

Email: liz3@cisco.com


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

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

nmalykh@protokols.ru

1Routing Protocol for Low-Power and Lossy Networks — протокол маршрутизации для сетей LLN.

2Destination-Oriented Directed Acyclic Graph — ориентированный на получателя направленный ациклический граф.

3Internet Engineering Task Force.

4Internet Engineering Steering Group.

5Low-Power and Lossy Network — сеть со слабым питанием и потерями.

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

Архитектура переносимых коммутаторов P416 (проект, 02.04.2021)

P416 Portable Switch Architecture (PSA)

Архитектура переносимых коммутаторов P416 (проект)

(working draft)

The P4.org Architecture Working Group

2021-04-02

PDF

Аннотация

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

1. Модель целевой архитектуры

PSA для языка P416 является аналогом стандартной библиотеки для языка программирования C. PSA определяет библиотеку типов, внешние элементы P416 (extern) для часто используемых функций (таких как счётчики, измерители и регистры), а также набор путей пакетов (packet path), позволяющие создавать программы P4 для управления потоками пакетов в коммутаторе с множеством портов (например, несколькими десятками портов Ethernet). Приведённые здесь API и рекомендации позволяют разработчикам создавать программы P4, переносимые между разными устройствами, соответствующими PSA.

Хотя некоторые части PSA специфичны для коммутаторов и архитектура Portable NIC Architecture (если такая будет разработана) будет существенно отличаться от PSA в этих частях, предполагается, что определённые здесь внешние элементы можно будет применять в разной архитектуре P416.

Модель PSA включает 6 программируемых блоков P4 и 2 фиксированных функциональных блока, как показано на рисунке 1. Поведение программируемых блоков задаётся на языке P4. Блоки PRE2 и BQE3 зависят от платформы и могут настраиваться на выполнение фиксированного набора операций.

Рисунок 1. Конвейер коммутатора PSA.

Входящие пакеты анализируются и проверяются на пригодность, а затем передаются во входной конвейер СД (сопоставление-действие, match-action), принимающий решение о дальнейшем пути пакетов. Входной сборщик (deparser) P4 задаёт содержимое пакета, отправляемое в буфер, и сопровождающие пакет метаданные. После входного конвейера пакет может быть реплицирован (т. е. созданы копии для нескольких выходных портов), а затем сохранен в буфере.

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

Разработчик программы для PSA должен определить объекты в программируемых блоках P4, которые соответствуют определенным ниже API (5. Программируемые блоки). Для входных и выходных данных программируемых блоков применяются шаблоны заданных в программе заголовков и метаданных. После определения 6 программируемых блоков программа P4 для архитектуры PSA создаёт основной объект (пакет, package) с программируемыми блоками в качестве аргументов (см. например, 7.3. Блок репликации пакетов).

Для улучшения переносимости программы P4 следует выполнять приведённые ниже рекомендации:

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

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

В этом документе приведены фрагменты нескольких программ P416, использующих включаемый файл psa.p4 и демонстрирующих возможности PSA. Исходный код этих программ доступен в репозитории, содержащем официальную спецификацию.

2. Соглашения об именах

В документе используется ряд приведённых ниже соглашений об именовании объектов.

  • Имена типов используют «стиль верблюда» (CamelCase) и суффикс _t, например, PortId_t.

  • Типы элементов управления (control) и внешних объектов (extern) именуются в стиле CamelCase, например, IngressParser.

  • Структурные типы именуются с использованием символов нижнего регистра, разделителей _ и суффикса _t, например, psa_ingress_input_metadata_t.

  • Имена действий, внешних методов и функций, заголовков, структур и экземпляров элементов управления начинаются с символа нижнего регистра и используют разделители слов _, например, send_to_port.

  • Перечисляемые элементы, определения констант и константы #define именуются с использованием символов верхнего регистра и разделителей _, например, PSA_PORT_CPU.

Для зависимых от архитектуры метаданных (например, структур) используется префикс psa_.

3. Пути пакетов

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

Рисунок 2. Пути пакетов в PSA.

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

Таблица 1. Именование путей пакетов в коммутаторе.

Обозначение

Описание

Источник

Получатель

NFP

Обычный пакет из порта

Порт

Входной анализатор

NFCPU

Пакет из порта CPU

Порт CPU

Входной анализатор

NU

Обычный индивидуальный пакет из входного конвейера в выходной

Входной сборщик

Выходной анализатор

NM

Обычный реплицированный групповой пакет из входного конвейера в выходной

Выходной сборщик с помощью PRE

Выходной анализатор (возможно несколько копий)

NTP

Обычный пакет в порт

Выходной сборщик

Порт

NTCPU

Обычный пакет в порт CPU

Выходной сборщик

Порт CPU

RESUB

Повторно представленный пакет

Входной сборщик

Входной анализатор

CI2E

Клон пакета из входного конвейера в выходной

Входной сборщик

Выходной анализатор

RECIRC

Рециркулированный пакет

Выходной сборщик

Входной анализатор

CE2E

Клон из выходного конвейера в него же

Выходной сборщик

Выходной анализатор

В таблице 2 показаны результаты однократной обработки пакета во входном или выходном конвейере. Рассматриваются те же пути, что и в таблице 1, но они сгруппированы по следующему этапу обработки (столбец «Дальнейшая обработка»).

Таблица 2. Результаты однократной обработки пакетов во входном и выходном конвейере.

Обозначение

Описание

Дальнейшая обработка

Результирующие пакеты

NFP

Обычный пакет из порта

Входной конвейер

Не более 1 пакета CI2E, плюс не более 1 пакета RESUB, NU или NM. См. параграф 6.2. Поведение пакетов по завершении входной обработки.

NFCPU

Пакет из порта CPU

RESUB

Повторно представленный пакет

RECIRC

Рециркулированный пакет

NU

Обычный индивидуальный пакет из входного конвейера в выходной

Выходной конвейер

Не более 1 пакета CE2E, плюс не более 1 пакета RECIRC, NTP или NTCPU. См. параграф 6.5. Поведение пакетов по завершении выходной обработки.

NM

Обычный реплицированный групповой пакет из входного конвейера в выходной

CI2E

Клон пакета из входного конвейера в выходной

CE2E

Клон из выходного конвейера в него же

NTP

Обычный пакет в порт

Устройство на другой стороне

Определяется другим устройством

NTCPU

Обычный пакет в порт CPU

CPU

Определяется CPU

В PSA имеются поля метаданных, позволяющие программам P4 указать путь, по которому проходит каждый пакет, и следующий элемент управления для каждого пакета (см. раздел 6. Описание путей пакетов).

Для выходных пакетов выбор одного из выходных портов, порта CPU или порта рециркуляции выполняется непосредственно предшествующим этапом обработки (входной конвейер для NU, NM и CI2E, выходной конвейер для CE2E). При выходной обработке может быть принято решение об отбрасывании пакета вместо его передачи в выбранный ранее порт, но невозможно изменить выходной порт. Выбор выходного порта (или портов) обычно происходит во входном конвейере программы P4. Единственным исключением является выбор выходного порта для клонов CE2E, создаваемых непосредственно предшествующим этапом обработки. Причины этого исключения рассмотрены в приложении D.2. Неизменность выходного порта в процессе выходной обработки.

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

  • Исходный пакет принимается как NFP через порт 2. Входная обработка создаёт клон CI2E, адресованный в порт CPU (копия 1), и групповой пакет NM для multicast-группы 18, которая настроена в PacketReplicationEngine на создание копий для порта 5 (копия 2) и порта рециркуляции PSA_PORT_RECIRCULATE (копия 3).

  • Для копии 1 выполняется выходная обработка с передачей пакета по пути NTCPU в порт CPU.

  • Для копии 2 выполняется выходная обработка, которая создаёт клон CE2E для порта 8 (копия 4) и передаёт пакет NTP в порт 5.

  • Для копии 3 выполняется выходная обработка, которая возвращает RECIRC обратно на вход (копия 5).

  • Для копии 4 выполняется выходная обработка, передающая пакет NTP в порт 8.

  • Для копии 5 выполняется входная обработка, передающая пакет NU, направленный в порт 1 (копия 6).

  • Для копии 6 выполняется выходная обработка, которая отбрасывает пакет вместо передачи в порт 1.

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

В PSA нет обязательного механизма для предотвращения создания из одного принятого пакета множества пакетов, порождающих бесконечную рециркуляцию, повторное представление или клонирование CE2E. Такое поведение можно предотвратить тестированием программ P4 и/или включением в программу P4 метаданных «времени жизни», передаваемых с копиями пакетов подобно полю TTL в заголовках IPv4.

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

4. Типы данных PSA

4.1. Определения типов PSA

Каждая реализация PSA имеет конкретный размер в битах для описанных ниже типов в плоскости данных. Значения размера определяются во включаемом файле psa.p4 для конкретной платформы. Предполагается, что в разных реализациях PSA могут применяться разные размеры4.

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

/* В определениях применяется typedef, а не type, поэтому они просто
 * задают другие имена для типа bit<W> с конкретным значением W. 
 * В отличие от приведённых ниже определений type, значения, объявленные
 * с именами типов typedef можно свободно перемешивать в выражениях как
 * и другие значения, объявленные с типом bit<W>. Приведённые ниже
 * имена с type нельзя свободно перемешивать, если они не были сначала
 * приведены к соответствующему типу typedef. Хотя это может оказаться
 * неудобным при работе с арифметическими выражениями, такой подход 
 * позволяет отметить все значения типов type в создаваемом автоматически
 * API плоскости управления.
 *
 * Отметим, что размер typedef <name>Uint_t всегда совпадает с размером
 * type <name>_t. */
typedef bit<unspecified> PortIdUint_t;
typedef bit<unspecified> MulticastGroupUint_t;
typedef bit<unspecified> CloneSessionIdUint_t;
typedef bit<unspecified> ClassOfServiceUint_t;
typedef bit<unspecified> PacketLengthUint_t;
typedef bit<unspecified> EgressInstanceUint_t;
typedef bit<unspecified> TimestampUint_t;

@p4runtime_translation("p4.org/psa/v1/PortId_t", 32)
type PortIdUint_t	PortId_t;
@p4runtime_translation("p4.org/psa/v1/MulticastGroup_t", 32)
type MulticastGroupUint_t 	MulticastGroup_t;
@p4runtime_translation("p4.org/psa/v1/CloneSessionId_t", 16)
type CloneSessionIdUint_t 	CloneSessionId_t;
@p4runtime_translation("p4.org/psa/v1/ClassOfService_t", 8)
type ClassOfServiceUint_t 	ClassOfService_t;
@p4runtime_translation("p4.org/psa/v1/PacketLength_t", 16)
type PacketLengthUint_t	PacketLength_t;
@p4runtime_translation("p4.org/psa/v1/EgressInstance_t", 16)
type EgressInstanceUint_t 	EgressInstance_t;
@p4runtime_translation("p4.org/psa/v1/Timestamp_t", 64)
type TimestampUint_t	Timestamp_t;
typedef error	ParserError_t;

const PortId_t PSA_PORT_RECIRCULATE = (PortId_t) unspecified;
const PortId_t PSA_PORT_CPU = (PortId_t) unspecified;
const CloneSessionId_t PSA_CLONE_SESSION_TO_CPU = (CloneSessiontId_t) unspecified;
/* Примечание. Все типы с InHeader в именах предназначены лишь для значений
 * соответствующих типов в заголовках пакетов между устройством PSA и сервером
 * P4Runtime, который управляет им.
 *
 * Указанные здесь размеры должны быть не меньше, чем будет применять 
 * для этого типа любое из устройств PSA. Таким образом эти типы могут
 * быть полезны для определения пакетов, передаваемых устройством PSA
 * напрямую другим устройствам без прохождения через сервер P4Runtime
 * (например, при отправке пакетов контроллеру или системе сбора данных
 * на скоростях, превышающих возможности сервера P4Runtime). В таких
 * случаях не требуется автоматического преобразования этих типов
 * плоскостью данных PSA как при передаче серверу P4Runtime. Все такие
 * преобразования следует включать в программу P4.
 *
 * Все размеры должны быть кратны 8, чтобы любое подмножество этих полей
 * можно было использовать в одном определении заголовка P4 даже в случаях, 
 * когда реализации P4 требуют от содержащего поля заголовка кратный 8
 * битам размер. */
/* Причины использования typedef описаны выше. */
typedef bit<32> 	PortIdInHeaderUint_t;
typedef bit<32> 	MulticastGroupInHeaderUint_t;
typedef bit<16> 	CloneSessionIdInHeaderUint_t;
typedef bit<8> 	ClassOfServiceInHeaderUint_t;
typedef bit<16> 	PacketLengthInHeaderUint_t;
typedef bit<16> 	EgressInstanceInHeaderUint_t;
typedef bit<64> 	TimestampInHeaderUint_t;

@p4runtime_translation("p4.org/psa/v1/PortIdInHeader_t", 32)
type PortIdInHeaderUint_t		PortIdInHeader_t;
@p4runtime_translation("p4.org/psa/v1/MulticastGroupInHeader_t", 32)
type MulticastGroupInHeaderUint_t 	MulticastGroupInHeader_t;
@p4runtime_translation("p4.org/psa/v1/CloneSessionIdInHeader_t", 16)
type CloneSessionIdInHeaderUint_t 	CloneSessionIdInHeader_t;
@p4runtime_translation("p4.org/psa/v1/ClassOfServiceInHeader_t", 8)
type ClassOfServiceInHeaderUint_t 	ClassOfServiceInHeader_t;
@p4runtime_translation("p4.org/psa/v1/PacketLengthInHeader_t", 16)
type PacketLengthInHeaderUint_t	PacketLengthInHeader_t;
@p4runtime_translation("p4.org/psa/v1/EgressInstanceInHeader_t", 16)
type EgressInstanceInHeaderUint_t 	EgressInstanceInHeader_t;
@p4runtime_translation("p4.org/psa/v1/TimestampInHeader_t", 64)
type TimestampInHeaderUint_t		TimestampInHeader_t;

4.2. Поддерживаемые PSA типы метаданных

enum PSA_PacketPath_t {
	NORMAL,	/// Полученный входным конвейером пакет, не относящийся к приведённым ниже.
	NORMAL_UNICAST,	/// Обычный индивидуальный пакет, полученный выходным конвейером.
	NORMAL_MULTICAST,	/// Обычный групповой пакет, полученный выходным конвейером.
	CLONE_I2E,	/// Пакет, созданный операцией clone во входном конвейере и 
			/// предназначенный для выходного конвейера.
	CLONE_E2E, 	/// Пакет, созданный операцией clone в выходном конвейере и 
			/// предназначенный для выходного конвейера.
	RESUBMIT,	/// Пакет, полученный в результате операции resubmit.
	RECIRCULATE 	/// Пакет, полученный в результате операции recirculate.
}

struct psa_ingress_parser_input_metadata_t {
	PortId_t		ingress_port;
	PSA_PacketPath_t	packet_path;
}

struct psa_egress_parser_input_metadata_t {
	PortId_t		egress_port;
	PSA_PacketPath_t	packet_path;
}

struct psa_ingress_input_metadata_t {
	// Все перечисленные значения инициализируются архитектурой до
	// начала выполнения блока управления Ingress.
	PortId_t		ingress_port;
	PSA_PacketPath_t	packet_path;
	Timestamp_t		ingress_timestamp;
	ParserError_t		parser_error;
}

struct psa_ingress_output_metadata_t {
	// В комментариях после полей указаны исходные значения на момент
	// начала выполнения блока управления Ingress.
	ClassOfService_t	class_of_service; 	// 0
	bool			clone;			// false
	CloneSessionId_t	clone_session_id;	// не определено
	bool			drop;			// true
	bool			resubmit;		// false
	MulticastGroup_t	multicast_group; 	// 0
	PortId_t		egress_port;		// не определено

struct psa_egress_input_metadata_t {
	ClassOfService_t	class_of_service;
	PortId_t		egress_port;
	PSA_PacketPath_t	packet_path;
	EgressInstance_t	instance;	/// экземпляр от PacketReplicationEngine
	Timestamp_t		egress_timestamp;
	ParserError_t		parser_error;
}

/// Эта структура является входным (in) параметром выходного сборщика. 
/// Она включает достаточно данных, чтобы сборщик мог решить вопрос о
/// рециркуляции пакета.
struct psa_egress_deparser_input_metadata_t {
	PortId_t	egress_port;
}

struct psa_egress_output_metadata_t {
	// В комментариях после полей указаны исходные значения на момент
	// начала выполнения блока управления Egress.
	bool			clone;			// false
	CloneSessionId_t	clone_session_id; 	// не определено
	bool			drop;			// false
}

4.3. Типы сопоставления

PSA поддерживает дополнительные типы match_kind сверх 3, определённых в спецификации P416.

match_kind {
	range,		/// Служит для представления интервалов min-max.
	selector 	/// Служит для динамического выбора действий с 
			/// помощью внешнего блока ActionSelector.
}

Тип selector поддерживается только для таблиц в реализацией селектора действий (7.12. Селекторы действий).

4.3.1. Таблицы range

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

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

В таблицах range могут присутствовать поля lpm. В таких случаях для выбора записи применяется длина префикса, но при наличии нескольких совпадающих записей размер префикса не определяет их относительный приоритет и применяются лишь значения приоритета, заданные плоскостью управления. Если в таблице range имеются записи, заданные с помощью свойства const entries, относительный приоритет записей определяется по порядку их размещения в программе P4 (первая запись имеет наибольший приоритет).

4.3.2. Таблицы ternary

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

4.3.3. Таблицы lpm

Если в таблице нет полей range и ternary, но имеется поле lpm, такое поле должно быть единственным. В дополнение к нему могут присутствовать поля типа exact. Хотя одному ключу может соответствовать несколько записей таблицы, не может быть больше 1 записи, соответствующей каждому возможному размеру префикса в поле lpm, поскольку две присутствующие одновременно записи не могут иметь одинаковый ключ поиска. Всегда выбирается запись с максимальным размером совпадающего префикса. Плоскость управления не может задавать приоритет при создании записей в таких таблицах, поскольку приоритет всегда определяется размером префикса.

Если в таблице типа lpm имеются записи, определённые с помощью свойства const entries, их относительный приоритет определяется длиной префикса, а не порядком размещения в программе P4.

4.3.4. Таблицы exact

Если таблица включает лишь поля типа exact, любому ключу поиска будет соответствовать не более 1 записи, поскольку дубликаты ключей поиска не дозволены в таблице. В результате поле приоритета становится ненужным для определения соответствующей ключу записи. При наличии в таблице exact записей, определённых с помощью свойства const entries, ключу поиска не может соответствовать более одной записи, поэтому относительный приоритет записей в соответствии с их размещением в программе P4 также не имеет значения.

4.4. Представление данных в плоскости управления и данных

Реализации плоскости данных PSA, поддерживающие P4 Runtime API, включают программу P4 Runtime Server, которая позволяет программировать устройство PSA в процессе работы с помощью одного или множества P4 Runtime Client. Для краткости P4 Runtime Server будет называть агентом, а P4 Runtime Client — контроллером. Контроллер может управлять множеством устройств с разными реализациями PSA.

Как отмечено в параграфе 4.1. Определения типов PSA, предполагается, что разные реализации PSA могут задавать размеры типов данных, которые напрямую связаны с объектами плоскости данных, например, портами, идентификаторами multicast-групп и т. п..

Предполагается, что некоторые реализации PSA будут использовать заметно меньше ресурсов для таких объектов как ключи таблиц и параметры действий, если плоскость данных сохраняет лишь небольшое число битов, требуемое для значений каждого типа. Например, реализация может определять PortId_t как bit<6> вместо bit<16> и сберечь за счёт этого 10 Мбит хранилища при миллионе записей в таблице6.

P4 Runtime API использует величины, битовый размер которых не зависит от целевой платформы, для типов, указанных в параграфе 4.1. Определения типов PSA, с целью упрощения работы с этими типами в программах агента и контроллера. Для работы плоскости управления с таблицами поиска все операции отсечки или дополнения полей выполняются агентом (обычно отсечка выполняется при передаче от контроллера к устройству, а дополнение — при передаче от устройства в контроллер).

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

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

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

  • Пакеты, передаваемые CPU (входные с точки зрения контроллера) или получаемые от него (выходные).

  • Поля в уведомлениях внешнего блока Digest (7.14. Дайджест пакета).

  • Поля данных в массиве Register (7.9. Регистры).

Отметим, что приведённый список не является исчерпывающим.

Для пакетов между плоскостью управления и устройством PSA существует проблема, связанная с тем, что многие реализации PSA могут ограничивать в программах P4 размеры полей заголовков кратными 8 битам значениями. Чтобы соблюсти это ограничение и позволить определение типов заголовков P4 с полями специфичных для PSA типов, совместимыми с разными реализациями PSA, были определены дополнительные типы, содержащие в именах InHeader. Например, PortIdInHeader_t подобен PortId_t, но должен иметь размер, кратный 8 битам и не меньше размера PortId_t.

Поскольку эти типы InHeader имеют кратный 8 битам размер, можно включать любую их комбинацию в определение типа заголовка P4, коль скоро другие поля заголовка имеют размер, кратный 8 битам. Контроллеру или программе P4, генерирующим пакеты с такими заголовками, следует заполнять старшие биты полей нулями. Это можно делать с помощью обычных операторов присваивания в программе P4 с приведением правой части к размеру InHeader. Обратное приведение более длинного значения (например, PortIdInHeader_t к PortId_t) выполняется путём отсечки старших битов.

Значения типа PortId_t имеют в реализациях PSA необычное свойство. Поскольку это может упростить некоторые аппаратные реализации, численные значения полей типа PortId_t в плоскости данных P4 могут не быть простыми диапазонами (например, 0 — 31, как можно было бы задать в программе плоскости управления для 32-портового устройства). Предполагается, что агент будет преобразовывать численные идентификаторы портов в контроллере в идентификаторы портов плоскости данных и обратно для каждого из описанных выше каналов взаимодействия между контроллером и плоскостью данных. Файл psa.p4 содержит аннотацию p4runtime_translation для определений типов PortId_t и PortIdInHeader_t. Это позволяет компилятору отметить все случаи применения значений этих типов, доступные из P4Runtime API, чтобы программы агента знали о необходимости преобразования идентификаторов. Это позволяет не указывать специально все случаи использования этих типов в программе P4.

Такой подход требует явного приведения типов к bit<W> для выполнения арифметических операций. Включаемый файл psa.p4 определяет PortIdUint_t как typedef с таким же размером, как type PortId_t, что позволяет привести значения типа PortId_t к типу PortIdUint_t, а затем выполнить с ними арифметические операции P4. Результат нужно явно привести обратно к типу PortId_t, если его нужно передать в поле метаданных этого типа. Соответствующие типы с Uint в именах определены для всех типов PSA. Из-за этого преобразования рекомендуется трактовать значения типа PortId_t как значения перечисляемого типа (enum). Сравнение двух значений этого типа на равенство или неравенство допустимо, так же как присваивание значений другим переменным или параметрам того же типа, но почти все прочие операции ведут к ошибкам. При сопоставлении значения типа PortId_t как части ключа таблицы, нужно всегда проверять точное или шаблонное совпадение для каждого бита значения (т. е. сопоставление ternary с шаблоном для всех битов или lpm с префиксом нулевого размера). При попытке выполнить любое из указанных ниже действий со значением типа PortId_t или PortIdInHeader_t численное преобразование приведёт к ошибкам в программе.

  • Сопоставление ключа таблицы с подмножеством битов или диапазоном.

  • Сопоставление номеров портов с использованием оператора сравнения < или >.

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

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

Приведённый выше список не является исчерпывающим.

Приведённые выше комментарии относятся ко всем типам, для которых выполняются численные преобразования между контроллером и плоскостью данных. Ниже приведён полный список численных типов, для которых в PSA по умолчанию планируется численное преобразование:

  • PortId_t или PortIdInHeader_t;

  • ClassOfService_t или ClassOfServiceInHeader_t;

Для перечисленных ниже типов по умолчанию численные преобразования не выполняются7. Плоскость данных PSA должна поддерживать все численные значения от 0 до своего максимума. За исключением Timestamp_t число поддерживаемых плоскостью данных не обязано быть степенью 2. Контроллеры должны иметь способ определения максимального значения, поддерживаемого устройством PSA для каждого из этих типов.

  • MulticastGroup_t — 0 является особым значением, указывающим отсутствие групповой репликации для пакета, поэтому данный тип является исключением из указанного выше правила поддержки плоскостью управления значения 0.

  • CloneSessionId_t.

  • PacketLength_t.

  • EgressInstance_t.

  • Timestamp_t8

Отметим, что для всех этих типов имеются аннотации p4runtime_translation во включаемом файле psa.p4, чтобы при генерации компилятором P4Runtime файла P4Info из исходной программы в этот файл были включены типы, указанные p4runtime_translation, вместо зависимых от платформы размеров типа. Для данной программы P4 содержимое P4Info должно совпадать для всех платформ.

Если размер типа, указанный в качестве второго параметра p4runtime_translation, отличается от размера для платформы (или базового типа), предполагается, что сервер P4Runtime выполнит подходящее приведение типа. Кроме того, в процессе работы могут быть включены более сложные численные преобразования для любого типа, аннотированного в p4runtime_translation, хотя произвольные преобразования обязательны лишь для PortId_t, ClassOfService_t и других вариантов InHeader. Чтобы выполнить произвольное числовое преобразование для заданного типа, система P4Runtime ожидает URI (первый параметр p4runtime_translation) и нужного отображения.

5. Программируемые блоки

Ниже приведены шаблоны объявления программируемых блоков PSA. Разработчик программы P4 отвечает за реализацию элементов управления, соответствующих этим интерфейсам, и создание их экземпляров в определении пакета (package). Здесь используются одни пользовательские типы метаданных IM и заголовков IH для всех входных анализаторов и блоков управления. Выходной анализатор и блоки управления могут иметь те же или иные типы по усмотрению разработчика программы P4.

parser IngressParser<H, M, RESUBM, RECIRCM>(
	packet_in buffer,
	out H parsed_hdr,
	inout M user_meta,
	in psa_ingress_parser_input_metadata_t istd,
	in RESUBM resubmit_meta,
	in RECIRCM recirculate_meta);

control Ingress<H, M>(
	inout H hdr, inout M user_meta,
	in psa_ingress_input_metadata_t istd,
	inout psa_ingress_output_metadata_t ostd);

control IngressDeparser<H, M, CI2EM, RESUBM, NM>(
	packet_out buffer,
	out CI2EM clone_i2e_meta,
	out RESUBM resubmit_meta,
	out NM normal_meta,
	inout H hdr,
	in M meta,
	in psa_ingress_output_metadata_t istd);

parser EgressParser<H, M, NM, CI2EM, CE2EM>(
	packet_in buffer,
	out H parsed_hdr,
	inout M user_meta,
	in psa_egress_parser_input_metadata_t istd,
	in NM normal_meta,
	in CI2EM clone_i2e_meta,
	in CE2EM clone_e2e_meta);

control Egress<H, M>(
	inout H hdr, inout M user_meta,
	in psa_egress_input_metadata_t istd,
	inout psa_egress_output_metadata_t ostd);

control EgressDeparser<H, M, CE2EM, RECIRCM>(
	packet_out buffer,
	out CE2EM clone_e2e_meta,
	out RECIRCM recirculate_meta,
	inout H hdr,
	in M meta,
	in psa_egress_output_metadata_t istd,
	in psa_egress_deparser_input_metadata_t edstd);

package IngressPipeline<IH, IM, NM, CI2EM, RESUBM, RECIRCM>(
	IngressParser<IH, IM, RESUBM, RECIRCM> ip,
	Ingress<IH, IM> ig,
	IngressDeparser<IH, IM, CI2EM, RESUBM, NM> id);

package EgressPipeline<EH, EM, NM, CI2EM, CE2EM, RECIRCM>(
	EgressParser<EH, EM, NM, CI2EM, CE2EM> ep,
	Egress<EH, EM> eg,
	EgressDeparser<EH, EM, CE2EM, RECIRCM> ed);

package PSA_Switch<IH, IM, EH, EM, NM, CI2EM, CE2EM, RESUBM, RECIRCM> (
	IngressPipeline<IH, IM, NM, CI2EM, RESUBM, RECIRCM> ingress,
	PacketReplicationEngine pre,
	EgressPipeline<EH, EM, NM, CI2EM, CE2EM, RECIRCM> egress,
	BufferingQueueingEngine bqe);

6. Описание путей пакетов

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

6.1. Начальные значения пакетов, обрабатываемых входным конвейером

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

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

NFP

NFCPU

RESUB

RECIRC

packet_in

См. текст.

user_meta

См. текст.

Поля IngressParser istd (тип psa_ingress_parser_input_metadata_t)

ingress_port

Значение PortId_t входного порта для пакета

PSA_PORT_CPU

Копируется из повторно представленного пакета

PSA_PORT_RECIRCULATE

packet_path

NORMAL

NORMAL

RESUBMIT

RECIRCULATE

Входные поля istd (тип psa_ingress_input_metadata_t)

ingress_port

То же значение, которое получено IngressParser (см. выше).

packet_path

То же значение, которое получено IngressParser (см. выше).

ingress_timestamp

Время начала обработки пакета в IngressParser. Для пакетов RESUB и RECIRC это время начала обработки «копии», а не оригинала.

parser_error

От IngressParser. Всегда error.NoError, если при анализе не возникло ошибок.

Отметим, что для повторно представленных пакетов ingress_port может иметь значение PSA_PORT_RECIRCULATE, если для пакета использовалась рециркуляция, а затем он был представлен ещё раз.

6.1.1. Исходное содержимое пакетов из портов

Для пакетов Ethernet поле packet_in пакетов в путях FP и NFCPU содержит кадр Ethernet, начиная с заголовка Ethernet. Контрольная сумма (FCS9) кадра Ethernet не включается10.

PSA не вносит дополнительных ограничений на packet_in.length() из спецификации P416. Не поддерживающие такой размер платформы должны обеспечивать механизмы информирования об ошибках.

В P4 Runtime имеется свойство Packet Out для отправки пакетов данных из контроллера в устройство PSA. Такие пакеты передаются в PSA как пакеты пути NFCPU. С этими пакетами не связано метаданных и они включают лишь содержимое, которое обрабатывается кодом IngressParser в программе P4 обычным способом. При этом может выполняться приведение типов полей заголовка, как описано в параграфе 4.4. Представление данных в плоскости управления и данных.

6.1.2. Исходное содержимое повторно представленных пакетов

Для пакетов RESUB в packet_in содержится то же, что и в packet_in до IngressParser для пакета, вызвавшего повторное представление данного пакета (т. е. без изменений, внесённых при входной обработке).

6.1.3. Исходное содержимое рециркулирующих пакетов

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

6.1.4. Пользовательские метаданные для всех входных пакетов

Архитектура PSA не требует инициализации пользовательских метаданных известными значениями перед отправкой пакета входному анализатору. Если пользовательская программа P4 явно инициализирует такие метаданные заранее (например, при старте анализатора), они будут проходить через анализатор в блок управления Ingress, как и следовало ожидать. Это оставлено как опция пользователя в его программе P4 и не является обязательным для всех программ P4.

Имеется два направления во входных (in) параметрах входного анализатора с пользовательскими типами resubmit_meta и recirculate_meta. Они могут применяться для передачи метаданных в повторно представляемых и рециркулированных пакетах.

Рассмотрим пакет, приходящий во входной конвейер и получающий в процессе обработки программой P4 значения стандартных полей метаданных PSA, приводящие к повторному представлению пакета (6.2. Поведение пакетов по завершении входной обработки). Во входном сборщике программа P4 задаёт значение выходного (out) параметра resubmit_meta. Это значение (оно может содержать набор полей, субструктур, заголовков и т. п.) связывается реализацией PSA с повторно представляемым пакетом и при входном анализе повторно представленного пакета становится значением входного параметра resubmit_meta для входного анализатора. Для повторно представленных пакетов значение входного параметра recirculate_meta не определено.

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

Для пакетов из порта (включая CPU) входные параметры resubmit_meta и recirculate_meta не определены.

6.2. Поведение пакетов по завершении входной обработки

Приведённый ниже псевдокод управляет копированием (клонированием) пакетов по завершении работы блока управления Ingress на основе значений некоторых полей метаданных в структуре psa_ingress_output_metadata_t. Отмеченная ниже функция platform_port_valid() принимает значение типа PortId_t и возвращает true, если это значение представляет выходной порт для реализации. Предполагается, что в некоторых реализациях PSA будут применяться битовые маски для значений PortId_t, не соответствующих никакому порту. Функция возвращает значение true для портов PSA_PORT_CPU и PSA_PORT_RECIRCULATE. Функция platform_port_valid не определена в PSA для вызова из программы P4 плоскости данных, поскольку нет известных вариантов её вызова во время обработки пакета. Она предназначена для описания поведения в псевдокоде. Предполагается, что плоскость данных создаёт таблицы с действительными номерами портов.

Комментарии «рекомендовано для записи ошибок» не являются требованием и служат рекомендацией поддерживать в реализации PSA счётчики для таких ошибок. Полезно также записывать более подробные сведения о нескольких первых ошибках, например, очередь FIFO для первых недействительных значений ostd.egress_port, вызвавших ошибку, а также другую информацию о вызвавших ошибки пакетах с отбрасыванием (tail drop) сведений при переполнении. Программы плоскости управления или драйвер смогут считывать эти сведения, а также считывать и очищать очереди FIFO, чтобы помочь разработчикам P4 при отладке кода.

struct psa_ingress_output_metadata_t {
	// В комментарии после каждого поля указано значение в момент
	// начала выполнения блока управления Ingress.
	ClassOfService_t	class_of_service;	// 0
	bool			clone;			// false
	CloneSessionId_t	clone_session_id; 	// не определено
	bool			drop;			// true
	bool			resubmit;		// false
	MulticastGroup_t	multicast_group; 	// 0
	PortId_t		egress_port;		// не определено
}

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

psa_ingress_output_metadata_t ostd;

if (ostd.clone) {
	Создаётся клон(ы) с опциями, настроенными сеансом клонирования 
	PRE, с номером ostd.clone_session_id;
} else { нет клонирования; }

if (ostd.drop) { отбрасывание пакета; }
else if (ostd.resubmit) { повторное представление пакета; }
else if (ostd.multicast_group != 0) { PRE multicast реплицирует пакет; }
else { PRE передаёт 1 копию пакета в ostd.egress_port; }

Приведённый ниже псевдокод определяет поведение, которому должна следовать реализация PSA.

psa_ingress_output_metadata_t ostd;

if (ostd.clone) {
	if (значение ostd.clone_session_id поддерживается) {
		из значений, настроенных для ostd.clone_session_id в PRE {
			cos = class_of_service
			set((egress_port[0], instance[0]), ..., (egress_port[n], instance[n])) =
				набор пар (egress_port, instance)
			trunc = truncate
			plen = packet_length_bytes
		}
		if (значение cos не поддерживается) {
			cos = 0;
			// рекомендуется записать ошибку (не поддерживается значение cos).
		}
		Для каждой пары (egress_port, instance) в наборе {
			Создаётся клон пакета и передаётся в буфер пакетов с egress_port, 
			instance и class_of_service cos, после чего начинается выходная 
			обработка. Клон будет включать лишь первые plen байтов пакета, 
			полученного входным анализатором при trunc = true и целый пакет 
			в противном случае.
		}
	} else {
		// Клон не создаётся. Рекомендуется записать ошибку, связанную с 
		// неподдерживаемым значением ostd.clone_session_id.
	}
}
// Продолжение независимо от создания клона. Приведённый ниже код не оказывает
// влияния на созданные клоны.
if (ostd.drop) {
	Пакет отбрасывается.
	return;	// Последующие операции не выполняются.
}
if (значение ostd.class_of_service не поддерживается) {
	ostd.class_of_service = 0;	// Используется принятый по умолчанию класс 0
	// Рекомендуется записать ошибку, связанную с неподдерживаемым
	// значением ostd.class_of_service.
}
if (ostd.resubmit) {
	Пакет представляется повторно, возвращаясь во входной анализатор;
	return;	// Последующие операции не выполняются.
}
if (ostd.multicast_group != 0) {
	Могут создаваться копии пакета в соответствии с конфигурацией
	плоскости управления для multicast-группы ostd.multicast_group.
	Каждая копия будут иметь одинаковое значение ostd.class_of_service.
	return;	// Последующие операции не выполняются.
}
if (platform_port_valid(ostd.egress_port)) {
	Пакет помещается в очередь для выходного порта ostd.egress_port с классом
	обслуживания ostd.class_of_service.
} else {
	Пакет отбрасывается.
	// рекомендуется записать ошибку, связанную с неподдерживаемым ostd.egress_port.
}

Всякий раз, когда приведённый выше псевдокод направляет пакет по тому или иному пути, реализация PSA может при некоторых обстоятельствах отбросить пакет вместо его передачи. Например, причиной может служить нехватка буферов или какой-либо из механизмов контроля перегрузки, такой как RED11 или AFD12. Реализациям рекомендуется поддерживать счётчики отброшенных пакетов, предпочтительно раздельные для разных причин отбрасывания, поскольку некоторые из этих причин лежат за пределами ответственности программы P4.

Реализация PSA может поддерживать множество классов обслуживания для пакетов, передаваемых в буфер. В таких случаях блок управления Ingress может назначить для поля ostd.class_of_service значение, отличное от принятого по умолчанию (0).

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

Спецификация P4 Runtime API задает для контроллера способы обнаружения числа различных классов обслуживания, поддерживаемых устройством PSA.

6.2.1. Групповая репликация

Плоскость управления может настроить для каждой multicast_group в PRE создание нужного числа копий для передачи в эту группу. Изначально каждая группа пуста и передача пакета в пустую группу ведёт к его отбрасыванию. Плоскость управления может добавлять в группу одну или множество пар (egress_port, instance), а также может удалять имеющиеся пары из группы.

Предположим, что multicast-группа содержит приведённый ниже набор пар.

(egress_port[0], instance[0]),
(egress_port[1], instance[1]),
...,
(egress_port[N-1], instance[N-1])

При отправке пакета в эту группу создаётся N копий пакета. Копия с номером i, переданная на выходную обработку, будет иметь структуру типа psa_egress_input_metadata_t с полями egress_port = egress_port[i] и instance = instance[i]. Отметим, что группа представляет собой набор пар и от реализации не требуется создавать копии в порядке, который может задать плоскость управления. Рекомендации по упорядочению пакетов в устройствах PSA приведены в Приложении F. Упорядочение пакетов.

В одной multicast-группе все пары (egress_port, instance) должны отличаться друг от друга, но разрешено иметь совпадающее значение egress_port или instance в любом числе пар. Любая пара (egress_port, instance) может входить в произвольное число multicast-групп.

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

Устройство PSA должно поддерживать для egress_port в группах значения PSA_PORT_CPU и PSA_PORT_RECIRCULATE. Копии групповых пакетов, созданные для этих портов, будут вести себя при выходной обработке как обычные индивидуальные пакеты для соответствующего порта (т. е., не будучи отброшенными, попадут в порт CPU или рециркулируются на вход).

6.3. Действия по направлению пакетов при входной обработке

Все описанные ниже действия меняют одно или несколько полей в структуре типа psa_ingress_output_metadata_t, которая является параметром inout для блока управления Ingress, и не оказывают иных непосредственных воздействий. Судьба пакетов определяется значениями всех полей структуры по завершении входной обработки, а не в момент вызова действий (см. 6.2. Поведение пакетов по завершении входной обработки).

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

6.3.1. Индивидуальные операции

Отправка пакета в порт. Значения полей в начале выходной обработки пакета показаны в столбце NU таблицы 4.

/// Изменяются выходные метаданные входной обработки для отправки 
/// пакета на выходную обработку, а затем в egress_port (в процессе
/// выходной обработки пакет может быть отброшен). Это действие не 
/// влияет на операции клонирования и повторного представления.
action send_to_port(inout psa_ingress_output_metadata_t meta,
		     in PortId_t egress_port)
{
	meta.drop = false;
	meta.multicast_group = (MulticastGroup_t) 0;
	meta.egress_port = egress_port;
}

6.3.2. Групповые операции

Отправка пакета в multicast-группу или порт. Значения полей в начале выходной обработки пакета показаны в столбце NM таблицы 4.

Параметр multicast_group является идентификатором multicast-группы. Плоскость управления должна настраивать multicast-группы с помощью отдельного механизма, например, P4 Runtime API.

/// Изменение выходных метаданных входной обработки для создания копий
/// пакета, передаваемых на выходную обработку. Это действие не влияет
/// на операции клонирования и повторного представления.
action multicast(inout psa_ingress_output_metadata_t meta,
		  in MulticastGroup_t multicast_group)
{
	meta.drop = false;
	meta.multicast_group = multicast_group;
}

6.3.3. Отбрасывание пакета

Пакет не передаётся на обычную выходную обработку.

/// Изменение выходных метаданных входной обработки для отмены
/// обычной выходной обработки. Это действие не влияет на
/// клонирование пакетов, но предотвращает повторное представление.
action ingress_drop(inout psa_ingress_output_metadata_t meta)
{
	meta.drop = true;
}

6.4. Исходные значения пакетов, обрабатываемых выходным конвейером

В таблице 4 показаны исходные значения содержимого пакетов и метаданных в начале выходной обработки.

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

NU

NM

CI2E

CE2E

packet_in

См. текст.

user_meta

См. текст.

Поля EgressParser istd (тип psa_egress_parser_input_metadata_t)

egress_port

Значение ostd.egress_port во входном пакете

Из конфигурации PRE для группы

Из конфигурации PRE для сеанса клонирования.

packet_path

NORMAL_UNICAST

NORMAL_MULTICAST

CLONE_I2E

CLONE_E2E

Выходные поля istd (psa_egress_input_metadata_t)

class_of_service

Значение ostd.class_of_service во входном пакете

Из конфигурации PRE для сеанса клонирования.

egress_port

То же значение, которое получено EgressParser (см. выше).

packet_path

То же значение, которое получено EgressParser (см. выше).

instance

0

Из конфигурации PRE для группы

Из конфигурации PRE для сеанса клонирования

egress_timestamp

Время начала обработки пакета в EgressParser. Заполняется независимо для каждой копии реплицированного пакета.

parser_error

От EgressParser. Всегда error.NoError, если при анализе не возникло ошибок.

6.4.1. Исходное содержимое обычных пакетов

Для пакетов NU и NM значение packet_in берётся из входного пакета, вызвавшего передачу данного пакета в выходной конвейер. Оно начинается с заголовков пакета, выданных входным сборщиком, за которыми следует содержимое пакета, т. е. часть, не разбираемая входным анализатором.

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

6.4.2. Исходное содержимое клонов CI2E

Для пакетов CI2E значение packet_in берётся из входного пакета, вызвавшего создание клона. Оно совпадает с содержимым packet_in входного пакета до IngressParser без изменений, внесённых входной обработкой. Поддерживается отсечка данных (payload) в пакетах.

Пакеты, клонированные во входном конвейере с сессией клонирования, где egress_port = PSA_PORT_RECIRCULATE, также относятся к этой категории.

6.4.3. Исходное содержимое клонов CE2E

Для пакетов CE2E значение packet_in берётся из входного пакета, вызвавшего создание клона. Оно начинается с заголовков пакета, выданных выходным сборщиком, за которыми следует содержимое пакета, т. е. часть, не разбираемая выходным анализатором. Поддерживается отсечка данных (payload) в пакетах.

Пакеты, клонированные в выходном конвейере с сессией клонирования, где egress_port = PSA_PORT_RECIRCULATE, также относятся к этой категории.

6.4.4. Пользовательские метаданные для всех выходных пакетов

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

Основным отличием является использование для выходных пакетов иных путей. У выходного анализатора имеется 3 входных (in) параметра — normal_meta, clone_i2e_meta и clone_e2e_meta. Для каждого из пакетов в начале выходной обработки установлен один из этих параметров, а два оставшихся не определены.

Для пакетов NU и NM устанавливается лишь параметр normal_meta, принимая значение одноимённого выходного (out) параметра входного сборщика при завершении входной обработки обычного пакета.

Для пакетов CLONE_I2E устанавливается лишь параметр clone_i2e_meta, принимая значение одноимённого выходного параметра входного сборщика при клонировании пакета.

Для пакетов CLONE_E2E устанавливается лишь параметр clone_e2e_meta, принимая значение одноимённого выходного параметра выходного сборщика при клонировании пакета.

6.4.5. Групповая адресация и клоны

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

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

  • instance — см. egress_port.

  • egress_timestamp устанавливается независимо для каждой копии. В зависимости от объёма трафика на каждом выходном порту значения могут существенно различаться у копий одного пакета.

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

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

6.5. Поведение пакетов по завершении выходной обработки

Приведённый ниже псевдокод определяет создание копий пакетов по завершении работы блока управления Egress на основе содержимого нескольких полей метаданных в структуре psa_egress_output_metadata_t.

struct psa_egress_output_metadata_t {
	// В комментариях после полей указаны начальные значения по 
	// завершении работы блока управления Egress.
	bool			clone;			// false
	CloneSessionId_t	clone_session_id; 	// не определено
	bool			drop;			// false
}

psa_egress_input_metadata_t	istd;
psa_egress_output_metadata_t	ostd;

if (ostd.clone) {
	if (значение ostd.clone_session_id поддерживается) {
		Из значений, настроенных для ostd.clone_session_id в PRE {
			cos = class_of_service
			set((egress_port[0], instance[0]), ..., (egress_port[n], instance[n])) =
				набор пар (egress_port, instance)
			trunc = truncate
			plen = packet_length_bytes
		}
		if (значение cos не поддерживается) {
			cos = 0;
			// Рекомендуется записать ошибку, связанную с
			// неподдерживаемым значением cos.
		}
		Для каждой пары (egress_port, instance) в наборе {
			Создаётся клон пакета и передаётся в буфер с полями
			egress_port, instance, class_of_service cos, после
			чего начинается выходная обработка. Клон будет включать
			не более plen начальных байтов пакета, полученного от
			выходного сборщика, при установке trunc = true и весь
			пакет в ином случае.
		}
	} else {
		// Клон не создаётся. Рекомендуется сделать запись об ошибке,
		// связанной с неподдерживаемым значением ostd.clone_session_id.
	}
}
// Продолжение не зависит от создания клона и не влияет на 
// созданные ранее клоны.
if (ostd.drop) {
	Отбрасывание пакета
	return;	// Последующие операции не выполняются.
}
// Значение istd.egress_port ниже совпадает со значением в начале 
// выходной обработки в соответствии с решением предшествующей
// входной обработки пакета (или задано конфигурацией PRE для
// сеанса клонирования независимо от создания клона на входе или
// выходе). Выходному коду не разрешается изменять его.
if (istd.egress_port == PSA_PORT_RECIRCULATE) {
	Рециркулировать пакет, возвращая его во входной анализатор;
	return;	// Последующие операции не выполняются.
}
Размещение пакета в очереди для выходного порта istd.egress_port

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

6.6. Действия по направлению пакетов при выходной обработке

6.6.1. Отбрасывание пакета

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

/// Изменяются метаданные для отмены передачи пакета вовне.
/// Эта операция не влияет на поведение клонирования.
action egress_drop(inout psa_egress_output_metadata_t meta)
{
	meta.drop = true;
}

6.7. Содержимое передаваемого в порт пакета

С пакетами NTP и NTCPU не связывается метаданных.

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

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

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

P4 Runtime имеет свойство Packet In для приёма пакетов, отправленных устройством PSA в порт PSA_PORT_CPU. С такими пакетами не связано метаданных и они включают лишь содержимое пакета, выдаваемое кодом EgressDeparser в программе P4. При этом могут выполняться некоторые преобразования полей заголовка, как описано в параграфе 4.1. Определения типов PSA.

6.8. Клонирование пакетов

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

Одним из применений клонирования является полное отображение трафика в другой порт (mirroring), т. е. обычная отправка пакетов адресату в соответствии с программой P4, сопровождаемая передачей копии пакета в другой порт, например, для системы мониторинга.

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

Логически PRE реализует механизмы копирования пакета. Клонированием управляют поля метаданных структур psa_ingress_output_metadata_t и psa_egress_output_metadata_t, имена которых начинаются с clone.

bool			clone;
CloneSessionId_t	clone_session_id;

Тег clone управляет клонированием пакета. При значении true клон пакета (пакетов) создаётся в конце конвейера. Поле clone_session_id указывает одну или несколько сессий клонирования, которые плоскость управления может настроить в PRE. Для каждой сессии клонирования плоскость управления может задать указанные ниже значения, которые следует связывать с создаваемыми сессией клонами.

/// В каждой сессии клонирования могут создаваться пары (egress_port, instance).
PortId_t	egress_port; 	/// egress_port в паре (egress_port, instance).
EgressInstance_t instance; 	/// instance в паре (egress_port, instance).

/// Конфигурация сеанса клонирования задаёт в точности 1 значение для указанных
/// ниже полей.
ClassOfService_t 	class_of_service;
bool			truncate;
PacketLength_t packet_length_bytes; /// Применяется только при truncate = true

Конфигурация набора пар (egress_port, instance) для сеанса клонирования похожа на конфигурацию пар для multicast-групп (6.2.1. Групповая репликация) в части требований и ограничений.

В качестве значения egress_port могут указываться любые порты, пригодные для обычных индивидуальных пакетов, т. е. обычные порты, PSA_PORT_CPU, PSA_PORT_RECIRCULATE. В двух последних случаях клоны будут передаваться в CPU или на рециркуляцию в конце выходной обработки как обычные индивидуальные пакеты.

Для сокращения расхода пропускной способности может применяться отсечка при клонировании пакетов с передачей лишь заданного числа начальных байтов пакета. Это может быть полезно при отправке заголовков пакетов плоскости управления, а также системам сбора данных для мониторинга трафика. Здесь термином «заголовок» обозначается просто некоторое число байтов в начале пакета, а не заголовки, определённые и анализируемые в программе P4. Если для сессии установлено значение truncate = false, выполняется клонирование пакетов целиком. В ином случае клон включает лишь первые packet_length_bytes байтов исходного пакета. Отсечка пакетов не оказывает влияния на сопровождающие пакет метаданные и размер метаданных не учитывается в packet_length_bytes. Отсечка выполняется для исходного пакета, переданного в параметре packet_in входному анализатору (для клонов из входного конвейера в выходной), или передаваемого наружу как параметр packet_out из выходного сборщика (для клонов из выходного конвейера в выходной). Реализации PSA могут поддерживать лишь ограниченный диапазон значений packet_length_bytes, например, кратный 32 байтам.

Поскольку в общем случае предполагается клонирование пакетов в CPU, каждая реализация PSA начинается с сеанса клонирования PSA_CLONE_SESSION_TO_CPU, инициализируемого парой (egress_port, instance) с egress_port = PSA_PORT_CPU и instance = 0. Для этой сессии также устанавливается class_of_service = 0 и truncate = false.

6.8.1. Примеры клонов

Ниже приведён фрагмент кода для клонирования пакетов.

header clone_i2e_metadata_t {
	bit<8> custom_tag;
	EthernetAddress srcAddr;
}
control ingress(inout headers hdr,
		 inout metadata user_meta,
		 in psa_ingress_input_metadata_t istd,
		 inout psa_ingress_output_metadata_t ostd)
{
	action do_clone (CloneSessionId_t session_id) {
		ostd.clone = true;
		ostd.clone_session_id = session_id;
		user_meta.custom_clone_id = 1;
	}
	table t {
		key = {
			user_meta.fwd_metadata.outport : exact;
		}
		actions = { do_clone; }
	}
	apply {
		t.apply();
	}
}
control IngressDeparserImpl(packet_out packet,
			      out clone_i2e_metadata_t clone_i2e_meta,
			      out empty_metadata_t resubmit_meta,
			      out metadata normal_meta,
			      inout headers hdr,
			      in metadata meta,
			      in psa_ingress_output_metadata_t istd)
{
	DeparserImpl() common_deparser;
	apply {
		// Назначение выходного параметра clone_i2e_meta должно выполняться
		// при выполнении приведённого ниже условия.
		if (psa_clone_i2e(istd)) {
			clone_i2e_meta.custom_tag = (bit<8>) meta.custom_clone_id;
			if (meta.custom_clone_id == 1) {
				clone_i2e_meta.srcAddr = hdr.ethernet.srcAddr;
			}
		}
		common_deparser.apply(packet, hdr);
	}
}

6.9. Повторное представление пакетов

Повторное представление пакетов служит для повторения их обработки во входном конвейере и выполняется в конце этого конвейера. При повторном представлении пакета завершается его обработка во входном конвейере, после чего пакет снова представляется входному анализатору без выполнения сборки (deparse). Иными словами, повторно представленный пакет имеет тот же заголовок и данные, которые были у исходного пакета, сохраняется также значение ingress_port. Значение packet_path для повторно представленного пакета меняется на RESUBMIT.

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

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

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

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

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

Реализации PSA поддерживают конфигурационный флаг resubmit для PRE, разрешающий механизм повторного представления. При установленном флаге исходный пакет представляется снова вместе с необязательными метаданными, созданными при первом прохождении. Если флаг сброшен (false), механизм повторного представления отключается и метаданные resubmit_meta не устанавливаются.

6.10. Рециркуляция пакетов

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

Вопрос рециркуляции пакета решается во время входной обработки путём его отправки в специальный порт PSA_PORT_RECIRCULATE. Сама рециркуляция происходит в конце выходного конвейера. При отправке пакета в порт рециркуляции его выходная обработка завершается (включая выходной сборщик) и пакет возвращается входному анализатору. Поле ingress_port при рециркуляции пакета получает значение PSA_PORT_RECIRCULATE, а packet_path — RECIRCULATE.

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

7. Внешние блоки PSA

7.1. Ограничения на использование внешних блоков

Все экземпляры объектов в программе P416 создаются при компиляции и могут быть организованы в дерево реализации. Корень этого дерева (T) представляет верхний уровень программы, а его потомками являются программа (пакет) PSA_Switch (см. 5. Программируемые блоки) и все внешние блоки, созданные на верхнем уровне программы. Потомками узла PSA_Switch являются пакеты и внешние блоки, переданные как параметры экземпляра PSA_Switch. На рисунке 3 показано минимально возможное дерево для программы P4, использующей архитектуру PSA.


Рисунок 3. Дерево минимального экземпляра PSA.

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

Каждый экземпляр, узел которого является потомком узла Ingress в этом дереве, относится к экземпляру Ingress. (аналогично для других входных или выходных анализаторов и элементов управления). Все прочие экземпляры относятся к верхнему уровню.

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

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

 

Тип внешнего блока

Блоки, могущие создавать и вызывать extern

ActionProfile

Ingress, Egress

ActionSelector

Ingress, Egress

Checksum

IngressParser, EgressParser, IngressDeparser, EgressDeparser

Counter

Ingress, Egress

Digest

IngressDeparser

DirectCounter

Ingress, Egress

DirectMeter

Ingress, Egress

Hash

Ingress, Egress

InternetChecksum

IngressParser, EgressParser, IngressDeparser, EgressDeparser

Meter

Ingress, Egress

Random

Ingress, Egress

Register

Ingress, Egress

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

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

Вызовы метода emit для типа packet_out могут в PSA размещаться лишь в блоках сборщиков, поскольку экземпляры packet_out видимы лишь в таких элементах управления. Точно так же любые методы для типа packet_in (например, extract и advance) могут вызываться в программах PSA лишь из анализаторов. P416 позволяет вызовать метод verify лишь синтаксическим анализаторам для всех программ P416, независимо от их предназначенности для PSA.

  • Предполагается, что высокопроизводительные реализации PSA не могут обновлять один и тот же экземпляр extern из Ingress и Egress, а также из нескольких анализаторов или элементов управления, заданных в PSA.

  • В устройствах с несколькими конвейерами на деле имеется множество экземпляров входных и выходных конвейеров. Основной причиной создания множества конвейеров является практическая сложность доступа к одному объекту с поддержкой состояний (таблица, счётчик и т. п.) со скоростью, превышающей скорость пакетов в одном конвейере. Поэтому к объектам с поддержкой состояния следует обращаться лишь из одного конвейера в устройстве (см. Приложение E. Устройства PSA с несколькими конвейерами).

7.2. Свойства таблиц PSA

В таблице 6 указаны все свойства таблиц P4, определённые PSA, которые не включены в базовую спецификацию P416.

Таблица 6. Свойства таблиц PSA.

Свойство

Тип

Описание

psa_direct_counter

Имя одного экземпляра DirectCounter

7.7.3. Прямой счётчик

psa_direct_meter

Имя одного экземпляра DirectMeter

7.8. Измерители

psa_implementation

Имя одного экземпляра ActionProfile или ActionSelector

7.11. Профили действий, 7.12. Селекторы действий

psa_empty_group_action

action

7.12. Селекторы действий

psa_idle_timeout

PSA_IdleTimeout_t

7.2.1. Уведомление о тайм-ауте для записи таблицы

Реализации PSA недопустимо поддерживать оба свойства psa_implementation и psa_direct_counter в одной таблице. То же относится к одновременной поддержке свойств psa_implementation и psa_direct_meter, а также psa_implementation и psa_idle_timeout.

Реализация PSA должна поддерживать таблицы, имеющие оба свойства psa_direct_counter и psa_direct_meter.

7.2.1. Уведомление о тайм-ауте для записи таблицы

PSA использует свойство psa_idle_timeout для того, чтобы реализация таблицы могла передавать уведомления от устройства PSA по истечении заданного времени с момента последнего совпадения с записью таблицы. Это поле может принимать значение NO_TIMEOUT или NOTIFY_CONTROL. NO_TIMEOUT отключает уведомления и применяется по умолчанию, если свойство таблицы не задано. NOTIFY_CONTROL включает уведомления и реализация PSA будет генерировать API для плоскости управления, позволяющий установить для записей таблицы срок действия (TTL), по истечении которого устройство будет передавать уведомление, если для записи не было найдено ни одного совпадения при поиске в таблице. Частота и режим генерации и доставки уведомлений плоскости управления определяются конфигурационными параметрами, задаваемыми API плоскости управления. Например,

enum PSA_IdleTimeout_t {
	NO_TIMEOUT,
	NOTIFY_CONTROL
}

table t {
	action a1 () { ... }
	action a2 () { ... }
	key = { hdr.f1: exact; }
	actions = { a1; a2; }
	default_action = a2;
	psa_idle_timeout = PSA_IdleTimeout_t.NOTIFY_CONTROL;
}

Для значений TTL и уведомлений имеется ряд ограничений, приведённых ниже.

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

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

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

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

7.3. Блок репликации пакетов

Внешний блок PacketReplicationEngine (PRE) является частью конвейера PSA, которая не программируется кодом P4.

Хотя PRE невозможно программировать с помощью P4, этот блок можно настраивать с использованием API плоскости управления (например, путём настройки multicast-групп и сессий клонирования). Для каждого пакета программа P4 обычно будет устанавливать значения внутренних метаданных в таких структурах, как psa_ingress_output_metadata_t и psa_egress_output_metadata_t, которые управляют операциями PRE над пакетом. В файле psa.p4 определены некоторые действия, помогающие установить значения этих полей в наиболее распространённых ситуациях, описанных в параграфах 6.3. Действия по направлению пакетов при входной обработке и 6.6. Действия по направлению пакетов при выходной обработке.

Экземпляр внешнего блока PRE должен создаваться однократно при создании экземпляра PSA_Switch. Определения из файла psa.p4 даны в конце раздела 5. Программируемые блоки. Ниже приведён пример создания экземпляров, включая 1 экземпляр PacketReplicationEngine и 1 экземпляр BufferingQueueingEngine при создании экземпляра PSA_Switch.

IngressPipeline(IngressParserImpl(),
		 ingress(),
		 IngressDeparserImpl()) ip;

EgressPipeline(EgressParserImpl(),
		egress(),
		EgressDeparserImpl())ep;

PSA_Switch(ip, PacketReplicationEngine(), ep, BufferingQueueingEngine()) main;

7.4. Блок пакетных очередей

Внешний блок BufferingQueueingEngine (BQE) представляет другую часть конвейера PSA (после выходной обработки), которая не программируется кодом P4. Хотя BQE невозможно программировать с использованием P4, этот блок можно настраивать напрямую через API плоскости управления или путём установки внутренних метаданных.

Экземпляр внешнего блока должен создаваться однократно, как и PRE. Дополнительное обсуждение и пример кода представлены в параграфе 7.3. Блок репликации пакетов.

7.5. Хэширование

Ниже перечислены поддерживаемые алгоритмы хэширования.

enum PSA_HashAlgorithm_t {
	IDENTITY,
	CRC32,
	CRC32_CUSTOM,
	CRC16,
	CRC16_CUSTOM,
	ONES_COMPLEMENT16,	/// 16-битовая контрольная сумма с дополнением до 1,
				/// применяемая в заголовках IPv4, TCP и UDP.
	TARGET_DEFAULT		/// Определяется реализацией платформы.
}

7.5.1. Хэш-функция

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

parser P() {
	Hash<bit<16>>(PSA_HashAlgorithm_t.CRC16) h;
	bit<16> hash_value = h.get_hash(buffer);
}

Параметры хэш-функции представлены ниже.

  • algo — используемый для расчёта алгоритм (7.5. Хэширование).

  • O — тип возвращаемого функцией значения.

extern Hash<O> {
	/// Конструктор
	Hash(PSA_HashAlgorithm_t algo);

	/// Расчёт хэш-значения для данных.
	/// @param data - данные для хэширования.
	/// @return - значение хэш-функции.
	O get_hash<D>(in D data);

	/// Расчёт хэш-значения для data с модулем max и прибавлением base.
	/// @param base - минимальное возвращаемое значение.
	/// @param data - данные для хэширования.
	/// @param max - хэш-значение делится по модулю на max.
	/// Реализация может ограничивать максимальное поддерживаемое значение,
	/// например, величиной 32 или 256 а также может разрешать применение
	/// лишь степеней 2. Разработчикам P4 следует выбирать такие значения
	/// модуля, которые обеспечат требуемую переносимость.
	/// @return (base + (h % max)), где h - хэш-значение.
	O get_hash<T, D>(in T base, in D data, in T max);
}

7.6. Контрольные суммы

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

7.6.1. Базовая контрольная сумма

Базовый блок расчёта контрольных сумм в PSA поддерживает произвольные алгоритмы хэширования и принимает 1 параметр.

  • W — размер контрольной суммы в битах.

extern Checksum<W> {
	/// Конструктор
	Checksum(PSA_HashAlgorithm_t hash);
	/// Сброс внутреннего состояния и подготовка блока к расчётам. Каждый
	/// экземпляр объекта Checksum инициализируется автоматически, как будто
	/// для него вызвана функция clear(). Инициализация выполняется при 
	/// создании каждого экземпляра, т. е. при каждом применении анализатора
	/// или элемента управления с объектом Checksum. Все состояния 
	/// поддерживаются объектом Checksum независимо для каждого пакета.
	void clear();
	/// Добавление данных в контрольную сумму.
	void update<T>(in T data);
	/// Получение контрольной суммы после добавления (но без удаления) данных
	/// с последнего вызова clear.
	W	get();
}

7.6.2. Инкрементная контрольная сумма

PSA поддерживает также инкрементальный расчёт контрольных сумм, включающий дополнительный метод исключения данных, учтённых в предшествующем расчёте. Контрольные суммы рассчитываются по алгоритму хеширования ONES_COMPLEMENT16, используемому протоколами IPv4, TCP и UDP (см. RFC 1624 и Приложение B. Реализация внешнего блока InternetChecksum).

// Контрольные суммы на основе алгоритма ONES_COMPLEMENT16 применяются в IPv4, 
// TCP и UDP. Поддерживается инкрементное обновление с помощью метода subtract.
// См. IETF RFC 1624.
extern InternetChecksum {
	/// Конструктор
	InternetChecksum();

	/// Сброс внутреннего состояния и подготовка блока к расчётам. Каждый
	/// экземпляр объекта InternetChecksum инициализируется автоматически, 
	/// как будто для него вызвана функция clear(). Инициализация происходит 
	/// при создании каждого экземпляра, т. е. при каждом применении анализатора
	/// или элемента управления с этим объектом. Все состояния 
	/// поддерживаются объектом Checksum независимо для каждого пакета.
	void clear();

	/// Добавление данных в контрольную сумму. Размер data должен быть кратным 16.
	void add<T>(in T data);

	/// Исключение data из имеющейся контрольной суммы. Размер data должен быть
	/// кратным 16.
	void subtract<T>(in T data);

	/// Получение контрольной суммы после добавления (но без удаления) данных
	/// с последнего вызова clear.
	bit<16> get();

	/// Получение текущего статуса расчёта контрольной суммы. Возвращаемое 
	/// значение предназначено лишь для будущих вызовов метода set_state.
	bit<16> get_state();

	/// Восстанавливает состояние экземпляра InternetChecksum в одно из ранее
	/// возвращённых методом get_state. Это состояние может относиться к тому же
	/// или иному экземпляру внешнего блока InternetChecksum.
	void set_state(in bit<16> checksum_state);
}

7.6.3. Примеры InternetChecksum

Приведённый ниже фрагмент программы показывает использование внешнего блока InternetChecksum для проверки поля контрольной суммы в разобранном заголовке IPv4 и возврата ошибки анализатора при некорректном значении. Показаны также ошибки анализатора в блоке управления Ingress и отбрасывание пакетов в случае ошибки. Программы PSA могут обрабатывать пакеты с ошибками иначе, чем показано в примере, и этот отдано на откуп разработчикам P4.

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

// Определение дополнительных кодов ошибок для пакетов с некорректной 
// контрольной суммой заголовка IPv4.
error {
	UnhandledIPv4Options,
	BadIPv4HeaderChecksum
}

typedef bit<32> PacketCounter_t;
typedef bit<8> ErrorIndex_t;

const bit<9> NUM_ERRORS = 256;

parser IngressParserImpl(packet_in buffer,
			   out headers hdr,
			   inout metadata user_meta,
			   in psa_ingress_parser_input_metadata_t istd,
			   in empty_metadata_t resubmit_meta,
			   in empty_metadata_t recirculate_meta)
{
	InternetChecksum() ck;
	state start {
		buffer.extract(hdr.ethernet);
		transition select(hdr.ethernet.etherType) {
			0x0800: parse_ipv4;
			default: accept;
		}
	}
	state parse_ipv4 {
		buffer.extract(hdr.ipv4);
		// TBD. Было бы хорошо расширить этот пример для демонстрации
		// проверки контрольной суммы в заголовках IPv4 с опциями, но 
		// в данном примере не обрабатываются такие пакеты.
		verify(hdr.ipv4.ihl == 5, error.UnhandledIPv4Options);
		ck.clear();
		ck.add({
			/* 16-битовое слово 0	*/ hdr.ipv4.version, hdr.ipv4.ihl, hdr.ipv4.diffserv,
			/* 16-битовое слово 1	*/ hdr.ipv4.totalLen,
			/* 16-битовое слово 2	*/ hdr.ipv4.identification,
			/* 16-битовое слово 3	*/ hdr.ipv4.flags, hdr.ipv4.fragOffset,
			/* 16-битовое слово 4	*/ hdr.ipv4.ttl, hdr.ipv4.protocol,
			/* 16-битовое слово 5 пропуск hdr.ipv4.hdrChecksum, */
			/* 16-битовые слова 6-7 	*/ hdr.ipv4.srcAddr,
			/* 16-битовые слова 8-9 	*/ hdr.ipv4.dstAddr
			});
		// Оператор verify, приведённый ниже, будет переводить анализатор
		// в состояние reject, незамедлительно прерывая анализ при ошибке
		// в контрольной сумме заголовка IPv4. При этом записывается ошибка
		// error.BadIPv4HeaderChecksum, что будет доступно в поле метаданных
		// блока управления Ingress.
		verify(ck.get() == hdr.ipv4.hdrChecksum,
			error.BadIPv4HeaderChecksum);
		transition select(hdr.ipv4.protocol) {
			6: parse_tcp;
			default: accept;
		}
	}
	state parse_tcp {
		buffer.extract(hdr.tcp);
		transition accept;
	}
}

control ingress(inout headers hdr,
		 inout metadata user_meta,
		 in psa_ingress_input_metadata_t istd,
		 inout psa_ingress_output_metadata_t ostd)
{
	// Таблица parser_error_count_and_convert, приведённая ниже, показывает
	// один из способов учёта числа разных ошибок анализа. Хотя в примере
	// это не используется, показано также преобразование кода ошибки в 
	// уникальное значение вектора битов error_idx, который может быть 
	// полезен для кодирования ошибок в заголовке пакета (например, при 
	// отправке CPU).

	DirectCounter<PacketCounter_t>(PSA_CounterType_t.PACKETS) parser_error_counts;
	ErrorIndex_t error_idx;

	action set_error_idx (ErrorIndex_t idx) {
		error_idx = idx;
		parser_error_counts.count();
	}
	table parser_error_count_and_convert {
		key = {
			istd.parser_error : exact;
		}
		actions = {
			set_error_idx;
		}
		default_action = set_error_idx(0);
		const entries = {
			error.NoError			: set_error_idx(1);
			error.PacketTooShort		: set_error_idx(2);
			error.NoMatch			: set_error_idx(3);
			error.StackOutOfBounds		: set_error_idx(4);
			error.HeaderTooShort		: set_error_idx(5);
			error.ParserTimeout		: set_error_idx(6);
			error.BadIPv4HeaderChecksum 	: set_error_idx(7);
			error.UnhandledIPv4Options 	: set_error_idx(8);
		}
		psa_direct_counter = parser_error_counts;
	}
	apply {
		if (istd.parser_error != error.NoError) {
			// Пример кода, учитывающего каждый тип ошибок анализатора.
			parser_error_count_and_convert.apply();
			ingress_drop(ostd);
			exit;
		}
		// Здесь выполняется обычная обработка пакета.
	}
}

Ниже приведён фрагмент программы, показывающий использование внешнего блока InternetChecksum для расчёта и заполнения поля контрольной суммы IPv4 в блоке сборщика. В этом примере контрольная сумма обновляется и результат будет корректным независимо от изменений полей заголовка IPv4 в предшествующем блоке управления Ingress (или Egress).

control EgressDeparserImpl(packet_out packet,
			     out empty_metadata_t clone_e2e_meta,
			     out empty_metadata_t recirculate_meta,
			     inout headers hdr,
			     in metadata meta,
			     in psa_egress_output_metadata_t istd,
			     in psa_egress_deparser_input_metadata_t edstd)
{
	InternetChecksum() ck;
	apply {
		ck.clear();
		ck.add({
			/* 16-битовое слово 0	*/ hdr.ipv4.version, hdr.ipv4.ihl, hdr.ipv4.diffserv,
			/* 16-битовое слово 1	*/ hdr.ipv4.totalLen,
			/* 16-битовое слово 2	*/ hdr.ipv4.identification,
			/* 16-битовое слово 3	*/ hdr.ipv4.flags, hdr.ipv4.fragOffset,
			/* 16-битовое слово 4	*/ hdr.ipv4.ttl, hdr.ipv4.protocol,
			/* 16-битовое слово 5 пропуск hdr.ipv4.hdrChecksum, */
			/* 16-битовые слова 6-7 	*/ hdr.ipv4.srcAddr,
			/* 16-битовые слова 8-9 	*/ hdr.ipv4.dstAddr
			});
		hdr.ipv4.hdrChecksum = ck.get();
		packet.emit(hdr.ethernet);
		packet.emit(hdr.ipv4);
		packet.emit(hdr.tcp);
	}
}

В качестве финального примера показано использование InternetChecksum для инкрементного расчёта контрольной суммы заголовка TCP. Напомним, что контрольная сумма TCP рассчитывается для всего пакета, включая данные (payload). Поскольку тело пакета недоступно реализации PSA, предполагается, что контрольная сумма TCP для исходного пакета корректна и значение обновляется вызовом методов subtract и add для всех полей, изменённых программой. Например, блок управления Ingress в приведённой ниже программе меняет адрес отправителя IPv4, записывая исходный адрес в поле метаданных.

control ingress(inout headers hdr,
		 inout metadata user_meta,
		 in psa_ingress_input_metadata_t istd,
		 inout psa_ingress_output_metadata_t ostd) {
	action drop() {
		ingress_drop(ostd);
	}
	action forward(PortId_t port, bit<32> srcAddr) {
		user_meta.fwd_metadata.old_srcAddr = hdr.ipv4.srcAddr;
		hdr.ipv4.srcAddr = srcAddr;
		send_to_port(ostd, port);
	}
	table route {
		key = { hdr.ipv4.dstAddr : lpm; }
		actions = {
			forward;
			drop;
		}
	}
	apply {
		if(hdr.ipv4.isValid()) {
			route.apply();
		}
	}
}

Сборщик обновляет контрольную сумму IPv4, как показано выше, затем рассчитывает контрольную сумму TCP.

control EgressDeparserImpl(packet_out packet,
			     out empty_metadata_t clone_e2e_meta,
			     out empty_metadata_t recirculate_meta,
			     inout headers hdr,
			     in metadata user_meta,
			     in psa_egress_output_metadata_t istd,
			     in psa_egress_deparser_input_metadata_t edstd)
{
	InternetChecksum() ck;
	apply {
		// Обновление контрольной суммы IPv4. Этот вызов clear() 
		// можно удалить, поскольку экземпляр InternetCheckum 
		// автоматически очищается для каждого пакета.
		ck.clear();
		ck.add({
			/* 16-битовое слово 0	*/ hdr.ipv4.version, hdr.ipv4.ihl, hdr.ipv4.diffserv,
			/* 16-битовое слово 1	*/ hdr.ipv4.totalLen,
			/* 16-битовое слово 2	*/ hdr.ipv4.identification,
			/* 16-битовое слово 3	*/ hdr.ipv4.flags, hdr.ipv4.fragOffset,
			/* 16-битовое слово 4	*/ hdr.ipv4.ttl, hdr.ipv4.protocol,
			/* 16-битовое слово 5 пропуск hdr.ipv4.hdrChecksum, */
			/* 16-битовые слова 6-7 	*/ hdr.ipv4.srcAddr,
			/* 16-битовые слова 8-9 	*/ hdr.ipv4.dstAddr
			});
		hdr.ipv4.hdrChecksum = ck.get();
		// Обновление контрольной суммы TCP. Этот вызов clear() нужен, 
		// поскольку используется тот же экземпляр ck для того же 
		// пакета. Если применить взамен другой экземпляр 
		// InternetChecksum вместо ck, вызов clear() не нужен.
		ck.clear();
		// Вычитание исходной контрольной суммы TCP
		ck.subtract(hdr.tcp.checksum);
		// Исключение исходного адреса отправителя IPv4, являющегося
		// частью псевдозаголовка TCP для расчёта контрольной суммы 
		// TCP (см. RFC 793), затем учёт нового адреса отправителя
		// отправителя IPv4.
		ck.subtract(user_meta.fwd_metadata.old_srcAddr);
		ck.add(hdr.ipv4.srcAddr);
		hdr.tcp.checksum = ck.get();
		packet.emit(hdr.ethernet);
		packet.emit(hdr.ipv4);
		packet.emit(hdr.tcp);
	}
}

7.7. Счётчики

Счётчики обеспечивают механизм сбора статистики и плоскость управления может считывать значения счётчиков, а программам P4 разрешено лишь обновлять (без считывания) показания счётчиков. Если нужно реализовать свойства, включающие порядковые номера пакетов, для этого следует применять, например, регистры (7.9. Регистры).

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

  • Число независимо обновляемых значений счётчиков:

    • один экземпляр прямого счётчика всегда содержит столько независимых значений, сколько записей имеется в таблице, связанной с этим счётчиком;

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

  • Обновление значений счётчиков в программе P4:

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

    • для индексированных счётчиков метод count можно вызывать из любого места программы P4, где разрешены вызовы внешних объектов (например, в действии или напрямую в блоке apply элемента управления) и при каждом вызове метода должен указываться индекс обновляемого счётчика.

Счётчики предназначены для учёта пакетов или байтов, а также комбинации тех и других (PACKETS_AND_BYTES). Счётчики байтов всегда увеличиваются на размер пакета, но учитываемые в размере поля могут отличаться в разных реализациях PSA. Например, одна реализация может использовать размер кадра Ethernet, включая заголовок Ethernet и байты FCS при получении пакета физическим портом, а другая — не включать байты FCS в размер пакета. Каждой реализации PSA следует указывать используемые для счётчиков байты размер пакетов.

Если нужен подсчёт других величин или более точный учёт размера пакетов в счётчиках байтов, можно воспользоваться для этого регистрами (7.9. Регистры).

7.7.1. Типы счётчиков

enum PSA_CounterType_t {
	PACKETS,
	BYTES,
	PACKETS_AND_BYTES
}

7.7.2. Непрямой счётчик

/// Непрямой счётчик с n_counters независимых значений, где каждое
/// значение имеет в плоскости данных размер, заданный типом W.

extern Counter<W, S> {
	Counter(bit<32> n_counters, PSA_CounterType_t type);
	void count(in S index);
	
	/*
	/// API плоскости управления использует 64-битовые значения счётчиков. 
	/// Это не отражает размеры счётчиков в плоскости данных.
	/// Предполагается, что программы плоскости управления периодически
	/// считывают значения счётчиков плоскости данных и собирают их в
	/// более крупных счётчиках, которые позволяют учёт в течение 
	/// продолжительного времени без переполнения. 64-битовые счётчики
	/// байтов при скорости портов 100 Гбит/с будут переполняться 
	/// примерно через 46 лет.
	@ControlPlaneAPI
	{
		bit<64> read		(in S index);
		bit<64> sync_read	(in S index);
		void set		(in S index, in bit<64> seed);
		void reset		(in S index);
		void start		(in S index);
		void stop		(in S index);
	}
	*/
}

Псевдокод внешнего блока Counter приведён в Приложении C. Пример реализации внешнего блока Counter.

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

7.7.3. Прямой счётчик

extern DirectCounter<W> {
	DirectCounter(PSA_CounterType_t type);
	void count();

	/*
	@ControlPlaneAPI
	{
		W	read<W>		(in TableEntry key);
		W	sync_read<W>	(in TableEntry key);
		void 	set		(in TableEntry key, in W seed);
		void 	reset		(in TableEntry key);
		void 	start		(in TableEntry key);
		void 	stop		(in TableEntry key);
	}
	*/
}

Экземпляр DirectCounter должен присутствовать как значение атрибута таблицы psa_direct_counter не более чем в 1 таблице, которую называют владельцем экземпляра DirectCounter. Вызов метода count для экземпляра DirectCounter извне владельца является ошибкой.

Значение счётчика, обновлённое вызовом count, всегда связано с совпадающей записью таблицы.

Действию таблицы-владельца не требуется иметь вызовы метода count для всех экземпляров DirectCounter, которыми владеет таблица. Нужно использовать явный вызов метода count() для DirectCounter, чтобы обновить счётчик.

Реализация внешнего блока DirectCounter практически совпадает с реализацией Counter. Отсутствие индекса как параметра метода count позволяет исключить проверку корректности значения индекса.

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

Экземпляр DirectCounter должен иметь связанное с таблицей-владельцем значение счётчика, которое обновляется при выполнении принятого по умолчанию действия в случае отсутствия совпадений при поиске в таблице. Если таблица не имеет принятого по умолчанию действия, при отсутствии совпадений (miss) никакие из связанных с таблицей счётчиков не обновляются. Принятым по умолчанию действием таблицы считается действие, заданное в программе P4 для свойства таблицы default_action или явно назначенное для таблицы плоскостью управления. В остальных случаях у таблицы не будет используемого по умолчанию действия.

7.7.4. Пример использования счётчиков

Приведённый ниже фрагмент программы P4 демонстрирует создание экземпляров и обновление значений для внешних блоков Counter и DirectCounter.

typedef bit<48> ByteCounter_t;
typedef bit<32> PacketCounter_t;
typedef bit<80> PacketByteCounter_t;

const bit<32> NUM_PORTS = 512;

struct headers {
	ethernet_t	ethernet;
	ipv4_t		ipv4;
}

control ingress(inout headers hdr,
		 inout metadata user_meta,
		 in psa_ingress_input_metadata_t istd,
		 inout psa_ingress_output_metadata_t ostd)
{
	Counter<ByteCounter_t, PortId_t>(NUM_PORTS, PSA_CounterType_t.BYTES)
		port_bytes_in;
	DirectCounter<PacketByteCounter_t>(PSA_CounterType_t.PACKETS_AND_BYTES)
		per_prefix_pkt_byte_count;
	action next_hop(PortId_t oport) {
		per_prefix_pkt_byte_count.count();
		send_to_port(ostd, oport);
	}
	action default_route_drop() {
		per_prefix_pkt_byte_count.count();
		ingress_drop(ostd);
	}
	table ipv4_da_lpm {
		key = { hdr.ipv4.dstAddr: lpm; }
		actions = {
			next_hop;
			default_route_drop;
		}
	default_action = default_route_drop;
	// Таблица ipv4_da_lpm владеет этим экземпляром DirectCounter.
	psa_direct_counter = per_prefix_pkt_byte_count;
} apply {
	port_bytes_in.count(istd.ingress_port);
	if (hdr.ipv4.isValid()) {
	ipv4_da_lpm.apply();
}

control egress(inout headers hdr,
		inout metadata user_meta,
		in psa_egress_input_metadata_t istd,
		inout psa_egress_output_metadata_t ostd)
{
	Counter<ByteCounter_t, PortId_t>(NUM_PORTS, PSA_CounterType_t.BYTES)
		port_bytes_out;
	apply {
		// Это обновление выполняется на выходе, поскольку групповая
		// репликация выполняется до выходной обработки. В результате
		// обновление будет выполняться для каждой копии.
		port_bytes_out.count(istd.egress_port);
	}
}

7.8. Измерители

Измерители (RFC 2698) обеспечивают более сложные механизмы сбора статистики пакетов по сравнению со счётчиками. Их чаще всего применяют для маркировки или отбрасывания пакетов, для которых скорость (в пакетах или битах) превышает среднее значение (в пакетах или битах). Маркировка пакета означает изменение одного или нескольких параметров качества обслуживания в заголовках пакетов, таких как 802.1Q PCP15 или DSCP16 в байте типа обслуживания IPv4 или IPv6. Заданные в PSA измерители являются «трёхцветными».

От измерителей PSA не требуется выполнение действий по отбрасыванию или маркировке и они не выполняют таких действий автоматически. Измерители сохраняют и обновляют состояние при вызове метода execute(), возвращая значение GREEN (соответствие), YELLOW (избыток) или RED (нарушение). Условия возврата того или иного значения описаны в RFC 2698. Программа P4 отвечает за проверку возвращаемых значений и изменение поведения пакетов в соответствии с результатом. Неинициализированному измерителю следует возвращать значение GREEN (в соответствии со спецификацией P4 Runtime).

В RFC 2698 рассмотрены осведомленные о цветах (color aware) и «слепые» (color blind) варианты измерителей. Внешние блоки Meter и DirectMeter реализуют оба варианта. Единственным различием является метод обновления, как отмечено в комментариях к приведённому ниже коду.

Подобно счётчикам, измерители делятся на прямые и индексированные. Непрямые измерители указываются индексом, а прямые связаны с записями таблиц и обновляются при совпадении записи с ключом поиска. Из API плоскости управления доступ к прямым измерителям выполняет P4 Runtime по записи таблицы в качестве ключа.

Между счётчиками и измерителями имеется много общего, как показано ниже.

  • Число независимых обновляемых значений.

  • Точки возможного обновления значений из программы P4.

  • Для измерителей типа BYTES при обновлении используется размер пакета в соответствии с реализацией PSA (подход реализаций может различаться).

У прямых счётчиков и измерителей имеется дополнительное сходство, описанное ниже.

  • Метод execute для DirectMeter должен вызываться из действия, вызванного таблицей, которая владеет экземпляром DirectMeter. Действия не обязаны вызывать метод execute, но могут делать это.

  • Должно быть состояние измерителя для экземпляра DirectMeter, обновляемое при отсутствии совпадений (miss) в таблице-владельце. Как и для DirectCounter, это состояние требуется лишь в таблицах, включающих принятое по умолчанию действие.

Атрибутом таблицы, указывающим, что она владеет экземпляром DirectMeter, является psa_direct_meter. Значением этого атрибута таблицы является имя экземпляра DirectMeter.

Если для измерителя вызывается execute(idx) со значением idx, выходящим за пределы диапазона индексов, состояние измерителя не меняется (как и для счётчиков). Вызов execute возвращает значение PSA_MeterColor_t, но оно не определено. Программе, желающие обеспечить предсказуемое поведение, должны предотвращать влияние таких значений на выходные пакеты и возникновение иных побочных эффектов. В приведённом ниже примере кода показан один из способов обеспечить предсказуемое поведение. Отметим, что неопределённостей в поведении не возникает, если значение n_meters для индексированного измерителя равно 2W, а использованный для создания измерителя тип S представляет собой bit<W> (в таких случаях индекс просто не выходит за границы диапазона).

#define METER1_SIZE 100
Meter<bit<7>>(METER1_SIZE, PSA_MeterType_t.BYTES) meter1;
bit<7> idx;
PSA_MeterColor_t color1;

// ... дополнительный код ...

if (idx < METER1_SIZE) {
	color1 = meter1.execute(idx, PSA_MeterColor_t.GREEN);
} else {
	// Если idx выходит за границы диапазона, используется принятое
	// по умолчанию значение для color1. Можно также сохранять флаг
	// ошибки в поле метаданных.
	color1 = PSA_MeterColor_t.RED;
}

Для любой реализации диапазон значений Peak Burst Size и Committed Burst Size является конечным и в документации следует указывать поддерживаемые размеры пиков. Если реализация выполняет внутреннюю отсечку запрашиваемых плоскостью управления значений, это также следует указать в документации. В качестве максимального размера пиков рекомендуется устанавливать значение не меньше числа байтов, передаваемых с максимальной скоростью порта в течение 100 мсек.

Реализации могут также ограничивать диапазон и точность значений Peak Information Rate и Committed Information Rate. В документации следует указывать максимальное поддерживаемое значение, а также точность задания значений. Рекомендуется ограничивать максимально поддерживаемую скорость значением не меньше скорости наиболее быстрого порта, а фактическую скорость устанавливать с отклонением в пределах 0,1% от запрошенной.

7.8.1. Типы измерителей

enum PSA_MeterType_t {
	PACKETS,
	BYTES
}

7.8.2. Цвета для измерителей

enum PSA_MeterColor_t { RED, GREEN, YELLOW }

7.8.3. Непрямой измеритель

// Индексированный измеритель с n_meters независимых значений.
extern Meter<S> {
	Meter(bit<32> n_meters, PSA_MeterType_t type);

	// Вызывается для осведомленных о цветах измерителей (см. RFC 2698).
	// Цвет пакета перед вызовом метода указывается параметром color.
	PSA_MeterColor_t execute(in S index, in PSA_MeterColor_t color);

	// Вызывается для обновления «слепого» измерителя (см. RFC 2698).
	// Метод можно реализовать вызовом execute(index, MeterColor_t.GREEN), 
	// обеспечивающим такое же поведение.
	PSA_MeterColor_t execute(in S index);

	/*
	@ControlPlaneAPI
	{
		reset(in MeterColor_t color);
		setParams(in S index, in MeterConfig config);
		getParams(in S index, out MeterConfig config);
	}
	*/
}

7.8.4. Прямой измеритель

extern DirectMeter {
	DirectMeter(PSA_MeterType_t type);
	// См. описание методов для Meter.
	PSA_MeterColor_t execute(in PSA_MeterColor_t color);
	PSA_MeterColor_t execute();

	/*
	@ControlPlaneAPI
	{
		reset(in TableEntry entry, in MeterColor_t color);
		void setConfig(in TableEntry entry, in MeterConfig config);
		void getConfig(in TableEntry entry, out MeterConfig config);
	}
	*/
}

7.9. Регистры

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

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

Для экземпляров Register имеется два разных конструктора. Значения, возвращаемое для неициализированного варианта, будет неопределённым, а для инициализированного — заданным параметром конструктора initial_value.

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

extern Register<T, S> {
	/// Создание массива из <size> регистров. Начальные значения не 
	/// определены.
	Register(bit<32> size);
	/// Инициализация массива из <size> регистров с установкой 
	/// начального значения initial_value.
	Register(bit<32> size, T initial_value);

	T	read 	(in S index);
	void 	write 	(in S index, in T value);

	/*
	@ControlPlaneAPI
	{
		T	read<T>	(in S index);
		void 	set	(in S index, in T seed);
		void 	reset	(in S index);
	}
	*/
}

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

const bit<32> NUM_PORTS = 512;

// Более удобно применять для представления комбинированного счётчика 
// пакетов и байтов, а также других комбинированных значений тип struct 
// и хранить значения в экземпляре Register. Однако версия p4test от
// 10.02.2018 не позволяет возвращать тип struct из вызовов, подобных
// Register.read(). 
// Этот вопрос обсуждается на Github (см. 
// https://github.com/p4lang/p4-spec/issues/383) 

#define PACKET_COUNT_WIDTH 32
#define BYTE_COUNT_WIDTH 48
//#define PACKET_BYTE_COUNT_WIDTH (PACKET_COUNT_WIDTH + BYTE_COUNT_WIDTH)
#define PACKET_BYTE_COUNT_WIDTH 80

#define PACKET_COUNT_RANGE (PACKET_BYTE_COUNT_WIDTH-1):BYTE_COUNT_WIDTH
#define BYTE_COUNT_RANGE (BYTE_COUNT_WIDTH-1):0

typedef bit<PACKET_BYTE_COUNT_WIDTH> PacketByteCountState_t;

action update_pkt_ip_byte_count (inout PacketByteCountState_t s,
				   in bit<16> ip_length_bytes)
{
	s[PACKET_COUNT_RANGE] = s[PACKET_COUNT_RANGE] + 1;
	s[BYTE_COUNT_RANGE] = (s[BYTE_COUNT_RANGE] +
		(bit<BYTE_COUNT_WIDTH>) ip_length_bytes);
}
control ingress(inout headers hdr,
		 inout metadata user_meta,
		 in psa_ingress_input_metadata_t istd,
		 inout psa_ingress_output_metadata_t ostd)
{
	Register<PacketByteCountState_t, PortId_t>(NUM_PORTS)
		port_pkt_ip_bytes_in;
	apply {
		ostd.egress_port = (PortId_t) 0;
		if (hdr.ipv4.isValid()) {
			@atomic {
				PacketByteCountState_t tmp;
				tmp = port_pkt_ip_bytes_in.read(istd.ingress_port);
				update_pkt_ip_byte_count(tmp, hdr.ipv4.totalLen);
				port_pkt_ip_bytes_in.write(istd.ingress_port, tmp);
			}
		}
	}
}

Отметим использование аннотации @atomic в блоке, включающем вызовы методов read() и write() экземпляра Register. Считается, что в общем случае при доступе к регистрам нужна аннотация @atomic для блока кода, чтобы обеспечить нужное поведение. Как указано в спецификации P416, без аннотации @atomic в этом примере реализация может параллельно обрабатывать два пакета P1 и P2 с доступом к регистрам в показанном ниже порядке.

	// Возможный порядок операций для программы без аннотации @atomic.
	tmp = port_pkt_ip_bytes_in.read(istd.ingress_port);	// Для пакета P1
	tmp = port_pkt_ip_bytes_in.read(istd.ingress_port);	// Для пакета P2

	// Здесь пакеты P1 и P2 приходят из одного ingress_port и значения
	// tmp для них совпадают.
	update_pkt_ip_byte_count(tmp, hdr.ipv4.totalLen);	// Для пакета P1
	update_pkt_ip_byte_count(tmp, hdr.ipv4.totalLen);	// Для пакета P2
	port_pkt_ip_bytes_in.write(istd.ingress_port, tmp);	// Для пакета P1
	port_pkt_ip_bytes_in.write(istd.ingress_port, tmp);	// Для пакета P2
	// Операция write() для пакета P1 будет потеряна.

Поскольку реализации по разному могут ограничивать сложность кода, воспринимаемого в блоке @atomic, рекомендуется делать его по возможности коротким.

Вызовы отдельных методов для счётчиков и измерителей не нужно включать в блоки @atomic, поскольку для них гарантирована неделимость без потери внесённых изменений. Хотя спецификация P416 v1.0.0 требует от каждого действия (action) в таблице неделимого поведения, как при использовании аннотации @atomic для всего действия, рекомендуется явно использовать аннотации @atomic внутри тела действий, поскольку (a) это безопасно и, что более важно, (b) упомянутое требование может быть исключено в будущих версиях спецификации.

Как и для индексированных измерителей и счётчиков, доступ к индексируемым регистрам должен выполняться с соблюдением границ значений индекса. Запись в регистр с выходящим за границу индексом не будет менять состояние системы, а чтение вернёт неопределённое значение. В примере параграфа 7.8. Измерители показан код, гарантирующий предотвращение упомянутых неопределённостей. Выход за границы индекса регистра становится невозможным, если экземпляр регистра объявлен с типом S как bit<W> и размером 2W.

7.10. Случайные числа

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

extern Random<T> {
	/// Возвращает случайное значение из диапазона [min, max]. Реализациям
	/// разрешено поддерживать диапазоны, где значение (max - min + 1)
	/// является степенью 2. Разработчикам P4 следует ограничивать значения
	/// аргументов соответствующими числами для переносимости программ.
	Random(T min, T max);
	T read();

	/*
	@ControlPlaneAPI
	{
		void reset();
		void setSeed(in T seed);
	}
	*/
}

7.11. Профили действий

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


Рисунок 4. Профили действий в PSA.

На рисунке 4 сравниваются прямые (direct) таблицы и таблицы с реализацией профиля действий. Прямая таблица, как показано на рисунке 4(a), содержит спецификацию действия в каждой своей записи. На рисунке показан пример таблицы с сопоставлением LPM для поля заголовка h.f. Действием служит выбор порта. Видно, что записи t1 и t3 имеют одно действие, т. е. устанавливают порт 1. Профили действий позволяют совместно использовать действие в записях разных таблиц, как показано на рисунке 4(b). Таблица с реализацией профиля действий имеет записи, указывающие элемент профиля вместо спецификации конкретного действия. Сопоставление элементов профиля со спецификациями действий поддерживается в отдельной таблице, которая является частью профиля действий, заданного атрибутом psa_implementation. При использовании таблицы с реализацией профиля действий ссылка на элемент профиля преобразуется в спецификацию конкретных действий, применяемых к пакету.

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

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

extern ActionProfile {
	/// Создание профиля действий с числом элементов size.
	ActionProfile(bit<32> size);

	/*
	@ControlPlaneAPI
	{
		entry_handle 	add_member	(action_ref, action_data);
		void		delete_member 	(entry_handle);
		entry_handle 	modify_member 	(entry_handle, action_ref, action_data);
	}
	*/
}

7.11.1. Пример профиля действий

Блок управления P4 Ctrl в приведённом ниже примере создаёт экземпляр профиля действий ap, который может включать до 128 элементов. Таблица indirect применяет этот экземпляр путём установки атрибута psa_implementation. Плоскость управления может добавлять элементы в ap и каждый элемент может задавать действие foo или NoAction. Записи таблицы indirect должны указывать действия, используя заданные контроллером ссылки на элементы профиля.

control Ctrl(inout H hdr, inout M meta) {
	action foo() { meta.foo = 1; }
	ActionProfile(128) ap;
	table indirect {
		key = {hdr.ipv4.dst_address: exact;}
		actions = { foo; NoAction; }
		psa_implementation = ap;
	}
	apply {
		indirect.apply();
	}
}

7.12. Селекторы действий

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

Рисунок 5. Селекторы действий в PSA.

На рисунке 5 показана таблица с реализацией селектора действий, использующая сопоставление LPM для поля h.f. Второй селектор типа сопоставления служит для задания полей, используемых при поиске спецификации действия в процессе работы.

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

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

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

  • Поддержка непустых групп, в которых все действия одной группы имеют одно имя.

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

  • Поддержка разных имён действий в разных группах.

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

Небязательные расширения:

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

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

Свойство таблицы psa_empty_group_action похоже на свойство default_action:

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

  • начальное значение задаёт код P4;

  • при отсутствии свойства psa_empty_group_action в коде P4 используется NoAction();

  • может применяться модификатор const, запрещающий программе управления изменять действие;

  • при отсутствии модификатора const управляющая программа может менять действие psa_empty_group_action.

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

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

Алгоритм динамического выбора требует на входе список полей для генерации индекса членов группы. Этот список создаётся. с использованием селектора типа сопоставления при задании ключа сопоставления для таблицы. Поля сопоставления типа selector организуются в список по порядку их указания. Созданный список передаётся как входной параметр реализации селектора действий. Недопустимо определять поля сопоставления типа selector, если таблица не включает реализации селектора действий.

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

extern ActionSelector {
	/// Создание селектора действий с size записей.
	/// @param algo - алгоритм хеширования для выбора члена группы.
	/// @param size - число записей в селекторе действий.
	/// @param outputWidth - размер ключа.
	ActionSelector(PSA_HashAlgorithm_t algo, bit<32> size, bit<32> outputWidth);

	/*
	@ControlPlaneAPI
	{
		entry_handle	add_member		(action_ref, action_data);
		void		delete_member		(entry_handle);
		entry_handle 	modify_member		(entry_handle, action_ref, action_data);
		group_handle 	create_group		();
		void		delete_group		(group_handle);
		void		add_to_group		(group_handle, entry_handle);
		void		delete_from_group	(group_handle, entry_handle);
	}
	*/
}

7.12.1. Пример селектора действий

Блок управления P4 Ctrl в приведённом ниже примере создаёт экземпляр селектора действий as, который может включать до 128 элементов. Селектор применяет алгоритм crc16 с 10-битовым результатом для выбора элементов в группе.

Таблица indirect_with_selection применяет этот экземпляр путём установки атрибута psa_implementation. Плоскость управления может добавлять элементы и группы в as и каждая запись может задавать действие foo или NoAction. При программировании записей таблицы плоскость управления не включает поля сопоставления типа selector в ключ сопоставления. Вместо этого поля сопоставления селектора используются для создания списка, передаваемого экземпляру селектора действий. В приведённом ниже примере список {hdr.ipv4.src_address, hdr.ipv4.protocol} передаётся на вход алгоритма хэширования crc16, используемого для динамического выбора селектором действий as.

control Ctrl(inout H hdr, inout M meta) {
	action foo() { meta.foo = 1; }
	ActionSelector(PSA_HashAlgorithm_t.CRC16, 128, 10) as;
	table indirect_with_selection {
		key = {
			hdr.ipv4.dst_address: exact;
			hdr.ipv4.src_address: selector;
			hdr.ipv4.protocol: selector;
		}
	actions = { foo; NoAction; }
	psa_implementation = as;
	}
	apply {
		indirect_with_selection.apply();
	}
}

Управление записями селектора действий при наличии отказов на каналах выходит за рамки PSA. Для быстрого восстановления нужны данные плоскости управления и этот вопрос будет решаться рабочей группой P4 Runtime API.

7.13. Временные метки

Реализация PSA предоставляет значение ingress_timestamp для каждого пакета, входящего в блок управления Ingress, как поле структуры типа psa_ingress_input_metadata_t. В эту временную метку следует включатьвремя, близкое к моменту приёма устройством первого бита пакета или (как вариант) начала синтаксического анализа. Эта метка не включается автоматически в пакет на входе в блок управления Egress и желающая использовать ingress_timestamp в выходном коде программа P4 должна копировать её в поле пользовательских метаданных, передаваемое выходному конвейеру.

Реализация PSA также предоставляет метку egress_timestamp для каждого пакета, входящего в блок управления Egress, как поле структуры psa_egress_input_metadata_t.

Одним из ожидаемых применений временных меток является их сохранение в экземплярах таблиц или регистров для реализации контроля протокольных тайм-аутов, где миллисекундной точности достаточно для большинства протоколов. Другим ожидаемым вариантом применения является телеметрия INT17, где требуется точность порядка микросекунд и лучше для измерения задержек в очередях (передача кадра Ethernet jumbo размером 9 Кбайт по каналу 100 Гбит/с занимает 740 нсек).

Для таких приложений рекомендуется обновлять временные метки с интервалом не более 1 мксек. Обновление в каждом такье ASIC или FPGA обеспечивает разумное решение. Частоту обновления временных меток следует делать постоянной. Например, для этого не следует использовать простой подсчёт тактов, поскольку тактовая частота устройства может динамически изменяться18.

Временные метки имеют тип Timestamp_t, который является bit<W>, а значение W задаёт реализация. Предполагается, что значения временных меток будут в течение некоторого времени повторяться в результате переполнения (wrap). Рекомендуется выбирать частоту обновления и число битов так, чтобы повтор значений меток происходил не чаще одного раза в час. Это позволит сделать метки полезными для указанных ниже применений.

  • Контроль тайм-аутов протоколов hello и keep-alive, составляющих секунды или минуты.

  • Если временные метки включаются в метаданные без преобразования формата, многим внешним системам анализа данных могут потребоваться преобразования, например, для сравнения временных меток из разных устройств PSA. Этим системам потребуются разные формулы и/или параметры для учёта цикличности временных меток или добавление ссылок на внешние источники временных данных для записанных значений. Чем длительней будут циклы повторения временных меток, тем меньше будет объем дополнительной работы.

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

  • Программам, использующим значение (egress_timestamp — ingress_timestamp) для расчёта задержки пакетов, нужно, чтобы продолжительность цикла меток превышала максимальную задержку в очередях.

При генерации меток с разрядностью 32 бита каждую микросекунду продолжительность цикла составит 1,19 часа, а для 42-битовых меток с обновлением каждую наносекунду — 1,22 часа.

От реализации PSA не требуется синхронизация часов, например, по протоколу PTP19 или NTP20.

Фрагмент API плоскости управления, приведённый ниже, может быть частью P4 Runtime API.

// Сообщения TimestampInfo и Timestamp следует добавлять в oneof сообщений Entity.
// Сообщение TimestampInfo предназначено лишь для чтения и попытки изменить его
// не будут иметь эффекта, однако следует сообщать о них (ошибка).
message TimestampInfo {
	// Число битов типа Timestamp_t в устройстве.
	uint32 size_in_bits = 1;
	// Значение временной метки в этом устройстве обновляется
	// increments_per_period раз каждые period_in_seconds секунд.
	uint64 increments_per_period = 2;
	uint64 period_in_seconds = 3;
}
// Значение timestamp доступно для чтения и записи. Отметим, что при наличии
// значений меток в экземплярах таблиц или регистров они не будут обновляться
// в результате записи значения timestamp. Запись временной метки устройства
// предназначена лишь для для инициализации и тестирования.
message Timestamp {
	bytes value = 1;
}

Для каждого пакета P, обрабатываемого входным и выходным конвейером с минимальной задержкой в буфере пакетов, гарантируется, что значение egress_timestamp будет таким же или чуть больше значения ingress_timestamp, заданного для пакета на входе. «Почти» в данном случае означает, что разность (egress_timestamp — ingress_timestamp) должна быть достаточно точной оценкой задержки в буфере пакетов, возможно нулевой, если эта задержка будет меньше интервала обновления меток.

Рассмотрим два пакета, которым одновременно (например, в один машинный такт) назначены временные метки — одному ingress_timestamp в начале входной обработки, другому egress_timestamp в начале выходной. Эти метки могут отличаться на несколько десятков наносекунд (или один «тик» временных меток, если он больше) по причине практических сложностей синхронизации.

Напомним, что двоичные операции + и — для типа bit<W> в P4 определены с использованием арифметики без знака с учётом перехода через максимум (wrap-around). Таким образом, даже при переходе временных меток через максимум всегда можно вычислить разность между метками t1 и t2, используя выражение t2−t1 (если интервал превышает 2W «тиков», это будет псевдонимом результата). Например, если для меток применяется W >= 4 битов и t1 = 2W − 5, а t2 = 3, то t2 − t1 = 8. Таким образом не возникает потребности в условных операциях для вычисления интервала.

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

Другим примером являются приложения, которым требуется высокая точность с учётом всех битов временных меток, но плоскость управления и программа P4 проверяют все записи массива регистров, где хранятся эти временные метки, не чаще 1 раза в 5 секунд для предотвращения перехода через максимум. В этом случае программа P4 может отбросить старшие биты временных меток, чтобы оставшиеся биты переходили через максимум каждые 8 секунд и сохранять эти усечённые метки в экземпляре Register.

7.14. Дайджест пакета

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

Дайджест может включать любые значения из плоскости данных. Поскольку программа P4 может иметь множество экземпляров Digest, каждый из которых передаёт своё содержимое, реализации PSA нужно различать дайджесты, созданные разными экземплярами. В PSA дайджест создаётся вызовом метода pack в экземпляре Digest. Аргументом вызова является включаемое в дайджест содержимое, которое часто является набором значений в структуре P4. Компилятор выбирает подходящий формат последовательной передачи содержимого дайджеста локальному программному агенту, который отвечает за доставку дайджеста в заданном спецификацией P4 Runtime API формате.

Программа PSA может создать множество экземпляров Digest в одном блоке управления IngressDeparser и применять не более одного вызова pack для каждого экземпляра в процессе одного исполнения этого блока. От реализации PSA не требуется поддержка применения внешнего блока Digest в блоке управления EgressDeparser.

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

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

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

extern Digest<T> {
	Digest();		/// Определяет поток сообщений для плоскости управления.
	void pack(in T data);	/// Отправка данных в поток.
	
/*
	@ControlPlaneAPI
	{
		T data;			/// Если T - список, плоскость управления создаёт struct.
		int unpack(T& data);	/// Распакованные данные помещаются в T&, int - код возврата.
	}
	*/
}

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

struct mac_learn_digest_t {
	EthernetAddress srcAddr;
	PortId_t	ingress_port;
}

struct metadata {
	bool			send_mac_learn_msg;
	mac_learn_digest_t	mac_learn_msg;
}

// Это часть функциональности обычного моста Ethernet с обучением.
// Плоскость управления обычно задаёт одинаковые ключи для таблиц 
// learned_sources и l2_tbl. Записи в l2_tbl служат для поиска по 
// MAC-адресу получателя и совпадение даёт выходной порт для пакета.
// Записи в learned_sources такие же, но действием для них служит
// NoAction. При отсутствии адреса в learned_sources разумно передать
// плоскости управления сообщение с MAC-адресом отправителя и номером
// принявшего пакет порта. Плоскость управления примет решение о 
// добавлении записи с MAC-адресом отправителя в обе таблицы и l2_tbl 
// далее будет направлять пакеты в ingress_port этого пакета.
// Это лишь простой пример, который не включает, например, лавинной
// рассылки, которую мост с обучением обычно применяет при отсутствии 
// в таблице MAC-адреса получателя.
control ingress(inout headers hdr,
		 inout metadata meta,
		 in psa_ingress_input_metadata_t istd,
		 inout psa_ingress_output_metadata_t ostd)
{
	action unknown_source () {
		meta.send_mac_learn_msg = true;
		meta.mac_learn_msg.srcAddr = hdr.ethernet.srcAddr;
		meta.mac_learn_msg.ingress_port = istd.ingress_port;
		// meta.mac_learn_msg передаётся плоскости управления
		// из блока управления IngressDeparser.
	}
	table learned_sources {
		key = { hdr.ethernet.srcAddr : exact; }
		actions = { NoAction; unknown_source; }
		default_action = unknown_source();
	}
	action do_L2_forward (PortId_t egress_port) {
		send_to_port(ostd, egress_port);
	}
	table l2_tbl {
		key = { hdr.ethernet.dstAddr : exact; }
		actions = { do_L2_forward; NoAction; }
		default_action = NoAction();
	}
	apply {
		meta.send_mac_learn_msg = false;
		learned_sources.apply();
		l2_tbl.apply();
	}
}

control IngressDeparserImpl(packet_out packet,
			      out empty_metadata_t clone_i2e_meta,
			      out empty_metadata_t resubmit_meta,
		  	      out empty_metadata_t normal_meta,
			      inout headers hdr,
			      in metadata meta,
			      in psa_ingress_output_metadata_t istd)
{
	CommonDeparserImpl() common_deparser;
	Digest<mac_learn_digest_t>() mac_learn_digest;
	apply {
		if (meta.send_mac_learn_msg) {
			mac_learn_digest.pack(meta.mac_learn_msg);
		}
		common_deparser.apply(packet, hdr);
	}
}

8. Неделимость операций API плоскости управления

Все операции добавления, удаления и изменения таблиц должны быть неделимыми (atomic) относительно пересылки пакета. Т. е. для каждой табличной операции apply и каждой операции плоскости управления по добавлению, удалению или изменению записи в таблице операция apply должна выполняться так, будто изменения таблицы ещё не началось, либо оно уже завершилось. Программе P4 никогда не следует вести себя так, будто операция плоскости управления выполнена частично.

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

Реализации PSA следует выдавать ошибку или отказ при компиляции программ P4, для которых она не может выполнить требования неделимости. Например, если реализация может выполнять эти требования с действиями, включающими не более 128 битов параметров, тогда ей следует выдавать ошибку при попытке компиляции программы P4, содержащей действия с большим объёмом параметров.

Предположим, например, что таблица T имеет действие A со 100 битами (суммарно) параметров, а плоскость управления добавила в таблицу запись с ключом поиска K и действием A. Позднее плоскость управления обновила запись для ключа K, не меняя ключ, но изменив 100 битов параметров действия. Для каждого пакета, вызывающего apply для таблицы T и записи с ключом K, нужно выполнить действие A со старыми или новыми 100 битами параметров.

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

То же самое применимо ко всем операциям API плоскости управления с внешними блоками (extern), если в документации явно не указано иное. В частности, одиночным операциям ActionProfile и ActionSelector, таким как добавление в группу или удаление из неё, добавление или удаление пустой группы и изменение параметров действия, добавленного ранее в группу, должна обеспечиваться неделимость. Неделимыми также должны быть операции плоскости управления по чтению и записи отдельных элементов массива Register, кроме того они должны происходить до или после (но не в процессе) любого блока кода P4, помеченного аннотацией @atomic. В плоскости управления нет операций над Register, которые могут неделимо читать элемент, а затем записывать в него изменённое значение.

Если нужно из программы P4 неделимо считать, изменить и записать обратно элемент массива Register, следует сделать так, чтобы операции чтения, изменения и записи в программе P4 выполнялись «пакетом», который плоскость управления может внедрить в плоскость данных (например, через операции packet in и packet out в P4 Runtime API).

Высокоскоростная реализация PSA может обрабатывать сотни или тысячи пакетов между отдельными операциями плоскости управления. Имеются базовые методы «записи в таблицу из будущего в прошлое потока данных», которые иногда называют back to front или pointer flipping, используемые плоскостью управления для достижения эффекта, подобного обеспечению неделимости операций над последовательностью таблиц в процессе пересылки пакета. Имеются исследования таких методов в более общем контексте21.

A. Нерешенные вопросы

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

A.1. Селекторы действий

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

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

A.2. Обнаружение и контроль перегрузок

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

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

Желательно задать в PSA небольшой набор полей, которые будут служить входными данными для множества алгоритмов контроля перегрузок. Одним из вариантов является использование хэшированного идентификатора потока, часто реализуемого в форме хэш-функции от полей заголовка IP, таких как адреса получателя и отправителя, протокол IP и возможно порты TCP/UDP для отправителя и получателя. С учётом того, что программируемые на P4 устройства могут обрабатывать не только пакеты IP, желательно найти механизм более общего назначения для устройств PSA.

A.3. Возможность полной реализации внутриканальной телеметрии

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

A.4. Профили PSA

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

B. Реализация внешнего блока InternetChecksum

В RFC 1071 и RFC 1141 описан эффективный расчёт контрольных сумм Internet, особенно для программных реализаций. Ниже приведены прототипы реализации методов для внешнего блока InternetChecksum с использованием синтаксиса и семантики P416, расширения цикла for и оператора return, возвращающего значение функции. Для экземпляра объекта InternetChecksum требуется, как минимум, внутреннее состояние в форме 16-битового вектора (sum в приведённом примере).

// Один из способов получить дополнение до 1 суммы двух
// 16-битовых значения.
bit<16> ones_complement_sum(in bit<16> x, in bit<16> y) {
	bit<17> ret = (bit<17>) x + (bit<17>) y;
	if (ret[16:16] == 1) {
		ret = ret + 1;
	}
	return ret[15:0];
}

bit<16> sum;

void clear() {
	sum = 0;
}

// Размер data должен быть кратным 16 битам
void add<T>(in T data) {
	bit<16> d;
	for (каждой 16-битовой части d из data) {
		sum = ones_complement_sum(sum, d);
	}
}
// Размер data должен быть кратным 16 битам
void subtract<T>(in T data) {
	bit<16> d;
	for (каждой 16-битовой части d из data) {
		// ~d - отрицание d в арифметике с дополнением до 1.
		sum = ones_complement_sum(sum, ~d);
	}
}

// Контрольная сумма Internet является дополнением до 1 суммы 
// дополнений до 1 соответствующих частей пакета. Указанные выше
// методы возвращают сумму дополнений до 1 в переменной sum.
// get() возвращает побитовое отрицание sum, которое является
// дополнением sum до 1.
bit<16> get() {
	return ~sum;
}

bit<16> get_state() {
	return sum;
}

void set_state(bit<16> checksum_state) {
	sum = checksum_state;
}

C. Пример реализации внешнего блока Counter

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

Двумя базовыми вариантами реализации счётчиков в плоскости данных являются:

  • кольцевые (wrap around) счётчики;

  • счётчики с насыщением, «застывающие» при максимальном значении без сброса в 0.

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

Counter(bit<32> n_counters, PSA_CounterType_t type) {
	this.num_counters = n_counters;
	this.counter_vals = новый массив из n_counters элементов размера W;
	this.type = type;
	if (this.type == PSA_CounterType_t.PACKETS_AND_BYTES) {
		// Подсчёт пакетов и байтов использует общее хранилище состояния.
		// Нужны ли отдельные конструкторы с дополнительным аргументом,
		// задающим размер счётчика байтов?
		W shift_amount = TBD;
		this.shifted_packet_count = ((W) 1) << shift_amount;
		this.packet_count_mask = (~((W) 0)) << shift_amount;
		this.byte_count_mask = ~this.packet_count_mask;
	}
}

W next_counter_value(Wcur_value, PSA_CounterType_t type) {
	if (type == PSA_CounterType_t.PACKETS) {
		return (cur_value + 1);
	}
	// Учитываемые в packet_len байты зависят от реализации.
	PacketLength_t packet_len = <размер пакета в байтах>;
	if (type == PSA_CounterType_t.BYTES) {
		return (cur_value + packet_len);
	}
	// Требуется тип PSA_CounterType_t.PACKETS_AND_BYTES.
	// В счётчике размера W младшие байты служат счётчиком байтов,
	// а старшие учитывают пакеты. Это просто один из форматов 
	// хранения и реализация может иначе хранить состояние
	// packets_and_byte, если API плоскости данных корректно 
	// возвращает значения счётчиков байтов и пакетов.
	W next_packet_count = ((cur_value + this.shifted_packet_count) &
				  this.packet_count_mask);
	W next_byte_count = (cur_value + packet_len) & this.byte_count_mask;
	return (next_packet_count | next_byte_count);
}

void count(in S index) {
	if (index < this.num_counters) {
		this.counter_vals[index] = next_counter_value(this.counter_vals[index], this.type);
	} else {
		// Значение counter_vals не обновляется при выходе индекса за
		// границы диапазона. Запись отладочных данных описана ниже.
	}
}

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

  • число фактов выхода индекса за границы;

  • FIFO для первых N выходов индекса за границу (N определяется реализацией, например, 1);

  • рекомендуется также сохранять информацию о точке вызова в программе P4 метода count() с выходящим за границы индексом.

D. Обоснование архитектуры

D.1. Зачем нужна выходная обработка?

В чем польза от разделения обработки пакетов в коммутаторе на входную и выходную?

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

1. Изменение пакетов в последний момент

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

Но для каналов с переменной скоростью, например, Ethernet с управлением потоком данных с помощью кадров pause, Wi-Fi при изменении качества сигнала или при наличии очередей по классам обслуживания со взвешенным планированием, невозможно предсказать на момент отправки пакета в очередь время его выхода из очереди. Задержка в очереди зависит от неизвестных событий в будущем, таких как получение кадров Ethernet или число и размер пакетов, поступающих в очереди с разным классом обслуживания.

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

2. Эффективность и гибкость групповой обработки

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

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

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

При такой организации multicast-обработки все ещё сохраняется потребность в различной обработке разных копий одного пакета. Например, в копию для выходного порта 5 нужно поместить тег VLAN 7, а для порта 2 — VLAN 18. Аналогичная задача возникает при отправке групповых пакетов в туннели VXLAN, GRE и т. п. За счёт изменения выходной обработки на уровне пакета логика репликации остаётся достаточно простой — по завершении входного конвейера создаются идентичные копии, различающиеся лишь неким уникальным идентификатором, позволяющим различать эти копии при выходной обработке.

D.2. Неизменность выходного порта в процессе выходной обработки

Почему в программе P4 нельзя сменить выходной порт в процессе выходной обработки?

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

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

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

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

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

D.3. Входной сборщик и выходной анализатор

В P414 нет входного сборщика и выходного анализатора. Зачем они в PSA?

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

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

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

Ситуация с выходным сборщиком похожа. Делая его явным и отдельным блоком, вы получаете полный контроль над данными, включаемыми в пакет при отправке его в буфер. В P414 неявно предполагается, что все метаданные пакета, применяемые в выходном коде, передаются вместе с пакетом. Это можно сделать и в программах P416 для архитектуры PSA, но сейчас это должно быть явным. В PSA можно ограничить объем передаваемых с пакетом метаданных, что может быть важно для блоков ввода-вывода буфера пакетов.

E. Устройства PSA с несколькими конвейерами

В современных высокоскоростных сетевых устройствах применяются ASIC с тактовой частотой 1 — 2 ГГц. В приведённом ниже обсуждении предполагается частота 1 ГГц, но все рассмотренные аспекты линейно масштабируются по частоте.

Обычно часть сетевого ASIC проектируется так, чтобы обработка нового пакета начиналась один раз в каждом такте и заканчивалась в каждом такте. Задержка от начала до завершения обработки может составлять сотни тактов. Таблицы P4 в таких ASIC обычно размещаются в памяти TCAM и SRAM. TCAM позволяет выполнять 1 поиск за такт, а SRAM — 1 операцию чтения или записи. Хотя имеются многопортовые системы SRAM, позволяющие выполнять несколько операций чтения и/или записи за один такт, они существенно проигрывают по размеру и потребляемой мощности однопортовым система. При создании многопортовых систем TCAM рост размеров и потребляемой мощности будет ещё больше, чем для многопортовых SRAM. Типовым способом повышения скорости поиска в TCAM является параллельная работа, когда создаётся. несколько копий TCAM, что обеспечивает линейный рост размеров и потребляемой мощности.

По этим причинам для создания коммутационных ASIC, обрабатывающих пакеты в N быстрее тактовой частоты (например, 2 миллиарда пакетов в секунду при частоте 1 ГГц), наиболее простым решением является параллельная обработка пакетов25 с созданием N конвейеров26, каждый из которых обрабатывает 1 миллиард пакетов в секунду. Созданные на основе такого подхода устройства PSA обычно будут включать N входных конвейеров и N выходных. Обычно к каждому конвейеру жёстко привязывается множество физических портов ASIC, например, в устройстве с 32 портами 100G Ethernet можно привязать порты 0 — 15 к конвейеру 0, а порты 16 — 31 к конвейеру 1. Все пакеты, принятые портами 0 — 15, обрабатываются входным конвейером 0, затем передаются в буфер пакетов (если не отброшены на входе), а после этого — в выходной конвейер 0, если они направлены в выходные порты 0 — 15, или в выходной конвейер 1, если направлены в порты 16 — 31. В таком устройстве обычно требуется применять одну и ту же программу P4 в каждом из N входных и выходных конвейеров.

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

Независимо от описанного выше подхода, применение таблиц в P4 выполняется в параллельном режиме, поскольку конвейеры могут работать независимо один от другого без обмена информацией между собой (имеющееся исключение описано ниже). То же относится к большинству внешних блоков PSA, например, ActionProfile, ActionSelector, Checksum, Digest, Hash, Random. Общим у таблиц P4 и этих внешних элементов является то, что программы P4 либо совсем не могут менять их состояние (например, таблицы, ActionProfile, ActionSelector), либо могут могут менять его лишь так, что это не влияет на обработку других пакетов (например, Checksum, Digest, Hash). Блок Random является особым случаем — обновление состояния генератора псевдослучайных чисел может влиять на обработку других пакетов, но обычно это связано со способом применения таких чисел (например, случайный выбор пакета для маркировки или отбрасывания в алгоритме RED).

Состояния счётчиков поддерживаются независимо в каждом конвейере, но при учёте одних и тех же параметров (например, пакетов, соответствующих записи с ключом X во всех конвейерах) можно просто сложить значения соответствующих счётчиков из каждого конвейера.

Рассмотрим устройство с поддержкой независимых измерителей в каждом конвейере. Если нужно учесть все пакеты, соответствующие записи таблицы X, но не более Y байт/сек, можно выполнить координацию состояний между конвейерами, например, с помощью протоколов когерентности кэша, обычно реализованных с многоядерных CPU, или рециркуляции пакетов в общий конвейер, где сохраняется состояние измерителя. Оба варианта имеют низкую производительность (по крайней мере в части случаев) и сложны в реализации. Коммутаторы обычно поддерживают независимые состояния измерителей в каждом конвейере, не координируя их. Эта проблема не специфична для коммутаторов и относится к категории доступа к изменяемому состоянию распределенной системы, что связано не только с вопросами точности, но и с проблемой производительности.

Внешний блок Register имеет более общее назначение по сравнению с измерителями и для него характерны те же проблемы разделения состояний между множеством конвейеров. Рекомендуется обсудить эти вопросы с производителем устройства PSA, если предполагается их влияние на работу программы P4. Если устройство PSA не согласует состояния автоматически, следует применять общую стратегию, представленную выше для измерителей — воспринимать независимое поведение регистров каждого конвейера и рециркулировать нужные пакеты в конвейер, поддерживающий общее состояние.

Отметим, что предложенное свойство таблицы psa_idle_timeout обеспечивает способ использования операций apply для обновления состояний таблиц P4. Для каждой записи таблицы требуется по меньшей мере 1 бит для представления момента последнего совпадения с записью и это значение обновляется при каждой операции apply. Если это состояние в таблице с данной опцией не согласуется автоматически между конвейерами, значения в разных таблицах могут различаться. Запись с ключом X в одном конвейере может оставаться неиспользуемой дольше заданного тайм-аута, тогда как в других конвейерах она может применяться чаще. Одним из возможных решений этой проблемы для устройства PSA и зависящей от реализации плоскости управления является явное указание плоскости управления наличия множества конвейеров, например, путём назначения каждому конвейеру, таблице и внешнему блоку своего имени.

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

F. Упорядочение пакетов

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

Рекомендация 1. Пакеты, принятые одним портом, следует обрабатывать во входном конвейере в порядке их приёма.

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

Рекомендация 3. Индивидуальные пакеты PRE (т. е. те, которые идут по пути «поместить в очередь» в псевдокоде параграфа 6.2. Поведение пакетов по завершении входной обработки), принятые из одного порта, прошедшие входной конвейер однократно (без рециркуляции и повторного представления), переданные а PRE с одним значением класса обслуживания (class_of_service) и адресованные в один выходной порт, следует обрабатывать с том же порядке, в котором они пришли на входную обработку.

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

Если реализация следует рекомендациям 1 — 3, индивидуальный трафик с одним классом обслуживания будет сохранять относительный порядок пакетов при прохождении через устройство.

Рекомендация 4. Рассмотрим групповые пакеты PRE (пакеты, следующие по пути «создать клон» в псевдокоде параграфа 6.2. Поведение пакетов по завершении входной обработки), приходящие через один входной порт, проходящие входную обработку однократно и передаваемые в PRE с одинаковыми парами (class_of_service, multicast_group). Копии одного исходного пакета, адресованные в один выходной порт и имеющие одинаковые пары (egress_port, instance), следует обрабатывать на выходе в порядке их входной обработки. Для групповых пакетов с разными значениями class_of_service это не предполагается по причине наличия в PRE раздельных очередей для разных классов обслуживания.

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

Если реализация следует рекомендациям 1, 2 и 4, групповой трафик с одним классом обслуживания будет сохранять относительный порядок при прохождении через устройство в условиях достаточно долгой неизменности членов групп.

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

Ниже приведены некоторые основания для рекомендаций этого приложения.

  1. Ожидания хостов.

    Хотя в протоколе IP нет строгих требований в части порядка пакетов, передаваемых от одного хоста к другому, имеются широко распространённые реализации TCP, для которых производительность работы в реальном масштабе времени значительно снижается при нарушении порядка доставки пакетов в сети. Для решения этой проблемы было выполнено множество исследований и разработок (например, современные реализации Linux TCP, начиная с 2011 г., когда было выпущено ядро 2.6.35, значительно устойчивей своих предшественников), однако остаётся ещё много реализаций TCP, страдающих от нарушения порядка. Примеры можно найти в работке Kandula и соавторов27, где исследована устойчивость TCP к нарушениям порядка доставки.

    Такие реализации TCP считают подтверждения с повторяющимися кумулятивными порядковыми номерами вероятным указанием на потерю пакетов в сети и сокращают окно передачи для предотвращения перегрузок.

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

    Упомянутые выше причины служат основанием для использования хэш-значений полей заголовков пакетов (таких как IP-адреса отправителя и получателя, номера портов TCP или UDP) при выборе между равноценными путями ECMP29 и каналами LAG. Такой выбор между параллельными путями помогает сохранить порядок пакетов за счёт снижения равномерности распределения нагрузки. Если бы внутренняя реализация сетевого устройства меняла порядок пакетов, это стало бы ещё одной причиной его нарушения.

  2. Реализация протоколов с состояниями.

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

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

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

G. Поддержка пустых групп в селекторах действий

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

Некоторые пользователи P4 выразили заинтересованность в предоставлении возможности клиенту P4Runtime (контроллер) удалять последний элемент группы селектора действий и получать в результате предсказуемое поведение плоскости данных.

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

Для полной поддержки пустых групп действий следует выполнять приведённые ниже требования.

  • Все операции P4Runtime API, такие как добавление элемента в группу (даже 1 элемента в пустую группу), удаление элемента из группы (даже последнего), изменение связанного с элементом действия и т. п., следует делать неделимыми в процессе обработки пакетов. Т. е. каждый пакет следует обрабатывать так, будто таблица находится в старом состоянии или новом состоянии с неопределённым поведением обработки.

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

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

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

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

Это поведение можно реализовать с помощью дополнительной логики в сервере P4Runtime (агент). Идея состоит в том, что агент получает пустое действие группы со значениями параметров действий, например, из скомпилированного представления программы P4.

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

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

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

  1. Добавить в G новый элемент, являющийся пустым действием группы. В результате группа G будет кратковременно включать 2 элемента.

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

Когда G в настоящее время пуста для контроллера (но содержит 1 элемент, указывающий на пустое действие группы в плоскости данных) и тот добавляет в группу один элемент, агент может выполнить указанные ниже действия.

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

  2. Удалить из G пустое действие группы. После этого G в плоскости данных будет включать 1 желаемый для контроллера элемент.

Реализация PSA с агентом, поддерживающим пустые группы селекторов действий описанным способом, должна выполнять указанные выше пары шагов неделимо, как описано в разделе 8. Неделимость операций API плоскости управления, но допускается обработка одного или двух пакетов между двумя этапами.

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

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

Например, в отмеченном ранее варианте выбора порта LAG имеется лишь одно действие для таблицы lag, как показано ниже.

action set_output_port (PortId_t p) {
	user_meta.out_port = p;
}
ActionProfile(128) ap;
table lag {
	key = {
		// ... поля ключа ...
	}
	actions = { set_output_port; }
	psa_implementation = ap;
}

control cIngress (inout headers hdr,
		   inout metadata user_meta,
		   in psa_ingress_input_metadata_t istd_meta,
		   inout psa_ingress_output_metadata_t ostd_meta)
{
	apply {
		// ... предшествующий код входного конвейера ...
		lag.apply();
		send_to_port(ostd_meta, user_meta.out_port);
		// ... последующий код входного конвейера ...
	}
}

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

Подход 1. Использование недействительного номера порта.

Выбирается значение PortId_t, которое не соответствует ни одному физическому порту устройства30, и применяется для пустого действия в пустой группе. В примере кода после lag.apply добавлен оператор if для проверки этого значения.

apply {
	// ... предшествующий код входного конвейера ...
	lag.apply();
	if (user_meta.out_port == PORT_INVALID_VALUE) {
		ingress_drop(ostd_meta);
	} else {
		send_to_port(ostd_meta, user_meta.out_port);
	}
	// ... последующий код входного конвейера ...
}

Подход 2. Добавление дополнительных параметров действия.

В этом случае добавляется 1-битовый параметр, указывающий отбрасывание пакета. Сохраняется необходимость использования оператора if после применения таблицы (apply).

action set_output_port (PortId_t p, bit<1> drop) {
	user_meta.out_port = p;
	user_meta.drop = drop;
}
// ...
	apply {
		// ... предшествующий код входного конвейера ...
		lag.apply();
		if (user_meta.drop == 1) {
			ingress_drop(ostd_meta);
		} else {
			send_to_port(ostd_meta, user_meta.out_port);
		}
	// ... последующий код входного конвейера ...
	}

В любом случае реализация может также поддерживать применение оператора if внутри действия set_output_port, но PSA не требует такой поддержки.

H. История выпусков

 

Выпуск

Дата

Описание изменений

1.0

1 марта 2018 г.

Исходный выпуск

1.1

22 ноября 2018 г.

Версия 1.1, см. ниже.

 

H.1. Изменения в версии 1.1

H.1.1. Численные преобразования между P4Runtime API и плоскостью данных

После выпуска PSA v1.0 было проведено несколько встреч рабочей группы по вопросам численных преобразования между значениями PortId_t (а также ClassOfService_t и возможно других значений в будущем). В PSA v1.1 отражены принятые решения.

  • 4.1. Определения типов PSA;

  • 4.4. Представление данных в плоскости управления и данных.

H.1.2. Возможность создания множества копий в сеансе клонирования

В PSA v1.0 запросы на клонирование ограничены созданием одной копии, передаваемой в выходной порт. PSA v1.1 позволяет настроить сеанс клонирования путём задания пар (egress_port, instance), подобно настройке multicast-групп.

  • 6.2. Поведение пакетов по завершении входной обработки;

  • 6.4.5. Групповая адресация и клоны;

  • 6.5. Поведение пакетов по завершении выходной обработки;

  • 6.8. Клонирование пакетов.

H.1.3. Добавлено свойство таблицы psa_idle_timeout

Добавление этого свойства в PSA v1.1 согласовано с его поддержкой в P4Runtime API. Использование этого свойства помогает разработчикам P4 указать, что таблица должна поддерживать состояние, указывающее время последнего совпадения для каждой записи, а в случае отсутствия совпадений в течение установленного плоскостью управления периода, передавать контроллеру уведомление.

  • 7.2.1. Уведомление о тайм-ауте для записи таблицы.

H.1.4. Добавлено свойство таблицы psa_empty_group_action

PSA v1.0 не задаёт поведения таблиц с реализацией ActionSelector для случаев, когда пакет соответствует записи, настроенной с пустой группой селектора действий. PSA v1.1 рекомендует (но не требует) от таких реализаций поддержки нового свойства таблиц psa_empty_group_action, значение которого указывает действие, выполняемое в таких ситуациях.

  • 7.12. Селекторы действий.

H.1.5. Прочие изменения

В PSA v1.0 поддержка внешнего блока Digest требовалась в блоках управления IngressDeparser и EgressDeparser. Сейчас она не требуется для блока EgressDeparser.

  • В таблице 5 указаны блоки управления, которые могут создавать и вызывать экземпляры extern.

H.1.6. Изменения в файле psa.p4

  • Изменения в соответствии с численными преобразованиями P4Runtime API для типов PortId_t и ClassOfService_t.

  • Исключён устаревший внешний блок ValueSet, поскольку конструкция value_set была добавлена в спецификацию P416 версии 1.1.0.

  • Исправлены несколько опечаток в комментариях к API плоскости управления.

  • Исключён макрос #define PSA_SWITCH с аргументами, поскольку спецификация P416 не требует от препроцессора P416 поддержки таких макросов.

H.1.7. Изменения в примерах программ PSA из каталога p4-16/psa/examples

  • Небольшие изменения для приведения в соответствие с последними изменениями в численном преобразовании для типа PortId_t в P4Runtime API.

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

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

nmalykh@protokols.ru

1Portable Switch Architecture.

2Packet buffer and Replication Engine — машина буферизации и репликации пакетов.

3Buffer Queuing Engine — машина очередей.

4Предполагается, что включаемые файлы psa.p4 для разных платформ будут в основном похожи один на другой. Кроме различий в размерах для типов PSA ожидаются различия в аннотациях блоков extern и т. п., позволяющие компилятору P4 для платформы выполнить свою работу.

5P4 Runtime API определяется как файл Google Protocol Buffer (protobuf) .proto, описание которого доступно по ссылке.

6Хотя 10 Мбит не кажется большим объёмом для компьютеров с памятью в сотни Гбайт, скоростные реализации PSA являются ASIC, где таблицы хранятся во встроенной памяти (как кэш-память обычных CPU). Intel i9-7980XE (2017 г.) имеет кэш-память L3 198 Мбит, используемую ядрами CPU. В процессорах Intel Core седьмого поколения, выпущенных в 2017 г, с памятью не меньше 100 Мбит L3-кэша стоимость составляет около $9/Мбит (https://en.wikipedia.org/wiki/List_of_Intel_microprocessors).

7В открытом компиляторе P4 p4c планируется поддержка опции для включения численных преобразований дополнительных типов без изменения программ P4 или включаемого файла psa.p4. Эти типы будут указываться по именам.

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

9В оригинале не вполне корректно сказано CRC. Прим. перев.

10TBD. Неясно, всегда ли минимальный размер данных составляет 46 байтов (64 байта минимального кадра Ethernet за вычетом 14 байтов заголовка 14 и 4 байтов CRC) или реализация может не включать некоторые байты.

11Random Early Detection — упреждающее отбрасывание случайного пакета.

12Approximate Fair Dropping — сравнительно беспристрастное отбрасывание.

13Link Aggregation Group — группа агрегирования каналов.

14В оригинале не вполне корректно указано CRC. Прим. перв.

15Priority code point — код приоритета.

16Differentiated service code point — код дифференцированного обслуживания

17In-band Network Telemetry — телеметрия по основному каналу связи, http://p4.org/p4/inband-network-telemetry

21Pavol Cerny, Nate Foster, Nilesh Jagnik, and Jedidiah McClurg, «Consistent Network Updates in Polynomial Time». International Symposium on Distributed Computing (DISC), Paris, France, September 2016.

23Approximate Fair Drop.

26Здесь и в спецификации P4 термин конвейер (pipeline) относится к части реализации P4, обеспечивающей, например, поведение блоков IngressParser, Ingress, затем IngressDeparser в PSA. Это принято в P4, хотя следует отметить наличие других аппаратных решений, которые реализуют функции конвейера иначе, например, в наборе параллельно работающих ядер CPU, каждое из которых обрабатывает свой пакет.

27S.Kandula, D. Katabi, S. Sinha, and A. Berger, «Dynamic load balancing without packet reordering», ACM SIGCOMM Computer Communication Review, Vol. 37, No. 2, April 2007,

29Equal Cost Multi Path.

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

Рубрика: SDN, Сетевое программирование | Оставить комментарий

RFC 8996 Deprecating TLS 1.0 and TLS 1.1

Internet Engineering Task Force (IETF)                       K. Moriarty
Request for Comments: 8996                                           CIS
BCP: 195                                                      S. Farrell
Obsoletes: 5469, 7507                             Trinity College Dublin
Updates: 3261, 3329, 3436, 3470, 3501, 3552,                  March 2021
         3568, 3656, 3749, 3767, 3856, 3871,                            
         3887, 3903, 3943, 3983, 4097, 4111,                            
         4162, 4168, 4217, 4235, 4261, 4279,                            
         4497, 4513, 4531, 4540, 4582, 4616,                            
         4642, 4680, 4681, 4712, 4732, 4743,                            
         4744, 4785, 4791, 4823, 4851, 4964,                            
         4975, 4976, 4992, 5018, 5019, 5023,                            
         5024, 5049, 5054, 5091, 5158, 5216,                            
         5238, 5263, 5281, 5364, 5415, 5422,                            
         5456, 5734, 5878, 5953, 6012, 6042,                            
         6083, 6084, 6176, 6347, 6353, 6367,                            
         6460, 6614, 6739, 6749, 6750, 7030,                            
         7465, 7525, 7562, 7568, 8261, 8422                             
Category: Best Current Practice                                         
ISSN: 2070-1721

Deprecating TLS 1.0 and TLS 1.1

Прекращение поддержки TLS 1.0 и TLS 1.1

PDF

Аннотация

Этот документ формально отменяет протокол TLS1 версии 1.0 (RFC 2246) и 1.1 (RFC 4346) с переводом упомянутых документов в статус Historic. В этих версиях отсутствует поддержка современных и рекомендуемых криптографических алгоритмов и механизмов, а различные правительственные и отраслевые профили приложений, использующих TLS, рекомендуют отказ от этих устаревших версий TLS. TLS версии 1.2 рекомендован для протоколов IETF с 2008 г., а в 2018 г. заменён TLS версии 1.3, что обеспечило достаточное для перехода к новым версиям время. Прекращение поддержки старых версий сокращает фронт атак, снижает вероятность неверной настройки и упрощает поддержку программ и библиотек.

Этот документ также отменяет DTLS2 версии 1.0 (RFC 4347), не отменяя DTLS версии 1.2 (DTLS версии 1.1 не существует).

Документ обновляет многие RFC, которые нормативно задавали применение TLS версии 1.0 или TLS версии 1.1, а также рекомендации по использованию TLS в RFC 7525 (следовательно, является частью BCP 195).

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

Документ относится к категории Internet Best Current Practice.

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

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

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

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

Протоколы TLS версии 1.0 [RFC2246] и 1.1 [RFC4346] переопределены TLS 1.2 [RFC5246] в 2008 г., а этот протокол был переопределен TLS 1.3 [RFC8446]. Протокол DTLS версии 1.0 [RFC4347] переопределен DTLS 1.2 [RFC6347] в 2012 г. Пришло время отказаться от TLS 1.0, TLS 1.1 и DTLS 1.0 с переводом упомянутых документов в статус Historic.

Технические причины отказа от поддержки старых версий указаны ниже.

  • Протоколы требуют поддержки устаревших протоколов, которая нежелательна с точки зрения криптографии. Например, TLS 1.0 требует реализации TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA.

  • Отсутствует поддержка рекомендуемых в настоящее время шифров, особенно аутентифицированного шифрования со связанными данными (AEAD5), которое не поддерживается до TLS 1.2. Отметим, что записи для устаревших шифров сохраняются в реестрах, но многие реестры TLS были обновлены [RFC8447], где указано, что эти записи не рекомендуются IETF.

  • Целостность согласования зависит от хэша SHA-1.

  • Проверка подлинности партнера зависит от подписей SHA-1.

  • Поддержка 4 версий протокола TLS повышает вероятность некорректной настройки.

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

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

1.1. Обновлённые RFC

Этот документ обновляет перечисленные ниже RFC, в которых содержатся нормативные ссылки на TLS 1.0, TLS 1.1, DTLS 1.0. Обновление предназначено для отмены использования этих устаревших версий. Конкретные ссылки на обязательную для реализации минимальную версию протокола TLS 1.0 или TLS 1.1 заменены ссылками на TLS 1.2, а ссылки на DTLS 1.0 — ссылками на DTLS 1.2. Утверждения вида: «TLS 1.0 является наиболее широко распространённой версией» удалены без замены.

[RFC3261] [RFC3329] [RFC3436] [RFC3470] [RFC3501] [RFC3552] [RFC3568] [RFC3656] [RFC3749] [RFC3767] [RFC3856] [RFC3871] [RFC3887] [RFC3903] [RFC3943] [RFC3983] [RFC4097] [RFC4111] [RFC4162] [RFC4168] [RFC4217] [RFC4235] [RFC4261] [RFC4279] [RFC4497] [RFC4513] [RFC4531] [RFC4540] [RFC4582] [RFC4616] [RFC4642] [RFC4680] [RFC4681] [RFC4712] [RFC4732] [RFC4785] [RFC4791] [RFC4823] [RFC4851] [RFC4964] [RFC4975] [RFC4976] [RFC4992] [RFC5018] [RFC5019] [RFC5023] [RFC5024] [RFC5049] [RFC5054] [RFC5091] [RFC5158] [RFC5216] [RFC5238] [RFC5263] [RFC5281] [RFC5364] [RFC5415] [RFC5422] [RFC5456] [RFC5734] [RFC5878] [RFC6012] [RFC6042] [RFC6083] [RFC6084] [RFC6176] [RFC6353] [RFC6367] [RFC6739] [RFC6749] [RFC6750] [RFC7030] [RFC7465] [RFC7525] [RFC7562] [RFC7568] [RFC8261] [RFC8422]

Статус [RFC7562], [RFC6042], [RFC5456], [RFC5024], [RFC4540], [RFC3656] обновлён с разрешения Independent Submissions Editor.

RFC с нормативными ссылками на TLS 1.0 или TLS 1.1, которые устарели и указаны здесь как обновлённые данным документом, чтобы подчеркнуть, что взамен устаревшего протокола следует использовать современную версию TLS включают [RFC3316], [RFC3489], [RFC3546], [RFC3588], [RFC3734], [RFC3920], [RFC4132], [RFC4244], [RFC4347], [RFC4366], [RFC4492], [RFC4507], [RFC4572], [RFC4582], [RFC4934], [RFC5077], [RFC5081], [RFC5101], [RFC5953].

Документ [RFC4642] уже обновлён [RFC8143], но это обновление не идентично вносимому данным документом.

В [RFC6614] указано требование использовать TLS 1.1 и выше, но содержится лишь информационная ссылка на [RFC4346]. Это требование обновлено указанием TLS 1.2 или последующих версий.

[RFC6460], [RFC4744], [RFC4743] уже имеют статус Historic, но указаны здесь как обновлённые данным документом, чтобы подчеркнуть необходимость замены устаревших протоколов современными версиями TLS.

Этот документ обновляет DTLS [RFC6347], где разрешено согласование использования DTLS 1.0, отменённого здесь.

Шифры DES и IDEA6, заданные в [RFC5469], были удалены из TLS 1.2 документом [RFC5246], поскольку указанные для этих шифров версии TLS, переведены в статус Historic, как и [RFC5469].

Заданное для отката версии шифра Signaling Cipher Suite Value [RFC7507] было определено с целью обнаружения ситуаций, когда клиент и сервер согласуют версию (D)TLS ниже максимальной, поддерживаемой обоими. В TLS 1.3 ([RFC8446]) для этого применяется другой механизм на основе сторожевых значений в поле ServerHello.Random. Версии (D)TLS до 1.2 полностью отменены и единственным вариантом, которым реализации (D)TLS могут согласовать использование версии ниже максимальной для обоих, является согласование (D)TLS 1.2 при поддержке обоими (D)TLS 1.3, а использование (D)TLS 1.3 предполагает поддержку механизма ServerHello.Random. Это переопределяет функциональность [RFC7507] и документ получает статус Obsolete.

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

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

2. Поддержка отмены

Детали атак на TLS 1.0 и TLS 1.1, а также способы их предотвращения рассмотрены в [NIST800-52r2], [RFC7457] и упомянутых там RFC. Несмотря на разработку мер устранения известных уязвимостей, вновь обнаруживаемые проблемы старых версий протоколов не могут быть устранены в старых версиях библиотек, если новые библиотеки не поддерживают эти устаревшие протоколы.

Например, NIST предлагает приведённые ниже рекомендации (раздел 1.1 History of TLS в [NIST800-52r2]).

Протокол TLS 1.1, заданный в RFC 4346 [24], был разработан для устранения слабостей TLS 1.0, прежде всего в части выбора вектора инициализации и обработки ошибок заполнения. Векторы инициализации были сделаны явными для предотвращения определённого класса атак против режима CBC7, используемого TLS. Обработка ошибок заполнения была изменена так, чтобы ошибка считалась неверным кодом аутентификации сообщения, а не отказом при расшифровке. Кроме того, в TLS 1.1 RFC подтверждены атаки на режим CBC, основанные на времени расчёта кода MAC8. В спецификации TLS 1.1 указано, что для защиты от таких атак реализация должна обрабатывать записи независимо от наличия ошибок заполнения. Дополнительные проблемы реализации режимов CBC (не включённые в RFC 4346 [24]), рассмотрены в параграфе 3.3.2.

Протокол TLS 1.2, заданный в RFC 5246 [25], внёс несколько криптографических улучшений, особенно в сфере функций хэширования, с возможностью использовать или задавать семейство алгоритмов SHA-2 для хэширования и расчётов MAC и PRF9. В TLS 1.2 также добавлены шифры AEAD.

Протокол TLS 1.3, заданный в RFC 8446 [57], существенно меняет TLS с целью устранения угроз, обнаруженных в последние годы. Изменения включают новый протокол согласования, новый процесс вывода ключей с использованием функции HKDF10 [37], а также исключение шифров, использующих транспорт ключей RSA или статический обмен DH (Diffie-Hellman), режимов работы CBC и SHA-1. Многие расширения, заданные для TLS 1.2 и предшествующих версий, не могут применяться с TLS 1.3.

3. SHA-1 как проблема TLS 1.0 и TLS 1.1

Целостность TLS 1.0 и TLS 1.1 зависит от хэширования SHA-1 при обмене сообщениями. Это позволяет организовать «атаку с понижением» на процесс согласования злоумышленнику, способному выполнить 277 операций, что гораздо ниже доступных в настоящее время возможностей.

Точно так же аутентификация при согласовании зависит от подписей с использованием хэширования SHA-1 или конкатенации хэш-значений MD5 и SHA-1, которая не намного сильней SHA-1, что позволяет атакующему представиться сервером при успешном взломе слабого хэша SHA-1.

Протоколы TLS 1.0 и TLS 1.1 не позволяют партнёрам выбрать более строгое хэширование подписей в сообщениях ServerKeyExchange и CertificateVerify, доступное лишь при переходе на новые версии протокола.

Дополнительная информация представлена в [Bhargavan2016].

4. Отказ от TLS 1.0

Использование TLS 1.0 недопустимо. Согласование TLS 1.0 из любой версии TLS недопустимо.

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

На практике клиентам недопустимо передавать ClientHello с ClientHello.client_version {03,01}, а серверам недопустимо передавать ServerHello с ServerHello.server_version {03,01}. Любая сторона, получившая сообщение Hello с версией протокола {03,01}, должна ответить сообщением protocol_version и разорвать соединение.

Исторически в спецификациях TLS не было чёткого указания номера версии уровня записи (TLSPlaintext.version) в сообщении ClientHello. Приложение E в [RFC5246] указывает, что TLSPlaintext.version можно выбирать для максимальной совместимости, хотя не было определено «идеального» значения. Эта рекомендация сохраняется, поэтому серверы TLS должны воспринимать любое значение {03,XX} (включая {03,00}) как номер версии для уровня записи в ClientHello, но согласование TLS 1.0 недопустимо.

5. Отказ от TLS 1.1

Использование TLS 1.1 недопустимо. Согласование TLS 1.1 из любой версии TLS недопустимо.

На практике клиентам недопустимо передавать ClientHello с ClientHello.client_version {03,02}, а серверам недопустимо передавать ServerHello с ServerHello.server_version {03,02}. Любая сторона, получившая сообщение Hello с версией протокола {03,02}, должна ответить сообщением protocol_version и разорвать соединение.

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

Исторически в спецификациях TLS не было чёткого указания номера версии уровня записи (TLSPlaintext.version) в сообщении ClientHello. Приложение E в [RFC5246] указывает, что TLSPlaintext.version можно выбирать для максимальной совместимости, хотя не было определено «идеального» значения. Эта рекомендация сохраняется, поэтому серверы TLS должны воспринимать любое значение {03,XX} (включая {03,00}) как номер версии для уровня записи в ClientHello, но согласование TLS 1.1 недопустимо.

6. Обновление RFC 7525

Документ Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) [RFC7525] является BCP 195 — самым свежим в категории Best Current Practice для реализации TLS — и основан на TLS 1.2. В момент публикации документа TLS 1.0 и TLS 1.1 ещё не считались устаревшими. Поэтому здесь BCP 195 упоминается специально для обновления текста рекомендациями этого документа по прекращению поддержки.

Этот документ обновляет параграф 3.1.1 [RFC7525] заменой не следует на недопустимо, как указано ниже.

  • Реализациям недопустимо согласовывать TLS версии 1.0 [RFC2246].

    Обоснование. Протокол TLS 1.0 (1999 г.) не поддерживает многие современные строгие шифры. Кроме того, в TLS 1.0 отсутствует вектор инициализации (Initialization Vector или IV) для шифров CBC и не выдаются предупреждения при ошибках заполнения.

  • Реализациям недопустимо согласовывать TLS версии 1.1 [RFC4346].

    Обоснование. Протокол TLS 1.1 (2006 г.) улучшает защиту по сравнению с TLS 1.0, но не поддерживает некоторые современные и более строгие шифры.

Этот документ обновляет параграф 3.1.2 [RFC7525] заменой не следует на недопустимо и добавлением ссылки на RFC 6347, как указано ниже.

  • Реализациям недопустимо согласовывать DTLS версии 1.0 [RFC4347] [RFC6347].

    Версия 1.0 протокола DTLS соответствует версии 1.1 протокола TLS (см. выше).

7. Вопросы эксплуатации

Этот документ является частью BCP 195 и в этом качестве отражает представление IETF (на момент публикации этого документа) в части опыта применения TLS и DTLS.

Хотя протокол TLS 1.1 устарел с момента публикации [RFC5246] в 2008 г., а DTLS 1.0 устарел с момента публикации [RFC6347] в 2012 г., ещё могут оставаться системы, не поддерживающие (D)TLS 1.2 и выше. Принятие рекомендаций этого документа для всех систем, которым нужно взаимодействовать с вышеупомянутыми системами, будет приводить к отказам. Однако игнорирование рекомендаций для сохранения взаимодействия сопряжено с риском. Характер возникающих рисков рассмотрен в разделах 2 и 3, а сведения о рисках следует учитывать вместе с информацией об их смягчении при решении вопроса об обновлении систем в свете рекомендаций этого документа.

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

Этот документ отменяет поддержку двух устаревших версий протокола TLS и одной устаревшей версии DTLS по описанным выще соображениям безопасности. Фронт возможных атак сужается за счет уменьшения числа поддерживаемых протоколов и возможностей отката к старым версиям.

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

[RFC2246] Dierks, T. and C. Allen, «The TLS Protocol Version 1.0», RFC 2246, DOI 10.17487/RFC2246, January 1999, <https://www.rfc-editor.org/info/rfc2246>.

[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, «SIP: Session Initiation Protocol», RFC 3261, DOI 10.17487/RFC3261, June 2002, <https://www.rfc-editor.org/info/rfc3261>.

[RFC3329] Arkko, J., Torvinen, V., Camarillo, G., Niemi, A., and T. Haukka, «Security Mechanism Agreement for the Session Initiation Protocol (SIP)», RFC 3329, DOI 10.17487/RFC3329, January 2003, <https://www.rfc-editor.org/info/rfc3329>.

[RFC3436] Jungmaier, A., Rescorla, E., and M. Tuexen, «Transport Layer Security over Stream Control Transmission Protocol», RFC 3436, DOI 10.17487/RFC3436, December 2002, <https://www.rfc-editor.org/info/rfc3436>.

[RFC3470] Hollenbeck, S., Rose, M., and L. Masinter, «Guidelines for the Use of Extensible Markup Language (XML) within IETF Protocols», BCP 70, RFC 3470, DOI 10.17487/RFC3470, January 2003, <https://www.rfc-editor.org/info/rfc3470>.

[RFC3501] Crispin, M., «INTERNET MESSAGE ACCESS PROTOCOL — VERSION 4rev1», RFC 3501, DOI 10.17487/RFC3501, March 2003, <https://www.rfc-editor.org/info/rfc3501>.

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

[RFC3568] Barbir, A., Cain, B., Nair, R., and O. Spatscheck, «Known Content Network (CN) Request-Routing Mechanisms», RFC 3568, DOI 10.17487/RFC3568, July 2003, <https://www.rfc-editor.org/info/rfc3568>.

[RFC3656] Siemborski, R., «The Mailbox Update (MUPDATE) Distributed Mailbox Database Protocol», RFC 3656, DOI 10.17487/RFC3656, December 2003, <https://www.rfc-editor.org/info/rfc3656>.

[RFC3749] Hollenbeck, S., «Transport Layer Security Protocol Compression Methods», RFC 3749, DOI 10.17487/RFC3749, May 2004, <https://www.rfc-editor.org/info/rfc3749>.

[RFC3767] Farrell, S., Ed., «Securely Available Credentials Protocol», RFC 3767, DOI 10.17487/RFC3767, June 2004, <https://www.rfc-editor.org/info/rfc3767>.

[RFC3856] Rosenberg, J., «A Presence Event Package for the Session Initiation Protocol (SIP)», RFC 3856, DOI 10.17487/RFC3856, August 2004, <https://www.rfc-editor.org/info/rfc3856>.

[RFC3871] Jones, G., Ed., «Operational Security Requirements for Large Internet Service Provider (ISP) IP Network Infrastructure», RFC 3871, DOI 10.17487/RFC3871, September 2004, <https://www.rfc-editor.org/info/rfc3871>.

[RFC3887] Hansen, T., «Message Tracking Query Protocol», RFC 3887, DOI 10.17487/RFC3887, September 2004, <https://www.rfc-editor.org/info/rfc3887>.

[RFC3903] Niemi, A., Ed., «Session Initiation Protocol (SIP) Extension for Event State Publication», RFC 3903, DOI 10.17487/RFC3903, October 2004, <https://www.rfc-editor.org/info/rfc3903>.

[RFC3943] Friend, R., «Transport Layer Security (TLS) Protocol Compression Using Lempel-Ziv-Stac (LZS)», RFC 3943, DOI 10.17487/RFC3943, November 2004, <https://www.rfc-editor.org/info/rfc3943>.

[RFC3983] Newton, A. and M. Sanz, «Using the Internet Registry Information Service (IRIS) over the Blocks Extensible Exchange Protocol (BEEP)», RFC 3983, DOI 10.17487/RFC3983, January 2005, <https://www.rfc-editor.org/info/rfc3983>.

[RFC4097] Barnes, M., Ed., «Middlebox Communications (MIDCOM) Protocol Evaluation», RFC 4097, DOI 10.17487/RFC4097, June 2005, <https://www.rfc-editor.org/info/rfc4097>.

[RFC4111] Fang, L., Ed., «Security Framework for Provider-Provisioned Virtual Private Networks (PPVPNs)», RFC 4111, DOI 10.17487/RFC4111, July 2005, <https://www.rfc-editor.org/info/rfc4111>.

[RFC4162] Lee, H.J., Yoon, J.H., and J.I. Lee, «Addition of SEED Cipher Suites to Transport Layer Security (TLS)», RFC 4162, DOI 10.17487/RFC4162, August 2005, <https://www.rfc-editor.org/info/rfc4162>.

[RFC4168] Rosenberg, J., Schulzrinne, H., and G. Camarillo, «The Stream Control Transmission Protocol (SCTP) as a Transport for the Session Initiation Protocol (SIP)», RFC 4168, DOI 10.17487/RFC4168, October 2005, <https://www.rfc-editor.org/info/rfc4168>.

[RFC4217] Ford-Hutchinson, P., «Securing FTP with TLS», RFC 4217, DOI 10.17487/RFC4217, October 2005, <https://www.rfc-editor.org/info/rfc4217>.

[RFC4235] Rosenberg, J., Schulzrinne, H., and R. Mahy, Ed., «An INVITE-Initiated Dialog Event Package for the Session Initiation Protocol (SIP)», RFC 4235, DOI 10.17487/RFC4235, November 2005, <https://www.rfc-editor.org/info/rfc4235>.

[RFC4261] Walker, J. and A. Kulkarni, Ed., «Common Open Policy Service (COPS) Over Transport Layer Security (TLS)», RFC 4261, DOI 10.17487/RFC4261, December 2005, <https://www.rfc-editor.org/info/rfc4261>.

[RFC4279] Eronen, P., Ed. and H. Tschofenig, Ed., «Pre-Shared Key Ciphersuites for Transport Layer Security (TLS)», RFC 4279, DOI 10.17487/RFC4279, December 2005, <https://www.rfc-editor.org/info/rfc4279>.

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

[RFC4497] Elwell, J., Derks, F., Mourot, P., and O. Rousseau, «Interworking between the Session Initiation Protocol (SIP) and QSIG», BCP 117, RFC 4497, DOI 10.17487/RFC4497, May 2006, <https://www.rfc-editor.org/info/rfc4497>.

[RFC4513] Harrison, R., Ed., «Lightweight Directory Access Protocol (LDAP): Authentication Methods and Security Mechanisms», RFC 4513, DOI 10.17487/RFC4513, June 2006, <https://www.rfc-editor.org/info/rfc4513>.

[RFC4531] Zeilenga, K., «Lightweight Directory Access Protocol (LDAP) Turn Operation», RFC 4531, DOI 10.17487/RFC4531, June 2006, <https://www.rfc-editor.org/info/rfc4531>.

[RFC4540] Stiemerling, M., Quittek, J., and C. Cadar, «NEC’s Simple Middlebox Configuration (SIMCO) Protocol Version 3.0», RFC 4540, DOI 10.17487/RFC4540, May 2006, <https://www.rfc-editor.org/info/rfc4540>.

[RFC4582] Camarillo, G., Ott, J., and K. Drage, «The Binary Floor Control Protocol (BFCP)», RFC 4582, DOI 10.17487/RFC4582, November 2006, <https://www.rfc-editor.org/info/rfc4582>.

[RFC4616] Zeilenga, K., Ed., «The PLAIN Simple Authentication and Security Layer (SASL) Mechanism», RFC 4616, DOI 10.17487/RFC4616, August 2006, <https://www.rfc-editor.org/info/rfc4616>.

[RFC4642] Murchison, K., Vinocur, J., and C. Newman, «Using Transport Layer Security (TLS) with Network News Transfer Protocol (NNTP)», RFC 4642, DOI 10.17487/RFC4642, October 2006, <https://www.rfc-editor.org/info/rfc4642>.

[RFC4680] Santesson, S., «TLS Handshake Message for Supplemental Data», RFC 4680, DOI 10.17487/RFC4680, October 2006, <https://www.rfc-editor.org/info/rfc4680>.

[RFC4681] Santesson, S., Medvinsky, A., and J. Ball, «TLS User Mapping Extension», RFC 4681, DOI 10.17487/RFC4681, October 2006, <https://www.rfc-editor.org/info/rfc4681>.

[RFC4712] Siddiqui, A., Romascanu, D., Golovinsky, E., Rahman, M., and Y. Kim, «Transport Mappings for Real-time Application Quality-of-Service Monitoring (RAQMON) Protocol Data Unit (PDU)», RFC 4712, DOI 10.17487/RFC4712, October 2006, <https://www.rfc-editor.org/info/rfc4712>.

[RFC4732] Handley, M., Ed., Rescorla, E., Ed., and IAB, «Internet Denial-of-Service Considerations», RFC 4732, DOI 10.17487/RFC4732, December 2006, <https://www.rfc-editor.org/info/rfc4732>.

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

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

[RFC4785] Blumenthal, U. and P. Goel, «Pre-Shared Key (PSK) Ciphersuites with NULL Encryption for Transport Layer Security (TLS)», RFC 4785, DOI 10.17487/RFC4785, January 2007, <https://www.rfc-editor.org/info/rfc4785>.

[RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault, «Calendaring Extensions to WebDAV (CalDAV)», RFC 4791, DOI 10.17487/RFC4791, March 2007, <https://www.rfc-editor.org/info/rfc4791>.

[RFC4823] Harding, T. and R. Scott, «FTP Transport for Secure Peer-to-Peer Business Data Interchange over the Internet», RFC 4823, DOI 10.17487/RFC4823, April 2007, <https://www.rfc-editor.org/info/rfc4823>.

[RFC4851] Cam-Winget, N., McGrew, D., Salowey, J., and H. Zhou, «The Flexible Authentication via Secure Tunneling Extensible Authentication Protocol Method (EAP-FAST)», RFC 4851, DOI 10.17487/RFC4851, May 2007, <https://www.rfc-editor.org/info/rfc4851>.

[RFC4964] Allen, A., Ed., Holm, J., and T. Hallin, «The P-Answer-State Header Extension to the Session Initiation Protocol for the Open Mobile Alliance Push to Talk over Cellular», RFC 4964, DOI 10.17487/RFC4964, September 2007, <https://www.rfc-editor.org/info/rfc4964>.

[RFC4975] Campbell, B., Ed., Mahy, R., Ed., and C. Jennings, Ed., «The Message Session Relay Protocol (MSRP)», RFC 4975, DOI 10.17487/RFC4975, September 2007, <https://www.rfc-editor.org/info/rfc4975>.

[RFC4976] Jennings, C., Mahy, R., and A. B. Roach, «Relay Extensions for the Message Sessions Relay Protocol (MSRP)», RFC 4976, DOI 10.17487/RFC4976, September 2007, <https://www.rfc-editor.org/info/rfc4976>.

[RFC4992] Newton, A., «XML Pipelining with Chunks for the Internet Registry Information Service», RFC 4992, DOI 10.17487/RFC4992, August 2007, <https://www.rfc-editor.org/info/rfc4992>.

[RFC5018] Camarillo, G., «Connection Establishment in the Binary Floor Control Protocol (BFCP)», RFC 5018, DOI 10.17487/RFC5018, September 2007, <https://www.rfc-editor.org/info/rfc5018>.

[RFC5019] Deacon, A. and R. Hurst, «The Lightweight Online Certificate Status Protocol (OCSP) Profile for High-Volume Environments», RFC 5019, DOI 10.17487/RFC5019, September 2007, <https://www.rfc-editor.org/info/rfc5019>.

[RFC5023] Gregorio, J., Ed. and B. de hOra, Ed., «The Atom Publishing Protocol», RFC 5023, DOI 10.17487/RFC5023, October 2007, <https://www.rfc-editor.org/info/rfc5023>.

[RFC5024] Friend, I., «ODETTE File Transfer Protocol 2.0», RFC 5024, DOI 10.17487/RFC5024, November 2007, <https://www.rfc-editor.org/info/rfc5024>.

[RFC5049] Bormann, C., Liu, Z., Price, R., and G. Camarillo, Ed., «Applying Signaling Compression (SigComp) to the Session Initiation Protocol (SIP)», RFC 5049, DOI 10.17487/RFC5049, December 2007, <https://www.rfc-editor.org/info/rfc5049>.

[RFC5054] Taylor, D., Wu, T., Mavrogiannopoulos, N., and T. Perrin, «Using the Secure Remote Password (SRP) Protocol for TLS Authentication», RFC 5054, DOI 10.17487/RFC5054, November 2007, <https://www.rfc-editor.org/info/rfc5054>.

[RFC5091] Boyen, X. and L. Martin, «Identity-Based Cryptography Standard (IBCS) #1: Supersingular Curve Implementations of the BF and BB1 Cryptosystems», RFC 5091, DOI 10.17487/RFC5091, December 2007, <https://www.rfc-editor.org/info/rfc5091>.

[RFC5158] Huston, G., «6to4 Reverse DNS Delegation Specification», RFC 5158, DOI 10.17487/RFC5158, March 2008, <https://www.rfc-editor.org/info/rfc5158>.

[RFC5216] Simon, D., Aboba, B., and R. Hurst, «The EAP-TLS Authentication Protocol», RFC 5216, DOI 10.17487/RFC5216, March 2008, <https://www.rfc-editor.org/info/rfc5216>.

[RFC5238] Phelan, T., «Datagram Transport Layer Security (DTLS) over the Datagram Congestion Control Protocol (DCCP)», RFC 5238, DOI 10.17487/RFC5238, May 2008, <https://www.rfc-editor.org/info/rfc5238>.

[RFC5263] Lonnfors, M., Costa-Requena, J., Leppanen, E., and H. Khartabil, «Session Initiation Protocol (SIP) Extension for Partial Notification of Presence Information», RFC 5263, DOI 10.17487/RFC5263, September 2008, <https://www.rfc-editor.org/info/rfc5263>.

[RFC5281] Funk, P. and S. Blake-Wilson, «Extensible Authentication Protocol Tunneled Transport Layer Security Authenticated Protocol Version 0 (EAP-TTLSv0)», RFC 5281, DOI 10.17487/RFC5281, August 2008, <https://www.rfc-editor.org/info/rfc5281>.

[RFC5364] Garcia-Martin, M. and G. Camarillo, «Extensible Markup Language (XML) Format Extension for Representing Copy Control Attributes in Resource Lists», RFC 5364, DOI 10.17487/RFC5364, October 2008, <https://www.rfc-editor.org/info/rfc5364>.

[RFC5422] Cam-Winget, N., McGrew, D., Salowey, J., and H. Zhou, «Dynamic Provisioning Using Flexible Authentication via Secure Tunneling Extensible Authentication Protocol (EAP-FAST)», RFC 5422, DOI 10.17487/RFC5422, March 2009, <https://www.rfc-editor.org/info/rfc5422>.

[RFC5469] Eronen, P., Ed., «DES and IDEA Cipher Suites for Transport Layer Security (TLS)», RFC 5469, DOI 10.17487/RFC5469, February 2009, <https://www.rfc-editor.org/info/rfc5469>.

[RFC5734] Hollenbeck, S., «Extensible Provisioning Protocol (EPP) Transport over TCP», STD 69, RFC 5734, DOI 10.17487/RFC5734, August 2009, <https://www.rfc-editor.org/info/rfc5734>.

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

[RFC5953] Hardaker, W., «Transport Layer Security (TLS) Transport Model for the Simple Network Management Protocol (SNMP)», RFC 5953, DOI 10.17487/RFC5953, August 2010, <https://www.rfc-editor.org/info/rfc5953>.

[RFC6042] Keromytis, A., «Transport Layer Security (TLS) Authorization Using KeyNote», RFC 6042, DOI 10.17487/RFC6042, October 2010, <https://www.rfc-editor.org/info/rfc6042>.

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

[RFC6353] Hardaker, W., «Transport Layer Security (TLS) Transport Model for the Simple Network Management Protocol (SNMP)», STD 78, RFC 6353, DOI 10.17487/RFC6353, July 2011, <https://www.rfc-editor.org/info/rfc6353>.

[RFC6367] Kanno, S. and M. Kanda, «Addition of the Camellia Cipher Suites to Transport Layer Security (TLS)», RFC 6367, DOI 10.17487/RFC6367, September 2011, <https://www.rfc-editor.org/info/rfc6367>.

[RFC6739] Schulzrinne, H. and H. Tschofenig, «Synchronizing Service Boundaries and <mapping> Elements Based on the Location-to-Service Translation (LoST) Protocol», RFC 6739, DOI 10.17487/RFC6739, October 2012, <https://www.rfc-editor.org/info/rfc6739>.

[RFC6749] Hardt, D., Ed., «The OAuth 2.0 Authorization Framework», RFC 6749, DOI 10.17487/RFC6749, October 2012, <https://www.rfc-editor.org/info/rfc6749>.

[RFC6750] Jones, M. and D. Hardt, «The OAuth 2.0 Authorization Framework: Bearer Token Usage», RFC 6750, DOI 10.17487/RFC6750, October 2012, <https://www.rfc-editor.org/info/rfc6750>.

[RFC7030] Pritikin, M., Ed., Yee, P., Ed., and D. Harkins, Ed., «Enrollment over Secure Transport», RFC 7030, DOI 10.17487/RFC7030, October 2013, <https://www.rfc-editor.org/info/rfc7030>.

[RFC7465] Popov, A., «Prohibiting RC4 Cipher Suites», RFC 7465, DOI 10.17487/RFC7465, February 2015, <https://www.rfc-editor.org/info/rfc7465>.

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

[RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre, «Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)», BCP 195, RFC 7525, DOI 10.17487/RFC7525, May 2015, <https://www.rfc-editor.org/info/rfc7525>.

[RFC7562] Thakore, D., «Transport Layer Security (TLS) Authorization Using Digital Transmission Content Protection (DTCP) Certificates», RFC 7562, DOI 10.17487/RFC7562, July 2015, <https://www.rfc-editor.org/info/rfc7562>.

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

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

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

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

[Bhargavan2016] Bhargavan, K. and G. Leuren, «Transcript Collision Attacks: Breaking Authentication in TLS, IKE, and SSH», DOI 10.14722/ndss.2016.23418, February 2016, <https://www.mitls.org/downloads/transcript-collisions.pdf>.

[NIST800-52r2] National Institute of Standards and Technology, «Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations NIST SP800-52r2», DOI 10.6028/NIST.SP.800-52r2, August 2019, <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-52r2.pdf>.

[RFC3316] Arkko, J., Kuijpers, G., Soliman, H., Loughney, J., and J. Wiljakka, «Internet Protocol Version 6 (IPv6) for Some Second and Third Generation Cellular Hosts», RFC 3316, DOI 10.17487/RFC3316, April 2003, <https://www.rfc-editor.org/info/rfc3316>.

[RFC3489] Rosenberg, J., Weinberger, J., Huitema, C., and R. Mahy, «STUN — Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)», RFC 3489, DOI 10.17487/RFC3489, March 2003, <https://www.rfc-editor.org/info/rfc3489>.

[RFC3546] Blake-Wilson, S., Nystrom, M., Hopwood, D., Mikkelsen, J., and T. Wright, «Transport Layer Security (TLS) Extensions», RFC 3546, DOI 10.17487/RFC3546, June 2003, <https://www.rfc-editor.org/info/rfc3546>.

[RFC3588] Calhoun, P., Loughney, J., Guttman, E., Zorn, G., and J. Arkko, «Diameter Base Protocol», RFC 3588, DOI 10.17487/RFC3588, September 2003, <https://www.rfc-editor.org/info/rfc3588>.

[RFC3734] Hollenbeck, S., «Extensible Provisioning Protocol (EPP) Transport Over TCP», RFC 3734, DOI 10.17487/RFC3734, March 2004, <https://www.rfc-editor.org/info/rfc3734>.

[RFC3920] Saint-Andre, P., Ed., «Extensible Messaging and Presence Protocol (XMPP): Core», RFC 3920, DOI 10.17487/RFC3920, October 2004, <https://www.rfc-editor.org/info/rfc3920>.

[RFC4132] Moriai, S., Kato, A., and M. Kanda, «Addition of Camellia Cipher Suites to Transport Layer Security (TLS)», RFC 4132, DOI 10.17487/RFC4132, July 2005, <https://www.rfc-editor.org/info/rfc4132>.

[RFC4244] Barnes, M., Ed., «An Extension to the Session Initiation Protocol (SIP) for Request History Information», RFC 4244, DOI 10.17487/RFC4244, November 2005, <https://www.rfc-editor.org/info/rfc4244>.

[RFC4347] Rescorla, E. and N. Modadugu, «Datagram Transport Layer Security», RFC 4347, DOI 10.17487/RFC4347, April 2006, <https://www.rfc-editor.org/info/rfc4347>.

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

[RFC4507] Salowey, J., Zhou, H., Eronen, P., and H. Tschofenig, «Transport Layer Security (TLS) Session Resumption without Server-Side State», RFC 4507, DOI 10.17487/RFC4507, May 2006, <https://www.rfc-editor.org/info/rfc4507>.

[RFC4572] Lennox, J., «Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP)», RFC 4572, DOI 10.17487/RFC4572, July 2006, <https://www.rfc-editor.org/info/rfc4572>.

[RFC4934] Hollenbeck, S., «Extensible Provisioning Protocol (EPP) Transport Over TCP», RFC 4934, DOI 10.17487/RFC4934, May 2007, <https://www.rfc-editor.org/info/rfc4934>.

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

[RFC5081] Mavrogiannopoulos, N., «Using OpenPGP Keys for Transport Layer Security (TLS) Authentication», RFC 5081, DOI 10.17487/RFC5081, November 2007, <https://www.rfc-editor.org/info/rfc5081>.

[RFC5101] Claise, B., Ed., «Specification of the IP Flow Information Export (IPFIX) Protocol for the Exchange of IP Traffic Flow Information», RFC 5101, DOI 10.17487/RFC5101, January 2008, <https://www.rfc-editor.org/info/rfc5101>.

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

[RFC5415] Calhoun, P., Ed., Montemurro, M., Ed., and D. Stanley, Ed., «Control And Provisioning of Wireless Access Points (CAPWAP) Protocol Specification», RFC 5415, DOI 10.17487/RFC5415, March 2009, <https://www.rfc-editor.org/info/rfc5415>.

[RFC5456] Spencer, M., Capouch, B., Guy, E., Ed., Miller, F., and K. Shumard, «IAX: Inter-Asterisk eXchange Version 2», RFC 5456, DOI 10.17487/RFC5456, February 2010, <https://www.rfc-editor.org/info/rfc5456>.

[RFC6012] Salowey, J., Petch, T., Gerhards, R., and H. Feng, «Datagram Transport Layer Security (DTLS) Transport Mapping for Syslog», RFC 6012, DOI 10.17487/RFC6012, October 2010, <https://www.rfc-editor.org/info/rfc6012>.

[RFC6083] Tuexen, M., Seggelmann, R., and E. Rescorla, «Datagram Transport Layer Security (DTLS) for Stream Control Transmission Protocol (SCTP)», RFC 6083, DOI 10.17487/RFC6083, January 2011, <https://www.rfc-editor.org/info/rfc6083>.

[RFC6084] Fu, X., Dickmann, C., and J. Crowcroft, «General Internet Signaling Transport (GIST) over Stream Control Transmission Protocol (SCTP) and Datagram Transport Layer Security (DTLS)», RFC 6084, DOI 10.17487/RFC6084, January 2011, <https://www.rfc-editor.org/info/rfc6084>.

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

[RFC6460] Salter, M. and R. Housley, «Suite B Profile for Transport Layer Security (TLS)», RFC 6460, DOI 10.17487/RFC6460, January 2012, <https://www.rfc-editor.org/info/rfc6460>.

[RFC6614] Winter, S., McCauley, M., Venaas, S., and K. Wierenga, «Transport Layer Security (TLS) Encryption for RADIUS», RFC 6614, DOI 10.17487/RFC6614, May 2012, <https://www.rfc-editor.org/info/rfc6614>.

[RFC7457] Sheffer, Y., Holz, R., and P. Saint-Andre, «Summarizing Known Attacks on Transport Layer Security (TLS) and Datagram TLS (DTLS)», RFC 7457, DOI 10.17487/RFC7457, February 2015, <https://www.rfc-editor.org/info/rfc7457>.

[RFC8143] Elie, J., «Using Transport Layer Security (TLS) with Network News Transfer Protocol (NNTP)», RFC 8143, DOI 10.17487/RFC8143, April 2017, <https://www.rfc-editor.org/info/rfc8143>.

[RFC8261] Tuexen, M., Stewart, R., Jesup, R., and S. Loreto, «Datagram Transport Layer Security (DTLS) Encapsulation of SCTP Packets», RFC 8261, DOI 10.17487/RFC8261, November 2017, <https://www.rfc-editor.org/info/rfc8261>.

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

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

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

Спасибо всем, кто представил данные об использовании протоколов, а также рецензентам и тем, кто помог внести улучшения в документ, включая Michael Ackermann, David Benjamin, David Black, Deborah Brungard, Alan DeKok, Viktor Dukhovni, Julien Élie, Adrian Farrelll, Gary Gapinski, Alessandro Ghedini, Peter Gutmann, Jeremy Harris, Nick Hilliard, James Hodgkinson, Russ Housley, Hubert Kario, Benjamin Kaduk, John Klensin, Watson Ladd, Eliot Lear, Ted Lemon, John Mattsson, Keith Moore, Tom Petch, Eric Mill, Yoav Nir, Andrei Popov, Michael Richardson, Eric Rescorla, Rich Salz, Mohit Sethi, Yaron Sheffer, Rob Sayre, Robert Sparks, Barbara Stark, Martin Thomson, Sean Turner, Loganaden Velvindron, Jakub Wilk, Christopher Wood.

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

Kathleen Moriarty

Center for Internet Security (CIS)

East Greenbush, NY

United States of America

Email: Kathleen.Moriarty.ietf@gmail.com

Stephen Farrell

Trinity College Dublin

Dublin

2

Ireland

Phone: +353-1-896-2354

Email: stephen.farrell@cs.tcd.ie


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

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

nmalykh@protokols.ru

1Transport Layer Security — защита транспортного уровня.

2Datagram TLS — TLS для дейтаграмм.

3Internet Engineering Task Force.

4Internet Engineering Steering Group.

5Authenticated encryption with associated data.

6International Data Encryption Algorithm — международный алгоритм шифрования данных.

7Cipher Block Chaining — цепочка шифрованных блоков.

8Message authentication code — код проверки подлинности сообщения.

9Pseudorandom Function — псевдослучайная функция.

10HMAC-based Extract-and-Expand Key Derivation Function — функция вывода ключей на основе HMAC.

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

A Weakness in the 4.2BSD Unix TCP/IP Software

25 февраля 1985 г.

A Weakness in the 4.2BSD Unix TCP/IP Software

Недостатки реализации протокола TCP в ОС 4.2BSD Unix

Robert T. Morris

AT&T Bell Laboratories

Murray Hill, New Jersey 07974

PDF

Операционная система Unix версии 4.2 Berkeley Software Distribution (далее 4.2BSD) поддерживает широкий набор программ, работа которых основана на использовании семейства протоколов TCP/IP. В частности, каждая система 4.2BSD “доверяет” некоторому множеству других систем, позволяя пользователям этих систем выполнять программы через сеть TCP/IP без проверки пароля. В этой статье описано, как TCP/IP и реализация этого стека протоколов в 4.2BSD позволяют пользователям непроверенных1 и, возможно, весьма удаленных хостов замаскироваться под доверенных пользователей. Лаборатории Bell используют постоянно расширяющуюся сеть TCP/IP, связывающую машины с различными требованиями безопасности, поэтому следует принять меры по снижению влияния описанной здесь уязвимости.

Стандарт протокола TCP/IP2 был разработан в 1979 году для реализации в «internet» – группе сетей, сильно различающихся по надежности и скоростным характеристикам и соединенных между собой через компьютеры, действующие в качестве шлюзов. Одной из наиболее популярных реализаций стека TCP/IP в среде Unix стала система 4.2BSD, используемая, в частности, Лабораториями Bell и Министерством обороны США. Программы 4.2BSD Unix TCP/IP весьма гибки и удобны, но слишком сильно доверяют другим компьютерам сети, не обеспечивая высокого уровня безопасности. Описанная здесь технология атаки не требует изменения ОС и не зависит от используемого в сети оборудования.

Стек TCP/IP концептуально делится на два уровня TCP (Transmission Control Protocol) и IP (Internet Protocol). Уровень IP обеспечивает передачу пакетов данных (дейтаграмм) между хостами через соединяющие их сети и шлюзы. Уровень TCP поддерживает множество «портов» на каждом хосте IP, обеспечивающих создание надежных и управляемых соединений (виртуальных каналов) между хостами. Соединения TCP организуются на основе сервиса передачи дейтаграмм IP. Каждый пакет TCP или IP содержит заголовок с управляющей информацией, за которым следуют передаваемые в пакет данные. В случае TCP данные предоставляются пользователем, а данными IP служат пакеты TCP. Важными элементами заголовка TCP являются номера портов получателя и отправителя, порядковый номер, номер подтверждения и некоторые флаги. Номера портов служат для идентификации “виртуальных устройств”. Порядковые номера и номера подтверждений обеспечивают корректность порядка доставки пакетов, а флаги влияют на состояние “виртуальных устройств”. Заголовок IP содержит адреса отправителя и получателя (32-битовые уникальные идентификаторы хоста и сети), а также номер протокола (например, TCP), котором протокол IP должен передать данные.

4.2BSD поддерживает функции удаленного сервера, который прослушивает запросы на организацию соединений TCP через порт 5143. При получении такого запроса сервер проверяет наличие хоста, указанного адресом отправителя в заголовке IP, в списке пользующихся доверием компьютеров. Если хост найден в этом списке, идентификатор пользователя и переданная им команда принимаются сервером к исполнению. Недостаток такой схемы состоит в том, что хост-отправитель сам указывает адрес в заголовке IP, а 4.2BSD и протокол TCP/IP не могут проверить корректность этого адреса.

Идеальным случаем была бы передача обманных пакетов непосредственно с использованием стека TCP/IP. 4.2BSD не обеспечивает такой возможности, поэтому требуются дополнительные программы для передачи обманных пакетов от систем 4.2BSD. Однако 4.2BSD предоставляет привилегированным пользователям возможность передачи пакетов IP, поэтому с минимальными усилиями можно организовать передачу пакетов с корректным номером протокола (6) и подставным адресом отправителя в заголовке IP. Для этого достаточно создать в 4.2BSD сокет типа SOCK_RAW, внести в структуру данных ядра изменение, позволяющее указывать для сокета SOCK_RAW номер протокола 6 (TCP) и подменить адрес отправителя. Это требует наличия у пользователя привилегий, однако в большой сети всегда можно найти по крайней мере один хост с недостаточным уровнем защиты для получения таких привилегий.

Имея соответствующий доступ к IP, пользовательский процесс сможет создавать и поддерживать соединения TCP без обращений к модулю протокола TCP в ядре Unix. Каждый заголовок TCP содержит контрольную сумму для обнаружения ошибок при передаче. Эта контрольная сумма учитывает не только заголовок и данные TCP, но и часть заголовка IP. Следовательно, пользовательская программа должна предсказать содержимое заголовка IP, который ядро использовало бы для инкапсуляции пакета TCP. После этого пользовательский процесс может передавать отдельные пакеты TCP.

Соединение TCP может находиться в состояниях LISTEN, SYN_SENT, SYN_RCVD и ESTABLISHED. Для каждого соединения TCP также поддерживается порядковый номер, как часть данных о состоянии этого соединения. На состояние соединения оказывают влияние флаги SYN, ACK, RST (синхронизация, подтверждение, сброс), а также порядковые номера подтверждений. Одна сторона4 инициирует соединение передачей пакета с флагом SYN и переходом в состояние SYN_SENT; другая сторона5 начинает соединение в состоянии LISTEN. В приведенной ниже диаграмме состояний каждое сообщение представлено набором флагов, порядковым номером и номером подтверждения. Каждая комбинация “состояние-событие” обычно ведет к передаче пакета и смене состояния (возможно с возникновением ошибки); ячейки таблицы показывают передаваемые пакеты и состояния соединения. M означает порядковый номер принятого пакета; N – порядковый номер, сохраненный как часть данных о состоянии порта TCP.

SYN,X,Y

ACK,X,Y,данные

LISTEN

SYN,N++,M+1
SYN_RCVD

ошибка

SYN_SENT

ACK,N,M+1

ESTABLISHED

ошибка

SYN_RCVD

RST,N,M
ошибка

ESTABLISHED

ESTABLISHED

RST,N,M

ошибка

ACK,N,M+размер данных
ESTABLISHED
(передача данных пользователю)

Данные (ACK,N,M,данные) передаются, когда обе стороны находятся в состоянии ESTABLISHED и после передачи данных значение N увеличивается на размер этих данных. Соединение также может находиться в других состояниях и использовать дополнительные флаги, не имеющие отношения к теме статьи.

4.2BSD поддерживает глобальную переменную для последовательных номеров, значение которой увеличивается на 128 каждую секунду и 64 при старте каждого соединения. Когда хост передает пакет SYN с обманным адресом, получатель такого пакета будет передавать отклик по указанному в пакете подставному адресу. Передающий пакеты с подставными адресами хост должен определить или предсказать порядковый номер неполученного им отклика, чтобы подтвердить его получение и перевести порт TCP атакуемого хоста в состояние ESTABLISHED. Предсказание порядкового номера для хоста 4.2BSD является простой задачей – достаточно организовать с атакуемым хостом реальное соединение, посмотреть полученный для него порядковый номер и увеличить его значение на 64. После этого обманная программа подтверждает этот порядковый номер, завершая тем самым процесс организации соединения, и может передавать данные (не получая, правда, откликов на них).

Дополнительные сложности связаны с тем, что SYN-пакет от атакуемого хоста не исчезает бесследно. Получив такой пакет, хост будет передавать в ответ пакет с флагом RST при получении которого атакуемый хост разорвет обманное соединение. Например, хост A шлет хосту B обманные пакеты с указанным в них адресом хоста C. Хост B будет передавать пакет SYN хосту C, в ответ на это C передаст пакет RST по адресу хоста B. В результате хост B сбросит соединение, которое хост A создал обманным путем. Однако порты хоста C, находящиеся в состоянии прослушивания входящих соединений могут не передавать пакета RST при получении неожиданного пакета SYN. Дело в том, что размер очереди ожидающих организации соединений ограничен и при получении пакета SYN, выходящего за пределы очереди такой пакет просто будет отброшен без генерации пакета RST в предположении повтора пакета SYN6. Таким образом, если обманный пакет отправлен с указанием ждущего соединений порта на подставном хосте, разрыва обманного соединения может не произойти.

Предположим, что атакующий хост A передает хосту B пакеты с адресом хоста C в поле отправителя. Пакеты адресуются в порт 514 хоста B и отправлены якобы из порта 217 (который обычно находится в состоянии ожидания) хоста C. Цепочка событий на хосте A может иметь вид:

  1. Забросать порт 21 хоста C запросами на организацию соединения для переполнения очереди.

  2. Создать реальное соединение с портом хоста B и запомнить порядковый номер, полученный от B.

  3. Создать raw-сокет IP, сменить для него номер протокола на TCP (6) и задать в качестве отправителя адрес хоста C.

  4. Передать обманный пакет SYN “из порта 21 хоста C” в порт 514 хоста B и передать пакет SYN в порт 21 хоста C для переполнения очереди.

  5. Передать пакет ACK хосту B с номером подтверждения, соответствующим сохраненному порядковому номеру, увеличенному на 64.

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

  7. Если хост B доверяет хосту C, полученная от хоста B команда будет выполнена.

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

При добавлении опущенных деталей описанная схема будет работать достаточно надежно. Она позволяет машине, подключенной к сети TCP/IP выполнить команду на любой подключенной к этой сети системе 4.2BSD, которая “доверяет” другим системам. Таким образом можно организовать различные атаки. Порядковые номера, которые должен предсказать атакующий, могут быть более случайными и 32-битовые номера создают большой простор для предсказаний. Однако атакующий может организовать достаточно большое число пробных соединений для определения алгоритма генерации случайных чисел; уровень случайности начальных порядковых номеров для соединения определяет сложность предсказания этих номеров. Еще лучше будет потребовать от всех сетей IP использовать только корректные адреса, но это зависит от используемого в сети оборудования и в некоторых случаях может не работать. Реальным выходом из положения может послужить ограничение доверительных отношений пределами локальной сети и изменение сетевых шлюзов таким образом, чтобы они отвергали пакеты, пришедшие снаружи и имеющие в поле отправителя адрес из локальной сети.

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

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

nmalykh@protokols.ru

1 В оригинале — untrusted – не пользующиеся доверием. Прим. перев.

2 Протокол IP описан в RFC 791, а TCP — в RFC 793. Прим. перев.

3 Служба shell в современной терминологии. Прим. перев.

4 Клиент. Прим. перев.

5 Сервер. Прим. перев.

6 Отметим, что пакеты SYN инициатора соединения и отвечающего сервера идентичны.

7 Порт ftp. Прим. перев.

Рубрика: Безопасность, Основы, Разное | Оставить комментарий

setcap

SETCAP

PDF

Утилита для управления возможностями файлов в Linux.

Синтаксис

setcap [-q] [-n <rootuid>] [-v] {capabilities|-|-r} filename [ ... capabilitiesN fileN ]

Описание

Без опции -v (verify — проверка) setcap устанавливает указанные возможности для каждого файла, заданного параметром filename. Необязательный аргумент -n <rootuid> можно использовать для установки возможности, используемого лишь в пространстве имен пользователя, владеющего идентификатором root. Опция -v служит для проверки связывания указанных возможностей с файлом. При указании опций -v и -n проверяется также аргумент -n <rootuid>.

Возможности указываются с помощью cap_from_text, как описано ниже.

Функция cap_from_text() выделяет и инициализирует состояние возможности в рабочем хранилище. Функция устанавливает содержимое вновь созданного состояния возможности в соответствии с понятной человеку строкой символов в стиле языка C (nul-завершение), указанной buf_p и возращает указатель на созданное состояние.
Текстовое представление возможности состоит из одного или множества разделенных пробелами «слов», каждое из которых указывает те или иные операции из набора возможностей, которые включаются или отключаются после выполнения команды (по умолчанию все отключено).

Каждое слово представляет собой список разделенных запятыми имен возможностей (или all), за которым следует список действий. Список действий включает последовательность пар «оператор-флаги». Операторами могут служить =, + и -, а флагами — e, i и p. Регистр флагов имеет значение и они указывают группу (набор), к которой относятся возможности Effective, Inheritable (наследуется) и Permitted (разрешено), соответственно.

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

Оператор = задает для указанного имени сначала сброс всех 3 параметров возможности, а затем их установку в соответствии с флагами (не обязательны для этого оператора). Например, all=p сбросит установку Effective и Inheritable для батарейного питания и установит Permitted, а cap_fowner=ep установит в Effective и Permitted возможности смены владельца файла (override-file-ownership) и сбросит их в Inheritable.

При указании первым оператора = без списка возможностей предполагается воздействие на все возможности (all). Например, варианты all=, =, и cap_chown,<every-other-capability>= будут эквивалентны.

Операторы + и требуют явного указания впереди списка возможностей, а после оператора — явных флагов. Оператор + включает все указанные в списке возможности в соответствии с флагами, а оператор отключает. Например, all+p включает для всех возможностей Permitted, а cap_fowner-i отключает override-file-ownership в группе Inheritable.

Список действий может включать множество пар «оператор-флаги», действия применяются слева направо. Например, cap_fowner+p-i эквивалентно cap_fowner+p cap_fowner-i, а cap_fowner+pe-i эквивалентно cap_fowner=+pe.

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

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

Флаг -q служит для сокращения выводимых программой сведений.

Список возможностей

Для выполнения проверки прав доступа в традиционных системах UNIX процессы делят на две категории — привилегированные (идентификатор эффективного пользователя равен 0, как у root), и непривилегированные (ID эффективного пользователя не равен 0). Для привилегированных процессов проверки прав в ядре не выполняются, а для не привилегированных процессов выполняется полная проверка на основе возможностей процесса (обычно, эффективные UID и GID, а также и список дополнительных групп).

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

CAP_AUDIT_CONTROL (2.6.11)

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

CAP_AUDIT_READ (3.16)

Чтение протокола аудита через многоадресный сокет netlink.

CAP_AUDIT_WRITE (2.6.11)

Запись данных в журнал аудита ядра.

CAP_BLOCK_SUSPEND (3.5)

Возможности, которые могут приводить к блокированию приостановки системы (epoll  EPOLLWAKEUP, /proc/sys/wake_lock).

CAP_BPF (5.8)

Привилегированные операции BPF (bpf, bpf_helpers). Возможность добавлена в Linux 5.8 для разгрузки перегруженной возможности CAP_SYS_ADMIN.

CAP_CHECKOUT_RESTORE (5.9)

    • Обновление /proc/sys/kernel/ns_last_pid (pid_namespaces);
    • использование свойства set_tid в clone3;
    • чтение содержимого символьной ссылки /proc/[pid]/map_files для других процессов.

Возможность добавлена в Linux 5.9 для переноса функциональности checkpount/restote из CAP_SYS_ADMIN.

CAP_CHOWN

Произвольные изменения UID и GID для файлов.

CAP_DAC_OVERRIDE

Пропуск проверки доступа к файлу на чтение, запись и выполнение (DAC или discretionary access control — избирательный контроль доступа).

CAP_DAC_READ_SEARCH

    • Пропуск проверки доступа к файлу на чтение и к каталогу на чтение и выполнение (просмотр);
    • вызов open_by_handle_at;
    • использование linkat с флагом AT_EMPTY_PATH для создания ссылки на файл, заданным дескриптором.

AP_FOWNER

    • Пропуск проверки доступа для операций, которые обычно требуют совпадения UID файловой системы процесса и UID файла (например, chmod,  utime), исключая операции, охватываемые CAP_DAC_OVERRIDE и CAP_DAC_READ_SEARCH, системы процесса и UID файла (например, chmod  utime),  исключая операции, охватываемые CAP_DAC_OVERRIDE и CAP_DAC_READ_SEARCH;
    • изменение флагов inode (ioctl_iflags) у произвольных файлов;
    • установка списков контроля доступа (ACL) для произвольных файлов;
    • игнорирование закрепляющего бита при удалении файла;
    • установка O_NOATIME для произвольных файлов в open и fcntl.

CAP_FSETID

Позволяет не сбрасывать биты режима set-user-ID и set-group-ID при изменении файла любыми дополнительными GID вызывающего процесса.

CAP_IPC_LOCK

Блокировка памяти (mlock, mlockall, mmap, shmctl).

CAP_IPC_OWNER

Отмена проверки доступа для операций с объектами System V IPC.

CAP_KILL

ioctl с операцией KDSIGACCEPT.

CAP_LEASE

(2.4) Установка аренды для произвольных файлов (fcntl).

CAP_LINUX_IMMUTABLE

Установка флагов inode FS_APPEND_FL и FS_IMMUTABLE_FL (ioctl_iflags).

CAP_MAC_ADMIN

(2.6.25) Изменение MAC или состояния. Реализована в Smack Linux Security Module (LSM).

CAP_MAC_OVERRIDE

(2.6.25) Замещение мандатного контроля доступа (MAC). Реализована в Smack LSM.

CAP_MKNOD

(2.4) Создание специальных файлов с помощью mknod.

CAP_NET_ADMIN

Различные сетевые операции:

    • настройка интерфейса;
    • управление IP МСЭ, трансляцией адресов и ведением учёта;
    • изменение таблиц маршрутизации;
    • привязка к любому адресу для организации прозрачного прокси;
    • назначение типа обслуживания (TOS);
    • сброс статистики драйвера;
    • управление режимом захвата (promiscuous);
    • включение групповой рассылки (multicasting);
    • использование setsockopt для включения параметров сокета SO_DEBUG, SO_MARK, SO_PRIORITY (для приоритетов вне диапазона 0 — 6), SO_RCVBUFFORCE и SO_SNDBUFFORCE.

CAP_NET_BIND_SERVICE

Привязка сокета к привилегированным портам домена Internet (номера портов меньше 1024).

CAP_NET_BROADCAST

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

CAP_NET_RAW

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

CAP_PERFMON (5.9)

Управление механизмами мониторига, включая:

    • вызов perf_event_open;
    • реализация операций BPF, влияющих на производительность.

Возможность добавлена в Linux 5.9 для разгрузки перегруженной возможности CAP_SYS_ADMIN.

CAP_SETGID

Произвольные действия с GID процесса и списком дополнительных GID, подмена GID при передаче возможностей сокета через доменные сокеты UNIX, запись отображения идентификатора пользователя в пользовательское пространство (user_namespaces).

CAP_SETFCAP

(2.6.24) Устанавливает произвольные возможности для файла.

CAP_SETPCAP

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

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

CAP_SETUID

Произвольные действия с UID процесса (setuid, setreuid, setresuid, setfsuid), подмена UID при передаче возможностей сокета через доменные сокеты UNIX, запись отображения идентификатора пользователя в пользовательское пространство (user_namespaces).

CAP_SYS_ADMIN

    • Управление системой, включая quotactl, mount, umount, swapon, swapoff, sethostname, setdomainname;
    • привилегированные операции syslog (начиная с Linux 2.6.37, для этих операций нужно использовать CAP_SYSLOG);
    • команды VM86_REQUEST_IRQ vm86;
    • функциональность checkpoint/restore, обеспечиваемая CAP_CHECKPOIBT_RESTORE (предпочтительна);
    • функциональность BPF, обеспечиваемая CAP_BPF (предпочтительна);
    • функциональность мониторинга производительности, обеспечиваемая CAP_PERFMON (предпочтительна);
    • операции IPC_SET и IPC_RMID над произвольными объектами System V IPC;
    • перезапись ограничения ресурса RLIMIT_NPROC;
    • операции над расширенными атрибутами trusted и security (xattr);
    • использование lookup_dcookie;
    • использование ioprio_set для назначения классов планирования ввода-вывода IOPRIO_CLASS_RT и (до Linux 2.6.25) IOPRIO_CLASS_IDLE;
    • подмена PID при передаче возможостей сокета через доменные сокеты UNIX;
    • превышение системного ограничения (/proc/sys/fs/file-max) на количество открытых файлов в системных
      вызовах, открывающих файлы (например, accept, execve, open, pipe);
    • использование флагов CLONE_*, создающих новые пространства имён с помощью clone и unshare
      (начиная с Linux 3.8 для создания пользовательских пространств никаких возможностей не требуется);
    • вызовы perf_event_open;
    • доступ к информации о привилегированном событии perf;
    • вызовы setns (требуется CAP_SYS_ADMIN в целевом пространстве имён);
    • вызовы fanotify_init;
    • привилегированные операции KEYCTL_CHOWN и KEYCTL_SETPERM в keyctl;
    • вызовы ptrace PTRACE_SECCOMP_GET_FILTER для получения дампа фильтров seccomp трассируемого;
    • операция MADV_HWPOISON в madvise;
    • использование TIOCSTI в ioctl для вставки символов во входную очередь терминала, отличного от управляющего терминала вызывающего;
    • устаревший системный вызов nfsservctl;
    • устаревший системный вызов bdflush;
    • привилегированные операции ioctl над блочными устройствами;
    • привилегированные операции ioctl над файловой системой;
    • привилегированные операции ioctl над устройством /dev/random (random);
    • установка фильтров seccomp без начальной установки атрибута потока no_new_privs;
    • изменение правил разрешения и запрета для групп управления устройствами;
    • операция ptrace PTRACE_SECCOMP_GET_FILTER для получения дампа фильтров seccomp трассируемого;
    • операция ptrace PTRACE_SETOPTIONS для приостановки защиты seccomp трассируемого (т. е., флаг PTRACE_O_SUSPEND_SECCOMP)
    • административные операции над многими драйверами устройств;
    • изменение значений приоритета autogroup путем записи в /proc/[pid]/autogroup.

CAP_SYS_BOOT

Использование reboot и kexec_load.

CAP_SYS_CHROOT

Использование chroot и смена примонтированных пространств имен с помощью setns.

CAP_SYS_MODULE

Загрузка и выгрузка модулей ядра (init_module и delete_module), в ядрах до версии 2.6.25 — отзыв возможностей из системного набора Bounded.

CAP_SYS_NICE

    • Снижение приоритета процесса (nice, setpriority) и изменение приоритета произвольных процессов;
    • задание политики планирования в реальном масштабе времени для вызывающего процесса, а также политики планирования и приоритетов для произвольных процессов (sched_setscheduler, sched_setparam, shed_setattr);
    • привязка к ЦП для произвольных процессов (sched_setaffinity);
    • назначение класса планирования ввода-вывода и приоритета для произвольных процессов (ioprio_set);
    • применение migrate_pages к произвольным процессам для их переноса на произвольные узлы;
    • применение move_pages к произвольным процессам;
    • использование флага MPOL_MF_MOVE_ALL в mbind и move_pages.

CAP_SYS_PACCT

Использование acct.

CAP_SYS_PTRACE

    • Трассировка любого процесса с помощью ptrace;
    • применение get_robust_list к произвольным процессам;
    • перенос данных в память произвольного процесса (или из нее) с помощью process_vm_readv и process_vm_writev;
    • изучение процессов с помощью kcmp.

CAP_SYS_RAWIO

  • Операции ввода-вывода из портов (iopl и ioperm);
  • доступ к /proc/kcore;
  • использование операции FIBMAP в ioctl(2);
  • создание устройств для доступа к специальным регистрам x86 (MSR, msr);
  • обновление /proc/sys/vm/mmap_min_addr;
  • отображение памяти по адресам меньше значения, заданного в /proc/sys/vm/mmap_min_addr;
  • отображение файлов в /proc/bus/pci;
  • доступ к /dev/mem и /dev/kmem;
  • выполнение различных команд устройств SCSI;
  • определённые операции с устройствами hpsa и cciss;
  • некоторые специальные операции с другими устройствами.

CAP_SYS_RESOURCE

  • Использование зарезервированного пространства файловых систем ext2;
  • вызовы ioctl, управляющие журналом ext3;
  • превышение ограничений дисковой квоты;
  • увеличение ограничений по ресурсам (setrlimit);
  • перезапись ограничений ресурсов RLIMIT_NPROC;
  • превышение максимального числа консолей при выделении консоли;
  • превышение максимального числа раскладок;
  • использование более 64hz прерывания из часов реального времени;
  • установка значения msg_qbytes очереди сообщений System V больше /proc/sys/kernel/msgmnb (msgop и msgctl);
  • разрешение RLIMIT_NOFILE ограничивать число файловых дескрипторов, передаваемых в обход, при передаче другому процессу через доменный сокет UNIX (unix);
  • переопределение /proc/sys/fs/pipe-size-max при назначении вместимости канала с помощью команды F_SETPIPE_SZ в fcntl;
  • использование F_SETPIPE_SZ для увеличения вместимости канала сверх /proc/sys/fs/pipe-max-size;
  • переопределение /proc/sys/fs/mqueue/queues_max, /proc/sys/fs/mqueue/msg_max, /proc/sys/fs/mqueue/msg-size_max при создании очередей сообщений POSIX (mq_overview);
  • операция prctl PR_SET_MM();
  • установка в /proc/[pid]/oom_score_adj значения меньше последнего, заданного процессом с помощью CAP_SYS_RESOURCE.

CAP_SYS_TIME

Настройка системных часов (settimeofday, stime, adjtimex) и часов реального времени (аппаратных).

CAP_SYS_TTY_CONFIG

Использование vhangup(2) и привилегированные операции ioctl с виртуальными терминалами.

CAP_SYSLOG (2.6.37)

Привилегированные операции syslog, просмотр адресов ядра в /proc  и  других  интерфейсах, когда значение /proc/sys/kernel/kptr_restrict = 1 (kptr_restrict в proc).

CAP_WAKE_ALARM (3.0)

Вызов чего-либо при пробуждении системы (установка таймеров CLOCK_REALTIME_ALARM и CLOCK_BOOTTIME_ALARM).

Группы (наборы) возможностей потока

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

Permitted – разрешенные возможности

Ограничивающее надмножество набора Effective с возможностями, которые поток может предполагать. Этот набор также ограничивает список возможностей, которые могут быть добавлены в наследуемый набор потоком без CAP_SETPCAP в своём наборе Effective.

Если поток отменяет возможность в своем наборе Permitted, он не сможет вернуть ее (без вызова execve из программы с set-user-ID-root или программы, чьи возможности для файла позволяют это).

Inheritable – наследуемые возможности

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

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

Bounding

(на уровне потока, начиная с Linux 2.6.25) Механизм, который может использоваться для ограничения возможностей, предоставляемых вызовом execve.

Начиная с Linux 2.6.25, этот набор задается на уровне потока, а в более ранних версиях это атрибут системы для всех потоков.

Effective

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

Ambient — внешние (охватывающие) возможности

(начиная с Linux 4.3) Набор возможностей, сохраняемый после execve для непривилегированных программ. Для набора внешних возможностей соблюдается правило, в соответствии с которым возможность не может  быть внешней, если она не входит в оба набора Permitted и Inheritable.

Набор внешних возможностей можно изменять с помощью prctl. Этот набор автоматически сужается при сужении соответствующего набора Permitted и Inheritable.

Выполнение программы, меняющей UID или GUI из-за установленного бита set-user-ID или set-group-ID, а также програмы, которая может устанавливать возможности для файла, сбрасывает набор Ambient. Внешние возможности добавляются к набору Permitted и назначаются набору Effective при вызове execve. Если внешние возможности расширяют набор Permitted или Effective при вызове execve, это не вызывает режим защищенного исполнения (secure-execution), описанный в ld.so.

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

Поток может менять свои возможности с помощью capset.

Начиная с версии 2.6.24 файл /proc/sys/kernel/cap_last_cap показывает максимальное численное значение возможностей, поддерживаемых работающим ядром. Это позволяет определить старший бит, который можно установить в наборе возможностей.

Возможности для файлов

Начиная с ядра 2.6.24 поддерживается связывание наборов возможностей с исполняемым файлом с помощью утилиты setcap. Наборы возможностей хранятся в расширенном атрибуте (setxattr, xattr) с именем security.capability. Для записи в этот атрибут требуется возможность CAP_SETFCAP. Наборы возможностей файла вместе с наборами возможностей потока определяют реальные возможности потока после вызова execve.

Для файла поддерживатся три набора возможностей.

Permitted (ранее forced)

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

Inheritable (ранее allowed)

Пересечение (AND) этого набора с набром наследуемых потоком возможностей определяет для потока набор Permitted после вызова execve.

Effective

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

Установка бита предполагает, что любая из возможностей Effective или Inheritable для файла, которая заставляет поток обретать соответствующую возможность Permitted в результате вызова execve (Правила преобразования), также будет включена в набор Effective. Поэтому при включении возможности для файла (setcap, cap_set_file, cap_set_fd) установка бита Effective для любой возможности должна сопровождаться установкой этого флага для всех других возможностей, где установлен флаг Permitted или Inheritable.

Правила преобразования

При выполнении execve ядро рассчитывает новые возможности процесса, как показано ниже.

P'(ambient)     = (файл привилегированный) ? 0 : P(ambient)
P'(permitted)   = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding)) | P'(ambient)
P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)
P'(inheritable) = P(inheritable)    [>т. е. не меняется]
P'(bounding)    = P(bounding)       [т. е. не меняется]

где P() указывает значение возможности потока до вызова execve, P'() — возможности после вызова, F() — набор возможностей для файла.

Отметим некоторые детали, относящиеся к правилам преобразования возможностей:

  • набор Ambient появился лишь в Linux 4.3 и при преобразовании набора внешних возможностей в процессе execve привилегированным считается файл, имеющий возможности или установленный бит set-user-ID или set-group-ID bit set;

  • до Linux 2.6.25 набор Bounding был системным атрибутом для всех потоков и это значение использовалось для расчетов при вызове execve как P(bounding).

Отметим, что при описанном выше преобразовании возможности файла можно игнорировать (считать пустыми) по тем же причинам, которые служат для игнорирования битов set-user-ID и set-group-ID. Возможности файлов игнорируются при загрузке ядра с опцией no_file_caps option.

Текст подготовлен на основании материалов man из Mageia 8.

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

nmalykh@protokols.ru

Рубрика: Linux | Комментарии к записи setcap отключены

RFC 8972 Simple Two-Way Active Measurement Protocol Optional Extensions

Internet Engineering Task Force (IETF)                         G. Mirsky
Request for Comments: 8972                                        X. Min
Updates: 8762                                                  ZTE Corp.
Category: Standards Track                                      H. Nydell
ISSN: 2070-1721                                        Accedian Networks
                                                                R. Foote
                                                                   Nokia
                                                             A. Masputra
                                                              Apple Inc.
                                                              E. Ruffini
                                                                  OutSys
                                                            January 2021

Simple Two-Way Active Measurement Protocol Optional Extensions

Необязательные расширения протокола STAMP

PDF

Аннотация

Этот документ описывает необязательные расширения для протокола STAMP), позволяющего измерять параметры производительности. Документ также определяет идентификатор тестовой сессии (STAMP Test Session Identifier), обновляя тем самым RFC 8762.

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

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

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

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

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

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

Простой протокол активных двухсторонних измерений (Simple Two-way Active Measurement Protocol или STAMP) [RFC8762] задает базовую функциональность STAMP. В этом документе описаны необязательные расширения, использующие кодирование TLV. Такие расширения дополняют базовые функции STAMP, такие как измерение односторонней или круговой задержки, задержки при обработке, потери пакетов, их дублирование и нарушение порядка доставки. Спецификация определяет необязательные расширения STAMP, их формат и теорию работы. Определен также идентификатор тестовых сессий (STAMP Test Session Identifier) в качестве обновления [RFC8762].

2. Используемые соглашения

2.1. Сокращения

BDS

BeiDou Navigation Satellite System (навигационная система BeiDou).

BITS

Building Integrated Timing Supply (устройство синхронизации здания).

CoS

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

DSCP

Differentiated Services Code Point (код дифференцированного обслуживания).

ECN

Explicit Congestion Notification (явное увкдомление о перегрузке).

GLONASS

Global Orbiting Navigation Satellite System (глобальная орбитальная спутниковая система навигации).

GPS

Global Positioning System (глобальная система позиционирования) [GPS].

HMAC

Hashed Message Authentication Code (хэшированный код аутентификации сообщения).

LORAN-C

Long Range Navigation System Version C (система навигации дальнего действия, версия C).

MBZ

Must be Zero (должно быть 0).

NTP

Network Time Protocol (протокол сетевого времени) [RFC5905].

PMF

Performance Measurement Function (функция измерения производительности).

PTP

Precision Time Protocol (протокол точного времени) [IEEE.1588.2008].

RP

Reverse Path (обратный путь).

SMI

Structure of Management Information (структура информации управления).

SSID

STAMP Session Identifier (идентификатор сессии STAMP).

SSU

Synchronization Supply Unit (блок синхронизации).

STAMP

Simple Two-way Active Measurement Protocol (простой протокол активного двухстороннего измерения).

TLV

Type-Length-Value (тип, размер, значение).

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

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

3. Идентификатор сессии STAMP

STAMP Session-Sender передает тестовые пакеты рефлектору STAMP Session-Reflector. Рефлектор принимает пакеты от Session-Sender и действует в соответствии со своей конфигурацией и необязательными управляющими сигналами в тестовых пакетах от Session-Sender. Протокол STAMP определяет два формата пакетов — один для STAMP Session-Sender, другой для STAMP Session-Reflector и может работать в режиме с аутентификацией или без нее. Тестовые пакеты STAMP без аутентификации совместимы в линии с пакетами TWAMP-Test без аутентификации [RFC5357].

По умолчанию STAMP использует симметричные пакеты, т. е. размер пакетов, переданных Session-Reflector , совпадает с размером пакетов, полученных рефлектором.

Сессия STAMP идентифицируется квартетом (4-tuple) из IP-адресов отправителя и получателя, а также портов UDP на той и другой стороне). STAMP Session-Sender может создавать уникальный для него идентификатор сессии SSID, представляющий собой 2-октетное положительное целое число. Правила генерации SSID определяются реализацией. В [NUM-IDS-GEN] тщательно проанализированы базовые алгоритмы для генерации идентификаторов и их уязвимости. Например, реализация может использовать алгоритмы, описанные в параграфе 7.1 [NUM-IDS-GEN]. Реализации недопустимо назначать один идентификатор разным тестовым сессиям STAMP. Session-Sender может применять SSID для идентификации тестовых сессий STAMP. При использовании SSID идентификатор должен включаться в каждый тестовый пакет данной сессии. Расположение SSID в режиме без аутентификации показано на рисунке 1.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |             SSID              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                                                               |
|                         MBZ (28 октетов)                      |
|                                                               |
|                                                               |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                            TLVs                               ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 1. Формат расширенного пакета без аутентификации.


Реализация STAMP Session-Reflector, поддерживающая эту спецификацию, должна идентифицировать сессию STAMP по SSID в комбинации с обычным квартетом для сессии. Перед началом тестовой сессии рефлектору должны быть предоставлены все элементы, идентифицирующие сессию. STAMP Session-Reflector должен отбрасывать не соответствующие сессии пакеты STAMP. Способ предоставления идентификационных данных сессии выходит за рамки документа. Соответствующая спецификации реализация STAMP Session-Reflector должна копировать значение SSID из полученных тестовых пакетов в отражаемые пакеты, как показано на рисунке 2.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |           SSID                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Receive Timestamp                    |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Session-Sender Sequence Number                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Session-Sender Timestamp                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Session-Sender Error Estimate |           MBZ                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ses-Sender TTL |                   MBZ                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                            TLVs                               ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 2. Формат отраженного расширенного пакета без аутентификации.


Не поддерживающий эту спецификацию STAMP Session-Reflector будет возвращать нулевое значение поля SSID в отраженных пакетах STAMP и Session-Sender может прервать сессию при получении такого поля SSID. Реализация Session-Sender должна поддерживать управление поведением в таких случаях. Если тестовая сессия не прерывается, Session-Sender может передавать базовые пакеты STAMP [RFC8762] или продолжить передачу пакетов с SSID.

Размещение поля SSID в режиме с аутентификацией показано на рисунках 3 и 4.


 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sequence Number                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                      MBZ (12 октетов)                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Timestamp                              |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Error Estimate         |            SSID               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                                                               ~
|                         MBZ (68 октетов)                      |
~                                                               ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                       HMAC (16 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                            TLVs                               ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 3. Формат расширенного пакета с аутентификацией.


 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (12 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |            SSID               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (4 октетов)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Receive Timestamp                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (8 октетов)                        |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Session-Sender Sequence Number                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (12 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Session-Sender Timestamp                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Session-Sender Error Estimate |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                        MBZ (6 октетов)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ses-Sender TTL |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
|                        MBZ (15 октетов)                       |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        HMAC (16 октетов)                      |
|                                                               |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                            TLVs                               ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 4. Формат отраженного расширенного пакета с аутентификацией.

4. TLV-расширения для STAMP

Кодирование TLV обеспечивает гибкий механизм расширения для необязательных информационных элементов за счет включения необязательного поля TLV в тестовый пакет STAMP. Это поле TLV может содержать другие TLV в зависимости от семантики (внешнего) TLV. TLV имеют однооктетное поле STAMP TLV Flags, однооктетное поле Type и двухоктетное поле Length, указывающее размер поля Value в октетах. Если поле Type для TLV или суб-TLV имеет значение из диапазона Private Use [RFC8126], размер должен быть не меньше 4 и первые четыре октета должны содержать фирменный код SMI (Private Enterprise Code), как указано в субреестре IANA SMI Network Management Private Enterprise Codes, с сетевым полядком байтов. Остальная часть поля Value определяется производителем. В последующих параграфах описано применение TLV для STAMP, расширяющее базовую спецификацию STAMP.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|     Type      |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                            Value                              ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 5. Формат TLV в расширенном пакете STAMP.


STAMP TLV Flags

8-битовое поле. Формат и интерпретация описаны ниже.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле, указывающее размер поля Value в октетах.

Value

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

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

Формат поля STAMP TLV Flags показан на рисунке 6, а флаги местоположения определены в параграфе 5.2.

 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|U|M|I|R|R|R|R|R|
+-+-+-+-+-+-+-+-+

Рисунок 6. Формат поля флагов.


U (Unrecognized)

Session-Sender должен устанавливать U = 1 перед отправкой расширенного пакета STAMP, а Session-Reflector должен устанавливать U = 1, если он не понимает данный TLV. Для известных TLV рефлектор должен указывать в отраженных пакетах U = 0.

M (Malformed)

Session-Sender должен устанавливать M = 1 перед отправкой расширенного пакета STAMP, а Session-Reflector должен устанавливать M = 1, если считает формат TLV некорректным (поле Length не соответствует типу или оставщаяся часть пакета STAMP меньше размера данного TLV). В остальных случаях рефлектор должен указывать в отраженных пакетах M = 0.

I (Integrity)

Session-Sender должен устанавливать I = 0 перед отправкой расширенного пакета STAMP, а Session-Reflector должен устанавливать I = 1, если расширения STAMP не прошли проверку HMAC (параграф 4.8). В остальных случаях рефлектор должен указывать в отраженных пакетах I = 0.

R

Зарезервированные на будущее флаги, которые должны содержать 0 при передачи и игнорироваться при получении.

Узел STAMP (Session-Sender или Session-Reflector), получивший тестовый пакет, должен проверить, является пакет базовым или содержит TLV. Узел должен сравнить значение поля Length в заголовке UDP и размер базового пакета STAMP в режиме (с аутентификацией или без нее), заданном конфигурацией сессии STAMP. Если разница превышает размер заголовка UDP, тестовый пакет включает STAMP TLV, следующие сразу за базовым пакетом STAMP. Рефлектор, не поддерживающий принятые расширения, не будет обрабатывать их, а просто скопирует в отраженный пакет, как указано в параграфе 4.3 [RFC8762]. Поддерживающий TLV рефлектор укажет необработанные им TLV установкой для них флага U = 1.

STAMP Session-Sender, получающий отраженные пакеты STAMP с TLV, должен проверить все TLV как указано ниже.

  • При установленном флаге U система STAMP должна пропустить обработку соответствующего TLV.

  • При установленном флаге M система STAMP должна прекратить обработку оставшейся части пакета STAMP.

  • При установленном флаге I система STAMP должна отбросить все TLV и должна прекратить обработку оставшейся части пакета STAMP.

  • Если реализация Session-Reflector не распознает значение поля Type, она должна включить копию TLV в отраженный пакет STAMP и должна установить для нее U = 1. Рефлектор должен пропускать обработку неизвестных TLV.

  • При нарушении формата TLV обработка TLV расширений должна прекращаться. Session-Reflector должен скопировать оставшуюся часть полученного пакета STAMP в отраженный пакет и должен установить M = 1.

4.1. TLV дополнительного заполнения

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                         Extra Padding                         ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 7. TLV дополнительного заполнения.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле, указывающее размер поля Value в октетах.

Extra Padding

Это поле следует заполнять псевдослучайными значениями, но можно заполнить нулями. Реализация должна контролировать поле Extra Padding.

Блок Extra Padding TLV похож на поле Packet Padding в пакетах TWAMP-Test [RFC5357]. Применение Extra Padding TLV рекомендуется для тестов STAMP, использующих пакеты, размер которых превышает базовый [RFC8762] размер, составляющий 44 октета в режиме без аутентификации и 112 — в режиме с аутентификацией. Extra Padding TLV может присутствовать в пакете STAMP в нескольких экземплярах.

4.2. TLV местоположения

STAMP Session-Sender может включать Location TLV переменного размера для запроса информации о местоположении рефлектора. Отправителю недопустимо заполнять в этом случае какие-либо поля, за исключением STAMP TLV Flags, Type и Length. Рефлектор должен проверять корректность формата TLV и следовать описанной в разделе 4 процедуре при обнаружении несоответствия.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Destination Port       |          Source Port          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                         Sub-TLVs                              ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 8. Location TLV.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле, указывающее размер поля Value в октетах.

Destination Port

2-октетное поле с номером целевого порта UDP в принятом пакете STAMP.

Source Port

2-октетное поле с номером порта отправителя UDP в принятом пакете STAMP.

Sub-TLVs

Последовательность суб-TLV, определенная ниже, которые Session-Sender использует для запроса информации о местоположении. Session-Reflector отвечает на них соответствующими суб-TLV для типа адреса (например, IPv4 или IPv6), используемого им.

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

4.2.1. Суб-TLV местоположения

Location TLV использует формат, показанный на рисунке 5. Обработка флагов U и M для этого суб-TLV выполняется в соответствии с разделом 4. Для флага I отправитель и рефлектор должны устанавливать значение 0 до передачи, а на приемной стороне флаг игнорируется. Ниже приведены типы суб-TLV для Location TLV, определенные этой спецификацией (таблица 5).

Source MAC Address

12-октетный блок суб-TLV с Type = 1. Поле Length должно иметь значение 8, поле Value является 8-октетным MBZ, которое должно заполняться нулями при передаче и игнорироваться при получении.

Source EUI-48 Address

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        EUI-48  Address                        |
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |            MBZ                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 9. Поле Value в суб-TLV Source EUI-48 Address.

12-октетный блок суб-TLV MAC-адресом отправителя EUI-48 и Type = 2. Поле Length должно иметь значение 8.

EUI-48 Address

6-октетное поле.

MBZ

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

Source EUI-64 Address

12-октетный блок суб-TLV, содержащий MAC-адрес EUI-64 для отправителя и Type = 3. Поле Length должно иметь значение 8, а Value содержит 8-октетный адрес EUI-64.

Destination IP Address

20-октетный блок суб-TLV с Type = 4. Поле Length должно иметь значение 16, а 16-октетное поле MBZ должно заполняться нулями при передаче и игнорироваться при получении.

Destination IPv4 Address

20-октетный блок суб-TLV с адресом получателя IPv4 и Type = 5. Поле Length должно иметь значение 16.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         IPv4 Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                        MBZ (12 октетов)                       ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 10. Поле Value в суб-TLV IPv4 Address.

IPv4 Address

4-октетное поле.

MBZ

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

Destination IPv6 Address

20-октетный блок суб-TLV с адресом получателя IPv6 и Type = 6. Поле Length должно иметь значение 16, а Value содержит 16-октетный адрес IPv6.

Source IP Address

20-октетный блок суб-TLV с Type = 7. Поле Length должно иметь значение 16, а Value содержит 16-октетное поле MBZ, которое должно заполняться нулями при передаче и игнорироваться при получении.

Source IPv4 Address

20-октетный блок суб-TLV с адресом отправителя IPv4 и Type = 8. Поле Length должно иметь значение 16, а Value содержит показанные ниже поля (рисунок 10).

IPv4 Address

4-октетное поле.

MBZ

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

Source IPv6 Address

20-октетный блок суб-TLV с адресом отправителя IPv6 и Type = 9. Поле Length должно иметь значение 16, а Value содержит 16-октетный адрес IPv6.

4.2.2. Теория работы Location TLV

Session-Reflector, принимающий расширенный пакет STAMP с Location TLV, должен включить в отраженный пакет Location TLV, размер которого совпадает с размером Location TLV в полученном пакете. В соответствии с локальной политикой Session-Reflector может не сообщать значения некоторых полей, заполнив их нулями. Реализация Session-Reflector с учетом состояния должна обеспечивать управление политикой заполнения полей.

Session-Sender может включить суб-TLV Source MAC Address в Location TLV. Рефлектор, получивший Location TLV с суб-TLV Source MAC Address, должен включить суб-TLV Source EUI-48 Address, если MAC-адрес отправителя тестового пакета имеет формат EUI-48. Session-Reflector должен копировать MAC-адрес отправителя в поле EUI-48. В противном случае Session-Reflector должен использовать суб-TLV Source EUI-64 Address и должен копировать значение Source MAC Address из полученного пакета в поле EUI-64. Если полученный пакет STAMP не имеет поля Source MAC Address, рефлектор должен заполнить поле EUI-64 нулями до передачи отраженного пакета.

Session-Sender может включить суб-TLV Destination IP Address в Location TLV. Рефлектор, получивший Location TLV с суб-TLV Destination IP Address, должен включить суб-TLV Destination IPv4 Address, если IP-адрес отправителя полученного пакета относится к семейству IPv4. Session-Reflector должен копировать значение IP-адреса получателя в поле IPv4 Address. В противном случае Session-Reflector должен использовать суб-TLV Destination IPv6 Address и должен копировать значение IP-адреса получателя в поле IPv6 Address.

Session-Sender может включить суб-TLV Source IP Address в Location TLV. Рефлектор, получивший Location TLV с суб-TLV Source IP Address, должен включить суб-TLV Source IPv4 Address, если IP-адрес отправителя в полученном пакете относится к семейству IPv4. Session-Reflector должен копировать значение IP-адреса отправителя в поле IPv4 Address. В противном случае Session-Reflector должен использовать суб-TLV Source IPv6 Address и должен копировать значение IP-адреса отправителя в поле IPv6 Address.

Location TLV можно применять для определения IP-адреса и порта и MAC-адреса последнего интервала (last-hop) для пакета STAMP. MAC-адрес может указывать переключение пути на последнем интервале, адрес IP и порт UDP покажут наличие на пути маршрутизаторов NAT. Это позволяет отправителю узнать IP-адрес рефлектора, расположенного за транслятором NAT и обнаружить изменения в отображении NAT, которые могут приводить к отправке пакетов STAMP не тому рефлектору.

4.3. TLV характеристик временных меток

STAMP Session-Sender может включать Timestamp Information TLV для запроса информации у рефлектора. Отправителю недопустимо указывать информационные поля, за исключением STAMP TLV Flags, Type и Length. Все остальные поля должны заполняться нулями. Session-Reflector должен проверять поле Length в TLV и при некорректном значении выполнять процедуру, описанную в разделе 4 для TLV с ошибкой формата.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Sync Src In  | Timestamp In  | Sync Src Out  | Timestamp Out |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                    Optional sub-TLVs                          ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 11. Timestamp Information TLV.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле, указывающее размер поля Value в октетах (рисунок 5).

Sync Src In

1-октетное поле, указывающее источник синхронизации часов на входе Session-Reflector. Имеется несколько методов синхронизации, например, протокол NTP (Network Time Protocol) [RFC5905] (таблица 7).

Timestamp In

1-октетное поле, указывающее метод, с помощью которого Session-Reflector получает временную метку T2. Это может быть аппаратный источник, подключенный через API к местным часам (wall clock) или удаленный источник (через плоскость управления). Возможные источники синхронизации указаны в таблице 9.

Sync Src Out

1-октетное поле, указывающее источник синхронизации часов на выходе Session-Reflector. Имеется несколько методов синхронизации выхода Session-Reflector (таблица 7).

Timestamp Out

1-октетное поле, указывающее метод, с помощью которого Session-Reflector получает временную метку T3 (таблица 9).

Optional sub-TLVs

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

4.4. TLV класса обслуживания

STAMP Session-Sender может включать CoS TLV в тестовые пакеты STAMP. Формат CoS TLV показан на рисунке 12.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   DSCP1   |   DSCP2   |ECN| RP|          Reserved             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 12. TLV класса обслуживания.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле со значением 4.

DSCP1

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

DSCP2

Значение поля DSCP во входных пакетах рефлектора.

ECN

Значение поля ECN во входных пакетах рефлектора.

RP (Reverse Path)

2-октетное поле, для которго Session-Sender должен устанавливать значение 0.

Reserved

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

STAMP Session-Reflector, получающий пакет с CoS TLV, должен включить CoS TLV в отраженный пакет. От также должен копировать значения полей DSCP и ECN из заголовка IP в принятом пакете STAMP в поле DSCP2 отраженного пакета. Кроме того, Session-Reflector должен использовать локальные правила для проверки соответствия CoS значению поля DSCP1, разрешенному в домене. При соответствии Session-Reflector должен установить поле DSCP в заголовке IP отраженного пакеты в соответствии с полем DSCP1 в полученном пакете. В противном случае Session-Reflector должен использовать значение DSCP из полученного пакета STAMP и установить RP = 1. При получении отраженного пакета с RP = 0 Session-Sender будет сохранять значения DSCP и ECN для анализа CoS в обратном направлении. Если в отраженном пакете RP = 1, CoS анализирется лишь для прямого направления.

Можно использовать перемаркировку CoS для разных сценариев (например, 2G, 3G, LTE в мобильных сетях) в одной сети. Однако при некорректной настройке будет сложно определить причину избыточной потери пакетов служб верхних уровней, тогда как для нижележащего уровня уровень потерь будет нормальным. использование CoS TLV в тестах STAMP помогает в поиске неполадок, а также проверке правил Diffserv при обработке CoS, требуемой конфигурацией.

4.5. TLV прямого измерения

Direct Measurement TLV позволяет собирать пакеты по профилю, т. е. из определенного потока данных, передаваемого от Session-Sender к Session-Reflector. Определение относящихся к профилю пакетов выходит за рамки документа и отдается на откуп оператору.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Session-Sender Tx counter  (S_TxC)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Session-Reflector Rx counter  (R_RxC)             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Session-Reflector Tx counter  (R_TxC)             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 13. Direct Measurement TLV.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле, указывающее размер поля Value в октетах. Поле должно иметь значение 12.

Session-Sender Tx counter (S_TxC)

4-октетное поле, к котором Session-Sender должен указывать число передаваемых по профилю пакетов.

Session-Reflector Rx counter (R_RxC)

4-октетное поле, которое Session-Sender должен устанавливать в 0, а Session-Reflector — игнорировать при получении. Рефлектор должен указывать в отраженных пакетах число принятых по профилю пакетов.

Session-Reflector Tx counter (R_TxC)

4-октетное поле, которое Session-Sender должен устанавливать в 0, а Session-Reflector — игнорировать при получении. Рефлектор должен указывать число переданных по профилю пакетов.

Session-Sender может включать Direct Measurement TLV в пакеты STAMP. При получении пакета STAMP с Direct Measurement TLV рефлектор должен включать этот блок TLV в отраженный пакет. Session-Reflector должен копировать значение поля S_TxC из полученного пакета в то же поле отраженного пакета.

4.6. TLV отчета о сети доступа

STAMP Session-Sender может включать Access Report TLV (рисунок 14) для индикации рефлектору изменения статуса сети доступа. Определение сети доступа выходит за рамки документа.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|     Type      |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   ID  |  Resv |  Return Code  |          Reserved             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 14. Access Report TLV.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле со значением 4.

ID (Access ID)

4-битовый идентификатор сети доступа, например, 3GPP (технологии радиодоступа, заданные 3GPP) или не-3GPP (доступ, не описанный 3GPP) [TS23501].

1

Сеть 3GPP.

2

Другая сеть (не-3GPP).

Другие значения недействительны и TLV с такими значениями должны отбрасываться.

Resv

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

Return Code

1-октетное поле, идентифицирующее сигнал отчета, например, доступность или недоступность. Значение предоставляется конечной точке STAMP, механизмом, выходящим за рамки этого документа. Возможные значения приведены в параграфе 5.6.

Reserved

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

STAMP Session-Sender, включающий Access Report TLV, устанавливает в поле Access ID значение, соответствующее типу сети, для которое передается отчет. Отправитель также указывает значение поля Return Code в соответствии с рабочим состоянием сети доступа. Механизм определения этого состояния выходит за рамки спецификации. Рефлектор, получивший тестовый пакет с Access Report TLV, должен включить такой TLV в отраженный пакет. Рефлектор должен скопировать в поля Access ID и Return Code значения из соответствующих полей принятого пакета.

Session-Sender должен запустить таймер повторной передачи после отправки тестового пакета с Access Report TLV. Таймер должен быть остановлен при получении отраженного пакета STAMP с Access Report TLV. Если отсчет таймера завершается до приема такого пакета, Session-Sender должен повторить тестовый пакет с Access Report TLV. Этот повтор следует выполнять до 4 раз, после чего процедуру нужно прервать. Установка значения таймера определяется локальной политикой и сетевым окружением. По умолчанию для таймера повтора Access Report TLV следует устанавливать значение 3 секунды. Реализация должна обеспечивать управления значением таймера и числом повторов.

Access Report TLV используется функцией измерения производительности (Performance Measurement Function или PMF) в системе управления доступом, коммутацией и разделением для сети 5G networks [TS23501]. PMF в пользовательском оборудовании выступает как STAMP Session-Sender, а PMF в пользовательской плоскости (User Plane) — как STAMP Session-Reflector.

4.7. Follow-Up Telemetry TLV

Session-Reflector может оказаться способным поместить в поле Follow-Up Timestamp лишь временную метку типа SW Local (таблица 9). Однако система хостинга может предоставлять временную метку ближе к началу реальной передачи пакета, даже если невозможно доставить информацию отправителю (Session-Sender) вовремя для самого пакета. Тем не менее, эта метка может быть важна для Session-Sender, поскольку она повышает точность измерения задержки в сети за счет минимизации влияния задержки в выходных очередях.

STAMP Session-Sender может включать Follow-Up Telemetry TLV для запроса информации у рефлектора. Session-Sender должен указать в полях Follow-Up Telemetry Type и Length подходящие для него значения. Поля Sequence Number и Follow-Up Timestamp должны заполняться отправителем нулями и игнорироваться рефлектором при получении пакета STAMP с Follow-Up Telemetry TLV. Рефлектор должен проверить значение поля Length в тестовом пакете STAMP. Если это значение недействительно, рефлектор должен обнулить поля Sequence Number и Follow-Up Timestamp, а также установить флаг M в поле STAMP TLV Flags отраженного пакета. Если рефлектор работает без поддержки состояния (параграф 4.2 в [RFC8762]), он должен обнулять поля Sequence Number и Follow-Up Timestamp.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Follow-Up Timestamp                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Timestamp M  |                     Reserved                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 15. Follow-Up Telemetry TLV.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле со значением 16.

Sequence Number

4-октетное поле, указывающее порядковый номер последнего пакета, отраженного в данной сессии STAMP. Поскольку Session-Reflector работает в режиме с поддержкой состояния (параграф 4.2 в [RFC8762]), это будет порядковый номер Session-Reflector из предыдущего отраженного пакета.

Follow-Up Timestamp

8-октетное поле, хормат которого задает флаг Z в поле Error Estimate базового пакета STAMP, который содержится в этом отраженном пакете от Session-Reflector, как описано в параграфе 4.2.1 [RFC8762]. Поле содержит временную метку момента передачи отраженного пакета с указанным номером.

Timestamp M(ode)

1-октетное поле, указывающее метод получения Follow-Up Timestamp элементом, передающим отраженный пакет STAMP (см. таблицу 9).

Reserved

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

4.8. HMAC TLV

STAMP в режиме с аутентификацией защищает целостность данных в базовом пакете STAMP. Расширения STAMP предназначены для предоставления дополнительных сведений об условиях в сети и их целостность тоже важна. Все базовые пакеты STAMP с аутентификацией (параграфы 4.2.2 и 4.3.2 в [RFC8762]), совместимые с этой спецификацией, должны также аутентифицировать дополнительные TLV путем включения HMAC TLV, за исключением случаев наличия лишь Extended Padding TLV. Блок HMAC TLV должен помещаться после всех TLV, включенных в пакет STAMP, за исключением Extra Padding TLV. Включение HMAC TLV в другое место расширенного тестового пакета STAMP должно считаться отказом при проверке HMAC, как указано ниже. HMAC TLV можно применять для защиты целостности расширений STAMP в режиме без аутентификации. Реализация расширений STAMP должна обеспечивать элементы управления для включения защиты целостности расширений в режиме без аутентификации.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAMP TLV Flags|      Type     |             Length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                              HMAC                             |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 16. HMAC TLV.


STAMP TLV Flags

8-битовое поле флагов, формат которого показан на рисунке 6.

Type

1-октетное поле, определяющее интерпретацию поля Value. Значения выделяются IANA (параграф 5.1).

Length

2-октетное поле со значением 16.

HMAC

16-октетное поле с кодом HMAC для всех предшествующих TLV.

Как определено в [RFC8762], STAMP использует HMAC-SHA-256 с отсечкой до 128 битов (см. [RFC4868]). Все вопросы использования ключей, рассмотренные в параграфе 4.4 [RFC8762], полностью применимы к HMAC TLV. Управление ключами HMAC и механизмы их распространения выходят за рамки этой спецификации. Предполагается, что HMAC TLV будет отслеживать изменения базового протокола STAMP [RFC8762], включая применение более совершенных криптографических алгоритмов. Расчет HMAC выполняется в соответствии с [RFC2104] для конкатенации поля Sequence Number в стандартном пакете STAMP и всех предшествующих TLV. Подпись должна отсекаться до 128 битов и помещаться в поле HMAC. Если HMAC TLV имеется в расширенном пакете STAMP, например, в режиме с аутентификацией, значение HMAC должно проверяться до использования данных, включенных в STAMP TLV. Если проверка HMAC рефлектором завершается отказом, Session-Reflector должен прекратить обработку полученного расширенного пакета STAMP. В этом случае рефлектор должен копировать TLV из полученного пакета STAMP в отраженный пакет и должен устанавливать флаг I = 1 в каждом TLV, копируемом в отраженный пакет, до отправки отраженного пакета. Если Session-Sender получает расширенный пакет STAMP с I = 1, он должен прервать обработку TLV в отраженном пакете. Если проверка HMAC у Session-Sender завершилась отказом, Session-Sender должен прервать обработку TLV в расширенном отраженном пакете STAMP.

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

Агентство IANA создало в реестре Simple Two-way Active Measurement Protocol (STAMP) TLV Types перечисленные в слудующих параграфах субреестры.

5.1. Субреестр STAMP TLV Types

В IANA создан субреестр STAMP TLV Types, коды в котором выделяются в соответствии с [RFC8126], как указано в таблице 1.

Таблица 1. Процедуры регистрации для субреестров типов STAMP TLV.

Диапазон

Процедура регистрации

1 — 175

IETF Review

176 — 239

First Come First Served

240 — 251

Experimental Use

252 — 254

Private Use

В соответствии с этим документом в IANA создан субреестр STAMP TLV Types (таблица 2).

Таблица 2. Типы STAMP TLV.

Значение

Название

Документ

0

Резерв

RFC 8972

1

Extra Padding

RFC 8972

2

Location

RFC 8972

3

Timestamp Information

RFC 8972

4

Class of Service

RFC 8972

5

Direct Measurement

RFC 8972

6

Access Report

RFC 8972

7

Follow-Up Telemetry

RFC 8972

8

HMAC

RFC 8972

255

Резерв

RFC 8972

5.2. Субреестр STAMP TLV Flags

В IANA создан субреестр STAMP TLV Flags, коды в котором выделяются по процедуре IETF Review [RFC8126]. Флаги занимают 8 битов. В соответствии с этим документом в IANA создан субреестр STAMP TLV Flags (таблица 3).

Таблица 3. Флаги STAMP TLV.

Бит

Символ

Название

документ

0

U

Unrecognized TLV

RFC 8972

1

M

Malformed TLV

RFC 8972

2

I

Integrity check failed

RFC 8972

5.3. Субреестр STAMP Sub-TLV Types

В IANA создан субреестр STAMP Sub-TLV Types, значения в котором выделяются в соответствии с [RFC8126], как указано в таблице 4.

Таблица 4. Процедуры регистрации для субреестров типов STAMP суб-TLV.

Диапазон

Процедура регистрации

1 — 175

IETF Review

176 — 239

First Come First Served

240 — 251

Experimental Use

252 — 254

Private Use

В соответствии с этим документом в IANA создан субреестр STAMP Sub-TLV Types (таблица 5).

Таблица 5. Типы STAMP суб-TLV.

Значение

Название

TLV

Документ

0

Резерв

RFC 8972

1

Source MAC Address

Location

RFC 8972

2

Source EUI-48 Address

Location

RFC 8972

3

Source EUI-64 Address

Location

RFC 8972

4

Destination IP Address

Location

RFC 8972

5

Destination IPv4 Address

Location

RFC 8972

6

Destination IPv6 Address

Location

RFC 8972

7

Source IP Address

Location

RFC 8972

8

Source IPv4 Address

Location

RFC 8972

9

Source IPv6 Address

Location

RFC 8972

255

Резерв

RFC 8972

5.4. Субреестр STAMP Synchronization Sources

В IANA создан субреестр STAMP Synchronization Sources, значения в котором выделяются в соответствии с [RFC8126], как указано в таблице 6.

Таблица 6. Процедуры регистрации для источников синхронизации STAMP.

Диапазон

Процедура регистрации

1 — 127

IETF Review

128 — 239

First Come First Served

240 — 249

Experimental Use

250 — 254

Private Use

В соответствии с этим документом в IANA создан субреестр STAMP Synchronization Sources (таблица 7).

Таблица 7. Источники синхронизации STAMP.

Значение

Название

Документ

0

Резерв

RFC 8972

1

NTP

RFC 8972

2

PTP

RFC 8972

3

SSU/BITS

RFC 8972

4

GPS/GLONASS/LORAN-C/BDS/Galileo

RFC 8972

5

Local free-running

RFC 8972

255

Резерв

RFC 8972

5.5. Субреестр STAMP Timestamping Methods

В IANA создан субреестр STAMP Timestamping Methods, значения в котором выделяются в соответствии с [RFC8126], как указано в таблице 8.

Таблица 8. Процедуры регистрации для методов указания временных меток STAMP.

Диапазон

Процедура регистрации

1 — 127

IETF Review

128 — 239

First Come First Served

240 — 249

Experimental Use

250 — 254

Private Use

В соответствии с этим документом в IANA создан субреестр STAMP Timestamping Methods (таблица 9).

Таблица 9. Методы получения временных меток STAMP.

Значение

Название

Документ

0

Резерв

RFC 8972

1

HW Assist

RFC 8972

2

SW Local

RFC 8972

3

Control Plane

RFC 8972

255

Резерв

RFC 8972

5.6. Субреестр STAMP Return Codes

В IANA создан субреестр STAMP Return Codes, коды в котором выделяются в соответствии с [RFC8126], как указано в таблице 10.

Таблица 10. Процедуры регистрации для кодов возврата STAMP.

Диапазон

Процедура регистрации

1 — 127

IETF Review

128 — 239

First Come First Served

240 — 249

Experimental Use

250 — 254

Private Use

В соответствии с этим документом в IANA создан субреестр STAMP Return Codes (таблица 11).

Таблица 11. Коды возврата STAMP.

Значение

Название

Документ

0

Резерв

RFC 8972

1

Network available

RFC 8972

2

Network unavailable

RFC 8972

255

Резерв

RFC 8972

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

Этот документ определяет расширения протокола STAMP [RFC8762] и наследует все вопросы безопасности, связанные с базовым протоколом. В документе также определен блок HMAC TLV, обеспечивающий защиту целостности расширения STAMP, но он не защищает от replay-атак (повторное использование пакетов). Использование HMAC TLV описано в параграфе 4.8.

Для защиты от TLV с некорректным форматом реализации Session-Sender и Session-Reflector должны:

  • проверять значение флага M;

  • проверять корректность значения поля Length.

Поскольку эта спецификация задает механизм тестирования отображений DSCP, документ наследует все вопросы безопасности, рассмотренные в [RFC2474]. Мониторинг т необязательное управдение DSCP с помощью CoS TLV можно использовать через Internet так, что Session-Sender и Session-Reflector будут размещаться в доменах с разными профилями CoS. Поэтому важна проверка оператором набора значений CoS, применяемых в домене Session-Reflector. Реализации Session-Reflector также следует поддерживать локальную политику для подтверждения возможности использования значения поля DSCP, переданного Session-Sender (параграф 4.4).

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

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

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

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

[RFC8762] Mirsky, G., Jun, G., Nydell, H., and R. Foote, «Simple Two-Way Active Measurement Protocol», RFC 8762, DOI 10.17487/RFC8762, March 2020, <https://www.rfc-editor.org/info/rfc8762>.

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

[GPS] «Global Positioning System (GPS) Standard Positioning Service (SPS) Performance Standard», GPS SPS 5th Edition, April 2020.

[IEEE.1588.2008] «IEEE Standard for a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems», IEEE Std. 1588-2008, DOI 10.1109/IEEESTD.2008.4579760, July 2008, <https://doi.org/10.1109/IEEESTD.2008.4579760>.

[NUM-IDS-GEN] Gont, F. and I. Arce, «On the Generation of Transient Numeric Identifiers», Work in Progress, Internet-Draft, draft-irtf-pearg-numeric-ids-generation-06, 13 January 2021, <https://tools.ietf.org/html/draft-irtf-pearg-numeric-ids-generation-06>.

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

[RFC4868] Kelly, S. and S. Frankel, «Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec», RFC 4868, DOI 10.17487/RFC4868, May 2007, <https://www.rfc-editor.org/info/rfc4868>.

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

[RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, «Network Time Protocol Version 4: Protocol and Algorithms Specification», RFC 5905, DOI 10.17487/RFC5905, June 2010, <https://www.rfc-editor.org/info/rfc5905>.

[TS23501] 3GPP, «Technical Specification Group Services and System Aspects; System Architecture for the 5G System (5GS); Stage 2 (Release 16)», 3GPP TS 23.501, 2019.

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

Аворы признательны за внимательное рецензирование и вдумчивые комментарии Tianran Zhou, Rakesh Gandhi, Yuezhong Song и Yali Wang. Срасибо Al Morton за его замечанию и ценные предложения. Авторы также признательны за комментарии и предложения, полученные от Martin Duke.

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

Ниже указан человек, внесший вклад в текст этого документа.

Guo Jun

ZTE Corporation

68# Zijinghua Road

Nanjing

Jiangsu, 210012

China

Phone: +86 18105183663

Email: guo.jun2@zte.com.cn

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

Greg Mirsky

ZTE Corp.

Email: gregimirsky@gmail.com

Xiao Min

ZTE Corp.

Email: xiao.min2@zte.com.cn

Henrik Nydell

Accedian Networks

Email: hnydell@accedian.com

Richard Foote

Nokia

Email: footer.foote@nokia.com

Adi Masputra

Apple Inc.

One Apple Park Way

Cupertino, CA 95014

United States of America

Email: adi@apple.com

Ernesto Ruffini

OutSys

via Caracciolo, 65

20155 Milan

Italy

Email: eruffini@outsys.org

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

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

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

Рубрика: RFC, Измерения и тестирование | Комментарии к записи RFC 8972 Simple Two-Way Active Measurement Protocol Optional Extensions отключены

RFC 8969 A Framework for Automating Service and Network Management with YANG

Internet Engineering Task Force (IETF)                        Q. Wu, Ed.
Request for Comments: 8969                                        Huawei
Category: Informational                                M. Boucadair, Ed.
ISSN: 2070-1721                                                   Orange
                                                                D. Lopez
                                                          Telefonica I+D
                                                                  C. Xie
                                                           China Telecom
                                                                 L. Geng
                                                            China Mobile
                                                            January 2021

A Framework for Automating Service and Network Management with YANG

Модель автоматизации управления сетью и службами с помощью YANG

PDF

Аннотация

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

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

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

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

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

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

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

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

Системы управления услугами обычно включают активацию и предоставление, а также эксплуатацию служб. Современные процедуры доставки услуг от обработки требований и заказов клиентов до доставки и эксплуатации услуг обычно предполагают последовательное манипулирование данными в нескольких системах поддержки операций (Operations Support System или OSS) или поддержки бизнеса (Business Support System или BSS), которые могут управляться разными подразделениями поставщика услуг (например, отдел счетов, отдел проектирования, центр управления сетью). Многие из таких приложений разрабатываются собственными силами на протяжении многих лет и работают автономно. В результате:

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

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

Программно определяемые сети (Software-Defined Networking или SDN) становятся все более важными для решения этих задач. Методы SDN предназначены для автоматизации общих процедур предоставления услуг и обычно основаны на стандартных моделях данных. Эти модели служат не только для отражения мастерства поставщиков услуг, но и для динамического создания и применения набора определяемых услугами правил, который лучше всего соответствует тому, что было определено и, возможно, согласовано с клиентом. В [RFC7149] представлена предварительная попытка рационализировать точку зрения поставщиков услуг на пространство SDN путём указания конкретных технических областей, которые нужно рассмотреть и для которых могут быть предложены решения.

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

  • Методы раскрытия сетевых услуг [RFC8309] и их характеристик.

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

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

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

Разработчики YANG [RFC7950] использовали подходы «сверху вниз» и «снизу вверх» для создания модулей [RFC8199] и организации сопоставления между топологией сети и требованиями клиента наверху или абстрагирования базовых конструкций от различных сетевых технологий внизу. На момент подготовки этого документа (2020 г.) было уже много моделей данных YANG, включая модели конфигурации и служб, которые были приняты или рассматривались для принятия IETF. Они охватывают множество протоколов и методов. Однако способы сочетания этих моделей для настройки функций, управления множеством устройств, вовлечённых в службу, или предоставления услуги в настоящее время не документировано ни IETF, ни другими органами стандартизации (Standards Development Organization или SDO).

Многие из указанных в документе модулей YANG применяются для обмена данными между клиентами и серверами NETCONF/RESTCONF [RFC6241][RFC8040]. Тем не менее, YANG является независимым от транспорта языком моделирования данных и может применяться независимо от NETCONF и RESTCONF. Например, YANG можно применять для задания абстрактных структур данных [RFC8791] которыми могут манипулировать другие протоколы, такие как [DOTS-DDOS].

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

  • Независимые от производителей интерфейсы управления службой и базовой сетью.

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

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

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

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

Документ включает варианты применения для иллюстрации предлагаемого подхода (5. Примеры интеграции с моделью данных YANG), но не претендует на полноту списка таких вариантов. В Приложении A даны некоторые примеры представления многоуровневых модулей YANG.

2. Термины и сокращения

2.1. Термины

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

  • Network Operator — оператор сети.
  • Customer — клиент, заказчик.
  • Service — сервис, служба.
  • Data Model — модель данных.
  • Service Model — модель службы.
  • Network Element Model — модель элемента сети.

Этот документ также определяет ряд терминов.

Network Model — модель сети

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

Network Domain — сетевой домен

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

Device Model — модель устройства

Модель YANG для элемента сети, описанная в [RFC8199], или модель конфигурации устройства, рассмотренная в [RFC8309]. Термин применяется также для моделей функций, встроенных в устройство (например, трансляция адресов (Network Address Translation или NAT) [RFC8512] и списков контроля доступа (Access Control List или ACL) [RFC8519].

Pipe — канал

Область взаимодействия 1:1, например, между выходным и входным узлом, двумя сайтами служб и т. п.

Hose — «распылитель»

Область взаимодействия одного со многими (1:N), например, одного сайта с несколькими.

Funnel — воронка

Область взаимодействия многих с одним (N:1).

2.2. Сокращения

ACL Access Control List — список управления доступом;
AS Autonomous System — автономная система;
AP Access Point — точка доступа;
CE Customer Edge — граница клиента;
DBE Data Border Element — граничный элемент данных;
E2E End-to-End — сквозной;
ECA Event Condition Action — действие по событию;
L2VPN Layer 2 Virtual Private Network — виртуальная частная сеть канального уровня;
L3VPN Layer 3 Virtual Private Network — виртуальная частная сеть сетевого уровня;
L3SM L3VPN Service Model — модель службы L3VPN;
L3NM L3VPN Network Model — модель сети L3VPN;
NAT Network Address Translation — трансляция сетевых адресов;
OAM Operations, Administration, and Maintenance — операции, администрирование, управление (поддержка);
OWD One-Way Delay — задержка в одном направлении;
PE Provider Edge — граница провайдера;
PM Performance Monitoring — мониторинг производительности;
QoS Quality of Service — качество обслуживания;
RD Route Distinguisher — различитель маршрутов;
RT Route Target — цель маршрута;
SBE Session Border Element — граничный элемент сессии;
SDN Software-Defined Networking — программно определяемая сеть;
SP Service Provider — поставщик услуг;
TE Traffic Engineering — организация (построение) трафика;
VN Virtual Network — виртуальная сеть;
VPN Virtual Private Network — виртуальная частная сеть;
VRF Virtual Routing and Forwarding — виртуальная маршрутизация и пересылка.

3. Цели и концепции архитектуры

3.1. Модели данных — уровни и представление

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

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

В моделях служб традиционно применяется нисходящий подход и они в основном представляют ориентированные на клиента модули YANG, обеспечивающие общую модельную конструкцию для сетевых служб верхнего уровня (например, L3VPN). Такие модули можно сопоставить со специфичными для сетевых технологий модулями (туннели, маршрутизация, QoS, безопасность). Например, модели служб можно применять для характеризации сетевых услуг, обеспечиваемых между узлами службы (вход-выход), такими как:

  • область действия коммуникаций (канал, «распылитель», «воронка и т. п.);

  • направленность (входной-выходной);

  • гарантии производительности для трафика, выраженные такими показателями, как односторонняя задержка (OWD) [RFC7679] или односторонние потери (One-Way Loss) [RFC7680] (сводку показателей, поддерживаемых IANA, можно найти в [IPPM]);

  • пропускная способность канала [RFC5136] [METRIC-METHOD];

  • и пр.

На рисунке 1 дан пример голосовой связи по IP (Voice over IP или VoIP), основанной на услугах подключения, предоставляемых оператором сети. Услуги VoIP здесь предоставляются клиентам сетевого оператора сервис-провайдером SP1. Для обеспечения глобальной доступности VoIP, сайт SP1 связан с сайтами других SP, как правило, путём соединения граничных элементов SBE и граничных элементов данных (DBE) [RFC5486][RFC6406]. Для других адресатов VoIP сессии организуются через Internet. Эти услуги связности можно зафиксировать в модели службы YANG, отражающей атрибуты сервиса, показанные на рисунке 2. Этот пример соответствует профилю обеспечения связности IP (IP Connectivity Provisioning Profile), заданному в [RFC7297].

                   ,--,--,--.              ,--,--,--.
                ,-'    SP1   `-.        ,-'   SP2     `-.
               (   Сайт услуг   )      (    Сайт услуг   )
                `-.          ,-'        `-.          ,-'
                   `--'--'--'              `--'--'--'
                    x  | o *                  * |
                 (2)x  | o *                  * |
                   ,x-,--o-*-.    (1)     ,--,*-,--.
                ,-' x    o  * * * * * * * * *       `-.
               (    x    o       +----(     Internet    )
Пользователь---(x x x      o o o o o o o o o o o o o o o o o o
                  `-.          ,-'       `-.          ,-'   (3)
                     `--'--'--'             `--'--'--'
                  Оператор сети

**** (1) Связь между сервис-провайдерами (SP)
xxxx (2) Связь SP с клиентом
oooo (3) Связь SP с другими адресатами

Рисунок 1. Пример компонентов связности служб.

На рисунке 2 «класс с полной гарантией производительности для трафика» указывает класс обслуживания, где гарантируются все показатели производительности трафика, включённые в модель сервиса (OWD, потери, вариации задержки), а «класс с гарантиями задержки для трафика» — класс обслуживания, где гарантируется лишь OWD.

Связность — область действия и гарантии

  1. Связность между SP
    • канал от локального к удалённому SBE/DBE;
    • класс с полной гарантией производительности для трафика.
  1. Связность между клиентом и SP
    • «распылитель»/»воронка от локальных SBE/DBE к точкам доступа клиента;
    • класс с полной гарантией производительности для трафика.
  1. Связность SP с другими адресатами
    • «распылитель»/«воронка» от локальных SBE/DBE к шлюзу Internet;
    • класс с гарантиями задержки для трафика.

Идентификация потоков

  • IP-адрес получателя (SBE, DBE);
  • маркировка DSCP.

Изоляция трафика

VPN

Маршрутизация и пересылка

Правила маршрутизации для исключения некоторых AS на пути между доменами.

Уведомления (включая обратную связь)

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

Рисунок 2. Простые атрибуты, собранные в модель сервиса.

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

Каждый уровень поддерживает представление поддерживаемых модулей YANG, обеспечиваемое нижележащим уровнем (см., например, Приложение A). Могут применяться такие механизмы, как библиотека YANG [RFC8525], для раскрытия модулей YANG, поддерживаемых узлами на нижележащих уровнях.

На рисунке 3 показана модель уровней. Обзор по оркестраторам и контроллерам можно найти в разделе 4 [RFC8309]. За все эти элементы (оркестраторы, контроллеры, устройства) отвечает один оператор.

+-----------------------------------------------------------------+
|                                         Абстракция иерархии     |
|                                                                 |
| +-----------------------+                    Модель службы      |
| |     Оркестратор       |             (ориентирована на клиента)|
| |+---------------------+|              область: "1:1" канал     |
| || Моделирование службы||                                       |
| |+---------------------+|                                       |
| |                       |                   Двухсторонняя       |
| |+---------------------+|              +-+ производ., OWD +-+   |
| ||  Оркестровка службы ||              | +----------------+ |   |
| |+---------------------+|              +-+                +-+   |
| +-----------------------+              Вход             Выход   |
|                                                                 |
|                                                                 |
| +-----------------------+                Модель сети            |
| |   Контроллер          |           (ориентирована на оператора)|
| |+---------------------+|           +-+    +--+    +---+   +-+  |
| || Моделирование сети  ||           | |    |  |    |   |   | |  |
| |+---------------------+|           | o----o--o----o---o---o |  |
| |                       |           +-+    +--+    +---+   +-+  |
| |+---------------------+|           src                    dst  |
| ||   Оркестровка сети  ||                L3VPN через TE         |
| |+---------------------+|      Имя экземпляра/Интерфейс доступа |
| +-----------------------+      Тип протокола/Ёмкость/RD/RT/...  |
|                                                                 |
|                                                                 |
| +-----------------------+            Модель устройства          |
| |    Устройство         |                                       |
| |+--------------------+ |                                       |
| || Моделирование устр.| |        Добавление интерф., партн. BGP,|
| |+--------------------+ |              Tunnel ID, QoS/TE, ...   |
| +-----------------------+                                       |
+-----------------------------------------------------------------+

Рисунок 3. Уровни и представление у оператора.

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

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

Для упрощения сопоставления между уровнями и многократным использованием данных этот документ уделяет основное внимание моделям служб с использованием YANG. Тем не менее, в полном соответствии с разделом 3 в [RFC8309], рисунок 3 не исключает моделирования служб с использованием языков, отличных от YANG.

3.3. Автоматизация предоставления услуг

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

  • Обеспечение каждого вовлечённого сетевого устройства (функции) соответствующими настройками.

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

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

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

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

3.4. Интеграция с модулем YANG

Для предоставления услуг «сверху вниз» модули YANG на разных или одном уровне нужно интегрировать для корректной доставки услуг (включая нужную настройку сети). Например, параметры услуги, зафиксированные в моделях службы, нужно разложить в набор параметров конфигурации и уведомлений, которые могут быть связаны с одной или несколькими технологиями, а эти специфичные для технологии параметры нужно сгруппировать для задания зависящих от топологии моделей не уровне устройств или сети. Кроме того, эти связанные с технологией модели устройств или сети могут быть ещё раз объединены с помощью механизма монтирования схемы [RFC8528] для предоставления каждой задействованной функции (устройству) или домену сети поддержки добавленных модулей или функций. Набор интегрированных моделей устройств можно загрузить и проверить во время реализации.

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

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

Архитектурные соображения раздела 3 ведут к архитектуре управления жизненным циклом, показанной на рисунке 4.

                +------------------+
............... |                  |
 Уровень службы |                  |
                V                  |
Раскрытие   Создание/         Оптимизация               Диагностика
службы  --> изменение-------->  службы   ------------>    службы
E2E         службы       ^        E2E        ^             E2E
            E2E          |                   |              |
              ^ |        |Diff               |              |
Прекращение   | |        |       Гарантия    |              |
  службы  ----+ |        |        службы     |              |
   E2E          |        +---------- E2E ----+              |
                |                     ^                     |
 Сопоставление  |                     |                     |
 службы между   |                     |                     |
 домен. и уровн.|                     |                     |
............... |<-----------------+  |                     |
 Сетевой уровень|                  |  +-------+             v
                V                  |          |        Диагностика
            Создание/        Оптимизация      |        конкретной
            изменение--------> конкретн.<--+  |          службы
            конкретной   ^     службы      |  |             |
              службы     |                 |  |             |
                |        |Diff             |  |             |
                |        |      Гарантии --+  |             |
  Декомпозиция  |        |     конкретной     |             |
  службы        |        +------ службы ------+             |
                |                  ^                        |
............... |                  |Агрегирование           |
Уровень устрой. |                  +------------+           |
                V                               |           |
Предоставл.  Предоставл.                        |           v
услуг        конфигурации--->Проверка----> Мониторинг ---> Диагностика
             намерений       конфигурации производительн.  отказов

Рисунок 4. Управление жизненным циклом служб и сети.

4.1. Процедура управления жизненным циклом службы

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

4.1.1. Раскрытие сервиса

Услугой в контексте этого документа называется та или иная форма связности между сайтами клиента и Internet или между сайтами клиента через сеть оператора и Internet. Раскрытие служб используется для нахождения услуг, предоставляемых клиентам (заказы и их обработка). Одним из примеров является возможность использования клиентом модели службы L3VPN (L3SM) для запроса услуг L3VPN путём представления абстрактных технических характеристик предполагаемой услуги между сайтами клиента.

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

4.1.2. Создание и изменение служб

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

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

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

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

Отказ от услуги (отзыв) рассматривается в параграфе 4.1.6. Прекращение использования услуги.

4.1.3. Гарантированное обслуживание

Для обеспечения гарантий на уровне службы и/или сети можно использовать телеметрию производительности (4.2.3. Мониторинг производительности). Модель телеметрии производительности можно связать с моделями служб или сетей для отслеживания производительности сети или соглашений об уровне обслуживания (Service Level Agreement или SLA).

4.1.4. Оптимизация службы

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

Данные о производительности сети и правила можно промоделировать с использованием YANG. С помощью управления на основе правил можно реализовать самонастройку и само оптимизацию.

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

4.1.5. Диагностика службы

OAM обеспечивает важные сетевые функции для диагностики услуг, позволяющие оператору:

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

  • устранять неполадки (проверка и локализация отказов);

  • отслеживать SLA и производительность (т. е. управлять производительностью).

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

Данные диагностики службы можно смоделировать как независимые от технологии вызовы удалённых процедур (Remote Procedure Call или RPC) для протоколов OAM и независимая от технологии абстракция основных конструкций OAM для протоколов OAM [RFC8531][RFC8533]. Эти модели могут служить для обеспечения согласованной конфигурации, отчётов и предоставления механизмов OAM, применяемых для управления сетью.

Связанные с устройствами аспекты диагностики рассмотрены в параграфе 4.2.4. Диагностика отказов.

4.1.6. Прекращение использования услуги

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

4.2. Процедура управления предоставлением услуги

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

Предусмотренная конфигурация на уровне устройств выводится из моделей сети на уровне сети и моделей служб на уровне службы, а система пытается применить эту конфигурацию. Рассмотрим как пример модель службы L3SM для предоставления услуги L3VPN. Нужно сопоставить представление службы L3VPN, заданное моделью службы, с деталями предполагаемого представления конфигурации, заданного конкретными моделями конфигурации для элементов сети. Данные конфигурации включают:

  • определение VRF, в том числе правила VPN;
  • физические интерфейсы;
  • уровень IP (IPv4, IPv6);
  • свойства QoS, такие как классификация, профили и т. п.;
  • протоколы маршрутизации — поддержка настройки всех протоколов, указанных в запросе услуги, а также правила маршрутизации, связанные с каждым из этих протоколов;
  • поддержку групповой передачи;
  • использование общих адресов;
  • безопасность (например, контроль доступа, аутентификация, шифрование).

Эти конкретные модели конфигурации можно применить для настройки устройств провайдера (PE) и клиента (CE) внутри сайта. Например, модель политики BGP может служить для организации членства в VPN на сайтах и топологии службы VPN.

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

Этот интерфейс применяется также для отзыва услуг (4.1.6. Прекращение использования услуги).

4.2.2. Проверка конфигурации

Проверка предполагаемой конфигурации служит для обеспечения её установки. Например, если клиент создаёт интерфейс eth-0/0/0, но такого интерфейса физически не существует в данный момент, данные конфигурации появятся в состоянии <intended>, но не будут включены в хранилище <operational>. Дополнительные сведения о хранилищах <intended> и <operational> можно найти в параграфе 5.1 [RFC8342].

4.2.3. Мониторинг производительности

Когда конфигурация применена на устройстве, хранилище <operational> содержит все рабочее состояние устройства, включая изученную (learned), системную и принятую по умолчанию конфигурацию, а также состояние системы. Однако конфигурация и состояние устройства не видны во всей сети и не могут показать, как пакеты будут пересылаться через сеть. Отсутствие понимания текущего состояния сети осложняет управление сетью.

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

4.2.4. Диагностика отказов

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

В связанных с технологиями модулях YANG заданы зависящие от технологии узлы и RPC, которые могут использовать и расширять базовую модель, описанную в параграфе 4.1.5. Диагностика службы, для решения этих проблем. Команды RPC, получаемые зависимым от технологии узлом, можно применять для запуска связанного с технологией обмена сообщениями OAM для проверки и локализации отказов. Например, команда RPC для TRILL3 MTV4 [TRILL-YANG-OAM] может инициировать сообщения проверки дерева с множеством адресатов (Multi-Destination Tree Verification Message или MTVM), определённые в [RFC7455], для проверки целостности дерева распространения TRILL.

4.3. Многоуровневое и многодоменное представление

Многоуровневое/многодоменное сопоставление служб позволяет отобразить абстрактное сквозное представление услуги, сегментированное по уровням и/или доменам сети на специфичные для домена представления. Одним из примеров является отображение параметров службы в L3SM на параметры конфигурации, такие как различитеть маршрута (RD), цель маршрута (RT) и VRF с модели сети L3VPN (L3NM). Другим примером служит отображение параметров службы в L3SM на параметры туннеля TE (например, Tunnel ID) в модели TE и параметры виртуальной сети (Virtual Network или VN), такие как список точек доступа (AP) и членов VN, в модели данных YANG для операций VN [ACTN-VN-YANG].

4.4. Декомпозиция службы

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

5. Примеры интеграции с моделью данных YANG

В последующих примерах приведены некоторые примеры интеграции с моделями данных YANG.

5.1. Предоставление услуг L2VPN/L3VPN

На рисунке 5 показаны этапы предоставления услуги L3VPN в рамках архитектуры автоматизации управления сетью, описанной в разделе 4. Функциональные блоки и взаимодействия.

  1. Клиент запрашивает создание 2 сайтов (создание службы в параграфе 4.1.2) на основе L3SM, каждый из которых имеет одну точку подключения к сети, например,

    • Сайт A — доступ в сеть A с каналом 20 Мбит/с, класс foo, гарантированная доля полосы 10%, средняя задержка в одном направлении 70 мсек.

    • Сайт B — доступ в сеть B с каналом 30 Мбит/с, класс foo1, гарантированная доля полосы 15%, средняя задержка в одном направлении 60 мсек.

  1. Оркестратор получает параметры услуги от L3SM и использует их как в ввод при сопоставлении (4.3. Многоуровневое и многодоменное представление) для трансляции в организованные параметры конфигурации (например, RD, RT и VRF), входящие в модель L3NM, заданную в [OPSAWG-L3SM-L3NM].

  2. Контроллер принимает организованные параметры конфигурации в L3NM и транслирует их в организованную конфигурацию (4.4. Декомпозиция службы) элементов сети, которая является частью моделей, например, BGP, QoS, экземпляра сети, управления IP, интерфейса.

Можно использовать [UNI-TOPOLOGY] для представления, управления и контроля топологии на интерфейса сеть-пользователь (User Network Interface или UNI).

               Модель    |
               службы    |
               L3SM      |
+------------------------+------------------------+
|              +---------V---------+              |
|              |Сопоставление услуг|              |
|              +---------+---------+              |
| Оркестратор            |                        |
+------------------------+------------------------+
                Модель   |     ^ Модель топологии 
                сети     |     | UNI
                L3NM     |     |
+------------------------+------------------------+
|            +-----------V-----------+            |
|            |  Декомпозиция службы  |            |
|            +--++---------------++--+            |
|               ||               ||               |
| Контроллер    ||               ||               |
+---------------++---------------++---------------+
                ||               ||
                ||     BGP,      ||
                ||     QoS,      ||
                ||   Interface,  ||
   +------------+|      NI,      |+------------+
   |             |      IP       |             |
+--+--+       +--+--+         +--+--+       +--+--+
| CE1 +-------+ PE1 |         | PE2 +-------+ CE2 |
+-----+       +-----+         +-----+       +-----+

Рисунок 5. Пример предоставления услуг L3VPN (текущее).


L3NM наследует некоторые элементы данных L3SM. Тем не менее, модель L3NM, заданная в [OPSAWG-L3SM-L3NM], не раскрывает вышележащему уровню некоторые сведения, такие как возможности базовой сети (которые могут применяться для обработки заказа на услугу) и уведомления (для информирования подписчиков о конкретных событиях или нарушении SLA). Часть таких сведений может быть предоставлена с использованием, например, [OPSAWG-YANG-VPN]. Полная целевая модель показана на рисунке 6.

               Модель    |     ^
               службы    |     |  Уведомления
               L3SM      |     |
+------------------------+------------------------+
|              +---------V---------+              |
|              |Сопоставление услуг|              |
|              +---------+---------+              |
| Оркестратор            |                        |
+------------------------+------------------------+
                  Модель |     ^ Модель топологии UNI
                  сети   |     | Уведомления L3NM
                  L3NM   |     | Возможности L3NM
+------------------------+------------------------+
|            +-----------V-----------+            |
|            |  Декомпозиция службы  |            |
|            +--++---------------++--+            |
|               ||               ||               |
| Контроллер    ||               ||               |
+---------------++---------------++---------------+
                ||               ||
                ||     BGP,      ||
                ||     QoS,      ||
                ||   Interface,  ||
   +------------+|      NI,      |+------------+
   |             |      IP       |             |
+--+--+       +--+--+         +--+--+       +--+--+
| CE1 +-------+ PE1 |         | PE2 +-------+ CE2 |
+-----+       +-----+         +-----+       +-----+

Рисунок 6. Пример предоставления услуг L3VPN (целевое).


Отметим, что похожий анализ возможен для L2VPN. Модель услуг L2VPN (L2SM) определена в [RFC8466], а модель YANG для сети L2VPN (L2NM) — в [OPSAWG-L2NM].

5.2. Управление жизненным циклом VN

Рисунок 7 показывает этапы предоставления услуги VN в рамках архитектуры автоматизации управления сетью, описанной в разделе 4. Функциональные блоки и взаимодействия.

  1. Клиент делает запрос (4.1.1. Раскрытие сервиса) на создание VN. Связи между VN, AP и членами VN определены в модели YANG VN [ACTN-VN-YANG].

  2. Оркестратор создаёт топологию с 1 абстрактным узлом на основе сведений из запроса.

  3. Клиент обменивается с оркестратором матрицей связей в топологии абстрактного узла и явными путями, используя модель топологии TE [RFC8795]. Эти сведения можно использовать для создания VN и организации туннелей между конечными точками источника и адресата (4.1.2. Создание и изменение служб).

  4.                        |
                   Модель  |
                   службы  |
                   VN      |
    +----------------------|--------------------------+
    | Оркестратор          |                          |
    |           +----------V---------+                |
    |           |Сопоставление службы|                |
    |           +--------------------+                |
    +----------------------+--------------------^-----+
                  Модель   |         Модель     |
                  туннеля  |         телеметрии |
                  TE       |                    |
    +----------------------V--------------------+-----+
    | Контроллер                                      |
    |                                                 |
    +-------------------------------------------------+
    
    +-----+      +-----+           +-----+      +-----+
    | CE1 +------+ PE1 |           | PE2 +------+ CE2 |
    +-----+      +-----+           +-----+      +-----+

    Рисунок 7. Пример предоставления услуги VN.


    Для обеспечения гарантированного обслуживания (4.1.4. Оптимизация службы) оркестратор может использовать модель телеметрии, которая дополняет модель VN и соответствующую модель туннеля TE, с целью подписки на данные измерения производительности. Контроллер может уведомлять оркестратор, передавая все изменения параметров и производительности сети, относящиеся к топологии VN и туннелям [TEAS-ACTN-PM].

5.3. Телеметрия по событиям в самоуправлении устройства

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

  1.      +----------------+
         |                <----+
         |   Контроллер   |    |
         +-------+--------+    |
                 |             |
                 |             |
           Модель|             | Уведомление
           ECA   |             | ECA
                 |             |
                 |             |
    +------------V-------------+-------+
    |Устройство                |       |
    | +-------+ +---------+ +--+-----+ |
    | |Источн.+-> Условие +->Действие| |
    | |события| | события | |события | |
    | +-------+ +---------+ +--------+ |
    +----------------------------------+

    Рисунок 8. Телеметрия по событиям.


    Для контроля должного состояния устройства определён набор условий и действий, сопоставленный с событиями в сети (например, разрешать серверу NETCONF передавать обновления только при первом пересечении значением некого порога), совместно задающие правила действий по событию (Event Condition Action или ECA) или логику управления по событиям, которая может исполняться устройством (например, [EVENT-YANG]).

  2. Для быстрого автоматического отклика, который может быть свойством самоуправления, контроллер выталкивает (push) правила ECA в сетевое устройство и передаёт тому логику управления сетью.

  3. Сетевое устройство применяет модель ECA для подписки на источник событий, например, поток событий или состояний данных хранилища, передаваемых сервером через подписку YANG-Push [RFC8641], отслеживает параметры состояния и применяет простые быстрые действия при выполнении условия, связанного с событием для параметров состояния. Уведомления ECA могут генерироваться в результате действий, основанных на подписке на поток событий или хранилище данных (4.2.3. Мониторинг производительности).

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

Многие модули YANG, упомянутые в документе, определяют схемы данных, предназначенные для доступа по протоколам управления сетью, таким как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF служит защищённый транспорт с обязательной поддержкой SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF служит протокол HTTPS с обязательной поддержкой защиты на транспортном уровне (TLS) [RFC8446].

Модель управления доступом NETCONF [RFC8341] обеспечивает возможность разрешить доступ лишь определённых пользователей NETCONF или RESTCONF к заранее заданному подмножеству операций NETCONF или RESTCONF и содержимого.

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

Для предотвращения утечки деликатных сведений и проблемы confused deputy [Hardy] в целом следует соблюдать особую осторожность при трансляции между уровнями (4. Функциональные блоки и взаимодействия) или агрегировании данных из разных источников. Следует проверять подлинность и полномочия, чтобы данные были доступны лишь разрешённым сущностям. Оператор сети должен применять средства защиты связанных с приватностью сведений, включая ориентированные на клиента модели.

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

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

Дополнительные соображения безопасности приведены в последующих параграфах.

6.1. Уровень службы

Провайдер может полагаться на услуги других провайдеров для создания составных услуг. Он должен включить соответствующие механизмы для мониторинга и обнаружения перебоев в обслуживании со стороны этих провайдеров. Характеристики перебоев обслуживания (включая среднее время между отказами и среднее время восстановления), процедуры устранения и наказания обычно включаются в договоры о предоставлении услуг (например, как описано в параграфе 2.1 [RFC4176]). Таким способом обнаруживаются партнёры с некорректным поведением и применяются соответствующие меры воздействия.

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

6.2. Уровень сети

Ниже указаны вопросы безопасности, связанные с сетевым уровнем.

  • Контроллер может создавать петли пересылки, неверно настроив узлы базовой сети. Рекомендуется проверять статус путей пересылки регулярно или после изменений в процессе маршрутизации или пересылки. Такие проверки можно инициировать с уровня службы средствами, описанными в 4.1.5. Диагностика службы.

  • Некоторые модели служб могут включать положение об изоляции трафика, которое передаётся на сетевой уровень для выполнения там (и в вовлечённых устройствах сети) связанных с технологией действий, позволяющих предотвратить доступ неуполномоченных сторон к трафику. В частности, модели сети могут указывать, включено ли шифрования, а также поддерживаемые схемы и параметры шифрования, если оно применяется. См., например, функцию шифрования, определённое в [OPSAWG-VPN-COMMON] и её применение в [OPSAWG-L3SM-L3NM].

6.3. Уровень устройства

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

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

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

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

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

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

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

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

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

[ACTN-VN-YANG] Lee, Y., Dhody, D., Ceccarelli, D., Bryskin, I., and B. Y. Yoon, «A YANG Data Model for VN Operation», Work in Progress, Internet-Draft, draft-ietf-teas-actn-vn-yang-10, 2 November 2020, <https://tools.ietf.org/html/draft-ietf-teas-actn-vn-yang-10>.

[BFD-YANG] Rahman, R., Zheng, L., Jethanandani, M., Pallagatti, S., and G. Mirsky, «YANG Data Model for Bidirectional Forwarding Detection (BFD)», Work in Progress5, Internet-Draft, draft-ietf-bfd-yang-17, 2 August 2018, <https://tools.ietf.org/html/draft-ietf-bfd-yang-17>.

[DOTS-DDOS] Boucadair, M., Shallow, J., and T. Reddy.K, «Distributed Denial-of-Service Open Threat Signaling (DOTS) Signal Channel Specification», Work in Progress6, Internet-Draft, draft-ietf-dots-rfc8782-bis-04, 3 December 2020, <https://tools.ietf.org/html/draft-ietf-dots-rfc8782-bis-04>.

[EVENT-YANG] Wu, Q., Bryskin, I., Birkholz, H., Liu, X., and B. Claise, «A YANG Data model for ECA Policy Management», Work in Progress, Internet-Draft, draft-wwx-netmod-event-yang-10, 1 November 2020, <https://tools.ietf.org/html/draft-wwx-netmod-event-yang-10>.

[EVPN-YANG] Brissette, P., Shah, H., Hussain, I., Tiruveedhula, K., and J. Rabadan, «Yang Data Model for EVPN», Work in Progress, Internet-Draft, draft-ietf-bess-evpn-yang-07, 11 March 2019, <https://tools.ietf.org/html/draft-ietf-bess-evpn-yang-07>.

[Hardy] Hardy, N., «The Confused Deputy: (or why capabilities might have been invented)», DOI 10.1145/54289.871709, October 1988, <https://dl.acm.org/doi/10.1145/54289.871709>.

[IDR-BGP-MODEL] Jethanandani, M., Patel, K., Hares, S., and J. Haas, «BGP YANG Model for Service Provider Networks», Work in Progress, Internet-Draft, draft-ietf-idr-bgp-model-10, 15 November 2020, <https://tools.ietf.org/html/draft-ietf-idr-bgp-model-10>.

[IPPM] IANA, «Performance Metrics», March 2020, <https://www.iana.org/assignments/performance-metrics/performance-metrics.xhtml>.

[L2VPN-YANG] Shah, H., Brissette, P., Chen, I., Hussain, I., Wen, B., and K. Tiruveedhula, «YANG Data Model for MPLS-based L2VPN», Work in Progress, Internet-Draft, draft-ietf-bess-l2vpn-yang-10, 2 July 2019, <https://tools.ietf.org/html/draft-ietf-bess-l2vpn-yang-10>.

[L3VPN-YANG] Jain, D., Patel, K., Brissette, P., Li, Z., Zhuang, S., Liu, X., Haas, J., Esale, S., and B. Wen, «Yang Data Model for BGP/MPLS L3 VPNs», Work in Progress, Internet-Draft, draft-ietf-bess-l3vpn-yang-04, 19 October 2018, <https://tools.ietf.org/html/draft-ietf-bess-l3vpn-yang-04>.

[METRIC-METHOD] Morton, A., Geib, R., and L. Ciavattone, «Metrics and Methods for One-way IP Capacity», Work in Progress7, Internet-Draft, draft-ietf-ippm-capacity-metric-method-04, 10 September 2020, <https://tools.ietf.org/html/draft-ietf-ippm-capacity-metric-method-04>.

[MVPN-YANG] Liu, Y., Guo, F., Litkowski, S., Liu, X., Kebler, R., and M. Sivakumar, «Yang Data Model for Multicast in MPLS/BGP IP VPNs», Work in Progress, Internet-Draft, draft-ietf-bess-mvpn-yang-04, 30 June 2020, <https://tools.ietf.org/html/draft-ietf-bess-mvpn-yang-04>.

[NETMOD-MODEL] Clarke, J. and B. Claise, «YANG module for yangcatalog.org», Work in Progress, Internet-Draft, draft-clacla-netmod-model-catalog-03, 3 April 2018, <https://tools.ietf.org/html/draft-clacla-netmod-model-catalog-03>.

[OPSAWG-L2NM] Barguil, S., Dios, O. G. D., Boucadair, M., Munoz, L. A., Jalil, L., and J. Ma, «A Layer 2 VPN Network YANG Model», Work in Progress8, Internet-Draft, draft-ietf-opsawg-l2nm-01, 2 November 2020, <https://tools.ietf.org/html/draft-ietf-opsawg-l2nm-01>.

[OPSAWG-L3SM-L3NM] Barguil, S., Dios, O. G. D., Boucadair, M., Munoz, L. A., and A. Aguado, «A Layer 3 VPN Network YANG Model», Work in Progress9, Internet-Draft, draft-ietf-opsawg-l3sm-l3nm-05, 16 October 2020, <https://tools.ietf.org/html/draft-ietf-opsawg-l3sm-l3nm-05>.

[OPSAWG-VPN-COMMON] Barguil, S., Dios, O. G. D., Boucadair, M., and Q. Wu, «A Layer 2/3 VPN Common YANG Model», Work in Progress10, Internet-Draft, draft-ietf-opsawg-vpn-common-03, 14 January 2021, <https://tools.ietf.org/html/draft-ietf-opsawg-vpn-common-03>.

[OPSAWG-YANG-VPN] Wu, B., Wu, Q., Boucadair, M., Dios, O. G. D., Wen, B., Liu, C., and H. Xu, «A YANG Model for Network and VPN Service Performance Monitoring», Work in Progress, Internet-Draft, draft-www-opsawg-yang-vpn-service-pm-03, 21 January 2021, <https://tools.ietf.org/html/draft-www-opsawg-yang-vpn-service-pm-03>.

[PIM-YANG] Liu, X., McAllister, P., Peter, A., Sivakumar, M., Liu, Y., and F. Hu, «A YANG Data Model for Protocol Independent Multicast (PIM)», Work in Progress11, Internet-Draft, draft-ietf-pim-yang-17, 19 May 2018, <https://tools.ietf.org/html/draft-ietf-pim-yang-17>.

[QOS-MODEL] Choudhary, A., Jethanandani, M., Strahle, N., Aries, E., and I. Chen, «YANG Model for QoS», Work in Progress, Internet-Draft, draft-ietf-rtgwg-qos-model-02, 9 July 2020, <https://tools.ietf.org/html/draft-ietf-rtgwg-qos-model-02>.

[RFC4176] El Mghazli, Y., Ed., Nadeau, T., Boucadair, M., Chan, K., and A. Gonguet, «Framework for Layer 3 Virtual Private Networks (L3VPN) Operations and Management», RFC 4176, DOI 10.17487/RFC4176, October 2005, <https://www.rfc-editor.org/info/rfc4176>.

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

[RFC4664] Andersson, L., Ed. and E. Rosen, Ed., «Framework for Layer 2 Virtual Private Networks (L2VPNs)», RFC 4664, DOI 10.17487/RFC4664, September 2006, <https://www.rfc-editor.org/info/rfc4664>.

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

[RFC4762] Lasserre, M., Ed. and V. Kompella, Ed., «Virtual Private LAN Service (VPLS) Using Label Distribution Protocol (LDP) Signaling», RFC 4762, DOI 10.17487/RFC4762, January 2007, <https://www.rfc-editor.org/info/rfc4762>.

[RFC5136] Chimento, P. and J. Ishac, «Defining Network Capacity», RFC 5136, DOI 10.17487/RFC5136, February 2008, <https://www.rfc-editor.org/info/rfc5136>.

[RFC5486] Malas, D., Ed. and D. Meyer, Ed., «Session Peering for Multimedia Interconnect (SPEERMINT) Terminology», RFC 5486, DOI 10.17487/RFC5486, March 2009, <https://www.rfc-editor.org/info/rfc5486>.

[RFC5880] Katz, D. and D. Ward, «Bidirectional Forwarding Detection (BFD)», RFC 5880, DOI 10.17487/RFC5880, June 2010, <https://www.rfc-editor.org/info/rfc5880>.

[RFC6406] Malas, D., Ed. and J. Livingood, Ed., «Session PEERing for Multimedia INTerconnect (SPEERMINT) Architecture», RFC 6406, DOI 10.17487/RFC6406, November 2011, <https://www.rfc-editor.org/info/rfc6406>.

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

[RFC7224] Bjorklund, M., «IANA Interface Type YANG Module», RFC 7224, DOI 10.17487/RFC7224, May 2014, <https://www.rfc-editor.org/info/rfc7224>.

[RFC7276] Mizrahi, T., Sprecher, N., Bellagamba, E., and Y. Weingarten, «An Overview of Operations, Administration, and Maintenance (OAM) Tools», RFC 7276, DOI 10.17487/RFC7276, June 2014, <https://www.rfc-editor.org/info/rfc7276>.

[RFC7297] Boucadair, M., Jacquenet, C., and N. Wang, «IP Connectivity Provisioning Profile (CPP)», RFC 7297, DOI 10.17487/RFC7297, July 2014, <https://www.rfc-editor.org/info/rfc7297>.

[RFC7317] Bierman, A. and M. Bjorklund, «A YANG Data Model for System Management», RFC 7317, DOI 10.17487/RFC7317, August 2014, <https://www.rfc-editor.org/info/rfc7317>.

[RFC7455] Senevirathne, T., Finn, N., Salam, S., Kumar, D., Eastlake 3rd, D., Aldrin, S., and Y. Li, «Transparent Interconnection of Lots of Links (TRILL): Fault Management», RFC 7455, DOI 10.17487/RFC7455, March 2015, <https://www.rfc-editor.org/info/rfc7455>.

[RFC7665] Halpern, J., Ed. and C. Pignataro, Ed., «Service Function Chaining (SFC) Architecture», RFC 7665, DOI 10.17487/RFC7665, October 2015, <https://www.rfc-editor.org/info/rfc7665>.

[RFC7679] Almes, G., Kalidindi, S., Zekauskas, M., and A. Morton, Ed., «A One-Way Delay Metric for IP Performance Metrics (IPPM)», STD 81, RFC 7679, DOI 10.17487/RFC7679, January 2016, <https://www.rfc-editor.org/info/rfc7679>.

[RFC7680] Almes, G., Kalidindi, S., Zekauskas, M., and A. Morton, Ed., «A One-Way Loss Metric for IP Performance Metrics (IPPM)», STD 82, RFC 7680, DOI 10.17487/RFC7680, January 2016, <https://www.rfc-editor.org/info/rfc7680>.

[RFC8077] Martini, L., Ed. and G. Heron, Ed., «Pseudowire Setup and Maintenance Using the Label Distribution Protocol (LDP)», STD 84, RFC 8077, DOI 10.17487/RFC8077, February 2017, <https://www.rfc-editor.org/info/rfc8077>.

[RFC8194] Schoenwaelder, J. and V. Bajpai, «A YANG Data Model for LMAP Measurement Agents», RFC 8194, DOI 10.17487/RFC8194, August 2017, <https://www.rfc-editor.org/info/rfc8194>.

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

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

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

[RFC8345] Clemm, A., Medved, J., Varga, R., Bahadur, N., Ananthakrishnan, H., and X. Liu, «A YANG Data Model for Network Topologies», RFC 8345, DOI 10.17487/RFC8345, March 2018, <https://www.rfc-editor.org/info/rfc8345>.

[RFC8346] Clemm, A., Medved, J., Varga, R., Liu, X., Ananthakrishnan, H., and N. Bahadur, «A YANG Data Model for Layer 3 Topologies», RFC 8346, DOI 10.17487/RFC8346, March 2018, <https://www.rfc-editor.org/info/rfc8346>.

[RFC8348] Bierman, A., Bjorklund, M., Dong, J., and D. Romascanu, «A YANG Data Model for Hardware Management», RFC 8348, DOI 10.17487/RFC8348, March 2018, <https://www.rfc-editor.org/info/rfc8348>.

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

[RFC8466] Wen, B., Fioccola, G., Ed., Xie, C., and L. Jalil, «A YANG Data Model for Layer 2 Virtual Private Network (L2VPN) Service Delivery», RFC 8466, DOI 10.17487/RFC8466, October 2018, <https://www.rfc-editor.org/info/rfc8466>.

[RFC8512] Boucadair, M., Ed., Sivakumar, S., Jacquenet, C., Vinapamula, S., and Q. Wu, «A YANG Module for Network Address Translation (NAT) and Network Prefix Translation (NPT)», RFC 8512, DOI 10.17487/RFC8512, January 2019, <https://www.rfc-editor.org/info/rfc8512>.

[RFC8513] Boucadair, M., Jacquenet, C., and S. Sivakumar, «A YANG Data Model for Dual-Stack Lite (DS-Lite)», RFC 8513, DOI 10.17487/RFC8513, January 2019, <https://www.rfc-editor.org/info/rfc8513>.

[RFC8519] Jethanandani, M., Agarwal, S., Huang, L., and D. Blair, «YANG Data Model for Network Access Control Lists (ACLs)», RFC 8519, DOI 10.17487/RFC8519, March 2019, <https://www.rfc-editor.org/info/rfc8519>.

[RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., and R. Wilton, «YANG Library», RFC 8525, DOI 10.17487/RFC8525, March 2019, <https://www.rfc-editor.org/info/rfc8525>.

[RFC8528] Bjorklund, M. and L. Lhotka, «YANG Schema Mount», RFC 8528, DOI 10.17487/RFC8528, March 2019, <https://www.rfc-editor.org/info/rfc8528>.

[RFC8529] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X. Liu, «YANG Data Model for Network Instances», RFC 8529, DOI 10.17487/RFC8529, March 2019, <https://www.rfc-editor.org/info/rfc8529>.

[RFC8530] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X. Liu, «YANG Model for Logical Network Elements», RFC 8530, DOI 10.17487/RFC8530, March 2019, <https://www.rfc-editor.org/info/rfc8530>.

[RFC8531] Kumar, D., Wu, Q., and Z. Wang, «Generic YANG Data Model for Connection-Oriented Operations, Administration, and Maintenance (OAM) Protocols», RFC 8531, DOI 10.17487/RFC8531, April 2019, <https://www.rfc-editor.org/info/rfc8531>.

[RFC8532] Kumar, D., Wang, Z., Wu, Q., Ed., Rahman, R., and S. Raghavan, «Generic YANG Data Model for the Management of Operations, Administration, and Maintenance (OAM) Protocols That Use Connectionless Communications», RFC 8532, DOI 10.17487/RFC8532, April 2019, <https://www.rfc-editor.org/info/rfc8532>.

[RFC8533] Kumar, D., Wang, M., Wu, Q., Ed., Rahman, R., and S. Raghavan, «A YANG Data Model for Retrieval Methods for the Management of Operations, Administration, and Maintenance (OAM) Protocols That Use Connectionless Communications», RFC 8533, DOI 10.17487/RFC8533, April 2019, <https://www.rfc-editor.org/info/rfc8533>.

[RFC8632] Vallin, S. and M. Bjorklund, «A YANG Data Model for Alarm Management», RFC 8632, DOI 10.17487/RFC8632, September 2019, <https://www.rfc-editor.org/info/rfc8632>.

[RFC8641] Clemm, A. and E. Voit, «Subscription to YANG Notifications for Datastore Updates», RFC 8641, DOI 10.17487/RFC8641, September 2019, <https://www.rfc-editor.org/info/rfc8641>.

[RFC8652] Liu, X., Guo, F., Sivakumar, M., McAllister, P., and A. Peter, «A YANG Data Model for the Internet Group Management Protocol (IGMP) and Multicast Listener Discovery (MLD)», RFC 8652, DOI 10.17487/RFC8652, November 2019, <https://www.rfc-editor.org/info/rfc8652>.

[RFC8675] Boucadair, M., Farrer, I., and R. Asati, «A YANG Data Model for Tunnel Interface Types», RFC 8675, DOI 10.17487/RFC8675, November 2019, <https://www.rfc-editor.org/info/rfc8675>.

[RFC8676] Farrer, I., Ed. and M. Boucadair, Ed., «YANG Modules for IPv4-in-IPv6 Address plus Port (A+P) Softwires», RFC 8676, DOI 10.17487/RFC8676, November 2019, <https://www.rfc-editor.org/info/rfc8676>.

[RFC8783] Boucadair, M., Ed. and T. Reddy.K, Ed., «Distributed Denial-of-Service Open Threat Signaling (DOTS) Data Channel Specification», RFC 8783, DOI 10.17487/RFC8783, May 2020, <https://www.rfc-editor.org/info/rfc8783>.

[RFC8791] Bierman, A., Björklund, M., and K. Watsen, «YANG Data Structure Extensions», RFC 8791, DOI 10.17487/RFC8791, June 2020, <https://www.rfc-editor.org/info/rfc8791>.

[RFC8795] Liu, X., Bryskin, I., Beeram, V., Saad, T., Shah, H., and O. Gonzalez de Dios, «YANG Data Model for Traffic Engineering (TE) Topologies», RFC 8795, DOI 10.17487/RFC8795, August 2020, <https://www.rfc-editor.org/info/rfc8795>.

[RFC8819] Hopps, C., Berger, L., and D. Bogdanovic, «YANG Module Tags», RFC 8819, DOI 10.17487/RFC8819, January 2021, <https://www.rfc-editor.org/info/rfc8819>.

[RFC8944] Dong, J., Wei, X., Wu, Q., Boucadair, M., and A. Liu, «A YANG Data Model for Layer 2 Network Topologies», RFC 8944, DOI 10.17487/RFC8944, November 2020, <https://www.rfc-editor.org/info/rfc8944>.

[RFC8960] Saad, T., Raza, K., Gandhi, R., Liu, X., and V. Beeram, «A YANG Data Model for MPLS Base», RFC 8960, DOI 10.17487/RFC8960, December 2020, <https://www.rfc-editor.org/info/rfc8960>.

[RTGWG-POLICY] Qu, Y., Tantsura, J., Lindem, A., and X. Liu, «A YANG Data Model for Routing Policy», Work in Progress12, Internet-Draft, draft-ietf-rtgwg-policy-model-27, 10 January 2021, <https://tools.ietf.org/html/draft-ietf-rtgwg-policy-model-27>.

[SNOOPING-YANG] Zhao, H., Liu, X., Liu, Y., Sivakumar, M., and A. Peter, «A Yang Data Model for IGMP and MLD Snooping», Work in Progress13, Internet-Draft, draft-ietf-pim-igmp-mld-snooping-yang-18, 14 August 2020, <https://tools.ietf.org/html/draft-ietf-pim-igmp-mld-snooping-yang-18>.

[SPRING-SR-YANG] Litkowski, S., Qu, Y., Lindem, A., Sarkar, P., and J. Tantsura, «YANG Data Model for Segment Routing», Work in Progress14, Internet-Draft, draft-ietf-spring-sr-yang-29, 8 December 2020, <https://tools.ietf.org/html/draft-ietf-spring-sr-yang-29>.

[STAMP-YANG] Mirsky, G., Min, X., and W. S. Luo, «Simple Two-way Active Measurement Protocol (STAMP) Data Model», Work in Progress, Internet-Draft, draft-ietf-ippm-stamp-yang-06, 7 October 2020, <https://tools.ietf.org/html/draft-ietf-ippm-stamp-yang-06>.

[TEAS-ACTN-PM] Lee, Y., Dhody, D., Karunanithi, S., Vilalta, R., King, D., and D. Ceccarelli, «YANG models for VN/TE Performance Monitoring Telemetry and Scaling Intent Autonomics», Work in Progress, Internet-Draft, draft-ietf-teas-actn-pm-telemetry-autonomics-04, 2 November 2020, <https://tools.ietf.org/html/draft-ietf-teas-actn-pm-telemetry-autonomics-04>.

[TEAS-YANG-PATH-COMP] Busi, I., Belotti, S., Lopez, V., Sharma, A., and Y. Shi, «Yang model for requesting Path Computation», Work in Progress, Internet-Draft, draft-ietf-teas-yang-path-computation-11, 16 November 2020, <https://tools.ietf.org/html/draft-ietf-teas-yang-path-computation-11>.

[TEAS-YANG-RSVP] Beeram, V. P., Saad, T., Gandhi, R., Liu, X., Bryskin, I., and H. Shah, «A YANG Data Model for RSVP-TE Protocol», Work in Progress, Internet-Draft, draft-ietf-teas-yang-rsvp-te-08, 9 March 2020, <https://tools.ietf.org/html/draft-ietf-teas-yang-rsvp-te-08>.

[TEAS-YANG-TE] Saad, T., Gandhi, R., Liu, X., Beeram, V. P., and I. Bryskin, «A YANG Data Model for Traffic Engineering Tunnels, Label Switched Paths and Interfaces», Work in Progress, Internet-Draft, draft-ietf-teas-yang-te-25, 27 July 2020, <https://tools.ietf.org/html/draft-ietf-teas-yang-te-25>.

[TRILL-YANG-OAM] Kumar, D., Senevirathne, T., Finn, N., Salam, S., Xia, L., and W. Hao, «YANG Data Model for TRILL Operations, Administration, and Maintenance (OAM)», Work in Progress, Internet-Draft, draft-ietf-trill-yang-oam-05, 31 March 2017, <https://tools.ietf.org/html/draft-ietf-trill-yang-oam-05>.

[TWAMP-DATA-MODEL] Civil, R., Morton, A., Rahman, R., Jethanandani, M., and K. Pentikousis, «Two-Way Active Measurement Protocol (TWAMP) Data Model», Work in Progress15, Internet-Draft, draft-ietf-ippm-twamp-yang-13, 2 July 2018, <https://tools.ietf.org/html/draft-ietf-ippm-twamp-yang-13>.

[UNI-TOPOLOGY] Dios, O. G. D., Barguil, S., Wu, Q., and M. Boucadair, «A YANG Model for User-Network Interface (UNI) Topologies», Work in Progress, Internet-Draft, draft-ogondio-opsawg-uni-topology-01, 2 April 2020, <https://tools.ietf.org/html/draft-ogondio-opsawg-uni-topology-01>.

Приложение A. Обзор примеров многоуровневых модулей YANG

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

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

Читатель может обратиться к каталогу YANG (<https://www.yangcatalog.org>) или общедоступному репозиторию Github YANG (<https://github.com/YangModels/yang>) для поиска интересующих модулей YANG. Каталог YANG включает некоторые метаданные, указывающие тип модуля (module-classification) [NETMOD-MODEL]. Отметим, что механизм, заданный в [RFC8819] позволяет связывать с модулями YANG теги, позволяющие классифицировать модули.

A.1. Модели служб — определения и примеры

Как описано в [RFC8309], службой считается «та или иная форма связности сайтов клиента с Internet или соединения сайтов клиента через сеть оператора и Internet». Более конкретно, услугу связности IP можно определить как способность передачи трафика IP, характеризуемого квартетом (Source Nets, Destination Nets, Guarantees, Scope), где Source Nets указывает группу индивидуальных адресов, Destination Nets — группу индивидуальных и/или групповых адресов IP, Guarantees отражает гарантии (например, в терминах QoS, производительности и доступности) надлежащей пересылки трафика получателю Destination [RFC7297]. Scope указывает сетевой периметр (например, между маршрутизаторами PE и узлами клиента), где гарантии должны быть предоставлены. Например,

  • L3SM [RFC8299] определяет услугу L3VPN, заказываемую клиентом у оператора сети;

  • L2SM [RFC8466] определяет услугу L2VPN, заказываемую клиентом у оператора сети;

  • модель VN [ACTN-VN-YANG] предоставляет модель данных YANG, применимую к любому режиму работы VN.

L2SM и L3SM — модели обслуживания клиентов в соответствии с [RFC8309].

A.2. Монтирование схемы

Модульность и расширяемость были основными принципами разработки языка моделирования данных YANG. В результате один и тот же модуль YANG можно сочетать с разными наборами иных модулей для формирования модели данных, приспособленной к требованиям конкретного варианта применения. В [RFC8528] задан механизм, названный монтированием схемы (schema mount), который позволяет смонтировать модель данных, состоящую из любого числа модулей YANG в конкретном месте другой (родительской) схемы.

A.3. Модели служб — примеры

L2NM [OPSAWG-L2NM] и L3NM [OPSAWG-L3SM-L3NM] являются примерами моделей YANG для сети. На рисунке 9 показан набор дополнительных моделей сетей, таких как модели топологии и туннелей.

+-------------------------------+-------------------------------+
|   Модули YANG для топологии   |   Модули YANG для туннелей    |
+-------------------------------+-------------------------------+
|  +------------------+         |                               |
|  |  Модель сетевой  |         | +-------+ +-----------+       |
|  |     топологии    |         | |Другой | | Туннель TE|       |
|  +--------+---------+         | |туннель| +----+------+       |
|           |   +---------+     | +------+       |              |
|           +---+Топология|     |     +----------+---------+    |
|           |   |службы   |     |     |          |         |    |
|           |   +---------+     |     |          |         |    |
|           |   +---------+     |+----+---+ +----+---+ +---+---+|
|           +---+Топология|     ||Туннель | |Туннель | |Туннель||
|           |   |L3       |     ||MPLS-TE | |RSVP-TE | | SR-TE ||
|           |   +---------+     |+--------+ +--------+ +-------+|
|           |   +---------+     |                               |
|           +---+Топология|     |                               |
|           |   |TE       |     |                               |
|           |   +---------+     |                               |
|           |   +---------+     |                               |
|           +---+Топология|     |                               |
|               |L2       |     |                               |
|               +---------+     |                               |
+-------------------------------+-------------------------------+

Рисунок 9. Примеры ориентированных на ресурсы моделей сетей.


Ниже приведены примеры топологических модулей YANG.

Модель топологии сети

В [RFC8345] определена модель для топологии сети и инвентаризации. Данные топологии включают ресурсы каналов, узлов и точек завершения.

Модель топологии TE

В [RFC8795] определена модель данных YANG для представления топологии TE и манипуляций с ней. Этот модуль является расширением модуля топологии из [RFC8345] и включает содержимое, связанное с топологией TE. Модель содержит не связанные с технологией блоки построения топологии TE, которые можно дополнять и применять в других моделях топологии TE, связанных с технологией.

Модель топологии L3

В [RFC8346] определена модель данных YANG для манипуляций с топологией L3, являющаяся расширением модели из [RFC8345] и включающая детали, связанные в топологией L3.

Модель топологии L2

В [RFC8944] определена модель данных YANG для манипуляций с топологией L2, являющаяся расширением модели из [RFC8345] и включающая детали, связанные в топологией L2.

Ниже приведены примеры модулей YANG для туннелей.

Идентификаторы туннелей

В [RFC8675] задан набор идентификаторов YANG для туннелей, служащих типами интерфейсов для туннелей.

Модель туннелей TE

В [TEAS-YANG-TE] задан модуль YANG для настройки и управления интерфейсами и туннелями TE, а также LSP.

Модель туннелей SR TE

[TEAS-YANG-TE] дополняет базовые модели TE и MPLS-TE, задавая модуль данных YANG, связанный с SR-TE.

Модель MPLS-TE

[TEAS-YANG-TE] дополняет базовые модели TE и MPLS-TE, задавая модуль данных YANG для конфигурации и состояния MPLS-TE, RPC и уведомлений.

Модель MPLS RSVP-TE

[TEAS-YANG-RSVP] дополняет базовый модуль RSVP-TE параметрами для настройки и управления сигнализацией MPLS RSVP-TE LSP.

Ниже перечислены другие примеры моделей для сетей.

Модель API расчёта путей

В [TEAS-YANG-PATH-COMP] задан модуль YANG для RPC без учёта состояния, дополняющий решение с учётом состояний из [TEAS-YANG-TE].

Модели OAM (включая контроль отказов и мониторинг производительности)

В [RFC8532] задан базовый модуль YANG для управления протоколами OAM, не использующими явных соединений. В [RFC8533] задан модуль YANG для извлечения из протоколов OAM без организации соединений. [RFC8531] определяет базовый модуль YANG для ориентированных на соединения протоколов OAM. Имеется 3 модели, предназначенных для предоставления согласованных отчётов, конфигурации и представлений OAM с организацией соединений и без них.
Мониторинг сигналов тревоги является важной частью сетевого мониторинга. Необработанные (Raw) сигналы тревоги от сетевых устройств не всегда указывают статус сетевых услуг или место основной причины отказа. В [RFC8632] задан модуль YANG для сигналов тревоги.

A.4. Модели устройств — примеры

Модели элементов сети (Рисунок 10) служат для описания возможной реализации службы путём активации и настройки набора функций (включённых на одном или нескольких устройствах, или размещённых в облачной инфраструктуре), вовлечённых в предоставление услуги. Например, служба L3VPN включает множество PE и требует манипуляция с указанными ниже модулями.

  • Управление маршрутизацией [RFC8349].

  • BGP [IDR-BGP-MODEL].

  • PIM [PIM-YANG].

  • Управление NAT [RFC8512].

  • Управление QoS [QOS-MODEL].

  • ACL [RFC8519].

                                        +------------------------+
                                      +-+   Модель устройства    |
                                      | +------------------------+
                                      | +------------------------+
                  +---------------+   | |   Модель логического   |
                  |               |   +-+   элемента сети        |
                  | Архитектура   |   | +------------------------+
                  |               |   | +------------------------+
                  +-------+-------+   +-+ Модель экземпляра сети |
                          |           | +------------------------+
                          |           | +------------------------+
                          |           +-+Модель типа маршрутизац.|
                          |             +------------------------+
  +-------+----------+----+------+------------+-----------+------+
  |       |          |           |            |           |      |
+-+-+ +---+---+ +----+----+   +--+--+    +----+----+   +--+--+   |
|ACL| |Маршрут| |Транспорт|   | OAM |    |Групповое|   |  PM | Прочие
+---+ +-+-----+ +----+----+   +--+--+    +-----+---+   +--+--+
        | +-------+  | +------+  | +--------+  | +-----+  | +-----+
        +-+Ядро   |  +-+Базов.|  +-+  BFD   |  +-+IGMP |  +-+TWAMP|
        | |маршрут|  | | MPLS |  | +--------+  | |/MLD |  | +-----+
        | +-------+  | +------+  | +--------+  | +-----+  | +-----+
        | +-------+  | +------+  +-+LSP Ping|  | +-----+  +-+OWAMP|
        +-+  BGP  |  +-+ MPLS |  | +--------+  +-+ PIM |  | +-----+
        | +-------+  | | LDP  |  | +--------+  | +-----+  | +-----+
        | +-------+  | +------+  +-+MPLS-TP |  | +-----+  +-+LMAP |
        +-+  ISIS |  | +------+    +--------+  +-+ MVPN|    +-----+
        | +-------+  +-+Статич|                  +-----+
        | +-------+    | MPLS |
        +-+  OSPF |    +------+
        | +-------+
        | +-------+
        +-+  RIP  |
        | +-------+
        | +-------+
        +-+  VRRP |
        | +-------+
        | +-------+
        +-+SR/SRv6|
        | +-------+
        | +-------+
        +-+ISIS-SR|
        | +-------+
        | +-------+
        +-+OSPF-SR|
          +-------+

Рисунок 10. Обзор моделей элементов сети.


На рисунке 10 в качестве примера указаны заданные IETF модели данных.

A.4.1. Модели для компоновки

Модель логического элемента сети

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

Модель экземпляра сети

В [RFC8529] задан модуль для экземпляра сети, который может служить для управления распределением виртуальных ресурсов, которые могут присутствовать в сетевом устройстве. Примерами разделения таких ресурсов являются экземпляры VRF и виртуальных коммутаторов (Virtual Switch Instance или VSI).

A.4.2. Управление устройством

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

  • В [RFC8348] определён модуль YANG для управления оборудованием.

  • В [RFC7317] задан модуль YANG ietf-system со множеством функций, таких как настройка и мониторинг системы или идентификация операций управления системой (например, отключение — shutdown, перезапуск, установка времени).

  • В [RFC8341] задан модуль YANG для контроля доступа к конфигурации сети.

A.4.3. Управление интерфейсом

Ниже приведён список модулей YANG, которые могут служить для управления интерфейсами.

  • [RFC7224] задаёт модуль YANG с определениями типов интерфейсов.

  • [RFC8343] задаёт модуль YANG для управления сетевыми интерфейсами.

A.4.4. Примеры моделей для устройств

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

L2VPN

[L2VPN-YANG] задаёт модуль YANG для услуг L2VPN [RFC4664] и включает коммутацию между локально подключёнными устройствами. Модель L2VPN охватывает службу виртуальных частных проводов «точка-точка» (Virtual Private Wire Service или VPWS) и многоточечных виртуальных частных ЛВС (Multipoint Virtual Private LAN Service или VPLS). В этих службах применяется сигнализация для псевдопроводов через MPLS с использованием LDP [RFC8077][RFC4762] или BGP [RFC4761].

EVPN

[EVPN-YANG] определяет модуль YANG для служб Ethernet VPN. Модель не зависит от базовой сети (underlay). Она подходит для инкапсуляции MPLS и VxLAN16. Модуль не зависит от служб, включая E-LAN, E-LINE, E-TREE.

L3VPN

[L3VPN-YANG] задаёт модуль YANG, который можно применять для настройки и управления BGP L3VPN [RFC4364]. Модуль содержит связанные с VRF параметры, а также связанные с BGP параметры, применимые в L3VPN.

Ядро маршрутизации

[RFC8349] определяет модель данных YANG для ядра маршрутизации, предназначенный у качестве основы для будущих моделей, охватывающих более сложные системы маршрутизации. Предполагается, что модули YANG для других типов маршрутизации (например, VRRP, RIP, ISIS, OSPF) будут дополнять этот базовый модуль.

MPLS

[RFC8960] задаёт базовую модель для MPLS которая служит основой для настройки и управления подсистемой коммутации MPLS. Предполагается, что другие модули YANG MPLS (например, для статических MPLS LSP, LDP, RSVP-TE) будут дополнять этот базовый модуль YANG.

BGP

В [IDR-BGP-MODEL] задан модуль YANG для настройки и управления BGP, включая протокол, правила и аспекты работы в соответствии с требованиями ЦОД, операторов и контент-провайдеров.

Политика маршрутизации

[RTGWG-POLICY] определяет модуль YANG для настройки и управления политиками маршрутизации на основе опыта эксплуатации. Модуль обеспечивает базовую схему политики и может дополняться связанными с протоколами конфигурациями правил.

SR/SRv6

[SPRING-SR-YANG] задаёт модуль YANG для настройки и использования маршрутизации по сегментам.

BFD

Протокол двухстороннего обнаружения пересылки (Bidirectional Forwarding Detection или BFD) [RFC5880] применяется для определения живучести произвольных путей между системами [BFD-YANG] задаёт модуль YANG, который можно применять для настройки и управления BFD.

Групповая передача

[PIM-YANG] задаёт модуль YANG, который можно использовать для настройки и управления устройствами PIM17. В
[RFC8652] определён модуль YANG, который может служить для настройки и управления устройствами IGMP18 и MLD19. В [SNOOPING-YANG] задан модуль YANG, который можно применять для настройки и управления устройствами IGMP и MLD (snooping). В [MVPN-YANG] определена модель данных YANG для настройки и управления групповой передачей в MPLS/BGP IP VPN (MVPN).

PM

[TWAMP-DATA-MODEL] задаёт модель данных YANG для реализации клиента и сервера протокола двухсторонних активных измерений (Two-Way Active Measurement Protocol или TWAMP). В [STAMP-YANG] определена модель данных для реализаций Session-Sender и Session-Reflector в простом протоколе двухсторонних активных измерений (Simple Two-way Active Measurement Protocol или (STAMP), использующая YANG. В [RFC8194] задана модель данных YANG для платформ крупномасштабных измерений (Large-Scale Measurement Platform или LMAP).

ACL

ACL являются одними из базовых элементов для настройки поведения пересылки в устройствах. Они применяются во многих сетевых технологиях, таких как маршрутизация на основе правил (Policy-Based Routing), межсетевые экраны и т. п. В [RFC8519] описана модель данных YANG для базовых блоков ACL.

QoS

[QOS-MODEL] описывает модуль YANG для настройки и эксплуатации дифференцированных услуг (Differentiated Services или DS).

NAT

Для автоматизации сети и необходимости программировать функции NAT, в частности, важна модель данных YANG для настройки и управления NAT. В [RFC8512] задан модуль YANG для функции NAT, охватывающий различные варианты трансляции, такие как преобразование IPv4 в IPv4 (NAT44), трансляция адресов и протоколов от клиентов IPv6 к серверам IPv4 (Network Address and Protocol Translation from IPv6 Clients to IPv4 Servers или NAT64), трансляторы на стороне клиента (customer-side translator или CLAT), трансляция IP/ICMP без учёта состояния (Stateless IP/ICMP Translation или SIIT), явное сопоставления адресов (Explicit Address Mapping или EAM) для SIIT, трансляция сетевых префиксов IPv6 в IPv6 (IPv6-to-IPv6 Network Prefix Translation или NPTv6), трансляция адресов плучателей (Destination NAT). В [RFC8513] задан модуль YANG для двойного стека (Dual-Stack Lite или DS-Lite).

Совместное использование адресов без учёта состояния

в [RFC8676] задан модуль YANG для совместного использования адресов и портов (Address plus Port или A+P), включая Lightweight 4over6, сопоставление адреса и порта с инкапсуляцией (Mapping of Address and Port with Encapsulation или MAP-E), сопоставление адреса и порта с применением трансляции (Mapping of Address and Port using Translation или MAP-T).

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

Спасибо Joe Clark, Greg Mirsky, Shunsuke Homma, Brian Carpenter, Adrian Farrel, Christian Huitema, Tommy Pauly, Ines Robles, Olivier Augizeau за рецензии.

Большое спасибо Robert Wilton за подробную рецензию AD.

Спасибо Éric Vyncke, Roman Danyliw, Erik Kline, Benjamin Kaduk за рецензию IESG.

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

 

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


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

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

nmalykh@protokols.ru

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

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

3Transparent Interconnection of Lots of Links — прозрачное соединение большого числа каналов.

4Multi-destination Tree Verification — проверка дерева с множеством адресатов.

5Опубликовано в RFC 9127. Прим. перев.

6Опубликовано в RFC 9132. Прим. перев.

7Опубликовано в RFC 9097. Прим. перев.

8Опубликовано в RFC 9291. Прим. перев.

9Опубликовано в RFC 9182. Прим. перев.

10Опубликовано в RFC 9181. Прим. перев.

11Опубликовано в RFC 9128. Прим. перев.

12Опубликовано в RFC 9067. Прим. перев.

13Опубликовано в RFC 9166. Прим. перев.

14Опубликовано в RFC 9020. Прим. перев.

15Опубликовано в RFC 8913. Прим. перев.

16Virtual eXtensible Local Area Network — расширяемая виртуальная частная ЛВС.

17Protocol Independent Multicast — независимая от устройств групповая передача.

18Internet Group Management Protocol — протокол управления группами Internet.

19Multicast Listener Discovery — обнаружение групповых получателей (слушателей).

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

Как новые технологии меняют отрасль Web-разработки

Artur Meyster

https://twitter.com/arturmeyster
https://www.linkedin.com/in/meyster

Артур Мейстер (Artur Meyster) — технический директор Career Karma (YC W19) —  онлайн-площадки для подбора людей, меняющих свою карьеру, с учебными курсами по программированию. Он также является ведущим подкаста Breaking Into Startups, в котором рассказывают о людях с нетрадиционным образованием, пришедшим в технологическую индустрию.

Как новые технологии меняют отрасль Web-разработки

Новые технологии меняют всю сферу разработки. Хорошо это или плохо, новинки внедряются и обратного пути нет. Отрасль web-разработок также испытывает влияние новых технологий. Ускоренные страницы для мобильных приложений, голосовой поиск и искусственный интеллект (artificial intelligence или AI) — это лишь несколько технологий, применяемых сегодня для улучшения web-сайтов.

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

Точно так же использование дополненной реальности (augmented reality или AR) для покупок в сети ставит перед web-разработчиками новые задачи и требует от них оставаться в курсе современных событий.

Чтобы понять, как новые технологии влияют на отрасль web-разработки, нужно принять во внимание несколько аспектов.

Искусственный интеллект и машинное обучение

Сегодня разработчики применяют машинное обучение и AI для улучшения web-сайтов беспрецедентными способами. Благодаря машинному обучению, сайты способны предоставлять персонифицированные услуги и пользователи получают адаптированную для них информацию. По сути, такие компании, как Netflix, Spotify и Youtube использовали машинное обучение, чтобы предлагать содержимое на основе ввода от пользователя. Сейчас пользователи чувствуют себя комфортно, поскольку не приходится тратить время на просмотр не интересующего их содержимого.

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

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

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

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

Системы управления содержимым

Системы управления содержимым (Content management systems или CMS) служат для упрощения процесса создания web-сайтов. Фактически пользователям не нужны познания в сфере web-разработки и достаточно просто понимать, какой информацией они хотят поделиться, и добавить на сайт несколько виджетов. Однако создание уникальных сайтов с помощью таких CMS как WordPress или Wix может быть затруднего необходимостью использовать базовые макеты и темы.

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

Ускоренные страницы для мобильных приложений

Ускоренные страницы для мобильных приложений (Accelerated mobile pages или AMP) получили широкое распространение с обретением популярности смартфонами. Фактически большинство пользователей сейчас применяет мобильные устройства с высокой скоростью доступа в сеть, что требует быстрой загрузки web-сайтов. Использование AMP обеспечивает решение нескольких проблем. Например, эта технология не только повышает привлекательность мобильных приложений, но и снижает нагрузку на сервер. Фактически, это улучшает взаимодействие с пользователем и снижает нагрузку на серверы хостинг-провайдера.

Однако не все идеально и AMP также имеет свои недостатки. Во-первых, использование ускоренных страниц снижает интеграцию рекламы с сайтом и у результате владельцы сайта могут столкнуться со снижением дохода. Во-вторых, сайты электронной коммерции используют динамические элементы, не поддерживаемые AMP. По этой причине приходится перенаправлять клиента, посещающего web-сайт, что может снизить доверие к компании. И, наконец, имеются ограничения для содержимого web-сайтов, поскольку финальное представление находится под контролем Google.

Дополненная реальность

Web-дизайнеры внедрили технологию дополненной реальности (AR) в камеры смартфонов и web-камеры, чтобы помочь клиентам выбирать продукцию. Фактически, применение AR улучшает взаимодействие с пользователем как в настольных системах, так и в мобильных устройствах. Пользователь может через свою камеру показать все, что пожелает, и увидеть нужную продукцию. Например, в сфере обустройства дома можно выбрать продукцию и показать свое окружение через камеру, чтобы увидеть, как будет выглядеть комната. В модной розничной торговле пользователи могут просмотреть наряды и увидеть, что им лучше подходит. Разумно отметить, что дополненная реальность изменила способы покупок через сеть, повысив уровень удовлетворенности клиентов.

Рубрика: Разное | Комментарии к записи Как новые технологии меняют отрасль Web-разработки отключены