RFC 8926 Geneve: Generic Network Virtualization Encapsulation

Internet Engineering Task Force (IETF)                     J. Gross, Ed.
Request for Comments: 8926                                              
Category: Standards Track                                  I. Ganga, Ed.
ISSN: 2070-1721                                                    Intel
                                                         T. Sridhar, Ed.
                                                                  VMware
                                                           November 2020

Geneve: Generic Network Virtualization Encapsulation

Geneve — базовая инкапсуляция виртуализации сетей

PDF

Аннотация

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

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

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

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

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

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

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

Сети уже давно используют различные механизмы туннелирования, теги и другие способы инкапсуляции. Однако виртуализация сетей вызвала всплеск интереса и соответствующий рост разработки внедрения новых протоколов. Большое число таких протоколов от VLAN [IEEE.802.1Q_2018] и MPLS [RFC3031] до более новых VXLAN3 [RFC7348] и NVGRE4 [RFC7637] зачастую вызывает вопрос о необходимости разработки нового формата инкапсуляции и причинах быстрого распространения виртуализации сетей. Отметим, что представленный выше список протоколов не является исчерпывающим.

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

В таких работах, как «VL2: A Scalable and Flexible Data Center Network» [VL2] и «NVO3 Data Plane Requirements» [NVO3-DATAPLANE] описаны некоторые свойства, которые плоскость данных должна обеспечивать для поддержки сетевой виртуализации. Однако имеется дополнительное определяющее требование передачи метаданных (например, состояние системы) вместе с данными пакетов (примеры использования метаданных приведены ниже). Использование метаданных не является новинкой и почти все протоколы, применяемые для виртуализации сетей, содержат по меньшей мере 24-битовое пространство идентификаторов как способ разделения арендаторов. Это часто описывается как преодоление присущего VLAN ограничения в 12 битов, поскольку 16 миллионов идентификаторов вполне достаточно для обозначения идентификаторов практически в любом контексте. Однако на практике метаданные не ограничиваются идентификаторами арендаторов и представление других сведений приводит к быстрому заполнению доступного пространства. Фактически, по сравнению с тегами, применяемыми для обмена метаданными между линейными платами в шасси коммутатора 24-битовые идентификаторы начинают казаться достаточно мелкими. Применение метаданных практически не имеет границ и они служат для разных целей от хранения номера входного порта для простой политики безопасности до передачи связанного со службой контекста для расширенных приложений на промежуточных устройствах, завершающих или заново инкапсулирующих трафик Geneve.

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

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

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

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

Схема виртуализации сети через уровень L3 (Network Virtualization over Layer 3 или NVO3) [RFC7365] определяет множество концепций, обычно применяемых в сфере виртуализации сетей. Ниже приведены дополнительные определения используемых в этом документе терминов.

Checksum offload — выгрузка операций с контрольной суммой

Оптимизация, выполняемая во многих сетевых адаптерах (NIC) для переноса операций расчёта и проверки контрольных сумм в оборудование при передаче и приёме пакетов, соответственно. Обычно это включает контрольные суммы IP, TCP и UDP, которые без выгрузки обрабатываются программно в стеке протоколов.

Clos network — сеть Clos

Метод организации сетевых структур, выходящих за пределы одного коммутатора и поддерживающих неблокируемую пропускную способность между точками подключения. Для деления трафика между несколькими каналами используется механизм ECMP и коммутаторы, образующие структуру. Иногда для обозначения применяются термины топология leaf and spine (лист и ствол) и «дерево судьбы» (fat tree).

ECMP (Equal Cost Multipath) — множество равноценных путей

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

Geneve (Generic Network Virtualization Encapsulation) — базовая инкапсуляция виртуализации сети

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

LRO (Large Receive Offload) — выгрузка операций приёма с большими блоками данных

Эквивалент функции LSO на стороне получателя, когда несколько протокольных сегментов (в основном TCP) собирается в более крупный блок данных.

LSO (Large Segmentation Offload) — выгрузка сегментации больших блоков данных

Функция, обеспечиваемая многими коммерческими NIC и позволяющая передавать сетевому адаптеру блоки данных размером больше MTU с целью повышения производительности. NIC отвечает за создание более мелких сегментов, размер которых не превышает значение MTU, с корректными протокольными заголовками. В контексте TCP/IP эту функцию часто называют TSO (TCP Segmentation Offload — выгрузка сегментации TCP).

Middlebox — промежуточное устройство

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

NIC (Network Interface Controller) — контроллер сетевого интерфейса

Иногда используются также термины Network Interface Card (плата сетевого интерфейса) и Network Adapter (сетевой адаптер). NIC может быть частью конечной точки туннеля или транзитного устройства и может обрабатывать или способствовать обработке пакетов Geneve.

Transit device — транзитное устройство

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

Tunnel endpoint – конечная точка туннеля

Элемент, выполняющий инкапсуляцию и декапсуляцию пакетов, таких как кадры Ethernet или дейтаграммы IP, с заголовками Geneve. Будучи конечным потребителем метаданных туннеля, конечная точка предъявляет самый высокий уровень требований к синтаксическому анализу и интерпретации заголовков. Конечная точка может быть реализована программно, аппаратно или представлять комбинацию этих вариантов. Конечные точки туннелей часто служат компонентами периметра виртуализации сети (Network Virtualization Edge или NVE), но могут размещаться на промежуточных устройствах и других элементах, делая их частью сети NVO3.

VM (Virtual Machine) — виртуальная машина

2. Требования к разработке

Протокол Geneve разработан для поддержки вариантов виртуализации сети в среде ЦОД. В этих ситуациях туннели обычно служат «магистральными соединениями» между виртуальными коммутаторами, находящимися в гипервизорах, физическими коммутаторами и промежуточными устройствами или другими системами. В качестве базовой может служить любая сеть IP, хотя обычно применяются сети Clos с использованием каналов ECMP для обеспечения согласованной пропускной способности между всеми точками подключения. Многие концепции наложения виртуализации на сети IP описаны в модели NVO3 [RFC7365]. На рисунке 1 представлен пример гипервизора, коммутатора ToR (top-of-rack) для подключения физических серверов и канала в WAN, соединённых с помощью туннелей Geneve через упрощённую сеть Clos. Туннели служат для инкапсуляции и пересылки кадров от подключённых элементов, таких как VM и физические каналы.

+----------------------+            +--------+  +-------+
| +--+  +--------+---+ |            |Промеж. |--|Коммут.|==Физич.
| |VM|--|        |   | | +-------+ /|маршрут.|  | ToR   |==серверы
| +--+  |Виртуал.|NIC|---|Коммут.|/ +--------+\/+-------+
| +--+  |коммут. |   | | | ToR   |\ +--------+/\+-------+
| |VM|--|        |   | | +-------+ \|Промеж. |  |Восход.|   WAN
| +--+  +--------+---+ |            |маршрут.|--| канал |=========>
+----------------------+            +--------+  +-------+
       Гипервизор

            ()===================================()
               Туннели Geneve между коммутаторами

Рисунок 1. Пример развертывания Geneve.


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

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

  • эффективная реализация элементов туннеля на программном и аппаратном уровне без ограничения возможностями наиболее слабого элемента;

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

Эти требования более подробно описаны в последующих параграфах.

2.1. Независимость от плоскости управления

Хотя некоторые протоколы сетевой виртуализации включают плоскость управления как часть спецификации формата туннелей (наиболее ярко это проявляется в VXLAN [RFC7348], где предписана плоскость управления на основе изучения группового трафика), в основном их спецификации описывают лишь формат данных. Формат пакетов VXLAN фактически работает с разными плоскостями управления, построенные на его базе.

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

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

2.2. Расширяемость плоскости данных

Для достижения уровня гибкости, требуемого в поддержку имеющихся и будущих плоскостей управления, нужна инфраструктура опций, которая позволит эффективно определять, развёртывать, а также завершать или исключать новые типы метаданных. Опции также позволяют дифференцировать продукцию, поощряя независимую разработку по основной специализации каждого производителя, что в целом приведёт к ускорению развития. Безусловно, наиболее распространенным механизмом реализации опций будет формат TLV (Type-Length-Value — тип, размер, значение).

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

2.2.1. Эффективная реализация

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

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

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

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

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

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

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

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

3. Инкапсуляция Geneve

Пакет Geneve включает компактный заголовок туннеля, инкапсулированный в UDP для протокола IPv4 или IPv6. Небольшой фиксированный заголовок туннеля обеспечивает данные управления, а также базовую функциональность и возможность взаимодействия с упором на простоту. За этим заголовком следует набор опций переменного размера, позволяющих развивать протокол. Далее следуют данные (payload), включающие модуль данных протокола указанного типа, такой как кадр Ethernet. В параграфах 3.1 и 3.2 показан формат пакета Geneve доставляемого (как пример) через сеть Ethernet и содержащего в себе кадр Ethernet.

3.1. Формат пакета Geneve для IPv4

 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


Внешний заголовок Ethernet

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Внешний MAC-адрес получателя                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Внешний MAC-адрес получателя  | Внешний MAC-адрес отправителя |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Внешний MAC-адрес отправителя                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Необяз. Ethertype=C-Tag 802.1Q|      Внешний тег VLAN         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Ethertype = 0x0800 IPv4    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Внешний заголовок IPv4

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |Protocol=17 UDP|         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Внешний адрес отправителя IPv4              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Внешний адрес получателя IPv4               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Внешний заголовок UDP

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Source Port = xxxx      |    Dest Port = 6081 Geneve    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           UDP Length          |        UDP Checksum           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Заголовок Geneve

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver|  Opt Len  |O|C|    Rsvd.  |          Protocol Type        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Virtual Network Identifier (VNI)       |    Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                   Опции переменного размера                   ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Внутренний заголовок Ethernet (пример данных).

<pre+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Внутренний MAC-адрес получателя | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Внутренний MAC-адрес получателя|Внутренний MAC-адрес отправит. | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Внутренний MAC-адрес отправителя | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Необяз. Ethertype=C-Tag 802.1Q| Внутренний тег VLAN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 


Данные (Payload)

 

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Ethertype исходных данных   |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
|                                  Исходные данные Ethernet     |
|                                                               |
~ (Преамбула исходного кадра Ethernet, начиная с разграничителя ~
| кадра (SFD), и контрольная сумма (FCS) не показаны, а данные  |
| Ethernet не нужно выравнивать по 4-байтовой границе)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Последовательность проверки кадра (FCS)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Новое значение (FCS) для внешнего кадра Ethernet        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 2. Формат пакета Geneve для IPv4.

3.2. Формат пакета Geneve для IPv6

 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


Внешний заголовок Ethernet

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Внешний MAC-адрес получателя                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Внешний MAC-адрес получателя  | Внешний MAC-адрес отправителя |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Внешний MAC-адрес отправителя                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Необяз. Ethertype=C-Tag 802.1Q|      Внешний тег VLAN         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Ethertype = 0x86DD IPv6    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Внешний заголовок IPv6

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class |           Flow Label                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Payload Length        | NxtHdr=17 UDP |   Hop Limit   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                   Внешний адрес отправителя IPv6              +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                   Внешний адрес получателя IPv6               +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Внешний заголовок UDP

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Source Port = xxxx      |    Dest Port = 6081 Geneve    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           UDP Length          |        UDP Checksum           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Заголовок Geneve

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver|  Opt Len  |O|C|    Rsvd.  |          Protocol Type        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Virtual Network Identifier (VNI)       |    Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                   Опции переменного размера                   ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Внутренний заголовок Ethernet (пример данных).

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               Внутренний MAC-адрес получателя                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Внутренний MAC-адрес получателя|Внутренний MAC-адрес отправит. |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               Внутренний MAC-адрес отправителя                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Необяз. Ethertype=C-Tag 802.1Q|    Внутренний тег VLAN         
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Данные (Payload)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Новое значение (FCS) для внешнего кадра Ethernet        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Последовательность проверки кадра (FCS)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Новое значение (FCS) для внешнего кадра Ethernet        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 3. Формат пакета Geneve для IPv6.


3.3. Заголовок UDP

Использование заголовка инкапсуляции UDP [RFC0768] следует семантике Ethernet и IP без организации соединений в дополнение к обеспечению маршрутизаторам энтропии для выполнения ECMP. Интерпретация полей описана ниже.

Source Port

Порт отправителя, выбранный исходной точкой туннеля. Следует использовать один номер порта для всех пакетов одного инкапсулированного потока для предотвращения нарушения порядка доставки пакетов при использовании разных путей. Для равномерного распределения потоков по разным каналам следует задавать порт отправителя с использованием хэш-значения заголовков инкапсулированных пакетов, например, традиционный квинтет (5-tuple5). Поскольку порт служит идентификатором потока, а не реальное соединение UDP, можно использовать весь 16-битовый диапазон для повышения энтропии. В дополнение к установке номера порта, для протокола IPv6 энтропию можно повысить с помощью метки потока. Пример использования меток потока IPv6 в туннелях приведён в [RFC6438].

Если трафик Geneve используется совместно с другими «слушателями» UDP на том же адресе IP, конечным точкам туннеля следует реализовать механизм, обеспечивающий возврат трафика ICMP при возникновении сетевых ошибок, корректному слушателю. Определение такого механизма выходит за рамки спецификации.

Dest Port

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

UDP Length

Размер пакета UDP с учётом заголовка UDP.

UDP Checksum

Для защиты заголовка Geneve, опций и данных от возможных повреждений следует рассчитывать контрольную сумму UDP в соответствии с [RFC0768] и [RFC1122] при инкапсуляции Geneve в IPv4. Для защиты заголовков IP и Geneve, опций и данных от возможного повреждения по умолчанию должна рассчитываться контрольная сумма UDP в соответствии с [RFC0768] и [RFC8200] при инкапсуляции Geneve в IPv6, за исключением некоторых ситуаций, описанных ниже. При получении пакетов с ненулевой контрольной суммой конечная точка туннеля должна проверить контрольную сумму. Если контрольная сумма не корректна, пакет должен отбрасываться, в остальных случаях пакет должен восприниматься для декапсуляции.

В некоторых случаях для контрольной суммы UDP может быть установлено значение 0 при передаче по протоколам IPv4 и IPv6 [RFC8200]. Дополнительные требования для использований контрольной суммы 0 приведены в параграфе 4.3. Вопрос отключения контрольных сумм UDP следует решать с учётом рабочего окружения и возможных рисков в результате повреждения пакетов.

3.4. Поля туннельного заголовка

Ver (2 бита)

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

Opt Len (6 битов)

Размер поля опций в 4-байтовых словах без учёта 8 байтов фиксированного заголовка туннеля. В результате минимальный размер заголовка Geneve составляет 8 байтов, а максимальный — 260. Начало данных можно определить по смещению от конца заголовка Geneve.

Транзитные устройства должны обеспечивать соответствующую пересылку (включая выбор канала ECMP), независимо от поля Opt Len.

O (1 бит)

Флаг пакета управления (содержит управляющее сообщение). Управляющие сообщения передаются между конечными точками туннеля. Конечным точкам недопустимо пересылать данные (payload), а транзитным устройствам недопустимо интерпретировать их. Поскольку управляющие сообщения достаточно редки, конечным точкам туннеля рекомендуется направлять их в управляющую очередь с высоким приоритетом (например, для отправки пакета в процессор общего назначения из пересылающего контроллера ASIC6 или в отдельный адаптер NIC для системы управления). Транзитным устройства недопустимо менять поведение пересылки на основе этого бита (например, для выбора канала ECMP.

C (1 бит)

Флаг наличия важной опции (установлен бит важности, см. параграф 3.5). При установленном флаге конечная точка туннеля должна проанализировать список опций для интерпретации важных опций. В конечных точках без поддержки анализа опций пакеты должны отбрасываться на основе состояния бита C в базовом заголовке. Если бит не установлен, конечная точка туннеля может вырезать все опции, используя значение Opt Len и переслать декапсулированный пакет. Транзитным устройствам недопустимо отбрасывать пакет на основе этого бита.

Rsvd. (6 битов)

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

Protocol Type (16 битов)

Тип модуля данных протокола, размещённого после заголовка Geneve, в соответствии со значениями Ethertype [ETYPES]. Для кадров Ethernet указывается тип 0x6558.

Virtual Network Identifier (VNI) (24 бита)

Идентификатор для уникального элемента виртуальной сети. Во многих случаях он может представлять сегмент L2, однако семантику пересылки декапсулированных пакетов определяет плоскость управления. Значение VNI может использовать при выборе решения о пересылке ECMP или может служить механизмом разделения перекрывающихся пространств адресов в инкапсулированных пакетах при распределении нагрузки между CPU.

Reserved (8 битов)

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

3.5. Опции туннеля

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Option Class         |      Type     |R|R|R| Length  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                     Variable-Length Option Data               ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 4. Опция Geneve.


За базовым заголовком Geneve могут следовать опции в формате TLV, каждая и которых содержит 4-байтовый заголовок и переменное число данных, интерпретация которых определяется типом.

Option Class (16 битов)

Пространство имён для поля Type. Агентство IANA создало реестр Geneve Option Class для выделения идентификаторов организациям, технологиям и производителям, которые заинтересованы в создании типов опций. Каждая организация может независимо выделять типы, что позволяет проводить эксперименты и ускоренное внедрение. Предполагается, что со временем некоторые опции станут более распространёнными. Реализация может использовать типы опций из разных источников. Кроме того, агентство IANA зарезервировало определённые диапазоны для распределения по процедурам IETF Review и Experimental Use (см. раздел 7).

Type (8 битов)

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

Старший бит типа указывает важность (критичность) опции. Если приёмная сторона туннеля не распознает опцию с установленным старшим битом, пакет должен отбрасываться. Если в опции установлен этот бит, флаг C в базовом заголовке Geneve также должен быть установлен. Транзитным устройствам недопустимо отбрасывать пакеты на основе этого бита. На рисунке 5 показано расположение бита C в поле Type.

0 1 2 3 4 5 6 7 8
+-+-+-+-+-+-+-+-+
|C|    Type     |
+-+-+-+-+-+-+-+-+

Рисунок 5. Бит C в поле Type.

Требование отбрасывать пакет с неизвестной опцией и установленным битом применяется ко всей системе конечных точек, а не к отдельным компонентам реализации. Например, в системе, образованной пересылающим контроллером ASIC и CPU общего назначения, это означает отбрасывание пакета в ASIC. Реализация может передать пакет в CPU, используя канал управления с ограниченной скоростью для обработки исключительных ситуаций в slow-path.

R (3 бита)

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

Length (5 битов)

Размер опции в 4-байтовых словах с учётом заголовка (от 4 до 128 байтов). Поле Length = 0 говорит об отсутствии у опции данных. Пакеты, в которых общий размер опций не соответствует значению поля Opt Len в базовом заголовке, должны отбрасываться без уведомления, конечной точкой туннеля, обрабатывающей опции.

Variable-Length Option Data

Данные опции, интерпретируемые в соответствии с полем Type.

3.5.1. Обработка опций

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

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

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

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

  • Если конечная точка туннеля получает пакет Geneve со значением поля Opt Len (общий размер опций), превышающим её возможности обработки опций, она должна отбросить пакет. Реализация может считать такие события исключительной ситуацией для плоскости управления. Плоскость управления отвечает за обеспечение возможности обработки обеими конечными точками одного туннеля всех опций (полного размера). Определение плоскости управления выходит за рамки этого документа.

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

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

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

Опции могут обрабатываться оборудованием NIC с использованием выгрузки (offload, например, LSO и LRO), как описано в параграфе 4.6. Следует внимательно рассмотреть возможное влияние выгрузки на создаваемую опцию (см. параграф 4.6. Выгрузка в NIC).

4. Вопросы реализации и развёртывания.

4.1. Заявление о применимости

Geneve — это основанный на UDP протокол инкапсуляции наложенной виртуализации сетей, предназначенный для организации туннелей между NVE через имеющиеся сети IP. Протокол рассчитан на работу в общественных и частных ЦОД для развёртывания сетей множества арендаторов через имеющуюся базовую сеть IP.

Основанный на UDP протокол Geneve наследует рекомендации по применению UDP, содержащиеся в [RFC8085]. Применимость этих рекомендаций зависит от базовой сети IP и природы данных, передаваемых с использованием протокола Geneve (например, TCP/IP, IP/Ethernet).

Протокол Geneve предназначен для работы в среде ЦОД, управляемых одним или несколькими сотрудничающими сетевыми операторами, которая соответствует определению контролируемой среды [RFC8085]. Для работы сети в контролируемой среде могут поддерживаться определённые условия, что невозможно в глобальной среде Internet. Поэтому требования к туннельному протоколу, работающему в контролируемой среде, могут быть менее ограничительными по сравнению с требованиями для работы в Internet.

Для целей этого документа контролируемая среда с управляемым трафиком (traffic-managed controlled environment или TMCE) определяется как сеть IP, где применяется организация трафика (traffic engineered) или иные средства (например, ограничители трафика) предотвращения перегрузок. Концепция TMCE описана в [RFC8086]. Значительная часть текста параграфов 4.1 — 4.3 основана на [RFC8086], применимом к Geneve.

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

4.2. Контроль перегрузок

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

4.3. Контрольная сумма UDP

Следует использовать контрольные суммы внешнего заголовка UDP при работе Geneve в сетях IPv4. Это обеспечивает целостность заголовков, опций и данных Geneve в случаях повреждения пакетов (например, предотвратит ошибочную доставку данных в системы других арендаторов). Контрольные суммы UDP предоставляют статистические гарантии сохранности данных в пути передачи. Такой контроль целостности не является строгим с точки зрения кодирования и криптографии и не предназначен для обнаружения ошибок на физическом уровне или преднамеренного изменения дейтаграмм (см. параграф 3.4 в [RFC8085]). В средах, где возникают такие риски, оператору следует применять дополнительные механизмы защиты целостности, такие как IPsec (6.2. Целостность данных).

Оператор может отказаться от контрольных сумм UDP и использовать нулевое значение контрольной суммы (zero UDP checksum), если целостность пакетов Geneve обеспечивается другими механизмами, такими как IPsec или дополнительные контрольные, а также при выполнении одного из условий (a, b, c) параграфа 4.3.1.

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

4.3.1. Обработка нулевой контрольной суммы UDP в IPv6

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

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

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

  3. Данные Geneve передают пакеты приложений, устойчивых к нарушению порядка и повреждению пакетов (возможно за счёт проверки контрольных сумм на вышележащем уровне или повторной передачи при ошибках).

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

  1. Использование нулевой контрольной суммы UDP для IPv6 должно быть задано по умолчанию для всех туннелей Geneve.

  2. Если Geneve работает с нулевой контрольной суммой UDP для IPv6, реализация конечной точки туннеля должна выполнять все требования раздела 4 в [RFC6936] и требование 1 раздела 5 в [RFC6936], поскольку они относятся к Geneve.

  3. Декапсулирующей конечной точке туннеля Geneve следует проверять действительность адресов IPv6 отправителя и получателя для туннеля Geneve, настроенного на приём пакетов с нулевой контрольной суммой UDP и отвергать пакеты при несовпадении адреса.

  4. Инкапсулирующая конечная точка туннеля Geneve может использовать свой адрес отправителя IPv6 для каждого туннеля Geneve с нулевой контрольной суммой UDP для усиления проверки декапсулятором адреса отправителя (т. е. один адрес отправителя IPv6 не применяется для разных получателей IPv6 независимо от того, является адрес получателя индивидуальным или групповым). Если это невозможно, рекомендуется использовать каждый адрес отправителя для небольшого числа туннелей Geneve с нулевой контрольной суммой UDP.

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

  1. Следует принять меры по предотвращению выхода трафика Geneve, передаваемого по протоколу IPv6 с нулевой контрольной суммой UDP, в сеть Internet. Примеры таких механизмов включают пакетные фильтры на шлюзах и граничных устройствах сети Geneve, а также логическое или физическое разделение сети Geneve и сети, где передаётся трафик Internet.

Приведённые выше требования не меняют требований, заданных в [RFC8200] и [RFC6936].

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

4.4. Инкапсуляция Geneve в IP

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

4.4.1. Фрагментация IP

Рекомендуется применять Path MTU Discovery ([RFC1191] и [RFC8201]) для предотвращения или минимизации фрагментирования пакетов. Использование Path MTU Discovery для транзитной сети предоставляет конечным точкам туннеля сведения о состоянии каналов, которые позволяют предотвратить или снизить фрагментацию пакетов в зависимости от роли конечной точки в виртуализованной сети. NVE может поддерживает это состояние (размер MTU для каналов туннеля, связанных с конечной точкой), поэтому при отправке арендатором пакетов, размер которых после инкапсуляции превышает MTU на канале туннеля, конечная точка может отбрасывать такие пакеты и передавать системам арендатора соответствующие сообщения. Если конечная точка туннеля связана с функциями маршрутизации или пересылки или может передавать сообщения ICMP, инкапсулирующая сторона туннеля может передавать сообщения ICMP о необходимости фрагментации [RFC0792] или Packet Too Big [RFC4443] системам арендатора. При определении размера MTU для туннельного канала должен приниматься в расчёт максимальный размер опций, поскольку он может различаться в пакетах. Рекомендации по обработке фрагментации в похожих службах наложенной инкапсуляции, таких как PWE37, приведены в параграфе 5.3 [RFC3985].

Некоторые реализации могут не поддерживать фрагментацию или иные менее распространённые свойства заголовков IP, такие как опции и заголовки расширения. Некоторые вопросы, связанные с размером MTU и фрагментацией в туннелях IP, а также с сообщениями ICMP, рассмотрены в параграфе 4.2 [INTAREA-TUNNELS].

4.4.2. DSCP, ECN, TTL

При инкапсуляции пакетов IP (в том числе через Ethernet) в Geneve возникают вопросы передачи кодов дифференцированного обслуживания (Differentiated Services Code Point или DSCP) и битов явной индикации перегрузки (Explicit Congestion Notification или ECN) из внутреннего заголовка в туннель при передаче и в обратном направлении при получении.

В [RFC2983] даны рекомендации по отображению DSCP между внутренним и внешним заголовком IP. Виртуализация сетей обычно более тесно связана с описанной моделью Pipe, где значение DSCP в туннельном заголовке устанавливается на основе правил (это может быть фиксированное значение, код, основанный на внутреннем классе трафика, или иной механизм группировки трафика). Аспекты модели Uniform (внутренние и внешние значения DSCP трактуются как одно одно поле с копированием на входе и выходе) также могут применяться, например путём перемаркировки во внутреннем заголовке на выходе туннеля в соответствии с транзитной маркировкой. Однако однородная модель концептуально не согласуется с виртуализацией сети, которая стремится обеспечить строгую изоляцию инкапсулированного трафика от физической сети.

В [RFC6040] описан механизм раскрытия возможностей ECN для туннелей IP и распространения маркеров перегрузки во внутренние пакеты. Это поведение должно обеспечиваться для пакетов IP, инкапсулированных в Geneve.

Хотя любая из моделей Uniform и Pipe подходит для обслуживания TTL (Hop Limit в IPv6) при туннелировании пакетов IP, модель Pipe лучше подходит для виртуализации сети. В [RFC2003] приведены рекомендации по обмену TTL между внутренним и внешним заголовком IP, эта модель похожа на Pipe и рекомендуется для использования с Geneve для приложений виртуализации сетей.

4.4.3. Групповая и широковещательная адресация

Туннели Geneve могут быть организованы между индивидуальными адресами конечных точек (point-to-point unicast) или использовать групповую или широковещательную адресацию. Например, в физической сети без поддержки групповых адресов инкапсуляция группового трафика может выполняться копированием в несколько unicast-туннелей или пересылкой индивидуальным получателям в соответствии с правилами (с возможной репликацией).

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

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

Кроме того, в [RFC8293] представлены примеры механизмов, которые можно применять для обработки группового трафика в наложенных сетях при виртуализации.

4.4.4. Односторонние туннели

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

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

4.5. Ограничения для свойств протокола

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

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

4.5.1. Ограничения для опций

Хотя опции Geneve достаточно гибки, плоскость управления может ограничивать число TLV в опциях, а также порядок и размер TLV, передаваемых между конечными точками туннеля, для упрощения обработки плоскости данных на программном или аппаратном уровне [NVO3-ENCAP]. Например, для некоторой важной информации, такой как защитный хэш, может потребоваться определённый порядок обработки для обеспечения наименьшей задержки или могут возникать требования к порядку обработки опций, обусловленные семантикой прикладного протокола.

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

4.6. Выгрузка в NIC

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

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

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

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

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

4.7. Обработка внутренних тегов VLAN

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

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

5. Вопросы перехода

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

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

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

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

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

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

При прохождении через недоверенную сеть, такую как Internet, следует применять технологии VPN (например, IPsec [RFC4301]) для контроля подлинности и шифрования пакетов IP, сформированных как часть инкапсуляции (параграф 6.1.1).

В остальном Geneve не влияет на безопасность инкапсулированных пакетов. В соответствии с рекомендациями BCP 72 [RFC3552], в последующих параграфах описаны возможные риски, которые могут возникать в системах Geneve, и подходы к снижению таких рисков. Следует также отметить, что не все риски применимы к каждому варианту развёртывания Geneve и в некоторых случаях отдельные риски могут отсутствовать. Оператор должен оценить своё сетевое окружение, определить возможные риски и использовать подходящие методы их снижения.

6.1. Конфиденциальность данных

Протокол Geneve служит для инкапсуляции в среде виртуализации сетей и обеспечивает создание и поддержку туннелей между NVE через имеющиеся сети IP. Его можно использовать для развёртывания наложенной сети с множеством арендаторов на основе имеющейся базовой сети IP в общественном или частном ЦОД. Наложенные услуги обычно предоставляются сервис-провайдером, таким как поставщик облачных услуг или оператор частного ЦОД. Это может быть поставщик услуг базовой сети или другой провайдер. По причине наличия в такой среде множества арендаторов система арендатора может ожидать защиты конфиденциальности данных в пакетах, невозможности их подделки в пути (активная атака) и предотвращения несанкционированного отслеживания (пассивная атака) со стороны других арендаторов и базовой сети. Взломанный узел сети или промежуточное устройство в ЦОД может пассивно отслеживать пакеты Geneve между NVE или направлять трафик на дополнительный анализ. Арендатор может ожидать от провайдера наложенной сети защиту конфиденциальности данных как часть услуг или реализовать свои механизмы, такие как IPsec или TLS, для сквозной защиты данных между своими системами. Ожидается, что поставщик услуг наложенной сети обеспечит криптографическую защиту в случаях, когда услуги базовой сети предоставляет другой оператор, чтобы данные пакетов не были доступны в базовой сети.

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

6.1.1. Трафик между ЦОД

Система арендатора в его помещении (частный ЦОД) может соединяться с системами этого же арендатора в наложенной сети общественного облачного ЦОД или у арендатора могут быть системы в географически разнесённых ЦОД для повышения их доступности. Трафик данных Geneve между системами арендатора, передаваемый через разные сети, следует защищать от угроз при прохождении через сети общего пользования. Для всех наложенных данных Geneve, выходящих за пределы домена безопасности оператора, следует применять механизмы шифрования, такие как IPsec или иные технологии VPN, для защиты коммуникаций между NVE, которые могут проходить через недоверенные сетевые каналы. Спецификация механизмов защиты при обмене данными между разными ЦОД выходит за рамки этого документа.

Принципы, описанные в разделе 4 для контролируемых сред, применимы и при передаче данных между ЦОД.

6.2. Целостность данных

Инкапсуляция Geneve применяется между NVE для организации наложенных туннелей через имеющиеся базовые сети IP. В ЦОД с множеством арендаторов мошенническая или взломанная система может попытаться организовать пассивную (например, отслеживание трафика других арендаторов) или активную (например, вставка несанкционированного инкапсулированного трафика Geneve — обманные пакеты, повторное использование перехваченных пакетов и т. п.) атаку. Чтобы таких атак не возникало, NVE недопустимо распространять пакеты Geneve за пределы NVE в системы арендатора и следует применять механизмы фильтрации пакетов для предотвращения пересылки несанкционированного трафика между системами арендатора в разных сетях. NVE недопустимо интерпретировать пакеты Geneve от систем оператора за исключением кадров для инкапсуляции.

Взломанный узел или промежуточное устройство в ЦОД может организовать активную атаку с попыткой вмешательства в обмен пакетами Geneve между NVE. Злонамеренное изменение полей заголовка Geneve может вызвать пересылку пакета в сеть другого арендатора. Если оператор знает о возможности таких атак в его сети, он может реализовать механизмы защиты целостности данных между NVE. Для предотвращения рисков следует применять механизм защиты целостности пакетов Geneve, включая их заголовки, опции и содержимое на пути между парой NVE. Криптографические механизмы защиты, такие как IPsec, позволяют обеспечить целостность данных. Оператор ЦОД может развернуть другие механизмы подходящие защиты, поддерживаемые в базовой сети, хотя механизмы без криптографии могут не защитить связанную с Geneve часть пакета от подделки.

6.3. Проверка подлинности партнёров NVE

Мошенническое сетевое устройство или взломанное устройство NVE в среде ЦОД может подделывать пакеты Geneve, представляясь легитимным NVE. Для снижения таких рисков оператору следует применять механизмы проверки подлинности, такие как IPsec, гарантирующие восприятие пакетов Geneve лишь от предусмотренных партнёров NVE, в среде, где оператор считает подмены или мошеннические устройства потенциальными угрозами. В определённых обстоятельствам могут применяться более простые средства проверки подлинности отправителя пакетов Geneve, например, фильтрация на входе по VLAN, MAC, IP, проверка обратного пути и т. п.

6.4. Интерпретация опций транзитными устройствами

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

6.5. Групповой и широковещательный трафик

В типичных средах ЦОД, где групповая адресация IP не поддерживается базовой сетью, поддержку группового трафика можно организовать за счёт организации множества индивидуальных (unicast) туннелей. В этом случае применяются механизмы защиты, описанные выше для туннелей Geneve между партнёрами NVE. Если групповая адресация IP поддерживается базовой сетью и оператор решил применять её для группового трафика между конечными точками туннелей, он может воспользоваться механизмами защиты данных, такими как IPsec с групповыми расширениями [RFC5374], для защиты трафика в группах Geneve NVE.

6.6. Взаимодействия плоскости управления

Центр виртуализации (Network Virtualization Authority или NVA), описанный в [RFC8014], может служить в качестве плоскости управления для настройки и поддержки Geneve NVE. Предполагается, что оператор ЦОД использует механизмы защиты для коммуникаций между NVA и NVE, а также механизмы проверки подлинности для обнаружения обманных или взломанных NVE в своём административном домене. Рассмотрение таких механизмов выходит за рамки документа.

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

Агентство IANA выделило порт UDP 6081 в Service Name and Transport Protocol Port Number Registry [IANA-SN] как общеизвестный порт получателя для Geneve:

Имя службы: geneve

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

Правообладатель: IESG <iesg@ietf.org>

Контакт: IETF Chair <chair@ietf.org>

Описание: Generic Network Virtualization Encapsulation (Geneve)

Документ: [RFC8926]

Номер порта: 6081

Кроме того агентство IANA создало субреестр Geneve Option Class для классов опций, размещённый под заголовком Network Virtualization Overlay (NVO3) в реестрах IANA для протоколов [IANA-PR]. Реестр Geneve Option Class содержит 16-битовые шестнадцатеричные значения со строками описания, правообладателями, контактными данными и ссылками на документы. Процедуры регистрации в соответствии с [RFC8126] показаны в таблице 1.

Таблица 1. Диапазоны классов опций Geneve.

Диапазон

Процедура регистрации

0x0000-0x00FF

IETF Review

0x0100-0xFEFF

First Come First Served

0xFF00-0xFFFF

Experimental Use

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

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

[RFC0768] Postel, J., «User Datagram Protocol», STD 6, RFC 768, DOI 10.17487/RFC0768, August 1980, <https://www.rfc-editor.org/info/rfc768>.

[RFC0792] Postel, J., «Internet Control Message Protocol», STD 5, RFC 792, DOI 10.17487/RFC0792, September 1981, <https://www.rfc-editor.org/info/rfc792>.

[RFC1122] Braden, R., Ed., «Requirements for Internet Hosts — Communication Layers», STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, <https://www.rfc-editor.org/info/rfc1122>.

[RFC1191] Mogul, J. and S. Deering, «Path MTU discovery», RFC 1191, DOI 10.17487/RFC1191, November 1990, <https://www.rfc-editor.org/info/rfc1191>.

[RFC2003] Perkins, C., «IP Encapsulation within IP», RFC 2003, DOI 10.17487/RFC2003, October 1996, <https://www.rfc-editor.org/info/rfc2003>.

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

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

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

[RFC6936] Fairhurst, G. and M. Westerlund, «Applicability Statement for the Use of IPv6 UDP Datagrams with Zero Checksums», RFC 6936, DOI 10.17487/RFC6936, April 2013, <https://www.rfc-editor.org/info/rfc6936>.

[RFC7365] Lasserre, M., Balus, F., Morin, T., Bitar, N., and Y. Rekhter, «Framework for Data Center (DC) Network Virtualization», RFC 7365, DOI 10.17487/RFC7365, October 2014, <https://www.rfc-editor.org/info/rfc7365>.

[RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, «UDP Usage Guidelines», BCP 145, RFC 8085, DOI 10.17487/RFC8085, March 2017, <https://www.rfc-editor.org/info/rfc8085>.

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

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

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

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

[ETYPES] IANA, «IEEE 802 Numbers», <https://www.iana.org/assignments/ieee-802-numbers>.

[IANA-PR] IANA, «Protocol Registries», <https://www.iana.org/protocols>.

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

[IEEE.802.1Q_2018] IEEE, «IEEE Standard for Local and Metropolitan Area Networks—Bridges and Bridged Networks», DOI 10.1109/IEEESTD.2018.8403927, IEEE 802.1Q-2018, July 2018, <http://ieeexplore.ieee.org/servlet/opac?punumber=8403925>.

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

[NVO3-DATAPLANE] Bitar, N., Lasserre, M., Balus, F., Morin, T., Jin, L., and B. Khasnabish, «NVO3 Data Plane Requirements», Work in Progress, Internet-Draft, draft-ietf-nvo3-dataplane-requirements-03, 15 April 2014, <https://tools.ietf.org/html/draft-ietf-nvo3-dataplane-requirements-03>.

[NVO3-ENCAP] Boutros, S., «NVO3 Encapsulation Considerations», Work in Progress, Internet-Draft, draft-ietf-nvo3-encap-05, 17 February 2020, <https://tools.ietf.org/html/draft-ietf-nvo3-encap-05>.

[RFC2983] Black, D., «Differentiated Services and Tunnels», RFC 2983, DOI 10.17487/RFC2983, October 2000, <https://www.rfc-editor.org/info/rfc2983>.

[RFC3031] Rosen, E., Viswanathan, A., and R. Callon, «Multiprotocol Label Switching Architecture», RFC 3031, DOI 10.17487/RFC3031, January 2001, <https://www.rfc-editor.org/info/rfc3031>.

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

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

[RFC4301] Kent, S. and K. Seo, «Security Architecture for the Internet Protocol», RFC 4301, DOI 10.17487/RFC4301, December 2005, <https://www.rfc-editor.org/info/rfc4301>.

[RFC5374] Weis, B., Gross, G., and D. Ignjatic, «Multicast Extensions to the Security Architecture for the Internet Protocol», RFC 5374, DOI 10.17487/RFC5374, November 2008, <https://www.rfc-editor.org/info/rfc5374>.

[RFC6438] Carpenter, B. and S. Amante, «Using the IPv6 Flow Label for Equal Cost Multipath Routing and Link Aggregation in Tunnels», RFC 6438, DOI 10.17487/RFC6438, November 2011, <https://www.rfc-editor.org/info/rfc6438>.

[RFC7348] Mahalingam, M., Dutt, D., Duda, K., Agarwal, P., Kreeger, L., Sridhar, T., Bursell, M., and C. Wright, «Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks», RFC 7348, DOI 10.17487/RFC7348, August 2014, <https://www.rfc-editor.org/info/rfc7348>.

[RFC7637] Garg, P., Ed. and Y. Wang, Ed., «NVGRE: Network Virtualization Using Generic Routing Encapsulation», RFC 7637, DOI 10.17487/RFC7637, September 2015, <https://www.rfc-editor.org/info/rfc7637>.

[RFC8014] Black, D., Hudson, J., Kreeger, L., Lasserre, M., and T. Narten, «An Architecture for Data-Center Network Virtualization over Layer 3 (NVO3)», RFC 8014, DOI 10.17487/RFC8014, December 2016, <https://www.rfc-editor.org/info/rfc8014>.

[RFC8086] Yong, L., Ed., Crabbe, E., Xu, X., and T. Herbert, «GRE-in-UDP Encapsulation», RFC 8086, DOI 10.17487/RFC8086, March 2017, <https://www.rfc-editor.org/info/rfc8086>.

[RFC8293] Ghanwani, A., Dunbar, L., McBride, M., Bannai, V., and R. Krishnan, «A Framework for Multicast in Network Virtualization over Layer 3», RFC 8293, DOI 10.17487/RFC8293, January 2018, <https://www.rfc-editor.org/info/rfc8293>.

[VL2] «VL2: A Scalable and Flexible Data Center Network», ACM SIGCOMM Computer Communication Review, DOI 10.1145/1594977.1592576, August 2009, <https://dl.acm.org/doi/10.1145/1594977.1592576>.

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

Авторы признательны Puneet Agarwal, David Black, Sami Boutros, Scott Bradner, Martín Casado, Alissa Cooper, Roman Danyliw, Bruce Davie, Anoop Ghanwani, Benjamin Kaduk, Suresh Krishnan, Mirja Kühlewind, Barry Leiba, Daniel Migault, Greg Mirksy, Tal Mizrahi, Kathleen Moriarty, Magnus Nyström, Adam Roach, Sabrina Tanamal, Dave Thaler, Éric Vyncke, Magnus Westerlund и многим другим членам рабочей группы NVO3 за их рецензии, комментарии и предложения.

Авторы бакже благодарят Sam Aldrin, Alia Atlas, Matthew Bocci, Benson Schliesser и Martin Vigoureux за руководство процессом.

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

Ниже перечислены люди, которые были авторами ранней версии документа и внесли в него существенный вклад.

Pankaj Garg

Microsoft Corporation

1 Microsoft Way

Redmond, WA 98052

United States of America

Email: pankajg@microsoft.com

Chris Wright

Red Hat Inc.

1801 Varsity Drive

Raleigh, NC 27606

United States of America

Email: chrisw@redhat.com

Kenneth Duda

Arista Networks

5453 Great America Parkway

Santa Clara, CA 95054

United States of America

Email: kduda@arista.com

Dinesh G. Dutt

Independent

Email: didutt@gmail.com

Jon Hudson

Independent

Email: jon.hudson@gmail.com

Ariel Hendel

Facebook, Inc.

1 Hacker Way

Menlo Park, CA 94025

United States of America

Email: ahendel@fb.com

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

Jesse Gross (редактор)

Email: jesse@kernel.org

Ilango Ganga (редактор)

Intel Corporation

2200 Mission College Blvd.

Santa Clara, CA 95054

United States of America

Email: ilango.s.ganga@intel.com

T. Sridhar (редактор)

VMware, Inc.

3401 Hillview Ave.

Palo Alto, CA 94304

United States of America

Email: tsridhar@utexas.edu

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

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

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Virtual eXtensible Local Area Network — виртуальная расширяемая ЛВС.

4Network Virtualization Using Generic Routing Encapsulation — виртуализация сетей с использованием GRE.

5Адреса и номера портов отправителя и получателя, а также номер протокола. Прим. перев.

6Application-Specific Integrated Circuit — специализированная для приложения интегральная схема.

7Pseudowire Emulation Edge-to-Edge — сквозная эмуляция псевдо-провода.

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

RFC 8939 Deterministic Networking (DetNet) Data Plane: IP

Internet Engineering Task Force (IETF)                     B. Varga, Ed.
Request for Comments: 8939                                     J. Farkas
Category: Standards Track                                       Ericsson
ISSN: 2070-1721                                                L. Berger
                                                                D. Fedyk
                                                 LabN Consulting, L.L.C.
                                                               S. Bryant
                                                  Futurewei Technologies
                                                           November 2020

Deterministic Networking (DetNet) Data Plane: IP

Плоскость данных DetNet IP

PDF

Аннотация

Этот документ определяет работу плоскости данных детерминированной сети (DetNet1) для хостов и маршрутизаторов IP, обеспечивающих услуги DetNet для инкапсулированных в IP данных. Специфической для DetNet инкапсуляции не задается для поддержки потоков IP и вместо этого применяется информация из заголовков IP и вышележащего протокола для поддержки идентификации потоков и предоставления услуг DetNet. Документ основан на архитектуре DetNet (RFC 8655) и модели плоскости данных (RFC 8938).

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

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

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

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

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

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

Детерминированные сети DetNet обеспечивают возможность передачи индивидуальных или групповых потоков данных для приложений в реальном масштабе времени (real-time) с чрезвычайно низким уровнем потерь и гарантированным предельным (максимум) значением сквозной задержки. Общее описание основ и концепций DetNet дано в [RFC8655].

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

Архитектура DetNet моделирует связанные с DetNet функции плоскости данных как разделенные на два уровня — сервиса и пересылки. Подуровень сервиса служит для защиты сервиса DetNet (например, с помощью функций PRF4 и PEF5) и переупорядочения. Подуровень пересылки обеспечивает защиту от перегрузок (малые потери, гарантия низкой задержки и ограниченного нарушения порядка). Подуровень сервиса обычно требует для работы использования дополнительных полей заголовка (см. например, [DetNet-MPLS]). Поскольку связанных с DetNet полей не добавляется для поддержки потоков DetNet IP, поддерживаются лишь функции подуровня пересылки с использованием DetNet IP в соответствии с данным документом. Защита сервиса может обеспечиваться на уровне подсети с применением таких технологий, как MPLS [DetNet-MPLS] и Ethernet (в соответствии с IEEE 802.1 TSN) [IEEE802.1TSNTG].

Этот документ содержит обзор плоскости данных DetNet IP в разделе 3 и рассматривает вопросы предоставления услуг DetNet на основе плоскости данных DetNet IP в разделе 4. Раздел 5 описывает процедуры для хостов и маршрутизаторов, поддерживающих услуги DetNet на базе IP, а раздел 6 обобщает сведения, требуемые для идентификации отдельных потоков DetNet.

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

2.1. Используемые в документе термины

В этом документе используется терминология, представленная в архитектуре DetNet [RFC8655], и предполагается, что читатель знаком с этим документом.

2.2. Сокращения

DetNet Deterministic Networking — детерминированная сеть.

DN DetNet

Diffserv Differentiated Services — дифференцированное обслуживание.

DSCP Differentiated Services Code Point — код дифференцированного обслуживания.

L2 Layer 2 — канальный уровень.

L3 Layer 3сетевой уровень.

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

MPLS Multiprotocol Label Switching — многопротокольная коммутация по меткам.

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

PCEP Path Computation Element Communication Protocol — коммуникационный протокол элементов расчета пути.

PEF Packet Elimination Function — функция исключения пакетов.

PREOF Packet Replication, Elimination, and Ordering Functions — функции репликации, исключения и упорядочения пакетов.

PRF Packet Replication Function — функция репликации пакетов.

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

TSN Time-Sensitive Networking — чувствительные к времени сети.

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

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

3. Обзор плоскости данных DetNet IP

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

Плоскость данных DetNet IP использует прежде всего идентификацию потока на основе кортежей 6-tuple, включающих данные из заголовков IP и вышележащего протокола. Термин 6-tuple в этом документе соответствует определению [RFC3290] и включает адреса отправителя и получателя, протокол IP, порты отправителя и получателя, а также DSCP. Сведения об использовании заголовков IP и кортежей 5-tuple для идентификации потоков и поддержки QoS приведены в [RFC3670]. В [RFC7657] также представлены полезные сведения по обеспечению Diffserv и идентификации потоков на основе кортежей. Отметим, что 6-tuple представляет собой кортеж 5-tuple с добавлением DSCP.

Для некоторых протоколов кортежи 5-tuple и 6-tuple использовать невозможно, поскольку информация о портах недоступна (например, в ICMP, IPsec, и ESP6). Такое возможно и для агрегата потоков. В этом случае используется меньшее число полей, например 3-tuple (2 адреса и протокол IP) и даже 2-tuple (вест трафик между парой адресов IP). Плоскость данных DetNet IP позволяет также сопоставление с полем IPv6 Flow Label [RFC8200].

Пакеты, не относящиеся к DetNet, и пакеты DetNet IP имеют одинаковый формат заголовка пакета при передаче. В общем случае используемые для идентификации потока поля пересылаются без изменений, однако стандартные изменения поля DSCP [RFC2474] не исключены.

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

Конкретные процедуры, которые требуется реализовать на узле DetNet, поддерживающем этот документ, описаны в разделе 5. Плоскость контроллера DetNet (Controller Plane) [RFC8655] отвечает за обеспечение каждого узла информацией, требуемой для идентификации и обслуживания каждого потока DetNet.

Конечн. сист.                                            Конечн. сист.
DetNet IP      Транслятор                  Транслятор     DetNet IP
+----------+                                             +----------+
|Приложение|<------------- Сквозной сервис ------------->|Приложение|
+----------+  ............                 ............  +----------+
| Сервис   |<-: Сервис   :-- Поток DetNet--: Сервис   :->| Сервис   |
+----------+  +----------+                 +----------+  +----------+
|Пересылка |  |Пересылка |                 |Пересылка |  |Пересылка |
+--------.-+  +-.------.-+                 +-.---.----+  +-------.--+
         :Канал :       \      ,-----.      /     \   ,-----.   /
         +......+        +----[Подсеть]----+       +-[Подсеть]-+
                               `-----'                `-----'
        |<--------------------- DetNet IP --------------------->|

Рисунок 1. Простая сеть IP с поддержкой DetNet.


На рисунке 1 показана сеть IP с поддержкой DetNet. Поддерживающие DetNet конечные системы создают инкапсулированный в IP трафик, который идентифицируется в домене DetNet как поток DetNet на основе данных из заголовка IP. Трансляторам понятны требования к пересылке потока DetNet и они обеспечивают выделение ресурсов, интерфейса и узла для выполнения требований сервиса DetNet. Линии из точек вокруг блока «Сервис» на трансляторе показывают, что транзитные маршрутизаторы понимают сервис DetNet, но не реализуют функций подуровня сервиса DetNet, таких как PREOF. Следует отметить, что подсети могут представлять TSN, сеть MPLS или иную технологию, которая может передавать трафик DetNet IP.

Конечная        Краевой                     Краевой      Конечная
система IP      узел                        узел         система IP
+----------+   +.........+                 +.........+   +----------+
|Приложение|<--:Svc Proxy:-- Сервис E2E ---:Svc Proxy:-->|Приложение|
+----------+   +.........+                 +.........+   +----------+
|    IP    |<--:IP : :Svc:---- Поток IP----:Svc: :IP :-->|    IP    |
+----------+   +---+ +---+                 +---+ +---+   +----------+
|Пересылка |   |Fwd| |Fwd|                 |Fwd| |Fwd|   |Пересылка |
+--------.-+   +-.-+ +-.-+                 +-.-+ +-.-+   +---.------+
         : Канал :      \      ,-----.      /     /   ,-----. \ 
         +.......+       +----[Подсеть]----+      +--[Подсеть]-+
                               `-----'                `-----'
      |<--- IP --->| |<------ DetNet IP ------>| |<--- IP --->|

Рисунок 2. Конечные системы без поддержки DetNet в домене DetNet IP.


На рисунке 2 приведен вариант рисунка 1, где конечные системы не понимают DetNet. В этом случае краевые узлы на границе домена DetNet обеспечивают посреднические услуги DetNet для приложений конечных точек путем создания и завершения сервиса DetNet для потоков IP от приложений. Для идентификации потоков DetNet может служить информация из заголовков или подход, описанный в параграфе 4.4. Агрегирование потоков DetNet.

Отметим, что конечные системы IP DetNet могут взаимодействовать через сеть DetNet IP с конечными системами IP.

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

Отметим, что работа конечных систем IEEE 802.1 TSN через сети IP с поддержкой DetNet не описана в этом документе. Описание TSN over MPLS приведено в [DetNet-TSN-over-MPLS].

4. Плоскость данных DetNet IP

В этом разделе рассматриваются вопросы, связанные с предоставлением услуг DetNet потокам, идентифицированным на основании данных из заголовков.

4.1. Конечные точки

Потоки данных, требующие сервиса DetNet, создаются и завершаются в конечных точках. Этот документ имеет дело лишь с конечными системами IP. Протокол, используемый конечной системой IP, зависит от приложения и конечная система взаимодействует с другой конечной системой (партнером). DetNet использует идентификацию потоков IP на основе кортежей 6-tuple, поэтому DetNet нужно знать не только формат заголовка IP, но и значение следующего протокола в пакете IP (5.1.1.3. Поля IPv4 Protocol и IPv6 Next Header).

Для не знающих DetNet конечных систем IP внутри домена DetNet требуются посреднические функции уровня сервиса.

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

Важным дополнительным вопросом для понимающих DetNet конечных систем является предотвращение фрагментации IP. Полная идентификация потоков на основе 6-tuple невозможна для фрагментов IP, поскольку они не включают транспортных заголовков и сведений о портах. Поэтому для приложений и/или конечных систем важно использовать размер пакетов IP, позволяющий избежать фрагментации в сети при передаче потоков DetNet. Максимальный размер пакетов можно узнать с помощью Path MTU Discovery [RFC1191] [RFC8201] или от плоскости контроллера. Отметим, что механизм Path MTU Discovery основан на пакетах ICMP, которые могут идти по иному пути, нежели отдельный поток DetNet.

Для максимального использования имеющихся механизмов понимающим DetNet приложениям и конечным системам не следует смешивать трафик DetNet с прочим трафиком в рамках одного кортежа 5-tuple.

4.2. Домен DetNet

Как правило, от домена DetNet IP требуется поддержка пересылки любого потока DetNet, указанного кортежем IP 6-tuple. Иное поведение будет ограничивать число идентификаторов потоков 6-tuple, которые могут применять конечные системы. С практической точки зрения это означает, что все узлы на сквозном пути потоков DetNet должны согласовать применяемые для идентификации потоков поля. Возможным следствием отсутствия такого согласия будут помехи, создаваемые одними потоками для других, и неожиданная обработка трафика.

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

  1. подключение DN — конечная система напрямую соединяется с краевым узлом или находится за пределами подсети (ES1 и ES2 на рисунке 3);

  2. интеграция с DN — конечная система является частью домена DetNet (ES3 на рисунке 3).

Конечные системы L3 (IP) могут применять любой из этих вариантов подключения. Домен DetNet позволяет взаимодействовать любым конечным системам с одинаковым форматом инкапсуляции независимо от типа подключения и свойств DetNet. Подключенные к DN конечные системы не знают о домене DetNet и его формате инкапсуляции. Примеры подключений даны на рисунке 3.

                                   ____+----+
           +----+        _____    /    | ES3|
           | ES1|____   /     \__/     +----+___
           +----+    \ /                        \
                      +                          |
              ____     \                        _/
+----+     __/    \     +__  DetNet IP domain  /
| ES2|____/  L2/L3 |___/   \         __     __/
+----+    \_______/         \_______/  \___/

Рисунок 3. Типы подключения конечных систем L3.


Внутри домена DetNet маршрутизаторы IP с поддержкой DetNet соединены между собой каналами и подсетями для поддержки сквозной доставки потоков DetNet. С точки зрения архитектуры DetNet эти маршрутизаторы являются ретрансляторами DetNet, поскольку они должны понимать сервис DetNet. Такие маршрутизаторы идентифицируют потоки DetNet на основе кортежей IP 6-tuple и обеспечивают обработку, требуемую сервисом DetNet, на самом узле и в подключенных к нему подсетях.

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

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

     <-------------------- DetNet IP ------------------------>
                                 ______
                       ____     /      \__
            ____      /     \__/          \___   ______
+----+   __/    +====+                       +==+      \     +----+
|src |__/ Sub-N1 )   |                       |  \ Sub-N3\____| dst|
+----+  \_______/    \        Подсеть 2      |   \______/    +----+
                      \_                    _/
                        \         __     __/
                         \_______/  \___/


          +---+        +---------E--------+      +-----+
+----+    |   |        |         |        |      |     |      +----+
|src |----R   E--------R     +---+        E------R     E------+ dst|
+----+    |   |        |     |            |      |     |      +----+
          +---+        +-----R------------+      +-----+

Рисунок 4. Репликация и исключение в подсетях для DetNet IP.


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

Если желательна сквозная защита сервиса, ее можно реализовать, например, с помощью конечных систем DetNet, используя транспортные (L4) или прикладные протоколы, однако это выходит за рамки документа.

Отметим, что отсутствие смешения трафика DetNet с прочим в рамках одного кортежа 5-tuple, как указано выше, позволяет упростить фильтры 5-tuple, применяемые на краях сети DetNet для предотвращения выхода трафика DetNet, не реагирующего на перегрузки, за пределы домена DetNet.

4.3. Подуровень пересылки

4.3.1. Класс обслуживания

Класс обслуживания (CoS) для потоков DetNet передаваемых в пакетах IPv4 и IPv6, обеспечивается стандартным полем DSCP [RFC2474] и связанными с ним механизмами.

Дополнительный вопрос для узлов DetNet, поддерживающих услуги CoS, заключается в том, что они должны обеспечить отсутствие влияния классов обслуживания CoS на механизмы защиты от перегрузки и контроля задержек, применяемые для DetNet QoS. Это похоже на требование к маршрутизаторам MPLS LSR7, где CoS LSP не должны влиять на ресурсы, выделенные для TE LSP [RFC3473].

4.3.2. Качество обслуживания

Качество обслуживания (QoS) для потоков сервиса DetNet, передаваемых по IP, должно обеспечиваться локально знающими о DetNet узлами и маршрутизаторами, поддерживающими потоки DetNet. Поддержка зависит от базовых сетевых уровней, таких как 802.1 TSN. Использование внутренних механизмов управления трафиком на узлах для обеспечения QoS потокам DetNet с инкапсуляцией IP выходит за рамки этого документа. С точки зрения инкапсуляции кортеж 6-tuple (5-tuple и DSCP) и, возможно, метка потока однозначно указывает поток DetNet IP.

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

  • Обработка пакетов, связанных с незавершенным резервированием, как не относящихся к DetNet.

  • Отбрасывание пакетов, связанных с незавершенным резервированием.

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

4.3.3. Выбор пути

Хотя алгоритмы и механизмы выбора пути выходят за рамки определения плоскости данных DetNet, важно подчеркнуть влияние идентификации потоков DetNet IP на выбор пути и следующего интервала. Как отмечено выше, плоскость данных DetNet IP идентифицирует потоки по данным из заголовков (6-tuple), а также (необязательным) меткам потоков. Обычно DetNet позволяет обрабатывать трафик и выбирать следующий интервал на уровне потока.

При пересылке не относящихся к DetNet пакетов IP обычно предполагается такая же последовательность next hop, т. е. для данного кортежа 5-tuple (в некоторых случаях, например, [RFC5120] — 6-tuple) будет использован тот же путь. Использование разных next hop для разных 5-tuples не имеет особого значения для приложений, понимающих DetNet.

Следует соблюдать осторожность при использовании разных next hop для одного кортежа 5-tuple. Как отмечено в [RFC7657], возможно неожиданное поведение когда в потоке приложения с данным 5-tuple происходит нарушение порядка в результате отправки по разным путям. Требуется понимать роль приложения и транспортного протокола при использовании разных next hop для одного кортежа 5-tuple, если это предполагается. Отметим, что это лишь косвенно влияет на выбор путей для потоков DetNet и данный документ.

4.4. Агрегирование потоков DetNet

Как описано в [RFC8938], возможность объединять отдельные потоки и связанное с этим управление ресурсами является важным способом повышения уровня расширяемости за счет уменьшения числа состояний на интервал пересылки. Агрегирование в плоскости данных DetNet IP может происходить на одном узле, когда тот поддерживает состояния для агрегированных и индивидуальных потоков. Это также может выполняться между узлами, когда один поддерживает лишь состояние для агрегата, а другой — для всех или части объединенных потоков. В любом случае функции управления и поддержки агрегирования должны обеспечивать адекватную настройку и выделение ресурсов для комбинации потребностей в обслуживании отдельных потоков. Поскольку DetNet заботится о задержках и их вариациях, требуется учитывать не только пропускную способность.

С точки зрения одного узла агрегирование потоков IP влияет на идентификацию потоков и выделение ресурсов в плоскости данных DetNet IP. Как обсуждалось выше, для идентификации потока IP служат кортежи IP 6-tuple. Потоки DetNet IP могут объединяться с использованием любого из полей 6-tuple, а также метки потока. Использование префиксов, списков и диапазонов значений позволяет узлу DetNet идентифицировать агрегированные потоки DetNet. С точки зрения выделения ресурсов узлы DetNet должны предоставлять обслуживание на уровне агрегированного потока, а не его компонентов.

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

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

4.5. Двухсторонний трафик

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

Механизмы управления и администрирования должны поддерживать двухсторонние потоки, но спецификация таких механизмов выходит за рамки документа. Пример решения для плоскости управления MPLS можно найти в [RFC7551].

5. Процедуры плоскости данных DetNet IP

В этом разделе описаны процедуры плоскости данных DetNet IP, которые разделены на три категории — идентификация потоков, пересылка и обработка трафика. Идентификация потоков включает процедуры, относящиеся к сопоставлению заголовков IP и вышележащего протокола с данными потока DetNet (состояние) и требованиями сервиса. Иногда идентификацию потоков называют классификацией трафика (например, в [RFC5777]). Пересылка включает процедуры, относящиеся к выбору следующего интервала (next-hop) и доставке пакетов. Обработка трафика включает процедуры, связанные с предоставлением потокам DetNet требуемого обслуживания.

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

5.1. Процедуры идентификации потоков DetNet IP

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

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

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

5.1.1. Данные заголовка IP

Реализации этого документа должны поддерживать идентификацию потоков DetNet на основе заголовков IP. Заголовок IPv4 определен в [RFC0791], IPv6 — в [RFC8200].

5.1.1.1. Поле адреса отправителя

Реализации этого документа должны поддерживать идентификацию потоков DetNet на основе поля Source Address8 в пакете IP. Реализациям следует поддерживать для этого поля сопоставление по наибольшей длине префикса (см. [RFC1812] и [RFC7608]). Отметим, что сопоставление с префиксом размера 0 означает игнорирование поля.

5.1.1.2. Поле адреса получателя

Реализации этого документа должны поддерживать идентификацию потоков DetNet на основе поля Destination Address в пакете IP. Реализациям следует поддерживать для этого поля сопоставление по наибольшей длине префикса (см. [RFC1812] и [RFC7608]). Отметим, что сопоставление с префиксом размера 0 означает игнорирование поля.

5.1.1.3. Поля IPv4 Protocol и IPv6 Next Header

Реализации этого документа должны поддерживать идентификацию потоков DetNet на основе поля IPv4 Protocol при обработке пакетов IPv4 и поля IPv6 Next Header при обработке пакетов IPv6. Это включает значение следующего протокола, определенное в параграфе 5.1.2, и другие значения, в том числе 0. Реализациям следует поддерживать возможность игнорировать это поле для конкретного потока DetNet.

5.1.1.4. Поля IPv4 Type of Service и IPv6 Traffic Class

Эти поля служат для поддержки дифференцированного обслуживания [RFC2474] [RFC2475]. Реализации этого документа должны поддерживать идентификацию потоков DetNet на основе поля DSCP в поле IPv4 Type of Service для пакетов IPv4 и поля DSCP в поле IPv6 Traffic Class для пакетов IPv6. Реализации должны поддерживать сопоставление полей DSCP со списком возможных значений при идентификации конкретного потока DetNet. Реализациям следует поддерживать возможность игнорировать это поле для конкретного потока DetNet.

5.1.1.5. Поле IPv6 Flow Label

Реализациям этого документа следует поддерживать идентификацию потоков DetNet на основе поля IPv6 Flow Label. Поддерживающие это реализации должны разрешать возможность игнорировать поле для конкретного потока DetNet. При использовании поля для идентификации конкретного потока DetNet реализация может исключить поле IPv6 Next Header и данные следующего заголовка из процесса идентификации потока DetNet.

5.1.2. Другая информация из заголовков

Реализации этого документа должны поддерживать идентификацию потоков DetNet на основе информации из заголовков, указанной в этом разделе. Определена поддержка для потоков TCP, UDP, ICMP и IPsec, а в будущем список протоколов может быть расширен.

5.1.2.1. TCP и UDP

Идентификация потоков DetNet для TCP [RFC0793] и UDP [RFC0768] выполняется на основе полей Source Port и Destination Port в заголовке каждого пакета. Эти поля используют одинаковые формате и для них применяются общие процедуры идентификации потоков DetNet.

Определенные в этом параграфе правила применимы только к полям IPv4 Protocol и IPv6 Next Header, содержащим определенные IANA значения для UDP и TCP.

5.1.2.1.1. Поле Source Port

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

5.1.2.1.2. Поле Destination Port

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

5.1.2.2. ICMP

Идентификация потоков DetNet для ICMP [RFC0792] обеспечивается на основе номера протокола в заголовке IP. Отметим, что тип ICMP не применяется для идентификации потоков.

5.1.2.3. IPsec AH и ESP

Протоколы IPsec Authentication Header (AH) [RFC4302] и Encapsulating Security Payload (ESP) [RFC4303] используют общий формат для поля Security Parameters Index (SPI) field. Реализации должны поддерживать идентификацию на основе точного совпадения значений. Реализациям следует поддерживать возможность игнорировать это поле для конкретного потока DetNet.

Определенные в этом параграфе правила применимы только к полям IPv4 Protocol и IPv6 Next Header, содержащим определенные IANA значения для AH и ESP.

5.2. Процедуры пересылки

Общие требования к узлам IP заданы в [RFC1122], [RFC1812], [RFC8504] и данный документ их не меняет. DetNet влияет на типичный процесс выбора следующего этапа пересылки (next-hop). В частности, реализациям этого документа нужно использовать данные управления и поддержки для выборе одного или нескольких выходных интерфейсов в качестве следующего этапа пересылки пакетов, связанных с потоком DetNet. Конкретные данные управления и поддержки будут определены в будущих документах, например, [DetNet-YANG].

Использование множества путей или каналов (например, ECMP) для поддержки одного потока DetNet нерекомендуется. ECMP можно использовать с не относящимися к DetNet потоками в домене DetNet.

Сказанное выше применимо к функциям управления и поддержки, которые будут определены для реализации этого требования, например, [DetNet-YANG].

5.3. Процедуры обработки трафика DetNet IP

Реализации этого документа должны обеспечивать для потоков DetNet обработку трафика, предусмотренную конфигурацией или плоскостью контроллера (например, через [DetNet-YANG]). Общие сведения о сервисе DetNet можно найти в [DetNet-Flow-Info]. Типичные механизмы обеспечения разной обработки для разных потоков включают выделение системных ресурсов (таких как очереди и буферы) и предоставление соответствующих параметров (формовка и правила). Поддержка также может быть обеспечена за счет базовой сетевой технологии, такой как MPLS [DetNet-IP-over-MPLS] или IEEE 802.1 TSN [DetNet-IP-over-TSN]. Другие механизмы, кроме применяемых в случае TSN, выходят за рамки этого документа.

6. Поддержка и управление

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

  • Поле IPv4 или IPv6 Source Address.

  • Размер префикса адреса отправителя IPv4 или IPv6, где значение 0 указывает игнорирование поля Source Address.

  • Поле IPv4 или IPv6 Destination Address.

  • Размер префикса адреса получателя IPv4 или IPv6, где значение 0 указывает игнорирование поля Destination Address.

  • Поле IPv4 Protocol. Разрешен ограниченный набор значений, желательна возможность игнорировать поле.

  • Поле IPv6 Next Header. Разрешен ограниченный набор значений, желательна возможность игнорировать поле.

  • Для полей IPv4 Type of Service и IPv6 Traffic Class:

    • используется ли поле DSCP для классификации потока (не обязательно);

    • при использовании DSCP идентификационные данные (для этого потока) включают список применяемых потоком значение DSCP.

  • Поле IPv6 Flow Label (не обязательно). При использовании этого поля оно может служить заменой сопоставления с полем Next Header.

  • Порт отправителя TCP и UDP Source Port. Требуется поддержка точного и шаблонного совпадения, возможно сопоставление с диапазоном.

  • Порт отправителя TCP и UDP Destination Port. Требуется поддержка точного и шаблонного совпадения, возможно сопоставление с диапазоном.

  • Поле IPsec Header SPI. Требуется поддержка точного совпадения и рекомендуется поддерживать шаблоны.

  • Для конечных систем — (необязательный) максимальный размер пакетов IP, который следует применять для данного исходящего потока DetNet IP.

Эта информация должна предоставляться на уровне потока DetNet путем настройки, например, через плоскость контроллера или систему управления.

Реализация должна поддерживать упорядочение набора информации, служащей для идентификации отдельного потока DetNet. Это может применяться, например, для предоставления услуг DetNet конкретному потоку UDP с определенной комбинацией Source Port и Destination Port с одновременным предоставлением других услуг агрегату из всех прочих потоков с таким же значением UDP Destination Port.

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

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

Вопросы безопасности DetNet подробно перечислены в [DetNet-Security], а более общее рассмотрение их приведено в [RFC8655]. В этом разделе рассматриваются вопросы безопасности, специфичные для плоскости данных DetNet IP.

Уникальными для DetNet являются аспекы безопасности, связанные с обеспечением конкретных требований QoS для DetNet, предназначенных в первую очередь для доставки пакетов потока с минимально возможными потерями и ограниченной сквозной задержкой. Достижение малых потерь и ограниченной задержки может стать невозможным перед лицом серьезного противника, такого как указан в модели угроз Internet из BCP 72 [RFC3552], который может произвольно отбрасывать или задерживать любой или весь трафик. Чтобы представить значимые вопросы безопасности, здесь рассматривается не столь сильный противник, который не может контролировать физические каналы домена DetNet, но способен управлять узлом сети в домене DetNet.

Основным вопросом для плоскости данных DetNet является поддержка целостности и предоставление услуг DetNet, проходящих через сеть DetNet. Поскольку в плоскости данных DetNet IP нет специфичных для DetNet полей, целостность и конфиденциальность потоков приложений могут быть защищены любыми средствами, предоставляемыми базовой технологией. Например, может применяться шифрование, такое как обеспечиваемое IPsec [RFC4301] для потоков IP или базовой сеть с использованием MACsec [IEEE802.1AE-2018] при передаче IP в потоках Ethernet (L2).

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

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

Для обеспечения непрерывной доступности сервиса DetNet могут быть приняты меры против атак на службы (DoS) и атак с задержками. Для защиты от DoS-атак избыточный трафик от вредоносных или некорректно работающих устройств можно предотвратить или ослабить, например, с помощью имеющихся механизмов, таких как правила и формовка на входе в домен DetNet или на краю домена IEEE 802.1 TSN. Для предотвращения вредоносной задержки пакетов DetNet за пределами домена DetNet определения технологии DetNet могут смягчать перехват и изменение в пути с участием человека (MITM9-атака), например за счет проверки подлинности и полномочий устройств в домене DetNet.

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

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

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

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

[RFC0768] Postel, J., «User Datagram Protocol», STD 6, RFC 768, DOI 10.17487/RFC0768, August 1980, <https://www.rfc-editor.org/info/rfc768>.

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

[RFC0792] Postel, J., «Internet Control Message Protocol», STD 5, RFC 792, DOI 10.17487/RFC0792, September 1981, <https://www.rfc-editor.org/info/rfc792>.

[RFC0793] Postel, J., «Transmission Control Protocol», STD 7, RFC 793, DOI 10.17487/RFC0793, September 1981, <https://www.rfc-editor.org/info/rfc793>.

[RFC1812] Baker, F., Ed., «Requirements for IP Version 4 Routers», RFC 1812, DOI 10.17487/RFC1812, June 1995, <https://www.rfc-editor.org/info/rfc1812>.

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

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

[RFC4301] Kent, S. and K. Seo, «Security Architecture for the Internet Protocol», RFC 4301, DOI 10.17487/RFC4301, December 2005, <https://www.rfc-editor.org/info/rfc4301>.

[RFC4302] Kent, S., «IP Authentication Header», RFC 4302, DOI 10.17487/RFC4302, December 2005, <https://www.rfc-editor.org/info/rfc4302>.

[RFC4303] Kent, S., «IP Encapsulating Security Payload (ESP)», RFC 4303, DOI 10.17487/RFC4303, December 2005, <https://www.rfc-editor.org/info/rfc4303>.

[RFC7608] Boucadair, M., Petrescu, A., and F. Baker, «IPv6 Prefix Length Recommendation for Forwarding», BCP 198, RFC 7608, DOI 10.17487/RFC7608, July 2015, <https://www.rfc-editor.org/info/rfc7608>.

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

[RFC8655] Finn, N., Thubert, P., Varga, B., and J. Farkas, «Deterministic Networking Architecture», RFC 8655, DOI 10.17487/RFC8655, October 2019, <https://www.rfc-editor.org/info/rfc8655>.

[RFC8938] Varga, B., Ed., Farkas, J., Berger, L., Malis, A., and S. Bryant, «Deterministic Networking (DetNet) Data Plane Framework», RFC 8938, DOI 10.17487/RFC8938, November 2020, <https://www.rfc-editor.org/rfc/rfc8938>.

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

[DetNet-Flow-Info] Varga, B., Farkas, J., Cummings, R., Jiang, Y., and D. Fedyk, «DetNet Flow Information Model», Work in Progress, Internet-Draft, draft-ietf-detnet-flow-information-model-11, 21 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-flow-information-model-11>.

[DetNet-IP-over-MPLS] Varga, B., Ed., Berger, L., Fedyk, D., Bryant, S., and J. Korhonen, «DetNet Data Plane: IP over MPLS», Work in Progress, Internet-Draft, draft-ietf-detnet-ip-over-mpls-09, 11 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-ip-over-mpls-09>.

[DetNet-IP-over-TSN] Varga, B., Ed., Farkas, J., Malis, A., and S. Bryant, «DetNet Data Plane: IP over IEEE 802.1 Time Sensitive Networking (TSN)», Work in Progress, Internet-Draft, draft-ietf-detnet-ip-over-tsn-04, 2 November 2020, <https://tools.ietf.org/html/draft-ietf-detnet-ip-over-tsn-04>.

[DetNet-MPLS] Varga, B., Ed., Farkas, J., Berger, L., Malis, A., Bryant, S., and J. Korhonen, «DetNet Data Plane: MPLS», Work in Progress, Internet-Draft, draft-ietf-detnet-mpls-13, 11 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-mpls-13>.

[DetNet-Security] Grossman, E., Ed., Mizrahi, T., and A. Hacker, «Deterministic Networking (DetNet) Security Considerations», Work in Progress, Internet-Draft, draft-ietf-detnet-security-12, 2 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-security-12>.

[DetNet-TSN-over-MPLS] Varga, B., Ed., Farkas, J., Malis, A., Bryant, S., and D. Fedyk, «DetNet Data Plane: IEEE 802.1 Time Sensitive Networking over MPLS», Work in Progress, Internet-Draft, draft-ietf-detnet-tsn-vpn-over-mpls-04, 2 November 2020, <https://tools.ietf.org/html/draft-ietf-detnet-tsn-vpn-over-mpls-04>.

[DetNet-YANG] Geng, X., Chen, M., Ryoo, Y., Fedyk, D., Rahman, R., and Z. Li, «Deterministic Networking (DetNet) Configuration YANG Model», Work in Progress, Internet-Draft, draft-ietf-detnet-yang-09, 16 November 2020, <https://tools.ietf.org/html/draft-ietf-detnet-yang-09>.

[IEEE802.1AE-2018] IEEE, «IEEE Standard for Local and metropolitan area networks-Media Access Control (MAC) Security», IEEE 802.1AE-2018, DOI 10.1109/IEEESTD.2018.8585421, December 2018, <https://ieeexplore.ieee.org/document/8585421>.

[IEEE802.1TSNTG] IEEE, «Time-Sensitive Networking (TSN) Task Group», <https://1.ieee802.org/tsn/>.

[RFC1122] Braden, R., Ed., «Requirements for Internet Hosts — Communication Layers», STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, <https://www.rfc-editor.org/info/rfc1122>.

[RFC1191] Mogul, J. and S. Deering, «Path MTU discovery», RFC 1191, DOI 10.17487/RFC1191, November 1990, <https://www.rfc-editor.org/info/rfc1191>.

[RFC2475] Blake, S., Black, D., Carlson, M., Davies, E., Wang, Z., and W. Weiss, «An Architecture for Differentiated Services», RFC 2475, DOI 10.17487/RFC2475, December 1998, <https://www.rfc-editor.org/info/rfc2475>.

[RFC3290] Bernet, Y., Blake, S., Grossman, D., and A. Smith, «An Informal Management Model for Diffserv Routers», RFC 3290, DOI 10.17487/RFC3290, May 2002, <https://www.rfc-editor.org/info/rfc3290>.

[RFC3473] Berger, L., Ed., «Generalized Multi-Protocol Label Switching (GMPLS) Signaling Resource ReserVation Protocol-Traffic Engineering (RSVP-TE) Extensions», RFC 3473, DOI 10.17487/RFC3473, January 2003, <https://www.rfc-editor.org/info/rfc3473>.

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

[RFC3670] Moore, B., Durham, D., Strassner, J., Westerinen, A., and W. Weiss, «Information Model for Describing Network Device QoS Datapath Mechanisms», RFC 3670, DOI 10.17487/RFC3670, January 2004, <https://www.rfc-editor.org/info/rfc3670>.

[RFC5120] Przygienda, T., Shen, N., and N. Sheth, «M-ISIS: Multi Topology (MT) Routing in Intermediate System to Intermediate Systems (IS-ISs)», RFC 5120, DOI 10.17487/RFC5120, February 2008, <https://www.rfc-editor.org/info/rfc5120>.

[RFC5777] Korhonen, J., Tschofenig, H., Arumaithurai, M., Jones, M., Ed., and A. Lior, «Traffic Classification and Quality of Service (QoS) Attributes for Diameter», RFC 5777, DOI 10.17487/RFC5777, February 2010, <https://www.rfc-editor.org/info/rfc5777>.

[RFC7551] Zhang, F., Ed., Jing, R., and R. Gandhi, Ed., «RSVP-TE Extensions for Associated Bidirectional Label Switched Paths (LSPs)», RFC 7551, DOI 10.17487/RFC7551, May 2015, <https://www.rfc-editor.org/info/rfc7551>.

[RFC7657] Black, D., Ed. and P. Jones, «Differentiated Services (Diffserv) and Real-Time Communication», RFC 7657, DOI 10.17487/RFC7657, November 2015, <https://www.rfc-editor.org/info/rfc7657>.

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

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

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

Авторы благодарят Pat Thaler, Norman Finn, Loa Andersson, David Black, Rodney Cummings, Ethan Grossman, Tal Mizrahi, David Mozes, Craig Gunther, George Swallow, Yuanlong Jiang и Carlos J. Bernardos за их вклад в работу. David Black был техническим советником рабочей группы DetNet во время создания этого документа и предоставил много полезных замечаний. Комментарии от IESG предоставили Murray Kucherawy, Roman Danyliw, Alvaro Retana, Benjamin Kaduk, Rob Wilton и Érik Vyncke.

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

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

Jouni Korhonen

Email: jouni.nospam@gmail.com

Andrew G. Malis

Malis Consulting

Email: agmalis@gmail.com

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

Balázs Varga (editor)

Ericsson

Budapest

Magyar Tudosok krt. 11.

1117

Hungary

Email: balazs.a.varga@ericsson.com

János Farkas

Ericsson

Budapest

Magyar Tudosok krt. 11.

1117

Hungary

Email: janos.farkas@ericsson.com

Lou Berger

LabN Consulting, L.L.C.

Email: lberger@labn.net

Don Fedyk

LabN Consulting, L.L.C.

Email: dfedyk@labn.net

Stewart Bryant

Futurewei Technologies

Email: sb@stewartbryant.com

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

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

nmalykh@protokols.ru

1Deterministic Networking.

2Internet Engineering Task Force.

3Internet Engineering Steering Group.

4Packet Replication Function — функция репликации пакетов.

5Packet Elimination Function — функция исключения пакетов.

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

7Label Switching Router — маршрутизатор с коммутацией по меткам.

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

9Man-in-the-middle — «человек в середине».

Рубрика: RFC | Комментарии к записи RFC 8939 Deterministic Networking (DetNet) Data Plane: IP отключены

RFC 8938 Deterministic Networking (DetNet) Data Plane Framework

Internet Engineering Task Force (IETF)                     B. Varga, Ed.
Request for Comments: 8938                                     J. Farkas
Category: Informational                                         Ericsson
ISSN: 2070-1721                                                L. Berger
                                                 LabN Consulting, L.L.C.
                                                                A. Malis
                                                        Malis Consulting
                                                               S. Bryant
                                                  Futurewei Technologies
                                                           November 2020

Deterministic Networking (DetNet) Data Plane Framework

Модель плоскости данных детерминированных сетей (DetNet)

PDF

Аннотация

В этом документе описана общая схема плоскости данных детерминированных сетей (DetNet1). Докумен охватывает концепции и вопросы, относящиеся к любой спецификации плоскости данных DetNet, а также включает общие вопросы, относящиеся к плоскости контроллера (Controller Plane).

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

Этот документ не является спецификацией какого-либо стандарта Internet (Internet Standards Track) и публикуется с информационными целями.

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

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

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

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

Детерминированные сети DetNet обеспечивают возможность передачи определенных индивидуальных или групповых потоков данных для приложений в реальном масштабе времени (real-time) с чрезвычайно низким уровень потерь и гарантированным предельным (максимум) значением сквозной задержки. Общее описание основ и концепций DetNet дано в [RFC8655].

Этот документ описывает концепции, потребные для спецификации любой плоскости данных DetNet (т. е. связанного с DetNet использования полей заголовков), и рассматривает вопросы, относящиеся ко всем совместимым реализациям. Документ охватывает компоненты сервиса DetNet, сервисный подуровень DetNet и функции подуровня пересылки DetNet, как описано в архитектуре DetNet [RFC8655].

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

Как часть функций сервисного подуровня в этом документе описаны типовые операции плоскости данных DetNet, включая функции репликации (Packet Replication Function или PRF), исключения (Packet Elimination Function или PEF) и упорядочения (Packet Ordering Function или POF) пакетов внутри подуровня. Описан также подуровень пересылки.

Как определено в [RFC8655], потоки DetNet могут передаваться на основе технологий, способных обеспечить требуемые характеристики услуг для DetNet. Например, потоки DetNet MPLS могут передаваться через подсети IEEE 802.1 Time-Sensitive Networking (TSN) [IEEE802.1TSNTG], однако поддержка IEEE 802.1 TSN не требуется в DetNet. Вытеснение кадров TSN является примером свойства уровня пересылки, которое обычно не используется в других технологиях пересылки. Большинство преимуществ DetNet можно обеспечить при работе на основе канальных уровней, не приспособленных специально для поддержки всех возможностей TSN, но для таких сетей и смешанного трафика характеристики задержки и ее вариаций могут различаться из-за внутренних свойств подуровня пересылки.

Различные потоки приложений (например, Ethernet или IP) могут отображаться на сеть DetNet. В DetNet может использоваться информация заголовков, предоставляемая приложениями или общая с ними. Примеры обобщенных полей заголовков приведены в [RFC8939].

В документе также рассмотрены базовые концепции, относящиеся к уровню контроллера и OAM4. Детали OAM плоскости данных выходят за рамки документа.

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

2.1. Используемые в документе термины

В этом документе используется терминология, представленная в архитектуре DetNet [RFC8655], и предполагается, что читатель знаком с этим документом.

2.2. Сокращения

Ниже приведены расшифровки используемых в документе сокращений.

BGP Border Gateway Protocol — протокол междоменной маршрутизации (граничного шлюза).

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

d-CW DetNet Control Word — управляющее слово DetNet.

DetNet Deterministic Networking — детерминированная сеть.

DN DetNet

GMPLS Generalized Multiprotocol Label Switching — обобщенная коммутация по меткам.

GRE Generic Routing Encapsulation — базовая инкапсуляция маршрутных данных.

IPsec IP Security — защита IP.

L2 Layer 2 — канальный уровень.

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

MPLS Multiprotocol Label Switching — многопротокольная коммутация по меткам.

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

PCEP Path Computation Element Communication Protocol — коммуникационный протокол элементов расчета пути.

PEF Packet Elimination Function — функция исключения пакетов.

POF Packet Ordering Function — функция упорядочения пакетов.

PREOF Packet Replication, Elimination, and Ordering Functions — функции репликации, исключения и упорядочения пакетов.

PRF Packet Replication Function — функция репликации пакетов.

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

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

S-Label DetNet «service» label — метка сервиса DetNet.

TDM Time-Division Multiplexing — мультиплексирование с разделением по времени.

TSN Time-Sensitive Networking — чувствительные к времени сети.

YANG Yet Another Next Generation

3. Обзор плоскости данных DetNet

В этом документе описано, как потоки приложений (App-flow) [RFC8655] передаются через сети DetNet. Архитектура DetNet [RFC8655] моделирует относящиеся к DetNet функции плоскости данных как разделенные на два подуровня — сервис и пересылка.

На рисунке 1 из [RFC8655] показана логическая схема сервиса DetNet с двумя подуровнями.

   |Пакет, проходящий|        ^ Пакет, проходящий ^
   v  вниз по стеку  v        |  вверх по стеку   |
+-----------------------+   +-----------------------+
|       Источник        |   |      Получатель       |
+-----------------------+   +-----------------------+
|   Подуровень сервиса: |   | Подуровень сервиса:   |
|   Упорядочение пакетов|   | Исключение дубликатов |
|   Репликация потоков  |   | Слияние потоков       |
|   Кодирование пакетов |   | Декодирование пакетов |
+-----------------------+   +-----------------------+
| Подуровень пересылки: |   | Подуровень пересылки: |
| Выделение ресурсов    |   | Выделение ресурсов    |
| Явные маршруты        |   | Явные маршруты        |
+-----------------------+   +-----------------------+
|     Нижние уровни     |   |     Нижние уровни     |
+-----------------------+   +-----------------------+
            v                           ^
             \_________________________/

Рисунок 1. Стек протоколов плоскости данных DetNet.


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

Подуровень пересылки обеспечивает связанные с QoS функции, требуемые для потоков DetNet. Это можно делать напрямую, используя очереди и методы организации трафика, или с помощью базового уровня. Например, можно использовать возможности IEEE 802.1 TSN [IEEE802.1TSNTG]. Подуровень пересылки использует буферные ресурсы для очередей пакетов и выделения пропускной способности.

Подуровень сервиса обеспечивает дополнительную поддержку сверх обеспечиваемых подуровнем пересылки функций связности (см. параграф 4.3. Функции PREOF. Функции POF используют порядковые номера, добавляемые в пакеты, для реализации разных функций упорядочения от простого сохранения порядка и отбрасывания нарушающих порядок пакетов до комплексного восстановления порядка при фиксированном числе допустимых нарушений и с минимальной задержкой. Для восстановления порядка нужны буферные ресурсы и оно влияет на задержку (и ее вариации) пакетов в потоке DetNet.

Метод создания экземпляров каждого из уровней зависит от конкретной плоскости данных DetNet с возможностью использования множества подходов для данного типа сети.

3.1. Характеристики плоскости данных

Двумя основными характеристиками плоскости данных являются технология и инкапсуляция, рассмотренные ниже.

3.1.1. Технология плоскости данных

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

3.1.2. Инкапсуляция

DetNet кодирует конкретные атрибуты потока (отождествление и порядковый номер) в пакетах. Например, в DetNet IP инкапсуляция не применяется и нет порядковых номеров, в DetNet MPLS связанная с DetNet информация может явно добавляться в пакеты в форме S-Label и d-CW [DetNet-MPLS].

Инкапсуляция потока DetNet позволяет передавать его через плоскости данных, не являющиеся естественными (native). DetNet использует данные заголовков для классификации трафика, т. е. идентификации потоков DetNet, и обеспечения функций сервиса и пересылки DetNet. Как отмечено выше, DetNet может добавлять заголовки, как в случае DN MPLS, или применять уже имеющиеся заголовки, как в DN IP. На рисунке 2 показаны некоторые связи между компонентами.

                        +-----+
                        | TSN |
   +-------+          +-+-----+-+
   | DN IP |          | DN MPLS |
+--+--+----+----+   +-+---+-----+-+
| TSN | DN MPLS |   | TSN | DN IP |
+-----+---------+   +-----+-------+

Рисунок 2. Примеры сервиса DetNet.


Использование инкапсуляции также требуется, если плоскости данных DetNet нужна дополнительная информация (метаданные) и (1) нет возможности включить ее в клиентские пакеты данных или (2) спецификация плоскости данных клиента не позволяет изменять пакеты для включения в них дополнительных данных. Примером таких метаданных является включение порядковых номеров, требуемых для PREOF.

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

3.2. Метаданные DetNet

Плоскость данных DetNet может предоставлять и передавать два типа данных:

  1. идентификаторы потоков (Flow-ID);

  2. порядковые номера.

Плоскость данных DetNet поддерживает Flow-ID (для идентификации потока или агрегата потоков) и/или порядковый номер (для PREOF) в каждом потоке DetNet. Flow-ID применяется подуровнями сервиса и пересылки, а порядковый номертолько сервисным уровнем. Метаданные могут также применяться для OAM и измерений в операциях плоскости данных DetNet.

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

Явное включение метаданных возможно за счет использования опций или заголовков расширения IP. Новые опции IP стандартизовать или реализовать в работающей сети уже практически невозможно и это дальше не рассматривается. Заголовки расширения IPv6 становятся популярными в текущих разработках IPv6, в частности, вместе с сегментной маршрутизацией IPv6 (Segment Routing или SRv6) и IP OAM. Разработка новых или изменение имеющихся заголовков расширения IPv6 доступны в наборе инструментов разработчика плоскости данных DetNet IP.

Явное включение метаданных в пакет IP также возможно за счет добавления стека меток MPLS и MPLS d-CW с использованием одного из методов для передачи MPLS по протоколу IP [DetNet-MPLS-over-UDP-IP]. Это более подробно рассматривается в параграфе 3.5.5. Подсети.

Неявные метаданные можно включить в IP путем использования парадигмы сетевого программирования [SRv6-Network-Prog], где суффикс адреса IPv6 служит для представления дополнительной информации, используемой сетью принимающего хоста.

Примером явных данных MPLS являются порядковые номера, используемые PREOF, и даже случай включения всей требуемой информации в стек меток DetNet-over-MPLS (d-CW и DetNet S-Label).

3.3. Плоскость данных DetNet IP

Плоскость данных DetNet IP может работать естественным способом или с использованием инкапсуляции. Требованиям DetNet удовлетворяет много типов инкапсуляции IP и предполагается возможность использования нескольких типов (например, GRE, IPsec).

Одним из вариантов работы плоскости данных DetNet IP без инкапсуляции является использование идентификации потоков на основе кортежей 6-tuple (данные из заголовка IP и вышележащего уровня). Общие сведения об использовании заголовков IP и кортежей 6-tuple для идентификации потоков и поддержки QoS можно найти в [RFC3670]. Дополнительным полем 6-tuple является поле DSCP в пакете. В [RFC7657] представлены полезные сведения о дифференцированных услугах (Diffserv) и идентификации потоков на основе кортежей. Агрегирование потоков DetNet может быть обеспечено за счет применения шаблонов, масок, префиксов и диапазонов. Работа этого метода подробно описана в [RFC8939].

Плоскость пересылки DetNet может использовать явные маршруты и возможности организации трафика для организации подуровня пересылки, отвечающего за выделение ресурсов и явные маршруты. Такую информацию можно включить в естественные пакеты IP явно или неявно.

3.4. Плоскость данных DetNet MPLS

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

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

В случаях, где требуются метаданные для обработки пакетов с инкапсуляцией MPLS на подуровне сервиса, можно применять d-CW [DetNet-MPLS]. Хотя управляющие слова d-CW часто имеют размер 32 бита, это не является архитектурным ограничением на размер структуры и задается лишь требование, чтобы структура была понятна всем сторонам, работающим на подуровне сервиса DetNet. Работа метода подробно описана в [DetNet-MPLS].

3.5. Другие вопросы плоскости данных DetNet

В этом разделе приведена информация, связанная с предоставлением услуг DetNet потокам на основании данных из заголовков.

3.5.1. Функции, обеспечиваемые на уровне потока

На верхнем уровне обеспечиваются на уровне потока описанные ниже функции.

3.5.1.1. Резервирование и выделение ресурсов

Ресурсы могут резервироваться, чтобы быть доступными для выделения конкретным потокам DetNet. Это может предотвратить «соперничество» и потери пакетов для трафика DetNet, а также снизить вариации задержки (jitter). Ресурсы, выделенные потоку DetNet, защищают его от других потоков трафика. С другой стороны предполагается, что потоки DetNet ведут себя в соответствии с зарезервированным профилем трафика. Должна обеспечиваться возможность обнаружения некорректного поведения потоков DetNet и предотвращения нарушений ими требований QoS других потоков. Очереди, правила и формовка трафика могут служить для распределения ресурсов, резервируемых DetNet.

3.5.1.2. Явные маршруты

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

3.5.1.3. Защита сервиса

Защита сервиса предполагает использование множества потоков пакетов с передачей по множеству путей, например, 1+1 или линейная защита 1:1. Для DetNet это связано в основном с возможностями репликации и исключения пакетов. MPLS обеспечивает множество схем защиты. Безотказную защиту MPLS можно применять для переключения трафика на уже созданный путь с целью быстрого восстановления доставки после отказа. Смена путей даже при восстановлении после отказа может приводить к нарушению порядка пакетов, что требует реализации POF на уровне сервиса DetNet или вышележащем уровне прикладного трафика. Организация новых путей при отказе выходит за рамки услуг DetNet.

3.5.1.4. Сетевое кодирование

Сетевое кодирование (Network Coding) [nwcrg], которое не следует путать с сетевым программированием, включает несколько методов для кодирования множества потоков данных. Получаемые в результате потоки можно передавать по разным путям. Операция кодирования может объединять поток с данными для восстановления ошибок. При декодировании и рекомбинации могут восстанавливаться исходные потоки. Отметим, что сетевое кодирование использует альтернативу попакетному применению PREOF. Поэтому для некоторых вариантов топологии и трафика сетевое кодирование позволяет повысить пропускную способность сети и улучшить параметры эффективности, задержки и расширяемости, а также повысить устойчивость к разделению, атакам и перехвату пакетов по сравнению с традиционными методами. DetNet может приментяь Network Coding в качестве дополнения к другим средствам защиты. Сетевое кодирование часто применяется в беспроводных сетях и исследуется для других типов сетей.

3.5.1.5. Распределение нагрузки

Использование попакетного (packet-by-packet) распределения нагрузки одного потока DetNet по множеству путей не рекомендуется, за исключением указанных выше случаев, где применяется PREOF для улучшения защиты и сохранения порядка. Попакетное распределение нагрузки, например, по равноценным (Equal-Cost Multipath или ECMP) или неравноценным (Unequal-Cost Multipath или UCMP) путям влияет на порядок и может влиять на вариации задержки.

3.5.1.6. Поиск неисправностей

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

3.5.1.7. Распознавание потоков для анализа

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

3.5.1.8. Сопоставление событий с потоками

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

3.5.2. Защита сервиса

Защита сервиса позволяет повысить отказоустойчивость служб DetNet и поддерживать желаемый уровень гарантий в случаях перегрузки или отказов в сети. DetNet опирается в схемах защиты на возможности используемых базовых технологий. Схемы защиты включают полное или частичное покрытие путей через сеть и активную защиту с использованием комбинаций PRF, PEF и POF.

3.5.2.1. Линейная защита сервиса

На рисунке 3 показан фрагмент сети DetNet MPLS и поток пакетов. Номера на рисунке указывают экземпляры пакета. Пакет 1 является исходным, 1.1 и 1.2 — первые копии исходного пакета, 1.2.1 — копия пакета 1.2 и т. д. Отметим, что эти номера не присутствуют в пакетах и их не следует путать с порядковыми номерами, метками или иными идентификаторами из пакетов. Они приведены здесь лишь для удобства ссылок.

   1      1.1       1.1      1.2.1    1.2.1      1.2.2
CE1----EN1--------R1-------R2-------R3--------EN2-----CE2
         \           1.2.1 /                  /
          \1.2     /------+                  /
           +------R4------------------------+
                     1.2.2

Рисунок 3. Пример потока пакетов, защищенного DetNet.


Пользовательское устройство CE1 передает пакет в сеть с поддержкой DetNet (пакет 1). Краевой узел EN1 инкапсулирует пакет как пакет DetNet и передает его ретранслятору R1 (1.1). EN1 также делает копию пакета (1.2), инкапсулирует ее и передает ретранслятору R4.

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

Ретранслятор R4 можно настроить на отправку одной копии пакета (1.2.1) ретранслятору R2, а другой (1.2.2) — конечному узлу EN2.

R2 получает копию 1.2.1 до прихода копии 1.1 и, поскольку на нем настроено исключение дубликатов для этого потока DetNet, пересылает 1.2.1 ретранслятору R3. Копия 1.1 больше не используется и будет отброшена R2.

Краевой узел EN2 получает копию 1.2.2 от R4 до прихода копии 1.2.1 от R2 через ретранслятор R3. Поэтому EN2 вырезает инкапсуляцию DetNet из копии 1.2.2 и передает пакет CE2. Когда EN2 получает копию 1.2.1, она уже не нужна и отбрасывается.

Для приведенного выше примера можно настроить и другие сценарии.

Пример также иллюстрирует схему защиты 1:1, означающую наличие трафика через каждый сегмент сквозного пути. Локальные ретрансляторы DetNet определяют, какие пакеты нужно переслать, а какие исключить. Схема 1+1, где для трафика в каждый момент применяется лишь один путь, может использовать такую же топологию. В этом случае не будет применяться PRF, а при возникновении отказа произойдет переключение трафика с использованием схемы OAM, отслеживающей отказы. Функция POF может по-прежнему использоваться в этом случае для предотвращения нарушений порядка пакетов. В обоих случаях защитные пути организуются и поддерживаются в течение всего срока работы сервиса DetNet.

3.5.2.2. Дифференциальная зедержка между путями

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

3.5.2.3. Защита кольца

Защита кольца может обеспечиваться при ее поддержке базовой технологией. Используется много одинаковых концепций, однако в кольцах обычно применяют защиту 1+1 для обеспечения эффективности обмена данными. В [RFC8227] представлен пример плоскости данных транспортного профиля MPLS (MPLS Transport Profile или MPLS-TP) с поддержкой защиты кольца.

3.5.3. Вопросы агрегирования

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

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

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

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

3.5.3.1. Агрегирование IP

Агрегирование IP включает аспекты плоскостей управления и контроллера. Для плоскости управления потоки могут агрегироваться с целью обработки на основе общих характеристик, таких как 6-tuple [RFC8939]. Дополнительно может применяться инкапсуляция IP для туннелирования агрегата потоков DetNet между ретрансляторами.

3.5.3.2. Агрегирование MPLS

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

3.5.4. Конечные системы

Потоки данных, которым нужен сервис DetNet, создаются и завершаются в конечных системах. Инкапсуляция зависит от приложения и его предпочтений. Например, в домене DetNet MPLS функции подуровня используют d-CW, S-Label и F-Label [DetNet-MPLS] для предоставления услуг DetNet. Однако приложения могут обмениваться параметрами, связанными с потоками (например, временными метками), которые не предоставляются функциями DetNet.

+-----+
|  X  |                               +-----+
+-----+                               |  X  |
| Eth |               ________        +-----+
+-----+     _____    /        \       | Eth |
       \   /     \__/          \___   +-----+
        \ /                        \ /
         0======== tunnel-1 ========0_
         |                             \
          \                             |
          0========= tunnel-2 =========0
         / \                        __/ \
  +-----+   \__ Домен DetNet MPLS  /     \
  |  X  |      \         __       /       +-----+
  +-----+       \_______/  \_____/        |  X  |
  |  IP |                                 +-----+
  +-----+                                 |  IP |
                                          +-----+

Рисунок 4. Конечные системы и домен DetNet MPLS.


Как правило, домены DetNet способны пересылать любые потоки DetNet и не задают формат инкапсуляции для конечных систем или краевых узлов. Если не используется тот или иной посредник (proxy) конечная система взаимодействует с другой конечной системой, используя общий формат инкапсуляции. Например, на рисунке 4 показано взаимодействие приложений IP и приложений Ethernet.

3.5.5. Подсети

                   +------+  +------+  +------+
App-flow           |  X   |  |  X   |  |  X   |
             +-----+======+--+======+--+======+-----+
DetNet-MPLS        | d-CW |  | d-CW |  | d-CW |
                   +------+  +------+  +------+
                   |Метки |  |Метки |  |Метки |
             +-----+======+--+======+--+======+-----+
Подсеть            |  L2  |  | TSN  |  | UDP  |
                   +------+  +------+  +------+
                                       |  IP  |
                                       +------+
                                       |  L2  |
                                       +------+

Рисунок 5. Пример инкапсуляции DetNet MPLS в подсетях.


Услуги DetNet любого типа могут предоставляться с использованием другого сервиса DetNet. Узлы MPLS могут быть соединены через подсети с иной технологией, которые могут включать каналы «точка-точка». Каждая из технологий подсетей должна предоставлять услуги, подходящие для потоков DetNet. В некоторых случаях (например, на выделенных каналах «точка-точка» или при использовании технологии TDM) от узла DetNet требуется лишь подходящая организация очередей для трафика. В иных случаях узлы DetNet должны отображать потоки DetNet на семантику (например, идентификаторы) и механизмы, используемые базовой технологией подсети. На рисунке 5 показано несколько примеров инкапсуляции в подсетях, которая может применяться для передачи потоков DetNet MPLS с использованием других технологий. L2 представляет базовую инкапсуляцию канального уровня, которая может применяться в соединениях «точка-точка». TSN указывает инкапсуляцию IEEE 802.1 TSN [DetNet-MPLS-over-TSN], а UDP/IP — инкапсуляцию DetNet IP PSN [DetNet-MPLS-over-UDP-IP].

4. Плоскость контроллера (поддержка и управление)

4.1. Требования плоскости контроллера DetNet

Плоскость контроллера (Controller Plane) соответствует объединению плоскостей управления и администрирования (Control и Management), описанному в [RFC7426] и [RFC8655]. Подробное рассмотрение плоскости контроллера DetNet выходит за рамки этого документа, однако ниже обсуждаются некоторые вопросы и требования к Controller Plane, связанные с уникальными характеристиками архитектуры DetNet и определенной здесь плоскости данных.

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

  • Создание экземпляров потоков DetNet в домене DetNet (который может, например, включать определение явных путей, резервирование пропускной способности, ограничение потоков в каналы IEEE 802.1 TSN, буферы узлов и другое резервирование ресурсов, спецификация требуемых в пути очередей, возможность управления двухсторонними потоками и т. п.) по мере потребности в потоках.

  • В случае MPLS управление выделением и распространением меток DetNet S-Label и F-Label. Использование инкапсуляции DetNet MPLS описано в [DetNet-MPLS].

  • Поддержка агрегирования потоков DetNet.

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

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

  • Предоставление идентификационных данных потоков на каждом узле пути. Идентификация потока может различаться в зависимости от места в домене DetNet (например, транзитный узел и ретранслятор).

Эти требования, как отмечено выше, могут быть выполнены с помощью распределенного сигнального протокола управления (например, RSVP-TE), механизмов централизованного управления сетью (BGP, PCEP, YANG, [DetNet-Flow-Info] и т. п.) или их комбинации, а также можно применять сегментную маршрутизацию на основе MPLS.

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

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

4.2. Базовая плоскость контроллера

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

Хотя плоскости администрирования и управления обычно рассматривают отдельно, с точки зрения плоскости данных нет практических различий, основанных на источнике информации о предоставлении потоков и в архитектуре DetNet [RFC8655] администрирование и управление отнесены к единой плоскости контроллера (Controller Plane). Поэтому документ не разделяет информацию от распределенных протоколов плоскости управления (например, RSVP-TE [RFC3209] [RFC3473]) и централизованных механизмов управления сетью (например, RESTCONF [RFC8040], YANG [RFC7950], PCEP [PCECC]) или их комбинации. Конкретные вопросы и требования к плоскости контроллера DetNet рассмотрены в разделе 4.1. Требования плоскости контроллера DetNet.

В каждом документе плоскости данных рассматриваются также вопросы плоскости управления для соответствующей технологии. Например, в [RFC8939] охватываются также нормативные аспекты плоскости управления для IP, а в [DetNet-MPLS] — для MPLS.

4.2.1. Управление агрегированием потоков

Агрегирование потоков означает обслуживание множества App-flow одним потоком DetNet. Для агрегирования применяется множество методов, например, в случае IP потоки IP с общими атрибутами 6-tuple или идентификаторами подуровня DetNet можно сгруппировать. Другим примером служит агрегирование с использованием иерархических LSP в MPLS и туннелях.

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

Сбор и распространение сведений о ресурсах организации трафика

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

Расчет пути и выделение ресурсов

При предоставлении или запросе сервиса DetNet выбирается один или несколько путей с проверкой и записью соответствующих ресурсов.

Координация плоскости данных с назначением ресурсов

Назначение ресурсов на пути зависит от технологии и включает указание соответствующих каналов, координацию очередей и другие средства организации трафика (такие как правила и формовка).

Запись и обновление выделенных ресурсов

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

4.2.2. Явные маршруты

Явные маршруты применяются для гарантированной отправки пакетов по путям с зарезервированными ресурсами, чтобы обеспечить приложениям DetNet требуемое обслуживание. От плоскости контроллера DetNet требуется способность назначить конкретному идентифицированному потоку DetNet IP путь через домен DetNet, которому были выделены требуемые ресурсы на каждом узле. Это обеспечивает подобающую обработку трафика для потока, а также включает как часть пути конкретные каналы, способные поддержать поток DetNet. Например, параметры DetNet можно обеспечить за счет использования каналов IEEE 802.1 TSN [DetNet-MPLS-over-TSN]. Дополнительное рассмотрение требований к плоскости контроллера DetNet приведено в параграфе 4.1. Требования плоскости контроллера DetNet.

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

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

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

  • Путь может использовать распределенную плоскость управления, такую как RSVP [RFC2205] или RSVP-TE [RFC3473], с расширением для поддержки потоков DetNet IP.

  • Путь можно реализовать с использованием сегментной маршрутизации на основе IPv6, расширенной для поддержки выделения ресурсов.

Эти варианты рассмотрены в параграфе 4.1. Кроме того, в [RFC2386] приведены полезные сведения о маршрутизации на основе QoS, а в [RFC5575] (обновлен [Flow-Spec-Rules]) обсуждается конкретный механизм, используемый BGP для задания потоков трафика и маршрутизации на основе правил.

4.2.3. Потери из-за конкуренции и снижение вариаций задержки

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

4.2.4. Двухсторонний трафик

Во многих случаях потоки DetNet можно считать односторонними и независимыми. Однако иногда сервис DetNet требует двухстороннего трафика с точки зрения приложений DetNet. В IP и MPLS обычно каждое направление обрабатывается самостоятельно и между встречными направлениями не возникает взаимной зависимости. Рабочая группа IETF MPLS изучила требования к двухстороннему трафику. Определения, представленные в [RFC5654], полезны для иллюстрации двухсторонних потоков, в том числе с общей маршрутизацией. MPLS определяет двухсторонний LSP, связанный с соединением «точка-точка», как два односторонних LSP «точка-точка» (от A к B и от B к A), которые рассматриваются как один логический двухсторонний путь. Это аналог стандартной маршрутизации IP. Двухсторонний LSP «точка-точка» с общей маршрутизацией определяется в MPLS как двухсторонний LSP, удовлетворяющий дополнительному требованию использовать в обоих направлениях один путь (один набор узлов и каналов). Важным свойством таких LSP является «общая судьба» путей в каждом направлении. Для обоих типов двухсторонних LSP резервирование в каждом из направления может быть разным. Концепции связанных двухсторонних потоков (в том числе с общей маршрутизацией) применимы и к потокам DetNet IP.

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

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

Механизмы управления и администрирования должны поддерживать двухсторонние потоки, но спецификация таких механизмов выходит за рамки документа. Примеры решений для плоскости управления MPLS можно найти в [RFC3473], [RFC6387] и [RFC7551]. Эти требования включены в раздел 4.1. Требования плоскости контроллера DetNet.

4.3. Функции PREOF

Выбор протокола плоскости контроллера, требуемого для управления работой PREOF, выходит за рамки документа. Тем не менее, следует отметить, что явно требуется возможность определить для конкретного потока оптимальные точки репликации и исключения дубликатов в домене DetNet. Некоторые имеющиеся возможности можно применить или расширить для решения этой задачи, например, сквозное восстановление GMPLS [RFC4872] и восстановление сегментов GMPLS [RFC4873].

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

Вопросы безопасности DetNet подробно рассматриваются в [DetNet-Security], а базовые проблемы безопасности для архитектуры DetNet — в [RFC8655]. В этом разделе обсуждаются вопросы безопасности на уровне архитектуры DetNet, применимые ко всем плоскостям данных.

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

Для всех коммуникационных протоколов первоочередной задачей плоскости данных является обеспечение целостности данных и предоставление услуг DetNet через сеть DetNet. Потоки приложений можно защитить любыми способами, предоставляемыми базовой технологией. Например, может применяться шифрование, подобное используемому в IPsec [RFC4301] для потоков IP или MACsec [IEEE802.1AE-2018] для потоков Ethernet (L2).

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

Для обеспечения непрерывной доступности сервиса DetNet могут быть приняты меры против атак на службы (DoS) и атак с задержками. Для защиты от DoS-атак избыточный трафик от вредоносных или некорректно работающих устройств можно предотвратить или ослабить, например, с помощью имеющихся механизмов, таких как правила и формовка на входе в домен DetNet. Для предотвращения вредоносной задержки пакетов DetNet за пределами домена DetNet определения технологии DetNet могут смягчать перехват и изменение в пути с участием человека (MITM5-атака), например за счет проверки подлинности и полномочий устройств в домене DetNet.

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

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

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

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

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

[RFC8655] Finn, N., Thubert, P., Varga, B., and J. Farkas, «Deterministic Networking Architecture», RFC 8655, DOI 10.17487/RFC8655, October 2019, <https://www.rfc-editor.org/info/rfc8655>.

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

[DetNet-Flow-Info] Varga, B., Farkas, J., Cummings, R., Jiang, Y., and D. Fedyk, «DetNet Flow Information Model», Work in Progress, Internet-Draft, draft-ietf-detnet-flow-information-model-11, 21 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-flow-information-model-11>.

[DetNet-MPLS] Varga, B., Ed., Farkas, J., Berger, L., Malis, A., Bryant, S., and J. Korhonen, «DetNet Data Plane: MPLS», Work in Progress, Internet-Draft, draft-ietf-detnet-mpls-13, 11 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-mpls-13>.

[DetNet-MPLS-over-TSN] Varga, B., Ed., Farkas, J., Malis, A., and S. Bryant, «DetNet Data Plane: MPLS over IEEE 802.1 Time Sensitive Networking (TSN)», Work in Progress, Internet-Draft, draft-ietf-detnet-mpls-over-tsn-04, 2 November 2020, <https://tools.ietf.org/html/draft-ietf-detnet-mpls-over-tsn-04>.

[DetNet-MPLS-over-UDP-IP] Varga, B., Ed., Farkas, J., Berger, L., Malis, A., and S. Bryant, «DetNet Data Plane: MPLS over UDP/IP», Work in Progress, Internet-Draft, draft-ietf-detnet-mpls-over-udp-ip-07, 11 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-mpls-over-udp-ip-07>.

[DetNet-Security] Grossman, E., Ed., Mizrahi, T., and A. Hacker, «Deterministic Networking (DetNet) Security Considerations», Work in Progress, Internet-Draft, draft-ietf-detnet-security-12, 2 October 2020, <https://tools.ietf.org/html/draft-ietf-detnet-security-12>.

[Flow-Spec-Rules] Loibl, C., Hares, S., Raszuk, R., McPherson, D., and M. Bacher, «Dissemination of Flow Specification Rules», Work in Progress, Internet-Draft, draft-ietf-idr-rfc5575bis-27, 15 October 2020, <https://tools.ietf.org/html/draft-ietf-idr-rfc5575bis-27>.

[IEEE802.1AE-2018] IEEE, «IEEE Standard for Local and metropolitan area networks-Media Access Control (MAC) Security», IEEE Std 802.1AE-2018, DOI 10.1109/IEEESTD.2018.8585421, December 2018, <https://ieeexplore.ieee.org/document/8585421>.

[IEEE802.1TSNTG] IEEE, «Time-Sensitive Networking (TSN) Task Group», <https://1.ieee802.org/tsn/>.

[nwcrg] IRTF, «Coding for efficient NetWork Communications Research Group (nwcrg)», <https://datatracker.ietf.org/rg/nwcrg/about>.

[PCECC] Li, Z., Peng, S., Negi, M. S., Zhao, Q., and C. Zhou, «PCEP Procedures and Protocol Extensions for Using PCE as a Central Controller (PCECC) of LSPs», Work in Progress, Internet-Draft, draft-ietf-pce-pcep-extension-for-pce-controller-08, 1 November 2020, <https://tools.ietf.org/html/draft-ietf-pce-pcep-extension-for-pce-controller-08>.

[RFC2205] Braden, R., Ed., Zhang, L., Berson, S., Herzog, S., and S. Jamin, «Resource ReSerVation Protocol (RSVP) — Version 1 Functional Specification», RFC 2205, DOI 10.17487/RFC2205, September 1997, <https://www.rfc-editor.org/info/rfc2205>.

[RFC2386] Crawley, E., Nair, R., Rajagopalan, B., and H. Sandick, «A Framework for QoS-based Routing in the Internet», RFC 2386, DOI 10.17487/RFC2386, August 1998, <https://www.rfc-editor.org/info/rfc2386>.

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

[RFC3473] Berger, L., Ed., «Generalized Multi-Protocol Label Switching (GMPLS) Signaling Resource ReserVation Protocol-Traffic Engineering (RSVP-TE) Extensions», RFC 3473, DOI 10.17487/RFC3473, January 2003, <https://www.rfc-editor.org/info/rfc3473>.

[RFC3670] Moore, B., Durham, D., Strassner, J., Westerinen, A., and W. Weiss, «Information Model for Describing Network Device QoS Datapath Mechanisms», RFC 3670, DOI 10.17487/RFC3670, January 2004, <https://www.rfc-editor.org/info/rfc3670>.

[RFC4301] Kent, S. and K. Seo, «Security Architecture for the Internet Protocol», RFC 4301, DOI 10.17487/RFC4301, December 2005, <https://www.rfc-editor.org/info/rfc4301>.

[RFC4872] Lang, J.P., Ed., Rekhter, Y., Ed., and D. Papadimitriou, Ed., «RSVP-TE Extensions in Support of End-to-End Generalized Multi-Protocol Label Switching (GMPLS) Recovery», RFC 4872, DOI 10.17487/RFC4872, May 2007, <https://www.rfc-editor.org/info/rfc4872>.

[RFC4873] Berger, L., Bryskin, I., Papadimitriou, D., and A. Farrel, «GMPLS Segment Recovery», RFC 4873, DOI 10.17487/RFC4873, May 2007, <https://www.rfc-editor.org/info/rfc4873>.

[RFC5575] Marques, P., Sheth, N., Raszuk, R., Greene, B., Mauch, J., and D. McPherson, «Dissemination of Flow Specification Rules», RFC 5575, DOI 10.17487/RFC5575, August 2009, <https://www.rfc-editor.org/info/rfc5575>.

[RFC5654] Niven-Jenkins, B., Ed., Brungard, D., Ed., Betts, M., Ed., Sprecher, N., and S. Ueno, «Requirements of an MPLS Transport Profile», RFC 5654, DOI 10.17487/RFC5654, September 2009, <https://www.rfc-editor.org/info/rfc5654>.

[RFC6387] Takacs, A., Berger, L., Caviglia, D., Fedyk, D., and J. Meuric, «GMPLS Asymmetric Bandwidth Bidirectional Label Switched Paths (LSPs)», RFC 6387, DOI 10.17487/RFC6387, September 2011, <https://www.rfc-editor.org/info/rfc6387>.

[RFC7426] Haleplidis, E., Ed., Pentikousis, K., Ed., Denazis, S., Hadi Salim, J., Meyer, D., and O. Koufopavlou, «Software-Defined Networking (SDN): Layers and Architecture Terminology», RFC 7426, DOI 10.17487/RFC7426, January 2015, <https://www.rfc-editor.org/info/rfc7426>.

[RFC7551] Zhang, F., Ed., Jing, R., and R. Gandhi, Ed., «RSVP-TE Extensions for Associated Bidirectional Label Switched Paths (LSPs)», RFC 7551, DOI 10.17487/RFC7551, May 2015, <https://www.rfc-editor.org/info/rfc7551>.

[RFC7657] Black, D., Ed. and P. Jones, «Differentiated Services (Diffserv) and Real-Time Communication», RFC 7657, DOI 10.17487/RFC7657, November 2015, <https://www.rfc-editor.org/info/rfc7657>.

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

[RFC8227] Cheng, W., Wang, L., Li, H., van Helvoort, H., and J. Dong, «MPLS-TP Shared-Ring Protection (MSRP) Mechanism for Ring Topology», RFC 8227, DOI 10.17487/RFC8227, August 2017, <https://www.rfc-editor.org/info/rfc8227>.

[RFC8939] Varga, B., Ed., Farkas, J., Berger, L., Fedyk, D., and S. Bryant, «Deterministic Networking (DetNet) Data Plane: IP», RFC 8939, DOI 10.17487/RFC8939, November 2020, <https://www.rfc-editor.org/info/rfc8939>.

[SRv6-Network-Prog] Filsfils, C., Ed., Camarillo, P., Ed., Leddy, J., Voyer, D., Matsushima, S., and Z. Li, «SRv6 Network Programming», Work in Progress, Internet-Draft, draft-ietf-spring-srv6-network-programming-26, 26 November 2020, <https://tools.ietf.org/html/draft-ietf-spring-srv6-network-programming-26>.

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

Авторы благодарят Pat Thaler, Norman Finn, Loa Andersson, David Black, Rodney Cummings, Ethan Grossman, Tal Mizrahi, David Mozes, Craig Gunther, George Swallow, Yuanlong Jiang, Carlos J. Bernardos за их вклад в работу.

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

Существенный вклад в создание этого документа внесли Don Fedyk и Jouni Korhonen

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

Balázs Varga (editor)

Ericsson

Budapest

Magyar Tudosok krt. 11.

1117

Hungary

Email: balazs.a.varga@ericsson.com

János Farkas

Ericsson

Budapest

Magyar Tudosok krt. 11.

1117

Hungary

Email: janos.farkas@ericsson.com

Lou Berger

LabN Consulting, L.L.C.

Email: lberger@labn.net

Andrew G. Malis

Malis Consulting

Email: agmalis@gmail.com

Stewart Bryant

Futurewei Technologies

Email: sb@stewartbryant.com

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

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

nmalykh@protokols.ru

1Deterministic Networking.

2Internet Engineering Task Force.

3Internet Engineering Steering Group.

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

5Man-in-the-middle — «человек в середине».

Рубрика: RFC | Комментарии к записи RFC 8938 Deterministic Networking (DetNet) Data Plane Framework отключены

RFC 8922 A Survey of the Interaction between Security Protocols and Transport Services

Internet Engineering Task Force (IETF)                       T. Enghardt
Request for Comments: 8922                                     TU Berlin
Category: Informational                                         T. Pauly
ISSN: 2070-1721                                               Apple Inc.
                                                              C. Perkins
                                                   University of Glasgow
                                                                 K. Rose
                                               Akamai Technologies, Inc.
                                                                 C. Wood
                                                              Cloudflare
                                                            October 2020

A Survey of the Interaction between Security Protocols and Transport Services

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

PDF

Аннотация

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

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

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

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

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

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

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

Услуги и свойства, предоставляемые транспортными протоколами, классифицированы в [RFC8095]. Это документ дополняет выполненную работу и указывает интерфейсы между этими протоколами, а также между транспортными протоколами и приложениями. Документ исследует TLS3, DTLS4, IETF QUIC, Google QUIC (gQUIC), tcpcrypt, IPsec5, SRTP6 с DTLS, WireGuard, CurveCP, MinimaLT и для каждого протокола в документе приведено краткое описание. Описаны также интерфейсы между этими протоколами и транспортом (раздел 4) и интерфейсы между протоколами и приложениями (раздел 5).

Система транспортных служб раскрывает приложениям интерфейс для доступа к разным (защищенным) транспортным функциям. Протоколы защиты, включенные в этот исследование, представляют расширенный набор функций и возможностей транспортных служб, которые могут потребоваться приложениям как для внутреннего, так и для внешнего применения (через API) [TAPS-ARCH]. Распространенные повсеместно протоколы IETF, такие как (D)TLS, наряду с нестандартными протоколами (например, gQUIC) включены в документ, несмотря на перекрывающиеся функции. Таким образом, исследование не ограничивается протоколами разработанными в сфере действия или контексте IETF. За пределами этого набора остались протоколы, которые не предлагают новых функций. Например, более новые протоколы, такие как WireGuard, применяют уникальные решения, которые могут влиять на ограничения при использовании приложений. Напротив, такие протоколы, как SSH [RFC4253], GRE [RFC2890], L2TP7 [RFC5641], ALTS8 [ALTS] не включены в обзор, поскольку они не имеют уникальных интерфейсов.

Не включены протоколы, предлагающие лишь аутентификацию, такие как TCP-AO9 [RFC5925] и IPsec AH10 [RFC4302]. TCP-AO добавляет аутентификацию для долгосрочных соединений TCP, например, защиту от повторного использования пакетов с помощью кодов MAC11 на уровне сообщения. TCP-AO обменяет «подписи» TCP MD5, заданные в [RFC2385] и одним из основных применений TCP-AO является защита соединений BGP. AH добавляет на уровне дейтаграмм аутентификацию и защиту целостности, а также защиту от повтора пакетов. Несмотря на эти усовершенствования, ни один из протоколов не относится в категории общего пользования и оба не включают важных свойств, требуемых для новых протоколов защиты, таких как защита конфиденциальности и приватности. Такие протоколы не включены в исследование.

В документ включены лишь протоколы парного взаимодействия (point-to-point), но не групповые протоколы.

1.1. Цели

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

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

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

1.2. Дополнительные аспекты

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

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

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

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

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

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

Ниже приведены определения используемых в документе терминов для описания ролей и взаимодействий протоколов защищенного транспорта (некоторые термины определены также в [RFC8095]).

Transport Feature — транспортная функция (свойство)

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

Transport Service — транспортный сервис (служба)

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

Transport Services system — система транспортных услуг

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

Transport Protocol — транспортный протокол

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

Application — приложение

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

Security Protocol — протокол защиты (безопасности)

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

Handshake Protocol — протокол согласования

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

Record — запись

Кадрированные сообщения протокола.

Record Protocol — протокол записей

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

Session — сессия (сеанс)

Эфемерная защитная ассоциация между приложениями.

Connection — соединение

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

Peer — партнер

Приложение конечной точки, участвующее в сессии.

Client — клиент

Партнер, отвечающий за инициирование сессии.

Server — сервер

Партнер, отвечающий за отклик на инициирование сессии.

3. Описания протоколов транспортной защиты

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

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

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

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

Для некоторых протоколов (например, tcpcrypt) эти компоненты тесно связаны. И напротив, в IPsec они реализованы в разных протоколах — AH и ESP12, — являющихся протоколами записи, которые используют ключи, предоставленные протоколом обмена ключами IKEv213, другими протоколами согласования или вручную.

Кроме того, некоторые протоколы могут использоваться разными способами. Базовый протокол TLS, определенный в [RFC8446], имеет встроенные протоколы согласования и записей, но TLS или DTLS можно также применять для согласования ключей в других протоколах (например, DTLS-SRTP) или протокол согласования может использоваться с отдельным уровнем записей, как в QUIC [QUIC-TRANSPORT].

3.1. Протоколы защиты данных приложения

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

3.1.1. TLS

TLS [RFC8446] является базовым протоколом для организации защищенных сессий между парой конечных точек. Коммуникации в таких сессиях защищены от перехвата, подмены и подставных сообщений. TLS включает тесно связанные протоколы согласования и записей. Протокол согласования служит для аутентификации партнеров, согласования опций протокола, таких как криптографические алгоритмы, и создания ключевого материала для сессии. Протокол записей используется для «присмотра» (marshal), а после согласования служит для шифрования данных между партнерами. Эти данные могут включать согласующие сообщения и необработанные (raw) данные приложения.

3.1.2. DTLS

Протокол DTLS [RFC6347] [DTLS-1.3] основан на TLS, но отличается тем, что предназначен для работы с протоколами дейтаграмм, такими как UDP, взамен TCP. DTLS меняет протокол, чтобы обеспечить гарантии защиты, эквивалентные TLS, за исключением сохранения порядка и невозможности повторного использования. DTLS разработан максимально похожим на TLS, поэтому здесь предполагается, что перенесены все свойства TLS, кроме отмеченных выше.

3.2. Зависимые от приложения протоколы защиты

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

3.2.1. Secure RTP

Secure RTP (SRTP) — это профиль RTP, обеспечивающий конфиденциальность, аутентификацию сообщений и защиту от повторного использования для пакетов данных RTP и пакетов протокола управления RTCP14 [RFC3711]. SRTP поддерживать только уровень записей и требует отдельного протокола согласования для управления ключами и контроля идентичности.

Наиболее широко в качестве протокола согласования для SRTP применяется DTLS в форме DTLS-SRTP [RFC5764]. Это расширение DTLS, согласующее применение SRTP как уровня записей и описывающее экспорт ключей для SRTP.

ZRTP [RFC6189] является другим вариантом протокола согласования ключей и контроля идентичности для SRTP. Согласование ключей в ZRTP выполняется с использованием обмена Diffie-Hellman на пути в среде. Алгоритм создает общий ключ, который служит для генерации первичного ключа и затравки (salt) для SRTP.

3.3. Протоколы защиты на транспортном уровне

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

3.3.1. IETF QUIC

QUIC — это новый стандартный протокол, работающий по протоколу UDP и частично основанный на фирменном протоколе Google (gQUIC) [QUIC-TRANSPORT] (см. параграф 3.3.2). Транспортный уровень QUIC обеспечивает защиту конфиденциальности и целостности. Это требует создания ключей с помощью отдельного протокола согласования. Отображение QUIC на TLS 1.3 [QUIC-TLS] была задано для выполнения такого согласования.

3.3.2. Google QUIC

Google QUIC (gQUIC) — это основанный на UDP мультиплексируемый потоковый протокол, разработанный и размернутый компанией Google на основании опыта развертывания SPDY — фирменного предшественника HTTP/2. Протокол gQUIC исходно назывался QUIC, но в этом документе используется обозначение gQUIC, чтобы различать этот протокол и IETF QUIC. Запатентованный технический предшественник IETF QUIC — gQUIC исходно включает интеграцию защиты и транспорта данных приложений.

3.3.3. tcpcrypt

Протокол tcpcrypt [RFC8548] является облегченным расширением TCP для гибкого управления шифрованием. Приложения могут использовать уникальные идентификаторы сессий tcpcrypt для дополнительной аутентификации на уровне приложений. Без этой аутентификации протокол tcpcrypt уязвим для активных атак.

3.3.4. MinimaLT

MinimaLT [MinimaLT] — это основанный на UDP протокол транспортной защиты, разработанный для обеспечения конфиденциальности, взаимной аутентификации, предотвращения DoS15 и мобильности соединений. Одной из основных целей протокола является усиление имеющихся протоколов для получения данных конфигурации на стороне сервера, используемых для ускоренной организации соединения. MinimaLT использует вариант механизма контроля перегрузок TCP.

3.3.5. CurveCP

CurveCP [CurveCP] — это основанный на UDP протокол транспортной защиты, основанный в отличие от многих других протоколов защиты, полностью на алгоритмах открытых ключей. CurveCP обеспечивает гарантии для данных приложения как часть протокола.

3.4. Протоколы защиты пакетов

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

3.4.1. IPsec

IKEv2 [RFC7296] и ESP [RFC4303] совместно образуют современный стек протоколов IPsec для шифрования и аутентификации пакетов IP при создании туннелей (туннельный режим) или непосредственно в транспортных соединениях (транспортный режим). Этот стек протоколов отделяет протокол генерации ключей (IKEv2) от протокола транспортного шифрования (ESP). Каждый протокол можно применять независимо, но в этом документе они рассматриваются вместе, поскольку это встречается чаще.

3.4.2. WireGuard

WireGuard [WireGuard] — это протокол уровня IP, разработанный как альтернатива IPsec для некоторых вариантов применения. Протокол использует UDP для инкапсуляции дейтаграмм IP между партнерами. В отличии от большинства протоколов транспортной защиты, опирающихся на PKI17 для аутентификации партнера, WireGuard проверяет подлинность партнеров с помощью заранее распространенных открытых ключей, переданных по отдельному каналу (out of band), каждый из которых привязан к одному или множеству адресов IP. Кроме того, как протокол, предназначенный для VPN, WireGuard не предлагает расширяемости, согласования и криптографической ловкости (agility).

3.4.3. OpenVPN

OpenVPN [OpenVPN] — это широко распространенный протокол, разработанный как альтернатива IPsec. Основной целью протокола является организация VPN с простой настройкой и работой с разным транспортом. OpenVPN инкапсулирует пакеты IP или кадры Ethernet в защищенный туннель и может работать по протоколу UDP или TCP. Для организации ключей OpenVPN может использовать TLS в качестве протокола согласования или работать с заранее распространенными ключами.

4. Транспортные зависимости

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

4.1. Надежный транспорт для байтовых потоков

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

Протоколы защиты данных приложения (payload)

TLS.

Протоколы защиты на транспортном уровне

tcpcrypt.

4.2. Транспортировка дейтаграмм без гарантий

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

Протоколы защиты данных приложения (payload)

DTLS;

ZRTP;

SRTP.

Протоколы защиты на транспортном уровне

QUIC;

MinimaLT;

CurveCP.

Протоколы защиты пакетов

IPsec;

WireGuard;

OpenVPN.

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

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

Протоколы защиты данных приложения (payload)

DTLSпри использовании как протокола согласования для SRTP [RFC7850];

ZRTP [RFC6189];

SRTP [RFC4571][RFC3711].

Протоколы защиты пакетов

IPsec [RFC8229].

4.3. Связанные с транспортом зависимости

Один из рассматриваемых протоколов (tcpcrypt) имеет прямую зависимость от свойства транспорта, требуемого для его работы. А именно, tcpcrypt предназначен для работы на основе TCP и использует опцию TCP-ENO18 [RFC8547] для согласования поддержки протокола.

QUIC, CurveCP и MinimaLT поддерживают функции транспорта и защиты. Они зависят от работы по протоколу с кадрированием, подобному UDP, но добавляют свои уровни гарантий доставки и других транспортных услуг. Таким образом, приложение, использующее такой протокол, не может отвязать защиту от транспортной функциональности.

5. Интерфейс с приложениями

В этом разделе описаны интерфейсы, раскрываемые описанными выше протоколами защиты. Эти интерфейсы разделены на pre-connection (до соединения, настройка), connection (соединение), post-connection (после соединения) в соответствии с соглашениями [TAPS-INTERFACE] и [TAPS-ARCH].

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

5.1. Интерфейсы до соединения

Конфигурационные интерфейсы служат для настройки протоколов защиты до начала согласования или установки ключей.

Отождествления и секретные ключи (IPK19)

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

  • TLS;
  • DTLS;
  • ZRTP;
  • QUIC;
  • MinimaLT;
  • CurveCP;
  • IPsec;
  • WireGuard;
  • OpenVPN.

Поддерживаемые алгоритмы (обмен ключами, подписи, шифронаборы) (ALG)

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

  • TLS;
  • DTLS;
  • ZRTP;
  • QUIC;
  • tcpcrypt;
  • MinimaLT;
  • IPsec;
  • OpenVPN.

Расширения (EXT)

Приложение включает или настраивает расширения, согласуемые протоколом защиты, таким как ALPN20 [RFC7301].

  • TLS;
  • DTLS;
  • QUIC.

Управление сеансовым кэшем (CM21)

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

  • TLS;
  • DTLS;
  • ZRTP;
  • QUIC;
  • tcpcrypt;
  • MinimaLT.

Передача полномочий проверки подлинности (AD22)

Приложение предоставляет доступ к отдельному модулю, обеспечивающему аутентификацию, например, с помощью протокола EAP23 [RFC3748].

  • IPsec;
  • tcpcrypt.

Импорт заранее распространенных ключей (PSKI24)

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

  • TLS;
  • DTLS;
  • ZRTP;
  • QUIC;
  • tcpcrypt;
  • MinimaLT;
  • IPsec;
  • WireGuard;
  • OpenVPN.

5.2. Интерфейсы соединения

Проверка идентичности (IV25)

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

  • TLS;
  • DTLS;
  • ZRTP;
  • QUIC;
  • MinimaLT;
  • CurveCP;
  • IPsec;
  • WireGuard;
  • OpenVPN.

Проверка адреса получателя (SAV26)

Протокол согласования может взаимодействовать с транспортных протоколом или приложением для проверки адреса удаленного партнера, приславшего данные. Это включает обмен cookie для предотвращения DoS-атак. В списке не указаны протоколы, зависящие от TCP, что ведет к неявному выполнению SAV.

  • DTLS;
  • QUIC;
  • IPsec;
  • WireGuard.

5.3. Интерфейсы после соединения

Прерывание соединения (CT27)

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

  • TLS;
  • DTLS;
  • ZRTP;
  • QUIC;
  • tcpcrypt;
  • MinimaLT;
  • IPsec;
  • OpenVPN.

Обновление ключей (KU28)

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

  • TLS;
  • DTLS;
  • QUIC;
  • tcpcrypt;
  • MinimaLT;
  • IPsec.

Экспорт общего секретного ключа (SSKE29)

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

  • TLS;
  • DTLS;
  • tcpcrypt;
  • IPsec;
  • OpenVPN;
  • MinimaLT.

Завершение срока действия ключа (KE30)

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

  • IPsec.

События мобильности (ME31)

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

  • DTLS (только версия 1.3 [DTLS-1.3]);
  • QUIC;
  • MinimaLT;
  • CurveCP;
  • IPsec [RFC4555];
  • WireGuard.

5.4. Сводка интерфейсов, раскрываемых протоколами

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

Таблица 1.

Протокол

IPK

ALG

EXT

CM

AD

PSKI

IV

SAV

CT

KU

SSKE

KE

ME

TLS

+

+

+

+

+

+

+

+

+

DTLS

+

+

+

+

+

+

+

+

+

+

+

ZRTP

+

+

+

+

+

+

QUIC

+

+

+

+

+

+

+

+

+

+

tcpcrypt

+

+

+

+

+

+

+

MinimaLT

+

+

+

+

+

+

+

+

+

CurveCP

+

+

+

IPsec

+

+

+

+

+

+

+

+

+

+

+

WireGuard

+

+

+

+

+

OpenVPN

+

+

+

+

+

+

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

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

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

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

8. Вопросы приватности

Анализ влияния функций на снижение или рост защиты приватности намеренно не включен в документ. Все рассмотренные протоколы защиты в целом повышают уровень приватности за счет шифрования для снижения утечек информации. Однако то или иное количество метаданных сохраняется каждым протоколом в открытом виде. Например, сертификаты клиентов и серверов передаются в открытом виде для TLS 1.2 [RFC5246], но шифруются в TLS 1.3 [RFC8446]. Обзор свойств приватности или их отсутствия может быть дан в отдельномдокументе.

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

[ALTS] Ghali, C., Stubblefield, A., Knapp, E., Li, J., Schmidt, B., and J. Boeuf, «Application Layer Transport Security», <https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security/>.

[CurveCP] Bernstein, D., «CurveCP: Usable security for the Internet», <https://curvecp.org/>.

[DTLS-1.3] Rescorla, E., Tschofenig, H., and N. Modadugu, «The Datagram Transport Layer Security (DTLS) Protocol Version 1.3», Work in Progress, Internet-Draft, draft-ietf-tls-dtls13-38, 29 May 2020, <https://tools.ietf.org/html/draft-ietf-tls-dtls13-38>.

[MinimaLT] Petullo, W., Zhang, X., Solworth, J., Bernstein, D., and T. Lange, «MinimaLT: minimal-latency networking through better security», DOI 10.1145/2508859.2516737, <https://dl.acm.org/citation.cfm?id=2516737>.

[OpenVPN] OpenVPN, «OpenVPN cryptographic layer», <https://openvpn.net/community-resources/openvpn-cryptographic-layer/>.

[QUIC-TLS] Thomson, M. and S. Turner, «Using TLS to Secure QUIC», Work in Progress, Internet-Draft, draft-ietf-quic-tls-31, 24 September 2020, <https://tools.ietf.org/html/draft-ietf-quic-tls-31>.

[QUIC-TRANSPORT] Iyengar, J. and M. Thomson, «QUIC: A UDP-Based Multiplexed and Secure Transport», Work in Progress, Internet-Draft, draft-ietf-quic-transport-31, 24 September 2020, <https://tools.ietf.org/html/draft-ietf-quic-transport-31>.

[RFC2385] Heffernan, A., «Protection of BGP Sessions via the TCP MD5 Signature Option», RFC 2385, DOI 10.17487/RFC2385, August 1998, <https://www.rfc-editor.org/info/rfc2385>.

[RFC2890] Dommety, G., «Key and Sequence Number Extensions to GRE», RFC 2890, DOI 10.17487/RFC2890, September 2000, <https://www.rfc-editor.org/info/rfc2890>.

[RFC3711] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and K. Norrman, «The Secure Real-time Transport Protocol (SRTP)», RFC 3711, DOI 10.17487/RFC3711, March 2004, <https://www.rfc-editor.org/info/rfc3711>.

[RFC3748] Aboba, B., Blunk, L., Vollbrecht, J., Carlson, J., and H. Levkowetz, Ed., «Extensible Authentication Protocol (EAP)», RFC 3748, DOI 10.17487/RFC3748, June 2004, <https://www.rfc-editor.org/info/rfc3748>.

[RFC4253] Ylonen, T. and C. Lonvick, Ed., «The Secure Shell (SSH) Transport Layer Protocol», RFC 4253, DOI 10.17487/RFC4253, January 2006, <https://www.rfc-editor.org/info/rfc4253>.

[RFC4302] Kent, S., «IP Authentication Header», RFC 4302, DOI 10.17487/RFC4302, December 2005, <https://www.rfc-editor.org/info/rfc4302>. [RFC4303] Kent, S., «IP Encapsulating Security Payload (ESP)», RFC 4303, DOI 10.17487/RFC4303, December 2005, <https://www.rfc-editor.org/info/rfc4303>.

[RFC4555] Eronen, P., «IKEv2 Mobility and Multihoming Protocol (MOBIKE)», RFC 4555, DOI 10.17487/RFC4555, June 2006, <https://www.rfc-editor.org/info/rfc4555>.

[RFC4571] Lazzaro, J., «Framing Real-time Transport Protocol (RTP) and RTP Control Protocol (RTCP) Packets over Connection-Oriented Transport», RFC 4571, DOI 10.17487/RFC4571, July 2006, <https://www.rfc-editor.org/info/rfc4571>.

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

[RFC5641] McGill, N. and C. Pignataro, «Layer 2 Tunneling Protocol Version 3 (L2TPv3) Extended Circuit Status Values», RFC 5641, DOI 10.17487/RFC5641, August 2009, <https://www.rfc-editor.org/info/rfc5641>.

[RFC5764] McGrew, D. and E. Rescorla, «Datagram Transport Layer Security (DTLS) Extension to Establish Keys for the Secure Real-time Transport Protocol (SRTP)», RFC 5764, DOI 10.17487/RFC5764, May 2010, <https://www.rfc-editor.org/info/rfc5764>.

[RFC5925] Touch, J., Mankin, A., and R. Bonica, «The TCP Authentication Option», RFC 5925, DOI 10.17487/RFC5925, June 2010, <https://www.rfc-editor.org/info/rfc5925>.

[RFC6189] Zimmermann, P., Johnston, A., Ed., and J. Callas, «ZRTP: Media Path Key Agreement for Unicast Secure RTP», RFC 6189, DOI 10.17487/RFC6189, April 2011, <https://www.rfc-editor.org/info/rfc6189>.

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

[RFC7296] Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. Kivinen, «Internet Key Exchange Protocol Version 2 (IKEv2)», STD 79, RFC 7296, DOI 10.17487/RFC7296, October 2014, <https://www.rfc-editor.org/info/rfc7296>.

[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, «Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension», RFC 7301, DOI 10.17487/RFC7301, July 2014, <https://www.rfc-editor.org/info/rfc7301>.

[RFC7850] Nandakumar, S., «Registering Values of the SDP ‘proto’ Field for Transporting RTP Media over TCP under Various RTP Profiles», RFC 7850, DOI 10.17487/RFC7850, April 2016, <https://www.rfc-editor.org/info/rfc7850>.

[RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, Ed., «Services Provided by IETF Transport Protocols and Congestion Control Mechanisms», RFC 8095, DOI 10.17487/RFC8095, March 2017, <https://www.rfc-editor.org/info/rfc8095>.

[RFC8229] Pauly, T., Touati, S., and R. Mantha, «TCP Encapsulation of IKE and IPsec Packets», RFC 8229, DOI 10.17487/RFC8229, August 2017, <https://www.rfc-editor.org/info/rfc8229>.

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

[RFC8547] Bittau, A., Giffin, D., Handley, M., Mazieres, D., and E. Smith, «TCP-ENO: Encryption Negotiation Option», RFC 8547, DOI 10.17487/RFC8547, May 2019, <https://www.rfc-editor.org/info/rfc8547>.

[RFC8548] Bittau, A., Giffin, D., Handley, M., Mazieres, D., Slack, Q., and E. Smith, «Cryptographic Protection of TCP Streams (tcpcrypt)», RFC 8548, DOI 10.17487/RFC8548, May 2019, <https://www.rfc-editor.org/info/rfc8548>.

[TAPS-ARCH] Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., Perkins, C., Tiesel, P. S., and C. A. Wood, «An Architecture for Transport Services», Work in Progress, Internet-Draft, draft-ietf-taps-arch-08, 13 July 2020, <https://tools.ietf.org/html/draft-ietf-taps-arch-08>.

[TAPS-INTERFACE] Trammell, B., Welzl, M., Enghardt, T., Fairhurst, G., Kuehlewind, M., Perkins, C., Tiesel, P. S., Wood, C. A., and T. Pauly, «An Abstract Application Layer Interface to Transport Services», Work in Progress, Internet-Draft, draft-ietf-taps-interface-09, 27 July 2020, <https://tools.ietf.org/html/draft-ietf-taps-interface-09>.

[WireGuard] Donenfeld, J., «WireGuard: Next Generation Kernel Network Tunnel», <https://www.wireguard.com/papers/wireguard.pdf>.

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

Авторы благодарны Bob Bradley, Frederic Jacobs, Mirja Kühlewind, Yannick Sierra, Brian Trammell, Magnus Westerlund за их вклад и отклики на этот документ.

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

Theresa Enghardt

TU Berlin

Marchstr. 23

10587 Berlin

Germany

Email: ietf@tenghardt.net

Tommy Pauly

Apple Inc.

One Apple Park Way

Cupertino, California 95014

United States of America

Email: tpauly@apple.com

Colin Perkins

University of Glasgow

School of Computing Science

Glasgow

G12 8QQ

United Kingdom

Email: csp@csperkins.org

Kyle Rose

Akamai Technologies, Inc.

150 Broadway

Cambridge, MA 02144

United States of America

Email: krose@krose.org

Christopher A. Wood

Cloudflare

101 Townsend St

San Francisco,

United States of America

Email: caw@heapingbits.net

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

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

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Transport Layer Security — защита транспортного уровня.

4Datagram Transport Layer Security — защита транспортного уровня для дейтаграмм.

5Internet Protocol Security — защита протокола IP.

6Secure Real-time Transport Protocol — защищенный транспортный протокол в реальном масштабе времени.

7Layer 2 Tunneling Protocol — протокол туннелирования на канальном уровне.

8Application Layer Transport Security — протокол защиты транспорта прикладного уровня.

9TCP Authentication Option — опция аутентификации TCP.

10Authentication Header — заголовок аутентификации.

11Message Authentication Code — код аутентификации сообщения.

12Encapsulating Security Payload — защищенные данные инкапсуляции.

13Internet Key Exchange Protocol Version 2 — протокол обмена ключами в Internet, версия 2.

14RTP control protocol — протокол управления RTP.

15Denial-of-Service — отказ в обслуживании. Прим. перев.

16Virtual Private Network — виртуальная частная сеть.

17Public Key Infrastructure — инфраструктура открытых ключей.

18TCP Encryption Negotiation Option — опция согласования шифрования TCP.

19Identities and Private Keys.

20Application-Layer Protocol Negotiation — протокол согласования на уровне приложений.

21Cache Management.

22Authentication Delegation

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

24Pre-Shared Key Import.

25Identity Validation.

26Source Address Validation.

27Connection Termination.

28Key Update.

29Shared Secret Key Export.

30Key Expiration.

31Mobility Events.

Рубрика: RFC | Комментарии к записи RFC 8922 A Survey of the Interaction between Security Protocols and Transport Services отключены

RFC 8923 A Minimal Set of Transport Services for End Systems

Internet Engineering Task Force (IETF)                          M. Welzl
Request for Comments: 8923                                   S. Gjessing
Category: Informational                               University of Oslo
ISSN: 2070-1721                                             October 2020

A Minimal Set of Transport Services for End Systems

Минимальный набор транспортных служб для конечной системы

PDF

Аннотация

Этот документ рекомендует минимальный набор транспортных служб (Transport Service), поддерживаемых конечной системой, и дает рекомендации по выбору доступных механизмов и протоколов. Документ основан на наборе транспортных функций из RFC 8303.

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

Документ не содержит какой-либо спецификации (Internet Standards Track) и публикуется с информационными целями.

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

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

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

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

В настоящее время набор транспортных служб, используемых большинством приложений, основан на TCP и UDP (и вышележащих протоколах на исх основе), что ограничивает для сетевого стека возможности использовать свойства других транспортных протоколов. Например, если протокол поддерживает доставку пакетов с нарушением порядка, а приложение предполагает упорядоченность потока байтов в сети, сетевой стек не сможет сразу же доставить сообщение, полученное с нарушением порядка, и это вступит в конфликт с базовым допущением приложения. Результатом этого станет неоправданная задержка из-за блокировки HOL3.

Раскрывая транспортные службы нескольких протоколов, транспортная система позволяет приложениям использовать эти службы без статической привязки к определенному транспортному протоколу. Первый шаг к разработке таких систем был предложен в [RFC8095], где было исследовано множество транспортных протоколов, а также в [RFC8303] и [RFC8304], указавших конкретные свойства транспорта, которые раскрываются приложениям протоколами TCP, Multipath TCP (MPTCP), UDP(-Lite), SCTP4, а также механизмом контроля перегрузок LEDBAT5. Механизм LEDBAT был включен в этот список единственным среди механизмов контроля перегрузок, поскольку предоставляемые им услуги существенно отличаются от других механизмов этого типа. Этот документ основан на упомянутых работах и использует принятую в них терминологию (приведена ниже). Поскольку рассматриваемые транспортные протоколы совместно охватывают широкий спектр транспортных функций, есть основания надеяться, что предлагаемый набор (о приведшие к его выбору рассуждения) будут применимы ко многим аспектам других транспортных протоколов, которые смогут использоваться в современных и будущих решениях.

Отделив приложения от транспортных протоколов, транспортная система обеспечивает иной уровень абстракции, нежели интерфейс сокетов Berkeley [POSIX]. Как и в языках программирования, повышение уровня абстракции обеспечивает большую свободу автоматизации под интерфейсом, но отнимает часть контроля у программиста приложений. Это компромисс, с которым сталкивается разработчик транспортной системы, и в данном документе приведены рекомендации для этого уровня абстракции. Некоторые транспортные свойства в настоящее время редко включаются в API, однако их нужно предлагать, иначе они никогда не будут использоваться. Другие транспортные функции предлагаются API описываемых здесь протоколов, но если их не раскрывать в API, это даст больше свободы при автоматизации использования протокола в транспортной системе. Представленный здесь минимальный набор является попыткой найти компромисс, который можно рекомендовать для реализации транспортных систем на основе функций, рассматриваемых в [RFC8303].

Современные приложения используют множество API. Хотя этот документ предназначен для включения в API, разработанный группой Transport Services (TAPS) [TAPS-INTERFACE], большинства наиболее важных транспортных функций, представленный здесь «минимальный набор» должен включаться во все сетевые API, для обеспечения возможности использовать базовую функциональность. Например, это может не помочь приложению, взаимодействующему с библиотекой, которая обеспечивает свой коммуникационный интерфейс, если базовый Berkeley Sockets API расширен для поддержки неупорядоченной доставки, но библиотека раскрывает лишь упорядоченный поток байтов. Для работы Berkeley Sockets API и библиотека должны раскрыть транспортное свойство неупорядоченной доставки (или использовать это свойство без его раскрытия на основе информации о приложении, но это не подходит в общем случае). Точно так же транспортные протоколы, такие как SCTP, предлагают многопотоковую передачу, которая не может использоваться, например, для приоритизации сообщений в разных потоках, пока приложения не обмениваются значениями приоритета, которые следует применять, и группой соединений для этого. В большинстве случаев для максимальной гибкости и эффективности лучшим решением для библиотеки будет раскрытие по меньшей мере тех возможностей, которые включены здесь в «минимальный набор».

«Минимальный набор» можно реализовать «односторонне» на основе TCP. Это означает, что транспортная система на стороне отправителя может взаимодействовать со стандартным получателем TCP, а на стороне получателя — со стандартным отправителем TCP. С некоторыми ограничениями возможна реализация минимального набора на одной стороне по протоколу UDP. Хотя возможность реализации на одной стороне может быть полезна при развертывании, за это приходится платить ограничением набора услуг, которые могут быть предоставлены TCP (с большими ограничениями и UDP). Таким образом, минимальный набор применим для многих, но не для всех приложений, поскольку некоторые прикладные протоколы предъявляют требования, не выполнимые минимальным набором.

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

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

Transport Feature — транспортная функция (свойство)

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

Transport Service — транспортный сервис (служба)

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

Transport Protocol — транспортный протокол

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

Application — приложение

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

Application-specific knowledge

Информация, которую имеет лишь приложение.

End system — конечная система

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

Connection — соединение

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

Connection Group — группа соединений

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

Socket — сокет

Комбинация IP-адреса и номера порта у получателя.

Кроме того, в этом документе применяется термин UDP(-Lite) при обсуждении транспортных свойств, присущих UDP и UDP-Lite. Точно так же TCP обозначает TCP и MPTCP.

3. Определение минимального набора

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

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

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

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

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

  1. Классификация (Приложение A). Представлено надмножество транспортных свойств из [RFC8303] и эти функции разделены на функциональные, оптимизационные и автоматизируемые.

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

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

  4. Построение (раздел 6). На основе сокращения и обсуждения транспортных свойств определяется их минимальный набор.

Следуя [RFC8303] и сохраняя принятую там терминологию транспортные функции поделены на две основных группы.

  1. Связанные с соединением транспортные функции:

    • организация;

    • доступность;

    • поддержка;

    • завершение.

  2. Связанные с передачей данных транспортные функции:

    • передача данных;

    • прием данных;

    • ошибки.

4. Сокращенный набор транспортных функций

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

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

Приведенный ниже список содержит транспортные функции из Приложения A, сокращенные с использованием приведенных правил. Выведенный в документе «минимальный набор» может быть реализован на одной стороне по протоколу TCP и с некоторыми ограничениями — UDP. В списке транспортные функции помечены T:, если возможна реализация на основе TCP, U: — для UDP и T,U: — когда возможна реализация на основе обоих протоколов.

4.1. Связанные с соединением транспортные функции

Организация

  • T,U: соединение;

  • T,U: задание числа попыток и/или тайм-аута для первого сообщения организации соединения;

  • T,U: отключение MPTCP;

  • T: настройка аутентификации;

  • T: отправка сообщения для гарантированной передачи (возможно неоднократная) до соединения;

  • T: отправка сообщения для гарантированной передачи при организации соединения.

Доступность

  • T,U: прослушивание;

  • T,U: отключение MPTCP;

  • T: настройка аутентификации.

Поддержка

  • T: смена тайм-аута разрыва соединения (ограничение числа повторов или время);

  • T: предложенный партнеру тайм-аут;

  • T,U: отключение алгоритма Nagle;

  • T,U: уведомление об избыточных повторах (упреждение перед достижением порога разрыва);

  • T,U: указание поля DSCP;

  • T,U: уведомление о получении сообщения ICMP об ошибке;

  • T: смена параметров аутентификации;

  • T: получение данных аутентификации;

  • T,U: установка значение Cookie;

  • T,U: выбор планировщика для управления потоками в ассоциации;

  • T,U: настройка приоритета или веса для палнировщика;

  • T,U: отключение контрольных сумм при передаче;

  • T,U: запрет требования контрольной суммы на приеме;

  • T,U: задание покрытия контрольной суммы, используемой отправителем;

  • T,U: задание минимального покрытия контрольной суммы, требуемого получателем;

  • T,U: задание поля DF;

  • T,U: получение максимального размера транспортного сообщения, которое может быть передано без фрагментации IP, от настроенного интерфейса;

  • T,U: получение максимального размера транспортного сообщения, которое может быть принято, от настроенного интерфейса;

  • T,U: получение поля ECN;

  • T,U: включение и настройка LEDBAT6.

Завершение

  • T: закрытие после гарантированной доставки всех оставшихся данных, вызывающее событие для информировании приложения на другой стороне;

  • T: разрыв без доставки оставшихся данных, вызывающий информирование приложения на другой стороне;

  • T,U: разрыв без доставки оставшихся данных и без информирования приложения на другой стороне;

  • T,U: тайм-аут, когда данные не могут быть доставлены слишком долго.

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

4.2.1. Передача данных

  • T: гарантированная доставка данных с контролем перегрузок;

  • T: гарантированная доставка сообщения с контролем перегрузок;

  • T,U: доставка данных без гарантии;

  • T: настраиваемые гарантии доставки сообщений;

  • T: упорядоченная доставка сообщений (может быть медленней неупорядоченной);

  • T,U: неупорядоченная доставка сообщений (потенциально быстрее упорядоченной);

  • T,U: запрос передачи сообщений без группировки (bundle);

  • T: задание идентификатора ключа для проверки подлинности сообщений;

  • T,U: запрос передачи подтвеждений без задержки (SACK).

4.2.2. Прием данных

  • T,U: получение данных (без разграничения сообщений);

  • U: получение сообщений;

  • T,U: информирование о частичной доставке сообщения.

4.2.3. Ошибки

В этом параграфе указаны отказы при передаче, связанные с конкретными вызовами категории «передача данных» (A.2.1. Передача).

  • T,U: уведомление об отказе при передаче;

  • T,U: уведомление о том, что стек больше не имеет пользовательских данных для передачи;

  • T,U: уведомление получателя о прерывании частичной доставки сообщения.

5. Обсуждение

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

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

5.1. Передача сообщений, прием байтов

Для реализации транспортной системы на основе TCP имеется несколько транспортных функций, относящихся к передаче, и лишь одна функция, связанная с приемом — получение сообщений без их разграничения (а также, как ни странно, информирование о частичной доставке сообщения). Примечательно, что транспортная функция приема сообщения является единственной не автоматизируемой функцией UDP(-Lite), для которой невозможна реализация на основе TCP.

Для поддержки семантики получателя TCP определен «кадрированный приложением поток байтов (Application- Framed Byte Stream или байтовый поток AFra). Байтовые потоки AFra позволяют отправителям работать с сообщениями при минимальном изменении API сокета TCP. В частности, на приемной стороне изменений просто не требуется и данные можно принимать через обычный соект TCP.

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

Например, если приложение запрашивает передачу сообщений постоянного размера 100 байтов с частичными гарантиями, принимающему приложению нужно быть готовым к приему 100-байтовых блоков. Приложению также нужно быть готовым к отсутствию некоторых блоков (например, в результате применения SCTP с настраиваемыми гарантиями). При использовании TCP пропусков блоков не будет, но это верно и для приложения, а возможная задержка из-за повтора приемлема в модели обслуживания по возможности (best-effort, См. параграф 3.5 в [RFC7305]). Тем не менее, принимающее приложение будет делить поток байтов на 100-байтовые блоки.

Отметим, что такое использование сообщений не требует одинакового их размера. Многие прикладные протоколы используют формат TLV (Type-Length-Value — тип, размер, значение), например, определяя заголовки с полем размера или используя методы заполнения байтов, такие как COBS (Consistent Overhead Byte Stuffing) [COBS]. Если приложению нужны номера сообщений, например для восстановления порядка, это тоже должно указывать само приложение, поскольку транспортные свойства SCTP, связанные с порядковыми номерами, не включаются в минимальный набор (в интересах применения TCP).

5.2. Планировщики потоков без потока

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

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

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

5.3. Упреждающая передача данных

Есть две транспортных функции, связанные с упреждающей передачей сообщений (возможно многократной) — TCP Fast Open [RFC7413] и «Передача сообщения для гарантированной доставки в процессе организации соединения», которая относится к способности SCTP передавать данные вместе с блоком COOKIE-Echo. Даже без TCP Fast Open протокол TCP может передавать данные в процессе согласования вместе с пакетом SYN, однако получатель таких данных может не передать их приложению, пока согласование не завершится. В разных вариантах TCP Fast Open эти данные не разграничены как сообщение протоколом TCP (не представляются сообщением). Эта функциональность обычно доступна в TCP и поддерживается несколькими реализациями, хотя спецификация TCP не указывает способ передачи таких данных приложениям.

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

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

5.4. Работа отправителя «всухую»

Транспортная функция «уведомления отсутствия в стеке данных для передачи» относится к уведомлению SCTP SENDER DRY. Такие уведомления могут в принципе использоваться для предотвращения избыточно больших буферов передачи, сохраняя гарантию того, что транспортный отправитель всегда имеет данные для передачи. Это может обеспечивать преимущества некоторым приложениям [WWDC2015]. Однако SENDER DRY на деле означает, что весь буфер передачи (включая неотправленные и неподтвержденные данные) пуст, т. е. это уведомляет отправителя, но уже слишком поздно, когда у транспортного протокола уже нет данных для передачи. Некоторые современные реализации TCP включают отсутствующую в спецификации опцию сокета TCP_NOTSENT_LOWAT, которая предложена в [WWDC2015] и ограничивает объем неотправленных данных, которые TCP может сохранять в буфере сокета. Это позволяет задать уровень заполнения буфера, при котором сокет открывается для записи, без ожидания опустошения буфера.

SCTP позволяет также настроить размер буфера на стороне отправителя — автоматизируемая транспортная функция «настроить размер буфера передачи» обеспечивает это, но только для всего буфера, который включает неотправленные и неподтвержденные данные. SCTP не позволяет настраивать эти части раздельно. Поэтому для транспортной системы имеет смысл разрешать однотипный доступ в TCP_NOTSENT_LOWAT и уведомлениями SENDER DRY.

5.5. Профиль производительности

Транспортные функции включают:

  • запрет алгоритма Nagle;

  • включение и настройку LEDBAT;

  • указание поля DSCP.

Все они связаны с приложениями класса QoS, такими как низкая задержка или сборка мусора (scavenger). В интересах гибкости транспортной системы они могут предлагаться в однородной, более абстрактной форме, когда транспортная система может, например, решить самостоятельно как использовать контроль перегрузок в стиле LEDBAT и выбрать определенные значения DSCP, а приложение будет лишь задавать общий профиль производительности (описание способа ее получения). Потребность в «минимально возможной задержке за счет издержек» можно тогда транслировать в автоматическое отключение алгоритма Nagle.

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

5.6. Защита

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

Защита рассматривается в отдельном документе [RFC8922]. Представленный здесь минимальный набор включает все связанные с защитой транспортные функции из Приложения A — настраиваемую аутентификацию, смену параметров аутентификации, получение данных аутентификации, установку значения Cookie life, а также задание ключа для аутентификации сообщения. Включены также транспортные функции, не указанные в приложении A, такие как приватность содержимого на промежуточных устройствах.

5.7. Размер пакета

UDP(-Lite) включает транспортную функцию задания поля DF. Это вызывает сообщения об ошибке в случае отправки сообщений размером больше Path MTU, которые нужны приложению на основе UDP для реализации механизма Path MTU Discovery (функция, которую приложения на базе UDP должны выполнять самостоятельно). Транспортная функция определения максимального размера транспортного сообщения, которое можно передать в пакете IP без фрагментации с заданного интерфейса, дает верхний предел для Path MTU (без заголовков) и может поэтому реализовать Path MTU Discovery более эффективно.

6. Минимальный набор транспортных свойств

На основе классификации, сокращения и обсуждения в разделе 3 здесь предлагается минимальный набор транспортных функций, которые конечным системам следует предлагать. Любая конфигурация на основе предлагаемого здесь минимального набора функций может быть реализована по протоколу TCP, а также обеспечивает гибкость транспортной системы в части выбора иного транспорта, если он доступен. В этом разделе термин не-UDP указывает элементы системы, которые не могут быть реализованы по протоколу UDP, тогда как элементы без такой пометки могут работать на основе транспорта UDP.

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

Как в разделах 3, 4 и [RFC8303] минимальный набор транспортных функций разделен на категории, связанные с 1) соединениями (организация, доступность, поддержка, завершение) и 2) передачей данных (отправка данных, прием данных, ошибки). Здесь основное внимание уделено соединениям, которые транспортные системы в абстрактной форме предлагают приложениям, в отличие от соединений транспортных протоколов, используемых транспортной системой.

6.1. Организация, доступность, завершение

Сначала должно быть «организовано» соединение, чтобы можно было выполнить ту или иную начальную настройку, прежде чем транспортная система сможет организовать пассивное или активное взаимодействие с удаленной конечной системой. При настройке вновь созданного соединения приложение может отказаться от использования MPTCP. Кроме того, все параметры конфигурации из параграфа 6.2 могут применяться изначально, хотя некоторые из них начнут работать лишь после организации соединения с выбранным транспортным протоколом. Ранняя настройка соединения помогает транспортной системе принять верное решение. Например, данные о группировке могут повлиять на решение вопроса о реализации соединения в форме потока многопоточного протокола в имеющейся ассоциации.

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

      +----------------------------------------------------------+
      | Потребуется ли предлагать что-либо из перечисленного?    |
      | * Гарантии доставки данных                               |
      | * Уведомление партнера о закрытии или прерывании         |
      | * Сохранение порядка данных                              |
      +----------------------------------------------------------+
                |                                    |
                |Да                                  |Нет
                | (Можно применять)                  | (Можно применять 
                |  SCTP или TCP)                     |  все протоколы)
                V                                    V
+--------------------------------------+ +-----------------------------+
| Полезно ли приложению что-либо       | | Полезно ли приложению что-то|
| из перечисленного?                   | | из перечисленного?          |
| * Выбор планировщика для работы с    | | * Задание покрытия контрол. |
|   соединениями в группе с            | |   суммы у отправителя       |
|   возможностью задать приоритет или  | | * Задание минимального      |
|   вес на уровне соединения           | |   покрытия контрольн. суммы,|
| * Настраиваемые гарантии для сообщен.| |   требуемого получателем    |
| * Неупорядоченная доставка сообщений | +-----------------------------+
| * Запрос передачи подтверждений      |         |             |
|   (SACK) без задержки                |         |Да           |Нет
+--------------------------------------+         |             |
          |                |                     |             |
          |Да              |Нет                  |             |
          V                |                     V             V
        Предпочтителен     |              Предпочтителен  Предпочтителен
        SCTP.              |                UDP-Lite.       UDP.
                           V
+------------------------------------------------------+
| Полезно ли приложению что-либо из перечисленного?    |
| * Передача сообщения (возможно неоднократная)        |
|   для гарантированной доставки до организ. соединения|
| * Предложение тайм-аута партнеру                     |
| * Уведомление об избыточных повторах (заранее до     |
|   достижения порога разрыва)                         |
| * Уведомление о прибытии сообщения ICMP об ошибке    |
+------------------------------------------------------+
          |                            |
          |Да                          |Нет
          V                            V
   Предпочтителен TCP.            SCTP и TCP равноценны.


Отметим, что это дерево решений не является оптимальным для всех случаев. Например, если приложение хочет использовать задание области покрытия контрольной суммы отправителем, которое предлагает лишь UDP-Lite, и настройку приоритета или веса для планировщика, которая доступна только в SCTP, выбор в соответствии с представленным деревом всегда приводит к UDP-Lite, делая невозможным использование планировщиков SCTP с планировщиками по приоритету внутри группы соединений. Есть и другие факторы, способные влиять на выбор протокола (за или против), например уровень распространенности, возможность работы через NAT и т. п. Разработчикам следует принимать во внимание все компромиссные требования, указанные в параграфе 4.1, при выборе способа инициализации соединения.

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

Reliability (надежность)

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

Checksum coverage (покрытие контрольной суммы)

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

Configure message priority (настраиваемый приоритет сообщений)

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

Early message timeout notifications (упреждающее информирование о тайм-ауте)

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

После организации соединения для него можно запросить максимальный объем данных, для которых приложение может ожидать гарантированную передачу до или в процессе организации транспортного соединения (с возможностью указать 0), как указано в параграфе 6.2.1. Приложение также может передавать в соединение сообщения для гарантированной доставки до или в процессе организации соединения (не-UDP), после чего транспортная система будет передавать их как можно раньше. Приложение может облегчить отправку сообщения как можно раньше, пометив его как «идемпотентное» (6.3.1. Передача) и в этом случае принимающая сторона должна быть гтова к возможности получения нескольких копий сообщения (поскольку идемпотентные сообщения передаются с гарантиев, запрос идемпотентности не требуется для систем, поддерживающих UDP).

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

Транспортная система может активно закрыть соединение, т. е. прервать его после гарантированной доставки партнеру всех оставшихся данных (если раньше была запрошена гарантированная доставка, не UDP) и в этом случае партнер уведомляется о закрытии соединения. Кроме того, соединение может быть разорвано без доставки партнеру оставшихся данных. В случае запрошенной ранее гарантированной или почти гарантированной доставки (не-UDP) партнер уведомляется о разрыве соединения. Может быть задан тайм-аут для разрыва соединения с случае, когда данные не доставляются слишком долго (не-UDP), однако при разрыве по тайм-ауту партнер не уведомляется о разрыве соединения. Поскольку полуоткрытые соединения не поддерживаются, при получении реализующим транспортную систему хостом уведомления от партнера о закрытии или разрыве соединения (не-UDP) может оказаться невозможным прочтение остающихся данных. Это значит, что неподтвержденные данные в буфере передачи транспортной системы могут быть отброшены из буфера при получении от партнера уведомления close или abort.

6.2. Поддержка

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

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

6.2.1. Группы соединений

Перечисленные ниже транспортные свойства и уведомления (некоторые напрямую из раздела 4, иные новые или измененные на основе раздела 5) автоматически применяются ко всем сгруппированным соединениям.

Настройка тайм-аута (не-UDP)

Это может выполняться со следующими параметрами:

  • значение тайм-аута для разрыва соединения (в секундах);
  • предлагаемое партнеру (если возможно) значение тайм-аута (в секундах);
  • число повторов, по достижении которого приложение следует информировать об избыточных повторах (Excessive Retransmissions).

Настройка важности (срочности)

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

  • Число для идентификации планировщика, который следует использовать для работы с соединениями внутри группы (без гарантий). Планировщики определены в [RFC8260].
  • Номер «профиля производительности» для указания способа использования приложением доступной производительности. Вариантами могут быть «наименьшая возможная задержка за счет накладных расходов» (отключает любой алгоритм в стиле Nagle), «сборка мусора» (scavenger) или иные значения, помогающие определить DSCP для соединения.
  • Предельный размер буфера (в байтах). Приложение может уведомляться, когда у отправителя в буфере объем данных меньше установленного предела. Уведомления не гарантируются и транспортная система не обязана поддерживать предельный размер буфера больше 0. Отметим, что этот предел и уведомления следует применять для буферов всей транспортной системы, т. е. для любых возможных буферов, которые сама транспортная система может применять «поверх» транспортного буфера передачи.

В соответствии с параграфом 5.7 можно запросить перечисленные ниже свойства.

  • Максимальный размер сообщений, которые можно передать без фрагменттации через настроенный интерфейс. Транспортная система не обязана предоставлять это свойство и может возвращать ошибку (not available). Это свойство может помочь приложениям, реализующим Path MTU Discovery.

  • Максимальный размер транспортного сообщения, которое можно передать (в байтах). Независимо от фрагментации имеется предельный размер для сообщений, обслуживаемых SCTP или UDP(-Lite). Поскольку предоставляемые транспортной системой услуги не зависят от транспортного протокола, система должна позволять приложениям запрашивать это значение — максимальный размер сообщения в кадрированном приложением потоке байтов (AFra, параграф 5.1). Система может возвращать ошибку (not available), если данные не разграничиваются.

  • Максимальный размер транспортного сообщения, которое может быть принято от настроенного интерфейса (в байтах) или not available.

  • Максимальный объем данных, которые можно передать до организации соединения (в байтах).

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

Excessive Retransmissions — избыточные повторы передачи

Достигнуто настроенное (или принятое по умолчанию) число повторов передачи, что является упреждающим разрыв соединения уведомлением.

ICMP Arrival — прибытие ICMP (параметром является сообщение ICMP)

Прибыл пакет ICMP, содержащий сообщение ICMP.

ECN Arrival — прибытие ECN (параметром является значение ECN)

Прибыл пакет с явным уведомлением о перегрузке (Explicit Congestion Notification или ECN). Это может быть полезно для приложений с контролем перегрузки.

Timeout — тайм-аут (параметром служит число секунд)

Данные не могут быть доставлены в течение s секунд.

Drain:

Буфер передачи был опустошен ниже заданного предела или полностью. Это базовое уведомление, которое пытается включить унифицированный доступ к TCP_NOTSENT_LOWAT, а также уведомлению SENDER DRY (как описано в параграфе 5.4, SCTP SENDER DRY является особым случаем, где порог для неотправленных данных равен 0 и в буфере передачи не осталось неподтвержденных данных).

6.2.2. Отдельные соединения

Настройка приоритета или веса для планировщика в соответствии с [RFC8260].

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

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

  • Желаемая область покрытия контрольной суммой (в байтах) при передаче.

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

  • Требуемая минимальная область покрытия контрольной суммой (в байтах) при получении.

6.3. Обмен данными

6.3.1. Передача

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

Reliability — гарантия доставки

Этот параметр служит для указания выбора — полностью надежная доставка с контролем перегрузки (не-UDP), доставка без гарантий и контроля перегрузки, доставка без гарантий с контролем перегрузки (не-UDP), частичные гарантии с контролем перегрузки (см. [RFC3758] и [RFC7496], где приведено описание частичных гарантий) (не-UDP). Два последних варианта транспортная система не обязана предлагать и это может приводить к полной гарантии. Отметим, что приложению, передающему данные без гарантий и контроля перегрузок, следует самому контролировать перегрузки в соответствии с [RFC8085].

Ordered — упорядоченность (не-UDP)

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

Bundle — связка (группировка)

Логическое значение, разрешающее (true) или запрещающее (false) группировать сообщения. Без гарантий.

DelAck — задержка подтверждения

Логическое значение, позволяющее приложению запросить (false) у партнера отправку подтверждения доставки этого сообщения без задержки.

Fragment — фрагментирование

Логическое значение, разрешающее (true) или запрещающее (false) фрагментировать сообщения на уровне IP. Без гарантий.

Idempotent — идемпотентность (не-UDP)

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

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

6.3.2. Прием

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

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

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

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

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

Аутентификация, защита конфиденциальности и целостности указаны как транспортные свойства в [RFC8095]. Зачастую эти свойства обеспечиваются протоколом или уровнем над транспортным протоколом. Ни один из полнофункциональных стандартных протоколов из [RFC8303], на которых базируется этот документ, не поддерживает все эти транспортные функции, поэтому они не рассматриваются в данном документе, за исключением естественных функций аутентификации в TCP и SCTP, к которым применимо рассмотрение вопросов безопасности в [RFC5925] и [RFC4895]. Минимальные требования к защищенной транспортной системе рассмотрены в отдельном документе [RFC8922].

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

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

[RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, Ed., «Services Provided by IETF Transport Protocols and Congestion Control Mechanisms», RFC 8095, DOI 10.17487/RFC8095, March 2017, <https://www.rfc-editor.org/info/rfc8095>.

[RFC8303] Welzl, M., Tuexen, M., and N. Khademi, «On the Usage of Transport Features Provided by IETF Transport Protocols», RFC 8303, DOI 10.17487/RFC8303, February 2018, <https://www.rfc-editor.org/info/rfc8303>.

[RFC8922] Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. Wood, «A Survey of the Interaction between Security Protocols and Transport Services», RFC 8922, DOI 10.17487/RFC8922, October 2020, <https://www.rfc-editor.org/info/rfc8922>.

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

[COBS] Cheshire, S. and M. Baker, «Consistent overhead byte stuffing», IEEE/ACM Transactions on Networking, Volume 7, Issue 2, DOI 10.1109/90.769765, April 1999, <https://doi.org/10.1109/90.769765>.

[POSIX] The Open Group, «IEEE Standard for Information Technology—Portable Operating System Interface (POSIX(R)) Base Specifications, Issue 7», (Revision of IEEE Std 1003.1-2008), IEEE Std 1003.1-2017, January 2018, <https://www.opengroup.org/onlinepubs/9699919799/functions/contents.html>.

[RFC3758] Stewart, R., Ramalho, M., Xie, Q., Tuexen, M., and P. Conrad, «Stream Control Transmission Protocol (SCTP) Partial Reliability Extension», RFC 3758, DOI 10.17487/RFC3758, May 2004, <https://www.rfc-editor.org/info/rfc3758>.

[RFC4895] Tuexen, M., Stewart, R., Lei, P., and E. Rescorla, «Authenticated Chunks for the Stream Control Transmission Protocol (SCTP)», RFC 4895, DOI 10.17487/RFC4895, August 2007, <https://www.rfc-editor.org/info/rfc4895>.

[RFC4987] Eddy, W., «TCP SYN Flooding Attacks and Common Mitigations», RFC 4987, DOI 10.17487/RFC4987, August 2007, <https://www.rfc-editor.org/info/rfc4987>.

[RFC5925] Touch, J., Mankin, A., and R. Bonica, «The TCP Authentication Option», RFC 5925, DOI 10.17487/RFC5925, June 2010, <https://www.rfc-editor.org/info/rfc5925>.

[RFC6897] Scharf, M. and A. Ford, «Multipath TCP (MPTCP) Application Interface Considerations», RFC 6897, DOI 10.17487/RFC6897, March 2013, <https://www.rfc-editor.org/info/rfc6897>.

[RFC7305] Lear, E., Ed., «Report from the IAB Workshop on Internet Technology Adoption and Transition (ITAT)», RFC 7305, DOI 10.17487/RFC7305, July 2014, <https://www.rfc-editor.org/info/rfc7305>.

[RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, «TCP Fast Open», RFC 7413, DOI 10.17487/RFC7413, December 2014, <https://www.rfc-editor.org/info/rfc7413>.

[RFC7496] Tuexen, M., Seggelmann, R., Stewart, R., and S. Loreto, «Additional Policies for the Partially Reliable Stream Control Transmission Protocol Extension», RFC 7496, DOI 10.17487/RFC7496, April 2015, <https://www.rfc-editor.org/info/rfc7496>.

[RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, «UDP Usage Guidelines», BCP 145, RFC 8085, DOI 10.17487/RFC8085, March 2017, <https://www.rfc-editor.org/info/rfc8085>.

[RFC8260] Stewart, R., Tuexen, M., Loreto, S., and R. Seggelmann, «Stream Schedulers and User Message Interleaving for the Stream Control Transmission Protocol», RFC 8260, DOI 10.17487/RFC8260, November 2017, <https://www.rfc-editor.org/info/rfc8260>.

[RFC8304] Fairhurst, G. and T. Jones, «Transport Features of the User Datagram Protocol (UDP) and Lightweight UDP (UDP-Lite)», RFC 8304, DOI 10.17487/RFC8304, February 2018, <https://www.rfc-editor.org/info/rfc8304>.

[RFC8622] Bless, R., «A Lower-Effort Per-Hop Behavior (LE PHB) for Differentiated Services», RFC 8622, DOI 10.17487/RFC8622, June 2019, <https://www.rfc-editor.org/info/rfc8622>.

[SCTP-STREAM-1] Weinrank, F. and M. Tuexen, «Transparent Flow Mapping for NEAT», IFIP Networking 2017, Workshop on Future of Internet Transport (FIT 2017), June 2017.

[SCTP-STREAM-2] Welzl, M., Niederbacher, F., and S. Gjessing, «Beneficial Transparent Deployment of SCTP: The Missing Pieces», IEEE GlobeCom 2011, DOI 10.1109/GLOCOM.2011.6133554, December 2011, <https://doi.org/10.1109/GLOCOM.2011.6133554>.

[TAPS-INTERFACE] Trammell, B., Welzl, M., Enghardt, T., Fairhurst, G., Kuehlewind, M., Perkins, C., Tiesel, P. S., Wood, C. A., and T. Pauly, «An Abstract Application Layer Interface to Transport Services», Work in Progress, Internet-Draft, draft-ietf-taps-interface-09, 27 July 2020, <https://tools.ietf.org/html/draft-ietf-taps-interface-09>.

[WWDC2015] Lakhera, P. and S. Cheshire, «Your App and Next Generation Networks», Apple Worldwide Developers Conference 2015, San Francisco, USA, June 2015, <https://developer.apple.com/videos/wwdc/2015/?id=719>.

Приложение A. Расширенное множество транспортных функций

В этом приложении представлены транспортные свойства в соответствии с номенклатурой «Категория.[Субкатегория].Свойство.Протокол» (CATEGORY.[SUBCATEGORY].FEATURENAME.PROTOCOL), эквивалентной этапу 2 в [RFC8303]. Очерчена также реализация транспортной системой транспортных свойств (функций). «Минимальный набор», заданный в этом документе, предназначен для «односторонней» реализации по протоколу TCP и (с некоторыми ограничениями) UDP. Поэтому для всех транспортных функций, отнесенных к категории «функциональные» или «оптимизирующие», для которых нет соответствующих примитивов TCP и/или UDP на этапе 2 в [RFC8303], приведено краткое описание реализации на основе TCP и/или UDP.

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

  • Большинство транспортных функций, связанных с многопоточностью, помечены как автоматизируемые, поскольку принятие решения об использовании множества потоков не требует знаний о конкретном приложении. Это значит, что соединение, предоставляемое приложению, может быть реализовано с использованием одного потока ассоциации SCTP вместо использования всей ассоциации или соединения TCP. Это можно сделать путем использования более одного потока в момент создания ассоциации SCTP (параметр CONNECT.SCTP — число исходящих потоков), поддержки внутренних номеров потоков и их применения при передаче данных (параметр SEND.SCTP — номер потока). Закрытие или разрыв соединения может просто освобождать номер потока для последующего использования (См. параграф 5.2).

  • Все транспортные функции, кроме отключения MPTCP, связанные с использованием нескольких путей или выбором сетевого интерфейса, считаются автоматизируемыми. Например, Listen всегда может прослушивать все доступные интерфейсы, а Connect — использовать принятый по умолчанию интерфейс для целевого адреса IP.

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

A.1. Связанные с соединением транспортные свойства

Организация

Connect

Протоколы: TCP, SCTP, UDP(-Lite).

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

Реализация: CONNECT.TCP, CONNECT.SCTP, CONNECT.UDP(-Lite).

Задание опций IP, которые должны применяться всегда

Протоколы: TCP, UDP(-Lite).

Автоматизируемо, поскольку опции IP относятся к информации о сети, а не о приложении.

Запрос множества потоков

Протоколы: SCTP.

Автоматизируемо, поскольку применение множества потоков не требуется связанного с приложением знания (примеры реализации множества потоков без участия приложения даны в [SCTP-STREAM-1] и [SCTP-STREAM-2]).

Реализация: См. параграф 5.2.

Ограничение числа входящих потоков

Протоколы: SCTP.

Автоматизируемо, поскольку применение множества потоков не требуется связанного с приложением знания.

Реализация: См. параграф 5.2.

Задание числа попыток и/или тайм-аутов для первого сообщения при организации

Протоколы: TCP, SCTP.

Функционально, поскольку тесно связано с предполагаемыми сведениями о гарантиях доставки для данных, отправленных до или в процессе организации соединения.

Реализация: Используются параметры CONNECT.TCP и CONNECT.SCTP.

Реализация на основе UDP: Ничего (безотносительно к варианту UDP, поскольку гарантии не предполагаются).

Получение множества сокетов

Протоколы: SCTP.

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

Отключение MPTCP

Протоколы: MPTCP.

Оптимизируемо, поскольку непараллельное применение множества путей для связи между теми же конечными хостами может повышать производительность. Применение этого свойства зависит от информации о сети и приложении (См. параграф 3.1 of [RFC6897]).

Реализация: С помощью логического параметра в CONNECT.MPTCP.

Реализация с TCP: Ничего.

Реализация с UDP: Ничего.

Настройка аутентификации

Протоколы: TCP, SCTP.

Функционально, поскольку напрямую влияет на безопасность.

Реализация: Через параметры в CONNECT.TCP и CONNECT.SCTP. С TCP это позволяет настроить кортежи первичных ключей (Master Key Tuple или MKT) для аутентификации полных сегментов (включая псевдозаголовок TCP IPv4, заголовок и данные TCP). В SCTP это позволяет задать типы аутентифицируемых блоков. Аутентификация лишь определенных типов блоков снижает уровень защиты, что не поддерживается в TCP. Для совместимости следует разрешать лишь аутентификацию всех блоков. Способ предоставления ключевого материала должен соответствовать [RFC4895] и [RFC5925].

Реализация с UDP: Невозможна (UDP не предлагает такой функциональности).

Указание (и/или получение по завершении) уровня адаптации с помощью его кода

Протоколы: SCTP.

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

Реализация: С помощью параметра в CONNECT.SCTP.

Реализация с TCP: Невозможна (TCP не предлагает такой функциональности).

Реализация с UDP: Невозможна (UDP не предлагает такой функциональности).

Запрос согласования для чередования пользовательских сообщений

Протоколы: SCTP.

Автоматизируемо, поскольку требует использования множества потоков, а запрос множества потоков в категории CONNECTION.ESTABLISHMENT является автоматизируемым.

Реализация: Контролируется через параметр в CONNECT.SCTP. Одной из возможных реализаций является попытка использовать чередования всегда.

Отправка сообщения с гарантией доставки (возможно несколько раз) до организации соединения

Протоколы: TCP.

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

Реализация: Через параметр в CONNECT.TCP.

Реализация с UDP: Невозможна (UDP не предлагает такой функциональности).

Отправка сообщения с гарантией доставки в процессе организации соединения

Протоколы: SCTP.

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

Реализация: Через параметр в CONNECT.SCTP.

Реализация с TCP: Передача сообщения в пакете SYN без возможности указать границы сообщения.

Реализация с UDP: Невозможна (UDP не предлагает такой функциональности).

Включение UDP-инкапсуляции с заданным удаленным портом UDP

Протоколы: SCTP.

Автоматизируема, поскольку инкапсуляция UDP относится к знанию о сети, а не о приложении.

Доступность

Listen

Протоколы: TCP, SCTP, UDP(-Lite).

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

RFC 8303 отличается от 3 автоматизируемых транспортных свойств, приведенных ниже, в том, что выбор интерфейса для прослушивания остается открытым.

Реализация: Прослушивание на всех интерфейсах с помощью LISTEN.TCP (не указан локальный IP-адрес) или LISTEN.SCTP (указаны пары «порт SCTP — адрес» для всех локальных адресов IP). LISTEN.UDP(-Lite) поддерживает оба метода.

Listen, 1 локальный интерфейс

Протоколы: TCP, SCTP, UDP(-Lite).

Автоматизируемо, поскольку решения о локальных интерфейсах связаны со знанием о сети и операционной системе, а не о приложении.

Listen, N локальных интерфейсов

Протоколы: SCTP.

Автоматизируемо, поскольку решения о локальных интерфейсах связаны со знанием о сети и операционной системе, а не о приложении.

Listen, все локальные интерфейсы

Протоколы: TCP, SCTP, UDP(-Lite).

Автоматизируемо, поскольку решения о локальных интерфейсах связаны со знанием о сети и операционной системе, а не о приложении.

Задание опций IP, которые должны применяться всегда

Протоколы: TCP, UDP(-Lite).

Автоматизируемо, поскольку опции IP относятся к знанию о сети, а не о приложении.

Отключение MPTCP

Протоколы: MPTCP.

Оптимизируемо, поскольку непараллельное применение множества путей для связи между теми же конечными хостами может повышать производительность. Применение этого свойства зависит от информации о сети и приложении (См. параграф 3.1 of [RFC6897]).

Реализация: Через логический параметр в LISTEN.MPTCP.

Реализация с TCP: Ничего.

Реализация с UDP: Ничего.

Настройка аутентификации

Протоколы: TCP, SCTP.

Функционально по причине прямого влияния на безопасность.

Реализация: Через параметры в LISTEN.TCP и LISTEN.SCTP.

Реализация с UDP: Невозможна (UDP не предлагает такой функциональности).

Реализация с TCP: С TCP это позволяет настроить кортежи первичных ключей (Master Key Tuple или MKT) для аутентификации полных сегментов (включая псевдозаголовок TCP IPv4, заголовок и данные TCP). В SCTP это позволяет задать типы аутентифицируемых блоков. Аутентификация лишь определенных типов блоков снижает уровень защиты, что не поддерживается в TCP. Для совместимости следует разрешать лишь аутентификацию всех блоков. Способ предоставления ключевого материала должен соответствовать [RFC4895] и [RFC5925].

Реализация с UDP: Невозможна (UDP не предлагает аутентификации).

Получение запрошенного числа потоков

Протоколы: SCTP.

Автоматизируемо, поскольку использование множества потоков не требует знания о приложении.

Реализация: См. параграф 5.2.

Ограничение числа входящих потоков

Протоколы: SCTP.

Автоматизируемо, поскольку использование множества потоков не требует знания о приложении.

Реализация: См. параграф 5.2.

Указание (и/или получение по завершении) кода уровня адаптации

Протоколы: SCTP.

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

Реализация: С помощью параметра в LISTEN.SCTP.

Реализация с TCP: Невозможна (TCP не предлагает такой функциональности).

Реализация с UDP: Невозможна (UDP не предлагает такой функциональности).

Запрос согласования для чередования пользовательских сообщений

Протоколы: SCTP.

Автоматизируемо, поскольку требует множество потоков, а запрос множества потоков в категории CONNECTION.ESTABLISHMENT является автоматизируемым.

Реализация: Через параметр в LISTEN.SCTP.

Поддержка

Смена тайм-аута для разрыва соединения (время или число повторов)

Протоколы: TCP, SCTP.

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

Реализация: Через CHANGE_TIMEOUT.TCP или CHANGE_TIMEOUT.SCTP.

Реализация с UDP: Невозможна (UDP не дает гарантий и не поддерживает тайм-аут для соединения).

Предложенный партнеру тайм-аут

Протоколы: TCP.

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

Реализация: Через CHANGE_TIMEOUT.TCP.

Реализация с UDP: Невозможна (UDP не дает гарантий и не поддерживает тайм-аут для соединения).

Отключение алгоритма Nagle

Протоколы: TCP, SCTP.

Оптимизируемо, поскольку это решение зависит от размера будущих блоков и задержки между ними.

Реализация: Через DISABLE_NAGLE.TCP и DISABLE_NAGLE.SCTP.

Реализация с UDP: Ничего (UDP не реализует алгоритм Nagle).

Запрос немедленной передачи heartbeat с возвратом результата

Протоколы: SCTP.

Автоматизируемо, поскольку информирует о знании, относящемся к сети.

Уведомление об избыточных повторах (ранее до достижения порога разрыва)

Протоколы: TCP.

Оптимизируемо, поскольку это раннее предупреждение приложения, информирующее о приближающемся функциональном событии.

Реализация: Через ERROR.TCP.

Реализация с UDP: Ничего (нет порога разрыва соединения).

Добавление пути

Протоколы: MPTCP, SCTP.

Параметры MPTCP: source-IP, source-Port, destination-IP, destination-Port.

Параметры SCTP: Локальный адрес IP.

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

Удаление пути

Протоколы: MPTCP, SCTP.

Параметры MPTCP: source-IP, source-Port, destination-IP, destination-Port.

Параметры SCTP: Локальный адрес IP.

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

Задание основного пути

Протоколы: SCTP.

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

Предложение основного пути партнеру

Протоколы: SCTP.

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

Настройка переключения пути

Протоколы: SCTP.

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

Определение статуса (запрос или уведомление)

Протоколы: SCTP, MPTCP.

Параметры SCTP: Состояние соединения для ассоциации, список транспортных адресов получателей, состояния доступности транспортных адресов получателей, текущие размеры окна приема (локальный и у партнера), текущий размер локального окна перегрузки, число неподтвержденных блоков DATA, число блоков DATA, ожидающих приема, последнее значение SRTT на основном пути, RTO на основном пути, SRTT и RTO для других адресов получателей, MTU для путей, поддержка чередования (yes/no).

Параметры MPTCP: Список субпотоков (идентификация по source-IP, source-Port, destination-IP, destination-Port).

Автоматизируемо, поскольку эти параметры относятся к знанию о сети, а не о приложении.

Задание поля DSCP

Протоколы: TCP, SCTP, UDP(-Lite).

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

Реализация: Через SET_DSCP.TCP, SET_DSCP.SCTP, SET_DSCP.UDP(-Lite).

Уведомление о приеме сообщения ICMP об ошибке

Протоколы: TCP, UDP(-Lite).

Оптимизируемо, поскольку эти сообщения могут информировать об успехе или отказе функционального транспортного свойства (например, host unreachable относится к Connect).

Реализация: Через ERROR.TCP или ERROR.UDP(-Lite.).

Obtain information about interleaving support

Протоколы: SCTP.

Автоматизируемо, поскольку требует множество потоков, а запрос множества потоков в категории CONNECTION.ESTABLISHMENT является автоматизируемым.

Реализация: Через STATUS.SCTP.

Смена параметров аутентификации

Протоколы: TCP, SCTP.

Функционально по причине прямого влияния на безопасность.

Реализация: Через SET_AUTH.TCP и SET_AUTH.SCTP.

Реализация с TCP: В SCTP это позволяет настраивать key_id, key и hmac_id. В TCP это позволяет менять предпочтительный исходящий (current_key) и предпочтительный входящий (rnext_key) кортеж MKT для сегментов в соединении. Ключевой материал должен предоставляться способом, совместимым с [RFC4895] и [RFC5925].

Реализация с UDP: Невозможна (UDP не поддерживает аутентификацию).

Получение данных аутентификации

Протоколы: SCTP.

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

Реализация: Через GET_AUTH.SCTP.

Реализация с TCP: В SCTP это позволяет получить key_id и список блоков. В TCP это позволяет получить current_key и rnext_key из принятого ранее сегмента. Ключевой материал должен предоставляться способом, совместимым с [RFC4895] и [RFC5925].

Реализация с UDP: Невозможна (UDP не поддерживает аутентификацию).

Сброс потока

Протоколы: SCTP.

Автоматизируемо, поскольку применение множества потоков не требует знания о приложении.

Реализация: См. параграф 5.2.

Уведомление о сбросе потока

Протоколы: SCTP.

Автоматизируемо, поскольку применение множества потоков не требует знания о приложении.

Реализация: См. параграф 5.2.

Сброс ассоциации

Протоколы: SCTP.

Автоматизируемо, поскольку для решения о сбросе ассоциации не требует знания о приложении.

Реализация: Через RESET_ASSOC.SCTP.

Уведомление о сбросе ассоциации

Протоколы: SCTP.

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

Добавление потоков

Протоколы: SCTP.

Автоматизируемо, поскольку применение множества потоков не требует знания о приложении.

Реализация: См. параграф 5.2.

Уведомление о добавлении потоков

Протоколы: SCTP.

Автоматизируемо, поскольку применение множества потоков не требует знания о приложении.

Реализация: См. параграф 5.2.

Выбор планировщика для потоков в ассоциации

Протоколы: SCTP.

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

Реализация: С использованием SET_STREAM_SCHEDULER.SCTP.

Реализация с TCP: Ничего (потоки недоступны в TCP и нет гарантий влияния этого транспортного свойства).

Реализация с UDP: Ничего (потоки недоступны в UDP и нет гарантий влияния этого транспортного свойства).

Настройка приоритета или веса для планировщика

Протоколы: SCTP.

Оптимизируемо, поскольку выбор приоритета или веса требует знания о приложении. Однако, если транспортная система не будет выбирать планировщик или сама настроит выбор некорректно, это повлияет лишь на производительность доставки данных и результат останется корректным в рамках модели best effort.

Реализация: С использованием CONFIGURE_STREAM_SCHEDULER.SCTP.

Реализация с TCP: Ничего (потоки недоступны в TCP и нет гарантий влияния этого транспортного свойства).

Реализация с UDP: Ничего (потоки недоступны в UDP и нет гарантий влияния этого транспортного свойства).

Настройка размера буфера передачи

Протоколы: SCTP.

Автоматизируемо, поскольку это решение связано со знанием о сети и операционной системе, а не о приложении (см. параграф 5.4).

Настройка размера приемного буфера (и rwnd)

Протоколы: SCTP

Автоматизируемо, поскольку это решение связано со знанием о сети и операционной системе, а не о приложении.

Настройка фрагментации сообщений

Протоколы: SCTP.

Автоматизируемо, поскольку это решение связано со знанием о сети и операционной системе, а не о приложении. Отметим, что это свойство SCTP не контролирует фрагментацию на уровне IP и относится лишь к фрагментации сообщений протоколом SCTP в конечной системе.

Реализация: Всегда выполняется путем включения через CONFIG_FRAGMENTATION.SCTP и автоматической настройки размера фрагментов в соответствии с условиями в сети и операционной системе.

Настройка PMTUD

Протоколы: SCTP.

Автоматизируемо, поскольку механизм Path MTU Discovery связан со знанием о сети, а не о приложении.

Настройка таймера задержки SACK

Протоколы: SCTP.

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

Установка значения Cookie life

Протоколы: SCTP.

Функционально, поскольку относится к безопасности (возможно снижение защиты при продолжительном использовании cookie), а не ко времени между попытками организации соединения. Эта информация может зависеть от приложения.

Реализация с TCP: Ближайшей похожей функциональностью TCP является cookie в TCP Fast Open. В [RFC7413] сказано, что сервер может в любой момент счесть cookie устаревшим в целях повышения уровня защиты, а в параграфе 4.1.2 [RFC7413] приведен пример реализации, где обновление ключа на стороне сервера ведет к завершению строка действия cookie. Для реализаций, не поддерживающих TCP Fast Open, это транспортное свойство может влияет на действительность SYN cookie (см. параграф 3.6 в [RFC4987]).

Реализация с UDP: Невозможна (UDP не поддерживает такой функциональности).

Установка максимального пика

Протоколы: SCTP.

Автоматизируемо, поскольку связано со знанием о сети, а не о приложении.

Настройка размера сообщений для частичной доставки

Протоколы: SCTP.

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

Реализация с TCP: Невозможна (TCP не предлагает идентификацию границ сообщения).

Реализация с UDP: Невозможна (UDP не фрагментируетсообщения).

Запрет контрольной суммы при отправке

Протоколы: UDP.

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

Реализация: Через SET_CHECKSUM_ENABLED.UDP.

Реализация с TCP: Ничего (TCP не предлагает отключать контрольные суммы, а передача данных с неповрежденной контрольной суммой не может давать семантически неверного результата).

Запрет требования контрольной суммы при получении

Протоколы: UDP.

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

Реализация: Через SET_CHECKSUM_REQUIRED.UDP.

Реализация с TCP: Ничего (TCP не предлагает отключать контрольные суммы, а передача данных с неповрежденной контрольной суммой не может давать семантически неверного результата).

Задание покрытия для контрольной суммы у отправителя

Протоколы: UDP-Lite.

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

Реализация: Через SET_CHECKSUM_COVERAGE.UDP-Lite.

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

Реализация с UDP: Если для контрольной суммы задано покрытие данных, не делает ничего. В иных случаях не делает ничего (передача данных с неповрежденной контрольной суммой не может давать семантически неверного результата) или используется транспортное свойство запрета контрольной суммы при передаче.

Минимальное покрытие для контрольной суммы, требуемое получателем

Протоколы: UDP-Lite.

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

Реализация: Через SET_MIN_CHECKSUM_COVERAGE.UDP-Lite.

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

Реализация с UDP: Если для контрольной суммы задано покрытие данных, не делает ничего. В иных случаях не делает ничего (передача данных с неповрежденной контрольной суммой не может давать семантически неверного результата) или используется транспортное свойство запрета контрольной суммы при передаче.

Задание поля DF

Протоколы: UDP(-Lite).

Оптимизируемо, поскольку поле DF может служить для передачи Path MTU Discovery и это может приводить к выбору приложением размера, обеспечивающего более эффективную доставку.

Реализация: Через MAINTENANCE.SET_DF.UDP(-Lite) и SEND_FAILURE.UDP(-Lite).

Реализация с TCP: Ничего (в TCP передающее приложение не контролирует размер транспортных сообщений).

Определение максимального размера транспортного сообщения для передачи без фрагментации IP через настроенный интерфейс

Протоколы: UDP(-Lite).

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

Реализация с TCP: Ничего (в TCP эта информация недоступна).

Определение максимального размера транспортного сообщения от настроенного интерфейса

Протоколы: UDP(-Lite).

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

Реализация с TCP: Ничего (в TCP эта информация недоступна).

Задание поля TTL/Hop Count

Протоколы: UDP(-Lite).

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

Получение поля TTL/Hop Count

Протоколы: UDP(-Lite).

Автоматизируемо, поскольку поле TTL/Hop Count связано со знанием о сети, а не о приложении.

Задание поля ECN

Протоколы: UDP(-Lite).

Автоматизируемо, поскольку поле ECN связано со знанием о сети, а не о приложении.

Получение поля ECN

Протоколы: UDP(-Lite).

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

Реализация с TCP: Ничего (в TCP эта информация недоступна).

Задание опций IP

Протоколы: UDP(-Lite).

Автоматизируемо, поскольку опции IP связаны со знанием о сети, а не о приложении.

Получение опций IP

Протоколы: UDP(-Lite).

Автоматизируемо, поскольку опции IP связаны со знанием о сети, а не о приложении.

Включение и настройка LEDBAT

Протоколы: Протокол, поддерживающий механизм контроля перегрузки LEDBAT.

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

Реализация: Через CONFIGURE.LEDBAT и/или SET_DSCP.TCP, SET_DSCP.SCTP, SET_DSCP.UDP(-Lite) [RFC8622].

Реализация с TCP: Ничего (TCP не поддерживает механизм LEDBAT, но реализация этой функциональности не вызывает семантически некорректного поведения).

Реализация с UDP: Ничего (UDP не предлагает контроля перегрузок).

Завершение

Закрытие после гарантированной доставки оставшихся данных с уведомлением приложения на другой стороне

Протоколы: TCP, SCTP

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

Реализация: Через CLOSE.TCP и CLOSE.SCTP.

Реализация с UDP: Невозможна (UDP не обеспечивает гарантий доставки и не знает о доставке остающихся данных, а также не указывает причину закрытия соединения партнером).

Разрыв без доставки оставшихся данных с уведомлением приложения на другой стороне

Протоколы: TCP, SCTP.

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

Реализация: Через ABORT.TCP and ABORT.SCTP.

Реализация с UDP: Невозможна (UDP не указывает причину закрытия соединения партнером).

Разрыв без доставки оставшихся данных и уведомления приложения на другой стороне

Протоколы: UDP(-Lite).

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

Реализация: Через ABORT.UDP(-Lite).

Реализация с TCP: Прекращение использования соединения, ожидание тайм-аута.

Тайм-аут, когда данные не удается доставить слишком долго

Протоколы: TCP, SCTP.

Функционально, так как уведомляет о том, что предполагаемая доставка с гарантией больше не обеспечивается.

Реализация: Через TIMEOUT.TCP и TIMEOUT.SCTP.

Реализация с UDP: Ничего (такое событие невозможно в UDP).

A.2. Связанные с обменом данными транспортные свойства

A.2.1. Передача

Гарантированная доставка данных с контролем перегрузок

Протоколы: TCP, SCTP.

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

Реализация: Через SEND.TCP и SEND.SCTP.

Реализация с UDP: Невозможна (UDP не предоставляет гарантий).

Гарантированная доставка сообщения с контролем перегрузок

Протоколы: SCTP.

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

Реализация: Через SEND.SCTP.

Реализация с TCP: Через SEND.TCP. Границы сообщения не видны получателю, поскольку TCP предоставляет услуги потока байтов.

Реализация с UDP: Невозможна (UDP не предоставляет гарантий).

Негарантированная доставка сообщения

Протоколы: SCTP, UDP(-Lite).

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

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

Реализация: Через SEND.SCTP или SEND.UDP(-Lite).

Реализация с TCP: Через SEND.TCP. Сообщения доставляются с гарантией, но получатель не видит границ.

Негарантированная доставка сообщения с контролем перегрузок

Протоколы: SCTP.

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

Негарантированная доставка сообщения без контроля перегрузок

Протоколы: UDP(-Lite).

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

Настраиваемые гарантии для сообщений

Протоколы: SCTP.

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

Реализация: Через SEND.SCTP.

Реализация с TCP: Выполняется через SEND.TCP и игнорирует эту настройку. В предположении модели сервиса best-effort доставка излишних данных не нарушает ожиданий приложения. Кроме того, в TCP невозможно связать запрашиваемые гарантии с сообщением.

Реализация с UDP: Невозможна (UDP не предоставляет гарантий).

Выбор потока

Протоколы: SCTP.

Автоматизируемо, поскольку требует множество потоков, а запрос множества потоков в категории CONNECTION.ESTABLISHMENT является автоматизируемым.

Реализация: См. параграф 5.2.

Выбор пути (адреса получателя)

Протоколы: SCTP.

Реализация с TCP: Н

Упорядоченная доставка сообщений (возможно медленней неупорядоченной)

Протоколы: SCTP.

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

Реализация: Через SEND.SCTP.

Реализация с TCP: Через SEND.TCP. Получатель не видит границ сообщения.

Реализация с UDP: Невозможна (UDP не предоставляет гарантий упорядоченности).

Неупорядоченная доставка сообщений (возможно быстрей упорядоченной)

Протоколы: SCTP, UDP(-Lite).

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

Реализация: Через SEND.SCTP.

Реализация с TCP: Выполняется через SEND.TCP с сохранением порядка. В предположении модели сервиса best-effort упорядоченная доставка не нарушает ожиданий приложения. Кроме того, в TCP невозможно связать запрос упорядоченной доставки с сообщением.

Запрос отмены группировки сообщений

Протоколы: SCTP.

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

Реализация: Через SEND.SCTP.

Реализация с TCP: Выполняется через SEND.TCP и DISABLE_NAGLE.TCP для запрета алгоритма Nagle по запросы и включении снова, когда запроса больше нет. Отметим неполную эквивалентность, связанную со временем подачи запроса, а не с конкретным сообщением.

Реализация с UDP: Ничего (UDP не группирует сообщений).

Задание идентификатора протокола в области данных (для получателя)

Протоколы: SCTP.

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

Реализация: SEND.SCTP.

Реализация с TCP: Невозможна (эта функциональность недоступна в TCP).

Реализация с UDP: Невозможна (эта функциональность недоступна в UDP).

Задание идентификатора ключа для аутентификации сообщения

Протоколы: SCTP.

Функционально по причине прямого влияния на безопасность.

Реализация: Через параметр SEND.SCTP.

Реализация с TCP: Возможна эмуляция с использованием SET_AUTH.TCP до и после передачи сообщения. Отметим неполную эквивалентность, связанную со временем подачи запроса, а не с конкретным сообщением.

Реализация с UDP: Невозможна (UDP не поддерживает аутентификации).

Запрос передачи без задержки подтверждения SACK для сообщения

Протоколы: SCTP.

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

Реализация с TCP: Ничего (TCP не предлагает такой функциональности и игнорирует такие запросы приложений, поскольку они задают сементически некорректное поведение).

Реализация с UDP: Ничего (UDP не предлагает такой функциональности и игнорирует такие запросы приложений, поскольку они задают сементически некорректное поведение).

A.2.2. Прием

Прием данных (без границ сообщений)

Протоколы: TCP.

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

Реализация: Через RECEIVE.TCP.

Реализация с UDP: Ничего (UDP работает лишь с сообщениями и приложение может игнорировать границы).

Прием сообщения

Протоколы: SCTP, UDP(-Lite).

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

Реализация: Через RECEIVE.SCTP и RECEIVE.UDP(-Lite).

Реализация с TCP: Невозможна (TCP не указывает границы сообщений).

Выбор потока для приема

Протоколы: SCTP.

Автоматизируемо, поскольку требует множество потоков, а запрос множества потоков в категории CONNECTION.ESTABLISHMENT является автоматизируемым.

Реализация: См. параграф 5.2.

Информация о частичной доставке сообщения

Протоколы: SCTP.

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

Реализация: Через RECEIVE.SCTP.

Реализация с TCP: Ничего (эта информация недоступна в TCP).

Реализация с UDP: Ничего (эта информация недоступна в UDP).

A.2.3. Ошибки

В этом параграфе описаны отказы при передаче, связанные с конкретным вызовом категории «Передача данных» (Приложение A.2.1).

Уведомление об отказе при передаче

Протоколы: SCTP, UDP(-Lite).

Функционально, так как уведомляет о том, что предполагаемая доставка с гарантией больше не обеспечивается.

RFC 8303 отличается от 2 указанных ниже транспортных свойств в том, что не различаются непереданные и неподтвержденные данные.

Реализация: Через SENDFAILURE-EVENT.SCTP и SEND_FAILURE.UDP(-Lite).

Реализация с TCP: Ничего (это уведомление недоступно в TCP).

Уведомление о неотправленном (частино) сообщении

Протоколы: SCTP, UDP(-Lite).

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

Уведомление о неподтвержденном (частино) сообщении

Протоколы: SCTP.

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

Уведомление об отсутствии в стеке данных для передачи

Протоколы: SCTP.

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

Реализация с TCP: Ничего (см. параграф 5.4).

Реализация с UDP: Ничего (это уведомление недоступно в UDP).

Уведомление получателя об отказе при частичной доставке сообщения

Протоколы: SCTP.

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

Реализация с TCP: Ничего (это уведомление недоступно в TCP).

Реализация с UDP: Ничего (это уведомление недоступно в UDP).

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

Авторы благодарят участников рабочей группы TAPS, а также исследовательских проектов NEAT и MAMI за ценный вклад в документ. Особая признательность Michael Tüxen за помощь по вопросам организации и завершения соединений, Gorry Fairhurst за предложения по части фрагментации и размера пакетов, Spencer Dawkins за очень подробную и конструктивную рецензию. Эта работа финансировалась исследовательской и инновационной программой Европейского Союза Horizon 2020 в рамках гранта 644334 (NEAT).

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

Michael Welzl

University of Oslo

PO Box 1080 Blindern

N-0316 Oslo

Norway

Phone: +47 22 85 24 20

Email: michawe@ifi.uio.no

Stein Gjessing

University of Oslo

PO Box 1080 Blindern

N-0316 Oslo

Norway

Phone: +47 22 85 24 44

Email: steing@ifi.uio.no

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

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

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Head-of-line — блокировка в начале (голове) линии.

4Stream Control Transmission Protocol — потоковый протокол управления передачей.

5Low Extra Delay Background Transport — транспорт с очень малыми задержками.

6Low Extra Delay Background Transfer — фоновая передача с очень малой задержкой.

Рубрика: RFC | Комментарии к записи RFC 8923 A Minimal Set of Transport Services for End Systems отключены

Архитектура переносимых коммутаторов P4_16 (проект 12.10.2020)

P416 Portable Switch Architecture (PSA)

(working draft)

The P4.org Architecture Working Group

2020-10-12

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, относительный приоритет записей определяется по порядку их размещения в программе P4 (первая запись имеет наибольший приоритет).

4.3.2. Таблицы ternary

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

4.3.3. Таблицы lpm

Если в таблице нет полей range и ternary, но имеется поле lpm, такое поле должно быть единственным. В дополнение к нему могут присутствовать поля типа exact. Хотя одному ключу может соответствовать несколько записей таблицы, не может быть больше 1 записи, соответствующей каждому возможному размеру префикса в поле lpm, поскольку две присутствующие одновременно записи не могут иметь одинаковый ключ поиска. Всегда выбирается запись с максимальным размером совпадающего префикса. Плоскость управления не может задавать приоритет при создании записей в таких таблицах, поскольку приоритет всегда определяется размером префикса.

Если в таблице типа lpm имеются записи, определенные с помощью свойства const, их относительный приоритет определяется длиной префикса, а не порядком размещения в программе P4.

4.3.4. Таблицы exact

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

4.4. Представление данных в плоскости управления и данных

Реализации плоскости данных PSA, поддерживающие P4 Runtime API6, включают программу 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 Мбит хранилища при миллионе записей в таблице7.

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;

Для перечисленных ниже типов по умолчанию численные преобразования не происходят8. Плоскость данных PSA должна поддерживать все численные значения от 0 до своего максимума. За исключением Timestamp_t число поддерживаемых плоскостью данных не обязано быть степенью 2. Контроллеры должны иметь способ определения максимального значения, поддерживаемого устройством PSA для каждого из этих типов.

  • MulticastGroup_t — 0 является особым значением, указывающим отсутствие групповой репликации для пакета, поэтому данный тип является исключением из указанного выше правила поддержки плоскостью управления значения 0.

  • CloneSessionId_t.

  • PacketLength_t.

  • EgressInstance_t.

  • Timestamp_t9

Отметим, что для всех этих типов имеются аннотации 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 приведены начальные значения содержимого пакетов и метаданных в начале входной обработки пакета. Отметим, что для повторно представленных пакетов ingress_port может иметь значение PSA_PORT_RECIRCULATE, если для пакета использовалась рециркуляция, а затем он был представлен еще раз.

6.1.1. Исходное содержимое пакетов из портов

Для пакетов Ethernet поле packet_in пакетов в путях FP и NFCPU содержит кадр Ethernet, начиная с заголовка Ethernet Контрольная сумма (CRC) кадра Ethernet не включается10.

Таблица 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, если при анализе не возникло ошибок.

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.

Имеется два направления в параметрах входного анализатора с пользовательскими типами — resubmit_meta и recirculate_meta. Они могут применяться для передачи метаданных в повторно представляемых и рециркулированных пакетах.

Рассмотрим пакет, приходящий во входной конвейер и получающий в процессе обработки программой P4 значения стандартных полей метаданных PSA, приводящие к повторному представлению пакета (6.2. Поведение пакетов по завершении входной обработки). Во входном сборщике программа P4 задает значение выходного параметра 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 и возвращает, если это значение представляет выходной порт для реализации. Предполагается, что в некоторых реализациях PSA будут применяться битовые маски для значений PortId_t, не соответствующих какому-либо порту. Функция возвращает значение true для портов PSA_PORT_CPU и PSA_PORT_RECIRCULATE. Функция platform_port_valid не определена в PSA для вызова из программы P4 плоскости данных, поскольку нет известных вариантов ее вызова во время обработки пакета. Она предназначена для описания поведения в псевдокоде. Предполагается, что плоскость данных создает таблицы с действительными номерами портов.

Комментарии «рекомендовано для записи ошибок» не являются требованием и служат рекомендацией поддерживать в реализации PSA счетчики для таких ошибок. Полезно также записывать более подробные сведения о нескольких первых ошибках, например, очередь FIFO для первых недействительных значений, вызвавших ошибку, а также другую информацию, о вызвавших ошибки пакетах. Программы плоскости управления или драйвер смогут считывать эти сведения, а также считывать и очищать очереди 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;		// не определено
}

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

psa_ingress_output_metadata_t ostd;

if (ostd.clone) {
	Создается клон(ы) I2E с опциями, настроенными сеансом клонирования 
	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, принимая значение одноименного выходного (out) параметра входного сборщика при клонировании пакета.

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

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 (CRC).

Предполагается, что программы 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 или на рециркуляцию в конце выходной обработки как обычные индивидуальные пакеты.

Для сокращения расхода пропускной способности может применяться отсечка при клонировании пакетов с передачей лишь заданного числа начальных байтов пакета. Это может быть полезно при отправке некоторых пакетов плоскости управления, а также системам сбора данных для мониторинга трафика. Если для сессии установлено значение 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.

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-групп и сессий clone). Для каждого пакета программа P4 обычно будет устанавливать значения внутренних метаданных в таких структурах, как psa_ingress_output_metadata_t и psa_egress_output_metadata_t, которые управляют операциями PRE над пакетом. В файле psa.p4 определены некоторые действия, помогающие установить значения этих полей в наиболее распространенных ситуациях, описанных в параграфах 6.3. Действия по направлению пакетов при входной обработке и 6.6. Действия по направлению пакетов при выходной обработке.

экземпляр внешнего блока PRE должен создаваться однократно при создании экземпляра пакета PSA_Switch. Определения пакета из файла psa.p4 приведены в конце раздела 5. Программируемые блоки. Ниже приведен пример создания экземпляров, включая один экземпляр PacketReplicationEngine и один экземпляр 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 (см. IETF 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, что будет доступно в поле метаданных
		// входного блока управления.
		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 рассчитывается для всего пакета, включая заголовок. Поскольку тело пакета не доступно реализации 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. Регистры).

Прямыми (direct counter) называют счетчики, связанные с конкретной таблицей 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). Если таблица не имеет принятого по умолчанию действия, при отсутствии совпадений (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 PCP14 или биты DSCP15 в байте типа обслуживания IPv4 или IPv6. Заданные в PSA измерители являются «трехцветными».

От измерителей PSA не требуется выполнение действий по отбрасыванию или маркировке и они не выполняют таких действий автоматически. Измерители сохраняют и обновляют состояние при вызове метода execute(), возвращая значение GREEN (соответствие), YELLOW (избыток) или RED (нарушение). Условия возврата того или иного значения описаны в RFC 2698. Программа P4 отвечает за проверку возвращаемых значений и изменение поведения пакетов в соответствии с результатом. При инициализации измерителей устанавливается значение GREEN (спецификация P4).

В 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;
// ... later ...
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). Таблица с реализацией профиля действий имеет записи, указывающие элемент профиля вместо спецификации конкретного действия. Сопоставление элементов профиля со спецификациями действий поддерживается в отдельной таблице, которая является частью заданного профиля действий. При использовании таблицы с реализацией профиля действий ссылка на элемент профиля преобразуется в спецификацию конкретных действий, применяемых к пакету.

Элементы профиля действий могут задавать лишь типы действий, определенные в атрибуте 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.

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

Плоскость управления может добавлять, изменять или удалять элементы или записи групп для данного экземпляра селектора действий. Экземпляр селектора может включать не более 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. При программировании записей таблицы плоскость управления не включает поля селектора типа сопоставления в ключ сопоставления. Вместо этого поля селектора типа сопоставления используются для создания списка, передаваемого экземпляру селектора действий. В приведенном ниже примере список {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 API16.

7.13. Временные метки

Реализация PSA предоставляет значение ingress_timestamp для каждого пакета, входящего в блок управления Ingress, как поле структуры типа psa_ingress_input_metadata_t. Эта временная метка должна содержать время, близкое к моменту приема устройством первого бита пакета или (вариант) начала синтаксического анализа. Метка не включается автоматически в пакет на входе в блок управления Egress и желающая использовать ingress_timestamp в выходном коде программа P4 должна копировать ее в поле пользовательских метаданных, передаваемое выходному конвейеру. Предоставляется также метка egress_timestamp для каждого пакета, входящего в блок управления Egress, как поле структуры psa_egress_input_metadata_t.

Одним из ожидаемых применений временных меток является их сохранение в экземплярах таблиц или регистров (Register) для реализации контроля протокольных тайм-аутов, где миллисекундной точности достаточно для большинства протоколов. Другим ожидаемым вариантом применения является телеметрия 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 следует добавлять в одно из сообщений 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 в порядке их создания.

Если нужно связать между собой в программе плоскости управления множество сообщений 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 в P4 Runtime API).

Высокоскоростная реализация PSA может обрабатывать сотни или тысячи пакетов между отдельными операциями плоскости управления. Имеются базовые методы «записи в таблицу из будущего в прошлое потока данных» (write tables from later to earlier in the data flow), которые иногда называют 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 сетевых устройств является внутриканальная телеметрия INT24. Хотя в PSA уже реализованы такие важные для телеметрии механизмы, как временные метки, еще не разработаны механизмы доступа к информации о загрузке каналов на выходных портах и заполнении очередей25.

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 ГГц), наиболее простым решением является параллельная обработка пакетов26 с созданием N конвейеров27, каждый из которых обрабатывает 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 и соавторов28, где проведено исследование повышения устойчивости TCP к нарушениям порядка доставки.

    Такие реализации TCP считают подтверждения с повторяющимися кумулятивными порядковыми номерами вероятным указанием на потерю пакетов в сети и сокращают окно передачи для предотвращения перегрузок в сети.

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

    Упомянутые выше причины служат основанием для использования хэш-значений полей заголовков пакетов (таких как IP-адреса отправителя и получателя, номера портов TCP или UDP) при выборе между равноценными путями ECMP30 и каналами 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, которое не соответствует ни одному физическому порту устройства31, и применяется для пустого действия в пустой группе. В примере кода после 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, описание которого доступно по ссылке https://github.com/p4lang/p4runtime.

6P4 Runtime API определяется как файл Google Protocol Buffer .proto, описание которого доступно по ссылке https://github.com/p4lang/p4runtime.

7Хотя 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).

8С открытом компиляторе P4 p4c планируется поддержка опции для включения численных преобразований дополнительных типов без изменения программ P4 или включаемого файла psa.p4. Эти типы будут указываться по именам.

9TBD: Для значений типа Timestamp_t рассматриваются численные преобразования в программе агента между зависимым от платформы значением и значением общего блока, а также значением 0 для всех платформ.

10TBD: Неясно, всегда ли минимальный размер данных составляет 46 байтов (64 байта минимального кадра Ethernet за вычетом 14 байтов заголовка 14 и 4 байтов CRC) или реализация может не включать некоторые байты.

11Random Early Detection — упреждающее отбрасывание случайного пакета.

12Approximate Fair Dropping — сравнительно беспристрастное отбрасывание.

13Link Aggregation Group — группа агрегирования каналов.

14Priority code point — код приоритета.

15Differentiated service code point — код дифференцированного обслуживания

16P4 Runtime API определяется как файл Google Protocol Buffer (protobuf) .proto, описание которого доступно по ссылке https://github.com/p4lang/p4runtime.

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.

24In-band Network Telemetry, http://p4.org/p4/inband-network-telemetry

27Здесь и в спецификации P4 термин конвейер (pipeline) относится к части реализации P4, обеспечивающей, например, поведение блоков IngressParser, Ingress, затем IngressDeparser в PSA. Это принято в P4, хотя следует отметить наличие других аппаратных решений, которые реализуют функции конвейера иначе, например, в наборе параллельно работающих ядер CPU, каждое из которых обрабатывает свой пакет.

28S.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,

30Equal Cost Multi Path.

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

Рубрика: SDN, Сетевое программирование | Комментарии к записи Архитектура переносимых коммутаторов P4_16 (проект 12.10.2020) отключены

Памятка по языку P4

PDF

Базовые типы данных

typedef

Служит для определения дополнительного имени типа.

typedef bit<48> macAddr_t; 	// Объявление нового типа для 48-битового MAC-адреса Ethernet
typedef bit<32> ip4Addr_t;	// Объявление нового типа для 32-битового адреса IPv4

header

Упорядоченный набор элементов (полей заголовка). Заголовок обязательно включает скрытый элемент (бит) validity. Для проверки и изменения этого бита служат функции isValid(), setValid(), setInvalid().

header ethernet_t {
	macAddr_t dstAddr;	// Поле заголовка с MAC-адресом получателя
	macAddr_t srcAddr;	// Поле заголовка с MAC-адресом отправителя
	bit<16> type;		// Поле заголовка, указывающее тип кадра (EtherType)
}

Объявление переменных для заголовков имеет вид

ethernet_t ethernet;		// Переменная типа ethernet_t

Для доступа к полям заголовков используется нотация с точкой, как показано ниже.

macAddr_t src = ethernet.srcAddr;	// Переменная src получает MAC-адрес отправителя

struct

Структуры в P4 представляют собой неупорядоченные наборы элементов.

struct headers_t {
	ethernet_t ethernet;	// Структура, содержащая 1 заголовок типа ethernet_t
}

Стеки заголовков

Стек заголовков представляет собой индексированный массив элементов типа header.

header label_t {	// Объявление заголовка label_t (метка).
	bit<20> label;	// Собственно метка.
	bit bos;	// Флаг последней метки в стеке.
}

struct header_t {	// Объявление стека меток.
	label_t[10] labels;	// Стек меток.
}

header_t hdr;		// Переменная стека меток.

action pop_label() {	// Удаление метки из стека.
	hdr.labels.pop_front(1); // Выталкивание метки.
}

action push_label(in bit<20> label) {	// Добавление метки в стек.
	hdr.labels.push_front(1);		// Вталкивание метки.
	hdr.labels[0].setValid();		// Объявление метки 0 действительной.
	hdr.labels[0] = {label, 0};
}

Операторы и выражения

Объявление и назначение локальных метаданных

bit<16> tmp1; bit<16> tmp2;	// Переменные tmp1 и tmp1 типа bit<16>
tmp1 = hdr.ethernet.type;	// Переменная tmp1 получает значение EtherType из заголовка пакета

«Нарезка» и объединение (конкатенация) битов

tmp2 = tmp1[7:0] ++ tmp1[15:8];	// Переменная tmp2 получает значение объединения битов 0-7
					// из переменной tmp1 с битами 8-15 из той же переменной.
					// В данном случае это перестановка старшего и младшего байтов

Сложение, вычитание и приведение типов

tmp2 = tmp1 + tmp1 — (bit<16>)tmp1[7:0];	// Переменная tmp2 получает значение суммы tmp1 и 
						// старшего байта tmp1

Побитовые операции

tmp2 = (~tmp1 & tmp1) | (tmp1 ^ tmp1);	// Переменная tmp2 получает значение 0, поскольку 
						// операции И для числа и его «отрицания», а также 
						// Исключительное ИЛИ с самим собой дают 0, а 
						// ИЛИ для двух нулей также дает 0.
tmp2 = tmp1 << 3;				// Переменная tmp2 получает значение смещенных на
						// три позиции влево битов переменной tmp1. Три 
						// младших бита будут иметь значение 0.

Действия

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

action set_next_hop(bit<32> next_hop) {		// Установка следующего интервала пересылки
	if (next_hop == 0) {				// Если параметр next_hop еще не задан,	
		metadata.next_hop = hdr.ipv4.dst;	// в поле метаданных помещается адрес получателя
							// из заголовка IP в пакете.
	} else {					// В противном случае поле метаданных
		metadata.next_hop = next_hop;		// получает значение параметра next_hop.
	}
}

Операции на основании входных параметров от плоскости данных.

action swap_mac(inout bit<48> x,	// Перестановка MAC-адресов отправителя и получателя,
		 inout bit<48> y) {	// переданных параметрами действия.
	bit<48> tmp = x;		// Сохранение адреса x во временной переменной.
	x = y;				// Назначение переменной x значения переменной y.
	y = tmp;			// Назначение переменной y исходного значения переменной x.
}

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

action forward(in bit<9> p, bit<48> d) {	// Задание выходного порта и адреса получателя.
	standard_metadata.egress_spec = p;	// Указание выходного порта в метаданных по параметру.
	headers.ethernet.dstAddr = d;		// Указание адреса получателя по параметру.
}

Удаление заголовка из пакета (декапсуляция).

action decap_ip_ip() {			// Декапсуляция внешнего заголовка IP.
	hdr.ipv4 = hdr.inner_ipv4;	// Перенос внутреннего заголовка во внешний.
	hdr.inner_ipv4.setInvalid();	// Объявление внутреннего заголовка недействительным.
}

Таблицы

Ниже приведен пример определения таблицы для поиска по максимальному совпадению префиксов.

table ipv4_lpm {				// Таблица сопоставления по префиксам
	key = {
		hdr.ipv4.dstAddr : lpm;	// Выполняется сопоставление lpm для поиска самого длинного
						// префикса. Стандартные типы сопоставления - exact, ternary, 
	}					// lpm.
	// Задание возможных действий.
	actions = {
		ipv4_forward;		// Пересылка IPv4.
		Drop;			// Отбрасывание.
		NoAction;		// Нет действий.
	}
	// Свойства таблицы
	size = 1024;			// Число записей
	default_action = NoAction();	// Используемое при отсутствии совпадений действие.
}

Поток управления

Метод apply служит для вызова блоков «сопоставление-действие».

apply {		// Ветвление по признаку действительности заголовка.
	if (hdr.ipv4.isValid()) {	// Если заголовок пакета IPv4 действителен,
		ipv4_lpm.apply();	// выполняется сопоставление по самому длинному префиксу.
	}
	// Ветвление по результатам поиска в таблице
	if (local_ip_table.apply().hit) {	
		send_to_cpu();		// Передача пакета в порт CPU
	}
	// Ветвление для выбора действия в таблице.
	switch (table1.apply().action_run) { 
		action1: { table2.apply(); }
		action2: { table3.apply(); }
	}
}

Синтаксический анализ заголовков

Использование внешнего элемента packet_in для входного пакета.

extern packet_in {
	void extract<T>(out T hdr);			// Извлечение заголовка в выходную переменную T.
	void extract<T>(out T hdr,in bit<32> n);	// Назначение значения выходной переменной T
							// (заголовок) по входной переменной n.
	T lookahead<T>();				// Извлечение заголовка в T.
	void advance(in bit<32> n);			// Перемещение указателя текущей позиции на n.
	bit<32> length();				// Размер пакета.	
}

Анализ начинается с предопределенного состояния start.

state start {
	transition parse_ethernet;	// Переход к анализу заголовка Ethernet.
}

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

state parse_ethernet {
	packet.extract(hdr.ethernet);			// Извлечение заголовка Ethernet.
	transition select(hdr.ethernet.type) {	// Определение типа пакета.
		0x800: parse_ipv4;			// Анализ заголовка IP при EtherType=IP.
		default: accept;			// Восприятие прочих пакетов без дополнительного
	}						// анализа.
}

Определения для заголовков IPv4 и IPv6.

header ip46_t {
	bit<4> version;	// Версия протокола IP.
	bit<4> reserved;
}

Анализ стека заголовков.

state parse_labels {					// Анализ меток в заголовке
	packet.extract(hdr.labels.next);		// Извлечение метки
	transition select(hdr.labels.last.bos) {
		0: parse_labels; 			// Цикл анализа меток.
		1: guess_labels_payload;		// Последняя метка
	}
}

Анализ данных после стека заголовков.

state guess_labels_payload {				// Анализ содержимого.
	transition select(packet.lookahead<ip46_t>().version) {
		4 : parse_inner_ipv4;			// Пакет IPv4
		6 : parse_inner_ipv6;			// Пакет IPv6
		default : parse_inner_ethernet;	// Кадр Ethernet.
	}
}

Сборка пакетов после обработки

Внешний элемент packet_out используется для отправки обработанных пакетов.

extern packet_out {
	void emit<T>(in T hdr);
}
apply {		// Включение действительных заголовков в пакет
	packet.emit(hdr.ethernet);	// Отправка пакета.
}

Архитектура V1Model

Базовые внешние элементы архитектуры перечислены ниже.

extern void truncate(in bit<32> length);
extern void resubmit<T>(in T x);
extern void recirculate<T>(in T x);
enum CloneType { I2E, E2I }
extern void clone(in CloneType type, in bit<32> session);
// Элементы конвейера v1model.
parser Parser<H, M>(packet_in pkt,
		     out H hdr,
		     inout M meta,
		     inout standard_metadata_t std_meta);
control VerifyChecksum<H, M>(inout H hdr, inout M meta );
control Ingress<H, M>(inout H hdr,
			inout M meta,
			inout standard_metadata_t std_meta);
control Egress<H, M>(inout H hdr,
			inout M meta,
			inout standard_metadata_t std_meta);
control ComputeChecksum<H, M>(inout H hdr, inout M meta );
control Deparser<H>( packet_out b, in H hdr);
// Коммутатор v1model
package V1Switch<H, M>(Parser<H, M> p,
			VerifyChecksum<H, M> vr,
			Ingress<H, M> ig,
			Egress<H, M> eg,
			ComputeChecksum<H, M> ck,
			Deparser<H> d);

Стандартные метаданные V1Model

struct standard_metadata_t {
	bit<9>	ingress_port;
	bit<9>	egress_spec;
	bit<9>	egress_port;
	bit<32>	clone_spec;
	bit<32>	instance_type;
	bit<1>	drop;
	bit<16>	recirculate_port;
	bit<32>	packet_length;
	bit<32>	enq_timestamp;
	bit<19>	enq_qdepth;
	bit<32>	deq_timedelta;
	bit<19>	deq_qdepth;
	bit<48>	ingress_global_timestamp;
	bit<48>	egress_global_timestamp;
	bit<32>	lf_field_list;
	bit<16>	mcast_grp;
	bit<32>	resubmit_flag;
	bit<16>	egress_rid;
	bit<1>	checksum_error;
	bit<32>	recirculate_flag;
}

Счетчики и регистры V1Model

Счетчики

counter(8192, CounterType.packets) c;
action count(bit<32> index) {
	c.count(index);	// Инкрементирование счетчика пакетов по индексу.
}

Регистры

register<bit<48>>(16384) r;
action ipg(out bit<48> ival, bit<32> x) {
	bit<48> last;
	bit<48> now;
	r.read(last, x);
	now = std_meta.ingress_global_timestamp;
	ival = now - last;
	r.write(x, now);
}

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

nmalykh@protokols.ru

Рубрика: Сетевое программирование | Комментарии к записи Памятка по языку P4 отключены

Краткий обзор репозиториев P4 на Github

PDF

Здесь кратко описаны репозитории общего пользования p4lang.

Если нужна компиляция исходного кода P414 или P416 для модели поведения bmv2 с использованием консольного интерфейса или thrift API для работы с таблицами, потребуется локально установить и собрать два приведенных ниже репозитория.

  • p4c — прототип компилятора P416 (поддерживается также код P414);
  • behavioral-model — переопределение модели поведения на языке C++ без автоматического создания кода.

Репозитории p4lang

В Github p4lang является именем «организации», поддерживающей набор репозиториев, связанных с языком P4. Ниже перечислены эти репозитории по состоянию на сентябрь 2020 г.

behavioral-model

Переопределение модели поведения behavioral-model (ее часто называют bmv2 — сокращение от Behavioral Model Version 2) на языке C++ без автоматического создания кода.

Первой версией модели служил вывод кода из репозитория p4c-behavioral (компилятор P4 в C). Изменение программы P4 требовало повторной компиляции в новую программу C и последующей ее компиляции. Модель bmv2 больше напоминает интерпретатор для всех возможных программ P4, который настраивает свое поведение в соответствии с конфигурационным файлом bmv2 JSON, создаваемым компилятором p4c. При изменении программы P4 требуется повторная компиляция лишь этой программы без повтора компиляции bmv2.

education

P4 для обучения (материалы рабочей группы P4 Education).

governance

Wiki с документами проекта P4. В настоящее время репозиторий пуст.

grpc (ветвь grpc/grpc)

Обобщенная модель работы с вызовами удаленных процедур (C, C++, Python, Ruby, Objective-C, PHP, C#).

hackathons

Код, разработанный на мероприятиях P4 Hackathon.

mininet (ветвь mininet/mininet)

Эмулятор для работы с программно-определяемыми сетями (SDN), http://mininet.org.

ntf

Платформа для сетевых тестов.

p4-applications

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

p4-build

Инфраструктура, требуемая для генерации, сборки и установки библиотеки PD для программ P4.

p4-hlir

Написанный на языке Python компилятор для программ P414 (v1.0.x и v1.1.x), генерирующий высокоуровневое промежуточное представление (High Level Intermediate Representation), на основе которого можно создавать компилятор back-end. Создает в памяти объекты Python, представляющие объекты код P4 (заголовки, таблицы, списки полей и т. п.). Выполняет независимые от целевой платформы семантические проверки, включая ссылки на неопределенные таблицы или поля, исключение неиспользуемых таблиц и действий.

p4-hlir не понимает программ P416.

p4-spec

Спецификации языка P4 разных версий, PSA (Portable Switch Architecture), INT (Inband Network Telemetry).

p4app

Инструменты для сборки, запуска, отладки и тестирования программ P4.

p4c

Прототип компилятора (front-end) P416, поддерживающий также программы P414. Репозиторий включает также bmv2 и другие варианты компиляторов back-end.

p4c-behavioral

Устаревший компилятор P4 для модели поведения (behavioral model). Заменен behavioral-model.

Компилятор p4c-behavioral использует p4-hlir в качестве front-end для синтаксического анализа исходного кода и дает на выходе промежуточное представление IR, из которого создается код C/C++ для модели поведения версии 1 (не подходит для bmv2).

При установке этого репозитория могут возникать конфликты с p4c-bm, поскольку оба устанавливают модуль Python p4c-bm.

p4c-bm

Устаревшая программа генерации конфигурационных файлов JSON для bmv2, а также кода C/C++ PD. Не развивается. Компилятор p4c-bm использует p4-hlir в качестве front-end для синтаксического анализа исходного кода и создает промежуточное представление IR, из которого может быть сгенерирован конфигурационный файл bmv2 JSON. Может также генерировать код C++ PD.

p4-constraints

Расширение языка P4 для анонсирования ограничений. См. презентацию. Ограничения могут быть реализованы с помощью библиотеки p4-constraints, представленной в репозитории.

p4factory

Устаревшая тестовая реализация спецификации INT (Inband Network Telemetry).

p4lang.github.io

Некая информация с сайта P4.org, в том числе анонсы мероприятий.

p4ofagent

Агент Openflow для плоскости данных P4.

p4runtime

Спецификации P4Runtime — API плоскости управления.

p4runtime-shell

Интерактивная оболочка (shell) Python для P4Runtime.

papers

Несколько старых статей, связанных с P4.

PI

Реализация сервера P4Runtime.

protobuf (ветвь protocolbuffers/protobuf)

Реализация механизмов Protocol Buffers для сериализации структурированных данных от компании Google.

ptf

Модель тестирования плоскости данных на основе Python.

rules_protobuf (ветвь pubref/rules_protobuf)

Правила Bazel для создания буферов протоколов и служб gRPC (java, c++, go и т. п.)

SAI (ветвь opencomputeproject/SAI)

Реализация абстрактного интерфейса SAI, определяющего API для независимого от производителя управления элементами пересылки (ASIC, NPU, программные коммутаторы).

scapy-vxlan

Реализация scapy от компании Barefoot с поддержкой дополнительных заголовков пакетов, включая VXLAN.

switch

Программа switch — пример реализации коммутатора на языке P4, включающая API, SAI и Netlink.

third-party

Сторонние программы, от которых зависит p4lang.

thrift (ветвь apache/thrift)

Зеркало репозитория Apache Thrift.

tutorials

Учебные материалы по языку P4.

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

nmalykh@protokols.ru

Рубрика: Сетевое программирование | Комментарии к записи Краткий обзор репозиториев P4 на Github отключены

RFC 8899 Packetization Layer Path MTU Discovery for Datagram Transports

Internet Engineering Task Force (IETF)                      G. Fairhurst
Request for Comments: 8899                                      T. Jones
Updates: 4821, 4960, 6951, 8085, 8261             University of Aberdeen
Category: Standards Track                                       M. Tüxen
ISSN: 2070-1721                                              I. Rüngeler
                                                               T. Völker
                                  Münster University of Applied Sciences
                                                          September 2020

Packetization Layer Path MTU Discovery for Datagram Transports

Определение MTU для пути на уровне пакетизации для транспорта на основе дейтаграмм

PDF

Аннотация

Этот документ задаёт механизм определения MTU на пути для уровня пакетизации дейтаграмм (Datagram Packetization Layer Path MTU Discovery или DPLPMTUD). Это отказоустойчивый метод определения MTU на пути (Path MTU Discovery или PMTUD) для уровня пакетизации дейтаграмм (Packetization Layer или PL). Он позволяет уровню PL или использующему его приложению на основе дейтаграмм определять возможность поддержки на пути текущего размера дейтаграмм. Это можно использовать для определения и сокращения размера сообщений при столкновении отправителя с «чёрной дырой» для пакетов. Метод также позволяет проверить путь через сеть для определения максимального размера пакетов. Это обеспечивает для транспортировки дейтаграмм функциональность, эквивалентную PLPMTUD для протокола TCP, заданную в RFC 4821 и обновлённую этим документом. Документ также обновляет рекомендации по использованию UDP, указывая этот метод, а также обновляет протокол SCTP.

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

Эта спецификация обновляет RFC 4960, RFC 4821, RFC 6951, RFC 8085, RFC 8261.

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

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

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

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

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

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

В IETF определён транспорт дейтаграмм с использованием протоколов UDP, SCTP (Stream Control Transmission Protocol) и DCCP (Datagram Congestion Control Protocol), а также протоколов, работающих на основе этого транспорта (например, SCTP/UDP, DCCP/UDP, QUIC/UDP), и прямой доставки дейтаграмм на основе сетевого уровня IP. В этом документе описан отказоустойчивый метод определения MTU на пути (PMTUD), который можно применять с этими транспортными протоколами (или приложениями, использующими такой транспорт) для определения подходящего размера пакетов при передаче через Internet.

1.1. Классическое определение MTU на пути

Классический механизм определения максимального блока для передачи по пути (Path Maximum Transmission Unit Discovery или PMTUD) можно применять с любым транспортом, способным обрабатывать сообщения ICMP о слишком больших пакетах (Packet Too Big или PTB) (например, [RFC1191] и [RFC8201]). В этом документе термин «сообщение PTB» относится к сообщениям IPv4 ICMP Unreachable (ти 3) с кодом необходимости фрагментации (Fragmentation Needed, тип 3, код 4) [RFC0792] и ICMPv6 Packet Too Big (тип 2) [RFC4443]. При получении отправителем сообщения PTB он снижает эффективное значение MTU до размера, указанного как MTU на канале в сообщении PTB. Классический механизм PMTUD задаёт метод периодического увеличения размера пакетов в попытке определить рост поддерживаемого PMTU. Пакеты, размер которых превышает эффективное значение PMTU, называют пакетами зондирования или просто зондами.

Пакеты, не предназначенные для зондирования, фрагментируются до текущего эффективного PMTU или будут отброшены с возвратом кода ошибки. Приложениям может предоставляться примитив, позволяющий им считывать максимальный размер пакета (Maximum Packet Size или MPS), который выводится из текущего эффективного PMTU.

Классический механизм PMTUD подвержен отказам протокола. Один из отказов возникает при использовании пакетов больше действующего значения PMTU которые блокируются (все дейтаграммы больше фактического PMTU отбрасываются). Это может быть обусловлено тем, что сообщения PTB по каким-то причинам не передаются отправителю (см., например, [RFC2923]). Примеры случаев, когда сообщения PTB не доставляются, приведены ниже.

  • Ограничена скорость генерации сообщений ICMP, в результате чего сообщения PTB для отправителя могут не создаваться (см. параграф 2.4 в [RFC4443]).

  • Сообщения ICMP могут фильтроваться промежуточными устройствами, включая межсетевые экраны (МСЭ) [RFC4890]. МСЭ может быть настроен на блокирование входящих сообщений ICMP и это будет препятствовать доставке сообщений PTB передающей конечной точкой, находящейся за МСЭ.

  • Когда маршрутизатор, отправляющий сообщение ICMP, отбрасывает туннельный пакет, сообщение ICMP направляется на вход туннеля. Эта конечная точка туннеля отвечает за пересылку сообщения ICMP, обработку включённого в него пакета из поля данных с целью исключения туннельных заголовков и возврат корректно форматированного сообщения ICMP отправителю [TUNNELS]. Отказ в этих операциях препятствует доставке сообщения PTB исходному отправителю.

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

  • Возникают также ситуации, когда следующий интервал пересылки (next-hop) не способен принять пакет по причине его размера, например, в результате некорректной настройки уровня 2 между узлами, скажем, MTU в коммутаторе L2 или неверная настройка MRU4. Если пакет отбрасывается каналом, это не вызовет передачу сообщения PTB исходному отправителю.

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

  • От создающего сообщение ICMP маршрутизатора RFC 792 [RFC0792] требует включать в него лишь 64 бита данных из исходного пакета IP. Этого может быть недостаточно для проверки сообщения отправителем.

    Примечание. RFC 1812 [RFC1812] рекомендует маршрутизаторам IPv4 включать в сообщение максимально возможную часть часть исходного пакета, пока дейтаграмма ICMP не превышает 576 байтов. Маршрутизаторы IPv6 включают максимально возможное число байтов исходного пакета, пока пакет ICMPv6 не превышает 1280 байтов [RFC4443].

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

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

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

  • При генерации сообщения ICMP маршрутизатором в сегменте сети, вставившем заголовок в пакет, включённая в сообщение часть исходного пакета может содержать дополнительные протокольные заголовки, которых не было в исходном пакете и которые отправитель PL не обрабатывает или не знает, как обработать. Это может помешать отправителю при проверке сообщения PTB.

  • Транслятор адресов (Network Address Translation или NAT), преобразующий заголовок пакета, должен также транслировать сообщения ICMP и обновлять содержащуюся в них часть исходного пакета [RFC5508]. При некорректной трансляции отправитель не сможет связать сообщение с PL, передавшим пакет и проверить сообщение ICMP не удастся.

1.2. Определение MTU для пути на уровне пакетизации

Термин «уровень пакетизации» (Packetization Layer или PL) был введён для описания уровня, отвечающего за размещение блоков данных в поле данных (payload) пакетов IP и выбор подходящего MPS. Эта функция зачастую реализуется транспортным протоколом (например, DCCP, RTP, SCTP, QUIC), но может выполняться и другими методами инкапсуляции, работающими над транспортным уровнем.

В отличие от PMTUD, механизм определения MTU на пути уровня пакетизации (PLPMTUD) [RFC4821] применяет метод, не основанный на получении и проверке сообщений PTB. Поэтому данный механизм более устойчив к отказам по сравнению с классическим PMTUD и стал рекомендуемым подходом к определению PMTU [BCP145].

Этот документ обновляет [RFC4821], задавая метод PLPMTUD для дейтаграммных PL, а также обновляет [BCP145], указывая заданный здесь метод для использования с дейтаграммами UDP вместо метода из [RFC4821].

Метод применяет общую стратегию, где PL передаёт пакеты зондирования в поиске наибольшего размера нефрагментированных дейтаграмм, которые можно передать по пути через сеть. Пакеты-зонды передаются для исследования с использованием наибольшего размера. Если зонд успешно доставлен (как определено PL), PLPMTU увеличивается до размера этого зонда. При обнаружении «чёрной дыры» (например, когда пакеты размером PLPMTU постоянно не доставляются) значение PLPMTU снижается. PLPMTUD для дейтаграмм обеспечивает гибкость реализации. С одной стороны, его можно настроить лишь на обнаружение чёрных дыр и восстановление с повышенной отказоустойчивостью по сравнению с Classical PMTUD. С другой стороны, обработку PTB можно полностью отключить и PLPMTUD заменит Classical PMTUD. PLPMTUD может также включать проверку согласованности без повышения риска потери данных при зондировании для определения Path MTU. Например, сведения, доступные на уровне PL или вышележащем уровне позволяют проверить сообщения PTB перед их использованием.

1.3. Определение Path MTU для служб на основе дейтаграмм

В разделе 5 этого документа представлен набор алгоритмов для протоколов на основе дейтаграмм, позволяющих определить наибольший размер нефрагментированной дейтаграммы, которая может быть передана по пути через сеть. Метод основан на свойствах PL, описанных в разделе 3 и применяемых к транспортным протоколам, использующим IPv4 и IPv6. Метод не требует взаимодействия с нижележащими уровнями, но может использовать сообщения PTB, когда они доступны уровню PL.

В рекомендациях по определению размера сообщений параграфа 3.2 в [BCP145] сказано: «приложению следует использовать данные о MTU на пути от уровня IP или самостоятельно реализовать определение MTU на пути (Path MTU Discovery или PMTUD)», но не представлен механизм определения наибольшего размера нефрагментированных дейтаграмм на пути через сеть. Этот документ обновляет RFC 8085, задавая этот метод вместо PLPMTUD [RFC4821] и предоставляет механизм совместного использования определённого наибольшего размера как MPS (параграф 4.4).

Параграф 10.2 в [RFC4821] рекомендует метод зондирования PLPMTUD для протокола SCTP (Stream Control Transport Protocol). SCTP использует пакеты зондирования содержащие блоки HEARTBEAT минимального размера с блоком PAD, как указано в [RFC4820]. Однако в RFC 4821 не задана полная спецификация. Этот документ обеспечивает её.

Протокол DCCP (Datagram Congestion Control Protocol) [RFC4340] требует от реализаций поддержки Classical PMTUD и говорит, что отправитель DCCP: «должен поддерживать значение максимального размера пакета (MPS), разрешённого для каждой активной сессии DCCP». Протокол также определяет текущее значение MPS для контроля перегрузки (CCMPS5), поддерживаемое на сетевом пути. Документ рекомендует использование PMTUD и предлагает применять пакеты управления (DCCP-Sync) в качестве зондов, поскольку это не вносит риска потери данных приложения. Определённый в этой спецификации метод может применяться с DCCP.

В разделах 4 и 5 определены протокольные механизмы и спецификация определения MTU для пути на уровне пакетизации дейтаграмм (Datagram Packetization Layer Path MTU Discovery или DPLPMTUD). В разделе 6 задан метод для транспорта дейтаграмм и представлены сведения для реализации PLPMTUD с другим транспортом на основе дейтаграмм и приложениями, использующими такой транспорт. В разделе 6 представлены также рекомендации для конечных точек SCTP, обновляющие [RFC4960], [RFC6951], [RFC8261] с целью использования описанного здесь метода вместо предложенного в [RFC4821].

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

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

Ниже приведены определения используемых в документе терминов. Соответствующие термины напрямую скопированы из [RFC4821], применяются также определения из [RFC1122].

Acknowledged PL — PL с подтверждениями

Уровень PL, включающий механизм, который может подтверждать доставку дейтаграмм удалённой конечной точке PL (например, SCTP). Обычно получатель PL возвращает подтверждения, соответствующие принятым дейтаграммам, которые можно использовать для обнаружения блокировки пакетов («чёрных дыр»). См. также Unacknowledged PL.

Actual PMTU — фактическое значение PMTU

Значение PMTU в сети между PL отправителя и получателя, которое алгоритм DPLPMTUD пытается определить.

Black Hole — “чёрная дыра”

«Чёрная дыра» возникает, когда отправитель не знает, доставлены ли его пакеты получателю. С DPLPMTUD связаны два типа «чёрных дыр»:

  • пакеты попадают в «чёрную дыру», когда они не доставляются конечному получателю (например, отправитель передаёт пакеты определённого размера с неизвестным заранее PMTU и они отбрасываются в сети);
  • «чёрная дыра» ICMP возникает, когда отправитель не знает, что пакеты не доставлены адресату, поскольку сообщения PTB не приходят в PL исходного отправителя.

Classical Path MTU Discovery — классический механизм определения Path MTU

Classical PMTUD — процесс, описанный в [RFC1191] и [RFC8201], где узлы полагаются на сообщения PTB для определения наибольшего размера нефрагментированных пакетов, которые можно передать по сетевому пути.

Datagram — дейтаграмма

Блок данных транспортного протокола, передаваемый в поле данных (payload) пакета IP.

DPLPMTUD

Определение MTU для пути на уровне пакетизации дейтаграмм — это PLPMTUD с использованием протокола доставки дейтаграмм.

Effective PMTU — эффективное значение PMTU

Текущая оценка значения PMTU, используемая PMTUD. Это эквивалент PLPMTU, выведенного PLPMTUD с добавлением размера всех заголовков ниже уровня PL, включая заголовки IP.

EMTU_S

Эффективное значение MTU для передачи (EMTU_S), определённое в [RFC1122] как «максимальный размер передаваемой дейтаграммы IP для конкретной комбинации отправитель – получатель».

EMTU_R

Эффективное значение MTU для приёма (EMTU_S), определённое в [RFC1122] как «максимальный размер дейтаграммы, которая может быть собрана».

Link — канал

Средство связи или среда, через которые узлы могут взаимодействовать на канальном уровне, т. е. ниже уровня IP. Примерами могут служить ЛВС Ethernet и туннели уровня Internet (или более высокого).

Link MTU — MTU для канала

Размер (в байтах) наибольшего пакета IP с учётом заголовка IP и данных, который может быть передан через канал. Отметим, что это корректней называть IP MTU в соответствии с терминологией, применяемой другими органами стандартизации. Значение учитывает заголовок IP, но не учитывает заголовки канального уровня и кадрирование, которые не относятся к IP. Другие органы стандартизации обычно учитывают в MTU для канала и заголовки канального уровня. Данная спецификация следует [RFC4821], где сказано: «Для всех каналов должно обеспечиваться соответствие своим MTU – при недетерминированном получении каналом пакета с размером больше установленного для канала MTU такие пакеты должны отбрасываться».

MAX_PLPMTU

Наибольшее значение PLPMTU, которое механизм DPLPMTUD пытается использовать (см. 5.1.2. Константы).

MIN_PLPMTU

Наименьшее значение PLPMTU, которое механизм DPLPMTUD пытается использовать (см. 5.1.2. Константы).

MPS

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

MSL

Максимальный срок жизни сегмента — это наибольшая задержка пакета, ожидаемая на пути. В [BCP145] задано значение 2 минуты.

Packet — пакет

Заголовок IP с расширениями и опциями, а также данные IP (payload).

Packetization Layer (PL) — уровень пакетизации

Уровень сетевого стека, помещающий данные в пакеты и выполняющий функции транспортного протокола. Примерами PL являются TCP, SCTP, SCTP на основе UDP, SCTP на основе DTLS, QUIC.

Path — путь

Набор каналов и маршрутизаторов, через которые проходит поток между узлом-источником и узлом-получателем.

Path MTU (PMTU) — MTU для пути

Минимальное из значение MTU для канала среди всех каналов на пути от источника к получателю, используемое PMTUD.

PTB

В этом документе термин «сообщение PTB» относится к сообщениям IPv4 ICMP Unreachable (тип 3) с ошибкой Fragmentation Needed (тип 3, код 4) [RFC0792] и ICMPv6 Packet Too Big (тип 2) [RFC4443].

PTB_SIZE

Значение, переданное в проверенном сообщении PTB, которое указывает MTU канала к следующему маршрутизатору на пути.

PL_PTB_SIZE

Значение, переданное в проверенном сообщении PTB, из которого исключены все заголовки, добавленные уровнями ниже PL.

PLPMTU

Значение PMTU уровня пакетизации, которое является оценкой максимального размера дейтаграммы PL, которая может быть передана по пути, контролируемому PLPMTUD.

PLPMTUD

Определение Path MTU для уровня пакетизации — описанный в этом документе метод для дейтаграммных PL, который является расширением Classical PMTU Discovery.

Probe packet — пакет зондирования

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

Unacknowledged PL — PL без подтверждения

Уровень PL без механизма подтверждения доставки удалённой точке PL (например, UDP), которому требуется DPLPMTUD в качестве механизма обнаружения блокировки пакетов («чёрных дыр»). См. также Acknowledged PL.

3. Свойства, требуемые для Datagram PLPMTUD

Принципы [RFC4821] применимы к использованию метода с любым уровнем PL. Был определён TCP PLPMTUD со стандартными механизмами протокола TCP. Дейтаграммные PL, в отличие от TCP, требуют дополнительных механизмов и соображений в части реализации PLPMTUD, как указано ниже.

  1. Управление PLPMTU. Для дейтаграммных PL значением PLPMTU управляет DPLPMTUD. Уровню PL недопустимо передавать дейтаграммы (кроме пробных пакетов), размер которых на уровне PL больше текущего PLPMTU.

  2. Пакеты зондирования. От сетевого интерфейса ниже уровня PL требуется обеспечивать способ передачи пробных пакетов размером больше PLPMTU. В IPv4 пробные пакеты должны передаваться с флагом запрета фрагментирования (DF) в заголовке IP и без фрагментации конечной точкой сетевого уровня. В IPv6 пробные пакеты всегда передаются без фрагментации источником (как указано в параграфе 5.4 [RFC8201]).

  3. Обратная связь при получении. От конечного получателя PL требуется метод обратной связи, указывающий отправителю DPLPMTUD приём пробного пакета конечным получателем PL. В разделе 6 представлены примеры подтверждения уровнем PL приёма пробных пакетов.

  4. Восстановление при потере зондов. Для зондирования рекомендуется использовать пакеты, не содержащие пользовательских данных, которые потребуется повторять при потере. Большинство средств транспорта дейтаграмм разрешает это. Если пробный пакет содержит пользовательские данные, которые требуется повторять при потере, от PL (или вышележащих уровней) требуется организовать повторную передачу и/или восстановление при любых потерях. От PL требуется отказоустойчивость в случаях потери пакетов по другим причинам (включая ошибки канального уровня и перегрузку).

  5. Параметры PMTU. Отправителю DPLPMTUD рекомендуется использовать сведения о максимальном размере пакета, которым он может по локальному каналу (например, MTU локального канала). Отправитель PL может использовать подобную информацию о максимальном размере пакета сетевого уровня, который получатель может воспринять (отметим, что это может быть меньше EMTU_R). Это избавляет реализации от попыток передать пробные пакеты, которые локальный канал не может передать. Слишком высокое значение может снизить эффективность алгоритма поиска. В некоторых приложениях также устанавливается максимальный размер транспортного блока (protocol data unit или PDU) и тогда не будет пользы от проверки больших размеров (если транспорт не позволяет мультиплексировать несколько PDU приложения в одну дейтаграмму).

  6. Обработка сообщений PTB. Отправитель DPLPMTUD может использовать сообщения PTB от сетевого уровня как помощь при определении невозможности передачи пробного пакета через сеть. Полученные сообщения PTB должны проверяться перед их использованием для обновления информации PLPMTU [RFC8201]. Эта проверка подтверждает отправку сообщения PTB в ответ на пакет от отправителя и её нужно выполнять до реагирования метода определения PLPMTU на сообщение PTB. Недопустимо использовать сообщение PTB для увеличения PLPMTU [RFC8201], но можно инициировать зонд для проверки большего PLPMTU. Действительное значение PTB_SIZE преобразуется в PL_PTB_SIZE перед использованием в конечном автомате DPLPMTUD. Значение PL_PTB_SIZE, превышающее текущее проверенное значение, следует игнорировать (это сообщение PTB нужно отбросить без обработки, но можно использовать в качестве триггера перехода в режим устойчивости).

  7. Зондирование и контроль перегрузок. PL может использовать контроллер перегрузок для решения вопроса об отправке пробного пакета. Если передача зондов ограничивается контроллером перегрузок, это может привести к задержке или приостановке передачи пробных пакетов во время перегрузки. Когда контроллер перегрузки не управляет передачей зондов, интервал отправки должен быть не меньше RTT. Потерю пробного пакета не следует считать индикацией перегрузки, а механизму контроля перегрузки не следует реагировать на неё [RFC4821], поскольку это может вести к необоснованному снижению скорости передачи. При обновлении PLPMTU (или MPS) недопустимо увеличивать окно перегрузок, измеренное в байтах [RFC4821]. Следовательно, рост размера пакета не вызывает увеличения скорости данных в байтах за секунду. PL с поддержкой окна перегрузки на основе ограничения числа ожидающих пакетов фиксированного размера следует изменить этот предел для компенсации фактического увеличения пакетов. Передача пробных пакетов может взаимодействовать с работой PL по сглаживанию пиков трафика и PL может потребоваться передача пробных пакетов в соответствии с этими методами.

  8. Зондирование и управление потоком данных. Управление потоком данных в PL связано со сквозными потоками данных, использующими услуги PL. Управление потоком данных не следует применять к DPLPMTU, если в зондах не передаются пользовательские данные для удалённого приложения.

  9. Общее состояние PLPMTU. Значение PMTU, рассчитанное из PLPMTU, может сохраняться в соответствующей записи, связанной с адресатом в кэше уровня IP и используемой другими экземплярами PL. В спецификации PLPMTUD [RFC4821] сказано: «Если PLPMTUD обновляет MTU для определённого пути, все сессии уровня пакетизации, использующие этот путь (см. параграф 5.2), следует уведомить об использовании нового MTU». Такие методы должны быть устойчивы к широкому спектру режимов пересылки базовой сети. В параграфе 5.2 [RFC8201] приведены рекомендации по кэширования данных PMTU и связи с метками потоков IPv6.

Кроме того, для разработки метода DPLPMTUD сформулирован ряд приведённых ниже принципов.

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

  • Чтобы помочь приложениям выбрать подходящий размер блока данных, уровню PL рекомендуется обеспечивать примитив, возвращающий значение MPS, выведенное из PLPMTU, вышележащему уровню, который использует PL. Значение MPS может меняться при смене пути или потере пробных пакетов.

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

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

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

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

4. Механизмы DPLPMTUD

В этом разделе описаны механизмы, используемые в спецификации.

4.1. Пакеты зондирования PLPMTU

Метод DPLPMTUD основан на возможности отправителя PL генерировать пробные пакеты заданного размера. TCP может создавать такие пакеты выбирая соответствующий сегмент передаваемых данных [RFC4821]. В PL на основе дейтаграмм это потребовало бы запросить у приложения передачу блока данных, размер которого превышает генерируемых приложением, или использовать функции заполнения для увеличения размера дейтаграмм. Протоколы, разрешающие обмен управляющими сообщениями (без блока данных приложения), могут генерировать пробные пакеты, просто дополняя управляющее сообщение данными заполнения. Общий размер пробного пакета включает все заголовки и заполнение, а также передаваемые данные (например, поля опций протокола, связанные с защитой поля, такие как тег AEAD6, и заполнения уровня TLS record).

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

Зондирование с использованием данных заполнения

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

Зондирование с использованием данных приложения и заполнения

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

Зондирование с использованием данных приложения

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

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

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

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

4.2. Подтверждение размера пробных пакетов

Уровню PL нужен метод определения (подтверждения) приёма пробных пакетов другой стороной через сеть. Транспортные протоколы могут включать сквозные методы обнаружения и информирования о приёме конкретных переданных дейтаграмм (например, DCCP, SCTP, QUIC имеют функции keep-alive/heartbeat). При поддержке таких механизмов они могут применяться в DPLPMTUD для подтверждения приёма пробных пакетов.

PL без подтверждения приёма данных (например, UDP и UDP-Lite) сам не может определить факт отбрасывания пакета с размером больше фактического PMTU. Таким PL приходится полагаться при обнаружении потерь на протокол приложения. В разделе 6 задана эта функция для набора протоколов IETF.

4.3. Обнаружение блокировки и снижение PLPMTU

Приведённое ниже описание использует константы из параграфа 5.1.2 и переменные из параграфа 5.1.3. Обнаружение блокировки «чёрной дыры) сигнализируется неспособностью пути через сеть поддерживать текущий размер PLPMTU. Возможны три индикатора блокировки, указанных ниже.

  • Проверенное сообщение PTB, указывающее, что PL_PTB_SIZE меньше текущего PLPMTU. Методу DPLPMTUD недопустимо полагаться лишь на эту индикацию.

  • PL может использовать механизм зондирования DPLPMTUD для периодической генерации пробных пакетов, размер которых равен текущему PLPMTU (например, с таймером CONFIRMATION_TIMER, параграф 5.1.1). Таймер отслеживает приём подтверждений. Последовательная потеря зондов служит индикатором невозможности поддержки путём текущего значения PLPMTU (например, когда число переданных и не подтверждённых пробных пакетов PROBE_COUNT становится больше MAX_PROBES).

  • PL может использовать событие, указывающее, что сетевой путь больше не поддерживает принятое отправителем значение PLPMTU. Это может быть реализованный в PL механизм обнаружения чрезмерных потерь с принятием на этом основании решения о том, что потери обусловлены недопустимым PLPMTU (как в PLPMTUD для TCP [RFC4821]).

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

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

Когда метод определяет, что текущее значение PLPMTU не поддерживается, DPLPMTUD устанавливает меньшие значения PLPMTU и MPS. После этого PL подтверждает пригодность нового PLPMTU на пути через сеть. Для пробного пакета может потребоваться размер меньше блока данных, создаваемого приложением.

4.4. Максимальный размер пакета

Результат зондирования определяет пригодное значение PLPMTU, используемое для установки MPS, применяемого приложением. MPS меньше PLPMTU, поскольку его значение уменьшается на размер заголовков PL (включая связанные с защитой поля, такие как тег AEAD и заполнение уровня TLS record). Связь между MPS и PLPMTUD показана на рисунке 1.

Заголовки
приложения        .---- MPS -----.
         |        |              |
         v        v              v
  +-------------------------------+
  | IP | ** | PL |данные протокола|
  +-------------------------------+

             <----- PLPMTU ------>
  <----------- PMTU -------------->

Рисунок 1. Связь между MPS и PLPMTU.


PL не может отправить пакет (кроме зонда) размером больше текущего PLPMTU на сетевом уровне. Для предотвращения этого PL можно спроектировать с сегментированием блоков данных больше MPS на несколько дейтаграмм.

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

Если DPLPMTUD приводит к изменению MPS, приложению потребуется приспособиться к новому MPS. Может возникать случай, когда пакеты были переданы с размером меньше MPS, а затем было уменьшено значение PLPMTU. Если эти пакеты будут потеряны, PL может сегментировать данные с использованием нового MPS. Если PL не может повторно сегментировать переданную ранее дейтаграмму (например, [RFC4960]), отправитель отбрасывает дейтаграмму или может повторить передачу с использованием фрагментации на сетевом уровне для создания нескольких пакетов IP размером не более PLPMTU. Для IPv4 использование фрагментации передающей конечной точкой предпочтительней сброса бита DF в заголовке IPv4. Опыт эксплуатации показывает, что фрагментация IP может снижать гарантии доставки в Internet [RFC8900], что может снизить вероятность успеха при повторной передаче.

4.5. Отключение влияния PMTUD

Уровень PL, реализующий эту спецификацию, должен приостановить обработку на сетевом уровне, вынуждающую использовать PMTU [RFC1191][RFC8201], для каждого потока, применяющего DPLPMTUD, и вместо этого определять размер передаваемых в поток пакетов через DPLPMTUD. Это избавляет сетевой уровень от необходимости отбрасывать или фрагментировать переданные пакеты с размером больше PMTU.

4.6. Отклики на сообщения PTB

Этот метод требует от отправителя DPLPMTUD проверять полученные сообщения PTB до использования сведений из них. Отклик на сообщение PTB зависит от значения PL_PTB_SIZE, рассчитанного из PTB_SIZE в сообщении PTB, состояния конечного автомата PLPMTUD и применяемого протокола IP.

В параграфе 4.6.1 описана проверка для сообщений IPv4 ICMP Unreachable (тип 3) и ICMPv6 Packet Too Big, которые совместно называются в этом документе сообщениями PTB.

4.6.1. Проверка сообщения PTB

В этом параграфе описано использование и проверка сообщений PTB:

  • простая реализация может игнорировать полученные сообщения PTB и PLPMTU не будет обновляться в результате их получения;

  • уровень PL с поддержкой сообщения PTB должен проверять эти сообщения до дальнейшей обработки.

Уровень PL, получивший сообщение PTB от маршрутизатора или промежуточного устройства, выполняет проверку ICMP (раздел 4 в [RFC8201] и параграф 5.2 в [BCP145]). Поскольку DPLPMTUD работает на уровне PL, этот уровень должен проверить, что каждое принятое сообщение PTB создано в ответ на пакет, переданный конечной точкой PL, выполняющей DPLPMTUD.

Уровень PL должен проверить протокольные данные в полученной в сообщении ICMP PTB части исходного пакета, чтобы убедиться в отправке пакета им. Эта проверка включает сопоставление адресов IP, протокола, портов отправителя и получателя, чтобы направить сообщение PTB соответствующему PL.

При проверке следует использовать сведения, которые атакующему вне пути передачи сложно определить [BCP145]. Например, можно проверить значение поля в заголовке протокола известное лишь двум конечным точкам PL. Приложения на основе дейтаграмм, использующие общеизвестные порты у отправителя и получателя, должны также полагаться при проверке на другие сведения.

Проверка предназначена для защиты от пакетов, переданных узлами, не находящимися на пути через сеть. Не прошедшие проверку сообщения PTB недопустимо использовать в DPLPMTUD, как указано в разделе 8. Вопросы безопасности. Обработка сообщений PTB описана в параграфе 4.6.2.

4.6.2. Использование сообщений PTB

Проверенные сообщения PTB можно применять в алгоритме DPLPMTUD, но недопустимо напрямую использовать для установки PLPMTU. Перед использованием размера, указанного в сообщении PTB его нужно преобразовать в PL_PTB_SIZE. Значение PL_PTB_SIZE меньше PTB_SIZE, поскольку оно не включает заголовки уровней ниже PL, опции IP и расширения, добавленные к пакету PL.

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

Набор проверок предназначен для защиты от маршрутизаторов, сообщающих неожиданное значение PTB_SIZE. Уровню PL нужно также убедиться, что значение PL_PTB_SIZE меньше используемого размера пробных пакетов и не меньше минимально допустимого размера. Ниже приведена сводка использования сообщений PTB с константами из параграфа 5.1.2. Обработка зависит от PL_PTB_SIZE и текущих значение переменных, как показано ниже.

PL_PTB_SIZE < MIN_PLPMTU
  • Непригодный размер PL_PTB_SIZE, см. параграф 4.6.1.

  • Сообщение PTB нужно отбросить без обработки (PLPMTU не меняется).

  • Информацию можно использовать как триггер включения режима устойчивости (параграф 5.3.3).

MIN_PLPMTU < PL_PTB_SIZE < BASE_PLPMTU
  • Отказоустойчивый уровень PL может ввести состояние Error (5.2. Конечный автомат) для пути IPv4, когда значение PL_PTB_SIZE из сообщения PTB не меньше 68 байтов [RFC0791] но меньше BASE_PLPMTU.

  • Отказоустойчивый уровень PL может ввести состояние Error (5.2. Конечный автомат) для пути IPv6, когда значение PL_PTB_SIZE из сообщения PTB не меньше 1280 байтов [RFC8200], но меньше BASE_PLPMTU.

BASE_PLPMTU <= PL_PTB_SIZE < PLPMTU
  • Это может быть индикацией чёрной дыры. Для PLPMTU следует установить значение BASE_PLPMTU (для предотвращения ненужных потерь пакетов при возникновении блокировки).

  • PL нужно запустить поиск для быстрого определения нового PLPMTU. Для инициализации алгоритма поиска можно использовать PL_PTB_SIZE из сообщения PTB.

PLPMTU < PL_PTB_SIZE < PROBED_SIZE
  • PLPMTU остаётся действительным, но размер использованных для поиска пакетов (PROBED_SIZE) был больше фактического PMTU.

  • PLPMTU не обновляется.

  • PL может применять PL_PTB_SIZE из сообщения PTB в качестве следующей точки поиска при возобновлении алгоритма.

PL_PTB_SIZE >= PROBED_SIZE
  • Несогласованный сигнал из сети.

  • Сообщение PTB нужно отбросить без обработки (PLPMTU не меняется).

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

5. PMTUD уровня пакетизации дейтаграмм

В этом разделе описывается PLPMTUD для дейтаграмм (DPLPMTUD). Метод может применяться в различных точках (* на рисунке 2) стека протоколов IP для определения PLPMTU, позволяющего приложения использовать подходящее значение MPS для текущего пути через сеть.

DPLPMTUD следует применять лишь на одном уровне между парой конечных точек. Поэтому вышележащему уровню PL или приложения следует избегать использования DPLPMTUD если этот метод уже включён на нижележащем уровне. Уровень PL должен установить значение MPS, указанное DPLPMTUD, с учётом всех дополнительных «издержек», вносимых PL.

+----------------------+
|     Приложение*      |
+-----+------------+---+
      |            |
  +---+--+      +--+--+
  | QUIC*|      |SCTP*|
  +---+--+      +-+-+-+
      |           | |
      +---+  +----+ |
          |  |      |
        +-+--+-+    |
        | UDP  |    |
        +---+--+    |
            |       |
+-----------+-------+--+
|  Сетевой интерфейс   |
+----------------------+

Рисунок 2. Примеры реализации DPLPMTUD.


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

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

5.1. Компоненты DPLPMTUD

В этом параграфе описаны таймеры, константы и переменные DPLPMTUD.

5.1.1. Таймеры

Метод использует 3 таймера.

PROBE_TIMER

Этот таймер настраивается на время максимального ожидания подтверждения пробного пакета. Для таймера недопустимо значение меньше 1 секунды и следует устанавливать значение больше 15 секунд. Рекомендации по выбору значения таймера приведены в параграфе 3.1.1 [BCP145].

PMTU_RAISE_TIMER

Время, в течение которого отправитель продолжает использовать текущее значение PLPMTU, перед входом в фазу поиска (Search Phase). Для этого таймера устанавливается значение 600 секунд в соответствии с рекомендацией PLPMTUD [RFC4821].

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

CONFIRMATION_TIMER

При использовании PL с подтверждениями, применять этот таймер недопустимо. Для других PL таймер задаёт время, в течение которого отправитель PL ждёт перед подтверждением поддержки текущего PLPMTU. Это время меньше PMTU_RAISE_TIMER и служит для уменьшения PLPMTU (например, при обнаружении чёрной дыры). Подтверждения должны быть достаточно частыми при передаче потока, чтобы передающий уровень PL не отправил в чёрную дыру слишком большой объем трафика. Рекомендации по установке этого таймера приведены в параграфе 3.1.1 [BCP145].

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

DPLPMTUD задаёт разные таймеры, однако реализация может реализовать их функции с одним таймером.

5.1.2. Константы

MAX_PROBES

Максимальное значение счётчика зондов PROBE_COUNT (5.1.3. Переменные). MAX_PROBES ограничивает число последовательных зондов любого размера. Алгоритмы поиска выигрывают от значения MAX_PROBES больше 1, поскольку это повышает устойчивость к изолированной потере пакета. По умолчанию MAX_PROBES = 3.

MIN_PLPMTU

Наименьший размер PLPMTU, который DPLPMTUD пытается использовать. Конечной точке может потребоваться настройка MIN_PLPMTU для обеспечения пространства под заголовки расширения и иную инкапсуляцию ниже уровня PL. Значение может зависеть от интерфейса и пути. Для IPv6 этот размер не меньше размера на уровне PL, приводящего к 1280-байтовым пакетам IPv6, как указано в [RFC8200]. Для IPv4 этот размер не меньше размера PL, приводящего к 68-байтовым пакетам IPv4.

Примечание. От маршрутизатора IPv4 требуется способность пересылать дейтаграммы размером 68 байтов без дальнейшей фрагментации. Это включает заголовок IPv4 и фрагмент минимального размера 8 байтов. Кроме того, от получателей требуется способность собирать фрагментированные дейтаграммы размером по меньшей мере 576 байтов, как указано в параграфе 3.3.3 [RFC1122].

MAX_PLPMTU

Наибольшее значение PLPMTU. Оно должно быть не больше максимального размера пакета PL, который можно передать через выходной интерфейс (ограничивается MTU локального интерфейса). Значение должно также быть меньше максимального размера пакета PL, который может принять удалённая конечная точка (если этот размер известен), ограниченный EMTU_R. Значение параметра может быть ограничено реализацией или настройкой используемого уровня PL. Приложение или PL может выбрать меньшее значение MAX_PLPMTU, если не требуется передавать пакеты больше определённого размера.

BASE_PLPMTU

Настраиваемый размер, который считается подходящим для работы на большинстве путей. Это значение не меньше MIN_PLPMTU и меньше MAX_PLPMTU. Для большинства PL подходящим будет BASE_PLPMTU больше 1200 байтов. При использовании IPv4 эквивалентный размер не задан и по умолчанию для BASE_PLPMTU рекомендуется значение 1200 байтов.

5.1.3. Переменные

PROBED_SIZE

Текущий размер пробного пакета, определённый PL. Это предварительное значение PLPMTU, ожидающее подтверждения.

PROBE_COUNT

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

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

MIN_PLPMTU                                MAX_PLPMTU
  <------------------------------------------->
                 |        |     |
                 v        |     |
           BASE_PLPMTU    |     v
                          |  PROBED_SIZE
                          v
                        PLPMTU

Рисунок 3. Связи между константами и переменными.


5.1.4. Фазы DPLPMTUD

В этом параграфе представлен высокоуровневый информативный обзор метода DPLPMTUD путём описания нескольких фаз работы метода. Более подробное описание конечного автомата дано в параграфе 5.2.

Base

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

Пробный пакет размера BASE_PLPMTU может быть отправлен сразу при входе в фазу Base (после проверки связности). PL без поддержки путей с PLPMTU меньше BASE_PLPMTU может упростить фазу до одного шага, выполняя проверку связности пробным пакетом размера BASE_PLPMTU.

После подтверждения DPLPMTUD переходит в фазу поиска (Search). Если фаза Base не смогла подтвердить BASE_PLPMTU, механизм DPLPMTUD переходит в фазу Error.

                    +------+
           +------->| Base |-----------------+ Отказ подтверждения
           |        +------+                 | связности или
           |           |                     | BASE_PLPMTU
           |           |                     v
           |           |   Связность     +-------+
           |           |   и BASE_PLPMTU | Error |
           |           |   подтверждены  +-------+
           |           |                     | Согласованная
           |           v                     | связность
Обнаружена |       +--------+                | и BASE_PLPMTU
черная дыра|       | Search |<---------------+ подтверждены
           |       +--------+
           |          ^  |
           |          |  |
           | Завершен |  | Алгоритм
           | отсчет   |  | поиска
           | таймера  |  | завершен
           | Raise    |  |
           |          |  v
           |   +-----------------+
           +---| Search Complete |
               +-----------------+

Рисунок 4. Фазы DPLPMTUD.


Search

Фаза Search использует алгоритм поиска для передачи пробных пакетов с целью увеличения PLPMTU. Алгоритм заключает, что найдено подходящее значение PLPMTU, переходом в фазу Search Complete.

PL может отвечать на сообщения PTB, используя PTB для продолжения или прерывания поиска (параграф 4.6).

Search Complete

Фаза завершённого поиска (Search Complete) начинается, когда PLPMTU поддерживается на сетевом пути. PL может использовать CONFIRMATION_TIMER для периодического повторения пробного пакета с текущим размером PLPMTU. Если отправитель не способен подтвердить достижимость (например, истекло время CONFIRMATION_TIMER) или PL сообщает о недостижимости, это считается обнаружением чёрной дыры и DPLPMTUD переходит в фазу Base.

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

Error

Фаза Error вводится при наличии конфликтующих или недействительных сведений PLPMTU для пути (например, отказ поддержки BASE_PLPMTU), которые делают невозможной работу DPLPMTUD и PLPMTU снижается.

DPLPMTUD остаётся в фазе Error, пока не будет найдено согласованное представление пути, а также подтверждена поддержка BASE_PLPMTU на пути (или DPLPMTUD приостанавливается).

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

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

5.2. Конечный автомат

Конечный автомат для DPLPMTUD показан на рисунке 5. При поддержке множества путей или многодомности автомат нужен для каждого пути. На рисунке для упрощения некоторые переходы не показаны.

Ниже перечислены состояния конечного автомата.

DISABLED

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

BASE

Состояние BASE служит для подтверждения поддержки размера BASE_PLPMTU на пути через сеть и предназначено для того, чтобы приложение могло продолжить работу при временном сокращении фактического PMTU. Это также позволяет избежать долгих периодов, когда отправитель, ищущий большее значение PLPMTU, не знает о том, что пакеты не были доставлены по причине блокировки их или ICMP (чёрная дыра).

При входе в состояние устанавливается PROBED_SIZE = BASE_PLPMTU и PROBE_COUNT = 0.

При каждой отправке пробного пакета запускается таймер PROBE_TIMER. Состояние прерывается, когда пробный пакет подтверждён, и отправитель PL переходит в состояние SEARCHING.

Состояние также прерывается, когда PROBE_COUNT достигает MAX_PROBES или проверяется полученное сообщение PTB. Это заставляет отправителя PL перейти в состояние ERROR.

SEARCHING

Состояние SEARCHING является основной частью зондирования и вводится по завершении зондирования для размера BASE_PLPMTU.

При каждом подтверждении пробного пакета устанавливается PROBE_COUNT = 0, PLPMTU = PROBED_SIZE, а значение PROBED_SIZE увеличивается с использованием алгоритма поиска (как описано в параграфе 5.3).

Когда переданный пробный пакет не подтверждён в интервале PROBE_TIMER, значение PROBE_COUNT инкрементируется и передаётся новый пробный пакет.

Состояние завершается переходом в SEARCH_COMPLETE, когда PROBE_COUNT достигает MAX_PROBES, принимается проверенное сообщение PTB, соответствующее последнему успешно проверенному размеру (PL_PTB_SIZE = PLPMTU), или подтверждается зонд размера MAX_PLPMTU (PLPMTU = MAX_PLPMTU).

При обнаружении чёрной дыры в состоянии SEARCHING отправитель PL переходит в состояние BASE.

SEARCH_COMPLETE

Состояние SEARCH_COMPLETE указывает завершения поиска. Это нормальное состояние поддержки, когда PL не выполняет зондирования для обновления PLPMTU. DPLPMTUD остаётся в этом состоянии до завершения отсчёта PMTU_RAISE_TIMER или обнаружения чёрной дыры.

Когда DPLPMTUD использует PL без подтверждений и находится в состоянии SEARCH_COMPLETE, таймер CONFIRMATION_TIMER периодически сбрасывает PROBE_COUNT и планирует пробный пакет размера PLPMTU. Если MAX_PROBES последовательных зондов размера PLPMTUD не подтверждены, метод переходит в состояние BASE. При использовании с подтверждаемым PL (например, SCTP) методу DPLPMTUD не следует продолжать генерацию зондов PLPMTU в этом состоянии.

   |         |
   |  Старт  | PL указывает 
   |         | потерю связности
   v         v
+---------------+                                   +---------------+
|    DISABLED   |                                   |     ERROR     |
+---------------+             PROBE_TIMER завершен: +---------------+
        | PL указывает     PROBE_COUNT = MAX_PROBES или   ^      |
        | связность      PTB: PL_PTB_SIZE < BASE_PLPMTU   |      | 
        +--------------------+         +------------------+      | 
                             |         |                         |
                             v         |    Запрошен зонд        | 
                          +---------------+ BASE_PLPMTU          | 
                          |     BASE      |--------------------->+
                          +---------------+                      |
                             ^ |    ^  ^                         |
       Обнаружена черная дыра| |    |  |Обнаружена черная дыра   |
        +--------------------+ |    |  +--------------------+    |
        |                      +----+                       |    |
        |                PROBE_TIMER завершен:              |    |
        |             PROBE_COUNT < MAX_PROBES              |    |
        |                                                   |    |
        |               PMTU_RAISE_TIMER завершен           |    |
        |    +-----------------------------------------+    |    |
        |    |                                         |    |    |
        |    |                                         v    |    v
+---------------+                                   +---------------+
|SEARCH_COMPLETE|                                   |   SEARCHING   |
+---------------+                                   +---------------+
   |    ^    ^                                         |    |    ^
   |    |    |                                         |    |    |
   |    |    +-----------------------------------------+    |    |
   |    |            Запрошен зонд MAX_PLPMTU или           |    |
   |    | PROBE_TIMER завершен: PROBE_COUNT = MAX_PROBES или|    |
   +----+            PTB: PL_PTB_SIZE = PLPMTU              +----+
CONFIRMATION_TIMER завершен:                    PROBE_TIMER завершен:
PROBE_COUNT < MAX_PROBES или             PROBE_COUNT < MAX_PROBES или
запрошен зонд PLPMTU                           Запрошен зонд или PTB:
                                   PLPMTU < PL_PTB_SIZE < PROBED_SIZE

Рисунок 5. Конечный автомат для Datagram PLPMTUD.


ERROR

Состояние ERROR представляет случай, когда для сетевого пути неизвестно о поддержке PLPMTU размером хотя бы BASE_PLPMTU или имеются противоречивые сведения о пути через сеть, которые в ином случае привели бы к чрезмерным вариациям MPS, передаваемого вышележащему уровню. Состояние смягчает осцилляции конечного автомата (смены состояния по событиям). Оно передаёт умеренное значение MPS вышележащему уровню через PL. Состояние завершается, когда пробные пакеты больше не обнаруживают ошибок. Отправитель PL затем переходит в состояние SEARCHING.

Реализациям разрешено включать фрагментацию на конечных точках, если DPLPMTUD не может проверить MIN_PLPMTU за PROBE_COUNT проб. Если DPLPMTUD не может проверить MIN_PLPMTU, реализация будет переходить в состояние DISABLED.

Примечание. MIN_PLPMTU может совпадать с BASE_PLPMTU для упрощения действий в этом состоянии.

5.3. Поиск для увеличения PLPMTU

В этом параграфе описаны алгоритмы, используемые DPLPMTUD для поиска большего PLPMTU.

5.3.1. Зондирование для повышения PLPMTU

Реализации применяют алгоритм поиска по всему диапазону для определения возможности поддержки большего значения PLPMTU на пути через сеть. Метод определяет диапазон поиска, подтверждая минимальное значение PLPMTU, а затем используя зондирование для выбора PROBED_SIZE, не превышающего MAX_PLPMTU. Значение MAX_PLPMTU является меньшим из значений локального MTU и EMTU_R (когда оно получено от удалённой конечной точки). Приложение может снизить MAX_PLPMTU, установив максимальный размер передаваемых дейтаграмм.

Для счётчика PROBE_COUNT устанавливается 0 при передаче первого пробного пакета размером не меньше PLPMTU. Каждый пробный пакет, успешно доставленный удалённому партнёру, подтверждается на уровне PL (параграф 4.1).

При передаче каждого пробного пакета получателю запускается таймер PROBE_TIMER, который сбрасывается при получении уровнем PL подтверждения доставки пакета через сеть (параграф 4.1). Это подтверждает поддержку на пути размера PROBED_SIZE и значение PROBED_SIZE присваивается PLPMTU. Алгоритм поиска может продолжить передачу пробных пакетов, увеличивая размер.

Если отсчёт таймера завершается до получения подтверждения, пробный пакет не подтверждает PROBED_SIZE. При каждом завершении отсчёта PROBE_TIMER увеличивается значение PROBE_COUNT, таймер запускается снова и может быть передан пробный пакет того же или иного (заданного алгоритмом поиска). Максимальное число передаваемых зондов задано константой MAX_PROBES. Если PROBE_COUNT достигает значения MAX_PROBES, зондирование останавливается и отправитель PL переходит в состояние SEARCH_COMPLETE.

5.3.2. Выбор размера зондов

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

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

5.3.3. Устойчивость к несогласованности сведений о пути

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

Отправитель PL может обнаружить несогласованность из последовательности подтверждённых зондов PLPMTU или последовательности принимаемых сообщений PTB. При обнаружении несогласованности сведений о пути отправитель PL может использовать другой режим поиска, который на некоторое время ограничивает предлагаемое значение MPS. Это позволяет избежать ненужной потери пакетов.

5.4. Устойчивость к несоответствию пути

Некоторые пути могут не поддерживать пакеты размером BASE_PLPMTU. Для обеспечения устойчивости к таким путям может быть реализовано состояние Error. Это позволяет использовать PLPMTU меньше желаемого значения для предотвращения отказов в связности. Для реализации этого можно использовать такие методы, как фрагментация IP в конечной точке, позволяющая отправителю PL взаимодействовать с партнёрами, используя пакеты размером меньше BASE_PLPMTU.

6. Спецификация зависящих от протокола методов

DPLPMTUD требует указания зависящих от протокола деталей для каждого применяемого уровня PL.

В следующем параграфе приведено руководство по реализации метода DPLPMTUD как части приложения, использующего UDP или UDP-Lite. Рекомендации применимы и к другим службам на основе дейтаграмм, не включающим конкретный транспортный протокол (например, к туннельной инкапсуляции). В последующих параграфах описаны возможные способы реализации DPLPMTUD как части транспортного сервиса, позволяющего приложениям использовать преимущества определения PLPMTU без необходимости самим реализовать этот метод при работе по протоколам SCTP и QUIC.

6.1. Поддержка DPLPMTUD в приложениях UDP и UDP-Lite

Действующие спецификации UDP [RFC0768] и UDP-Lite [RFC3828] не определяют в RFC метод поддержки PLPMTUD. В частности, транспорт UDP не поддерживает функций, требуемых для реализации PLPMTUD.

Метод DPLPMTUD можно реализовать как часть приложения, основанного на UDP или UDP-Lite, но полагающегося на функции вышележащего уровня для реализации метода [BCP145]. Некоторые примитивы, используемые DPLPMTUD, могут быть недоступны через Datagram API (например, возможность доступа к PLPMTU из кэша уровня IP или интерпретация сообщений PTB).

Кроме того, рекомендуется не применять определение PMTU на нескольких уровнях. Приложению следует избегать использования DPLPMTUD, если эти функции поддерживает базовая транспортная система. Единая поддержка PLPMTU обеспечивает преимущества как в возможности совместного использования разными процессами, так и в возможности согласовать зондирование для разных экземпляров PL.

6.1.1. Запрос к приложению

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

6.1.2. Отклик приложения

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

6.1.3. Отправка пробных пакетов

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

6.1.4. Начальная связность

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

6.1.5. Проверка пути

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

6.1.6. Обработка сообщений PTB

Приложение, способное и желающее принимать сообщения PTB, должно выполнять проверку ICMP в соответствии с параграфом 5.2 [BCP145]. Это требует от приложения проверки каждого принятого сообщения PTB, чтобы убедиться в его создании в ответ на передачу трафика и в том, что указанное в нем значение PL_PTB_SIZE меньше текущего размера зондов (см. параграф 4.6.2). Проверенное сообщение PTB можно использовать в качестве входных данных алгоритма DPLPMTUD, но недопустимо применять его напрямую для установки PLPMTU.

6.2. DPLPMTUD для SCTP

В параграфе 10.2 [RFC4821] определён рекомендуемый метод зондирования PLPMTUD для SCTP, а в параграфе 7.3 [RFC4960] конечным точкам рекомендуется применять методы RFC 4821 для каждого адреса получателя. Спецификация DPLPMTUD сохраняет практику применения PL для определения PMTU, но обновляет RFC4960 рекомендацией использовать заданный этим документом метод. Рекомендуемый метод генерации зондов заключается в добавлении к сообщению SCTP блока (chunk), содержащего лишь заполнение. Для создания пробного пакета следует присоединять блок PAD, определённый в [RFC4820], к блоку HEARTBEAT (HB). Это позволяет зондировать путь без влияния на передачу пользовательских сообщений и внесения ограничений в механизмы контроля перегрузок и управления потоком данных. Это предпочтительней использования блоков DATA (с заполнения, когда нужно) в качестве пробных пакетов.

В параграфе 6.9 [RFC4960] описано деление пользовательских сообщений на блоки DATA, передаваемые уровнем PL при использовании SCTP. При этом отмечено, что после отправки сообщения SCTP его нельзя сегментировать снова. В [RFC4960] описан метод повторной передачи блоков DATA при снижении MPS, а в параграфе 6.9 [RFC4960] описано применения для этого фрагментации IP. Данный документ не меняет этого поведения.

6.2.1. SCTP/IPv4 и SCTP/IPv6

6.2.1.1. Начальная связность

Базовый протокол задан [RFC4960] и является PL с подтверждениями. Поэтому отправитель может перейти в состояние BASE сразу после подтверждения связности.

6.2.1.2. Передача пробных пакетов SCTP

Пробный пакет содержит базовый заголовок SCTP, за которым следуют блоки HEARTBEAT и PAD. Блок PAD нужен для задания размера пробного пакета, а HEARTBEAT служит триггером возврата блока HEARTBEAT ACK. Получение блока HEARTBEAT ACK подтверждает успешную доставку зонда и на основании этого обновляются счётчики ассоциации и пути. Неудачные пробы при этом не учитываются и считаются последствием выбора слишком большого PLPMTU.

Отправитель SCTP должен быть способен определить суммарный размер пробного пакета. Блок HEARTBEAT может содержать параметр Heartbeat Information, включающий кроме информации, предложенной в [RFC4960], размер зонда, помогающий реализации связать HEARTBEAT ACK с размером переданного зонда. Отправитель также может использовать другие методы, такие как отправка nonce с проверкой этого значения в полученном отклике. Размер блока PAD определяется вычитанием из размера зонда размера базового заголовка SCTP и блока HEARTBEAT. Содержимое блока PAD может быть произвольным. При передаче на уровне IP размер PMTU также включает заголовок IPv4 или IPv6.

Зондирование может начаться сразу после согласования PL, до начала передачи данных. В таком случае (PMTU на превышает MTU для интерфейса) процесс займёт несколько периодов кругового обхода, в зависимости от числа передаваемых зондов DPLPMTUD. Для реализации PROBE_TIMER можно использовать таймер Heartbeat.

6.2.1.3. Проверка пути в SCTP

Поскольку SCTP является PL с подтверждениями, отправителю недопустимо реализовать таймер CONFIRMATION_TIMER в состоянии SEARCH_COMPLETE.

6.2.1.4. Обработка сообщений PTB в SCTP

Должна выполняться обычная проверка ICMP в соответствии с приложением C [RFC4960]. Это требует включения первых 8 байтов базового заголовка SCTP в сообщение PTB, возможного для ICMPv4 и обычного в ICMPv6.

Когда сообщение PTB проверено, значение PL_PTB_SIZE, рассчитанное из PTB_SIZE в сообщении PTB, следует применять в алгоритме DPLPMTUD при условии, что PL_PTB_SIZE меньше текущего размера зонда (параграф 4.6).

6.2.2. DPLPMTUD для SCTP/UDP

Инкапсуляция в UDP для протокола SCTP описана в [RFC6951]. Эта спецификация заменяет ссылку на RFC 4821 в параграфе 5.6 RFC 6951 ссылкой на этот документ (RFC 8899). RFC 6951 обновляется добавлением в конце параграфа 5.6 строки: «Рекомендуемый метод определения MTU на пути задан в RFC 8899».

6.2.2.1. Начальная связность

Отправитель может перейти в состояние BASE сразу после подтверждения связности SCTP.

6.2.2.2. Передача пробных пакетов SCTP/UDP

Зондирование может выполняться в соответствии с параграфом 6.2.1.2. Размер пробных пакетов включает 8 байтов заголовка UDP и его нужно учитывать при определении размера блока PAD.

6.2.2.3. Проверка пути с SCTP/UDP

SCTP является PL с подтверждениями, поэтому отправителю недопустимо реализовать таймер CONFIRMATION_TIMER в состоянии SEARCH_COMPLETE.

6.2.2.4. Обработка сообщений PTB в SCTP/UDP

Должна выполняться обычная проверка ICMP в соответствии с приложением C [RFC4960]. Это требует включения первых 8 байтов базового заголовка SCTP в сообщение PTB, возможного для ICMPv4 (отметим, что заголовок UDP также занимает часть включаемых в сообщение данных) и обычного в ICMPv6. Когда сообщение PTB проверено, значение PL_PTB_SIZE, рассчитанное из PTB_SIZE в сообщении PTB, следует применять в алгоритме DPLPMTUD при условии, что PL_PTB_SIZE меньше текущего размера зонда (параграф 4.6).

6.2.3. DPLPMTUD для SCTP/DTLS

Инкапсуляция в DTLS для SCTP определена в [RFC8261] и применяется для каналов данных в реализациях WebRTC. Эта спецификация заменяет ссылку на RFC 4821 в разделе 5 RFC 8261 ссылкой на этот документ (RFC 8899).

6.2.3.1. Начальная связность

Отправитель может перейти в состояние BASE сразу после подтверждения связности SCTP.

6.2.3.2. Sending SCTP/DTLS Probe Packets

Зондирование может выполняться в соответствии с параграфом 6.2.1.2. Размер пробных пакетов включает заголовок DTLS и его нужно учитывать при определении размера блока PAD.

6.2.3.3. Проверка пути с SCTP/DTLS

Поскольку SCTP является PL с подтверждениями, отправителю недопустимо реализовать таймер CONFIRMATION_TIMER в состоянии SEARCH_COMPLETE.

6.2.3.4. Обработка сообщений PTB в SCTP/DTLS

[RFC4960] не задаёт способа проверки содержимого сообщений SCTP/DTLS ICMP, равно как этот документ. Это может препятствовать обработке сообщений PTB на уровне PL.

6.3. DPLPMTUD для QUIC

QUIC [QUIC] представляет собой основанный на UDP уровень PL с обратной связью при получении. Данные UDP включают заголовок пакета QUIC, защищённое содержимое и поля проверки подлинности. Поддерживается заполнение и объединение пакетов для создания зондов нужного размера. С точки зрения DPLPMTUD, протокол QUIC можно считать PL с подтверждениями. В [QUIC] описан метод использования DPLPMTUD с пакетами QUIC.

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

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

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

Вопросы безопасности при использовании UDP и SCTP рассмотрены в соответствующих RFC.

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

Отправитель PL должен обеспечить защиту метода подтверждения приёма зондов от атакующих извне пути, способных внедрять пакеты в путь. Такая защита обеспечивается в протоколах IETF (например, TCP, SCTP) с помощью случайных значений порядковых номеров. Описание одного из способов защиты при использовании UDP приведено в параграфе 5.1 [BCP145]).

Возможны случаи, когда сообщения ICMP PTB (Packet Too Big) не доставляются в соответствии с политикой, настройкой или возможностями оборудования (см. 1.1. Классическое определение MTU на пути). Поэтому метод не полагается на получение сообщений PTB, но может использовать их. Сообщения PTB могут служить для принуждения узла к неоправданному снижению PLPMTU. Поэтому узел, использующий DPLPMTUD, должен проверять содержимое сообщений PTB и их соответствие переданным пакетам (т. е. сведения об ошибке должны соответствовать реально переданным дейтаграммам, см. параграф 4.6.1).

Расположенный на пути атакующий, способный создавать сообщения PTB, может генерировать фиктивные PTB, включая с них часть действительного пакета IP. Такие атаки могут служить для принудительного снижения PLPMTU. Устройство в пути может также принудительно снизить PLPMTU, реализуя правило отбрасывания пакетов больше определённого размера. Существует два способа ослабления таких атак. Во-первых, отправитель PL может не устанавливать PLPMTU ниже базового размера на основании лишь сообщений PTB, что достигается переходом в состояние BASE при получении таких сообщений. Во-вторых, сообщения PTB можно не обрабатывать и отправитель PL может отключить их обработку (например, в режиме устойчивости после обнаружения того, что последовательные зонды действительно показывают поддержку PTB_SIZE на пути).

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

Успешная обработка сообщения ICMP может вызвать зондирование, когда сообщенный в PTB размер действителен, но это не ведёт к прямому обновлению PLPMTU для пути. Такое поведение предотвращает чёрные дыры для данных, создаваемые путём задания избыточного для пути размера пакетов.

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

Методы DPLPMTUD могут вносить заполнение для увеличения общего размера дейтаграммы в пробных пакетах. Размер пробного пакета включает все заголовки и заполнение добавленное к данным пакета (например, включение связанных с защитой полей, таких как тег AEAD и заполнение уровня TLS record). Значение заполнения не влияет на алгоритм поиска DPLPMTUD и поэтому должно выбираться в соответствии с политикой PL.

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

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

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

[BCP145] Eggert, L., Fairhurst, G., and G. Shepherd, «UDP Usage Guidelines», BCP 145, RFC 8085, March 2017, <https://www.rfc-editor.org/info/bcp145>.

[RFC0768] Postel, J., «User Datagram Protocol», STD 6, RFC 768, DOI 10.17487/RFC0768, August 1980, <https://www.rfc-editor.org/info/rfc768>.

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

[RFC1191] Mogul, J. and S. Deering, «Path MTU discovery», RFC 1191, DOI 10.17487/RFC1191, November 1990, <https://www.rfc-editor.org/info/rfc1191>.

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

[RFC3828] Larzon, L-A., Degermark, M., Pink, S., Jonsson, L-E., Ed., and G. Fairhurst, Ed., «The Lightweight User Datagram Protocol (UDP-Lite)», RFC 3828, DOI 10.17487/RFC3828, July 2004, <https://www.rfc-editor.org/info/rfc3828>.

[RFC4820] Tuexen, M., Stewart, R., and P. Lei, «Padding Chunk and Parameter for the Stream Control Transmission Protocol (SCTP)», RFC 4820, DOI 10.17487/RFC4820, March 2007, <https://www.rfc-editor.org/info/rfc4820>.

[RFC4960] Stewart, R., Ed., «Stream Control Transmission Protocol», RFC 4960, DOI 10.17487/RFC4960, September 2007, <https://www.rfc-editor.org/info/rfc4960>.

[RFC6951] Tuexen, M. and R. Stewart, «UDP Encapsulation of Stream Control Transmission Protocol (SCTP) Packets for End-Host to End-Host Communication», RFC 6951, DOI 10.17487/RFC6951, May 2013, <https://www.rfc-editor.org/info/rfc6951>.

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

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

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

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

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

[QUIC] Iyengar, J., Ed. and M. Thomson, Ed., «QUIC: A UDP-Based Multiplexed and Secure Transport», Work in Progress7, Internet-Draft, draft-ietf-quic-transport-29, 10 June 2020, <https://tools.ietf.org/html/draft-ietf-quic-transport-29>.

[RFC0792] Postel, J., «Internet Control Message Protocol», STD 5, RFC 792, DOI 10.17487/RFC0792, September 1981, <https://www.rfc-editor.org/info/rfc792>.

[RFC1122] Braden, R., Ed., «Requirements for Internet Hosts — Communication Layers», STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, <https://www.rfc-editor.org/info/rfc1122>.

[RFC1812] Baker, F., Ed., «Requirements for IP Version 4 Routers», RFC 1812, DOI 10.17487/RFC1812, June 1995, <https://www.rfc-editor.org/info/rfc1812>.

[RFC2923] Lahey, K., «TCP Problems with Path MTU Discovery», RFC 2923, DOI 10.17487/RFC2923, September 2000, <https://www.rfc-editor.org/info/rfc2923>.

[RFC4340] Kohler, E., Handley, M., and S. Floyd, «Datagram Congestion Control Protocol (DCCP)», RFC 4340, DOI 10.17487/RFC4340, March 2006, <https://www.rfc-editor.org/info/rfc4340>.

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

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

[RFC4890] Davies, E. and J. Mohacsi, «Recommendations for Filtering ICMPv6 Messages in Firewalls», RFC 4890, DOI 10.17487/RFC4890, May 2007, <https://www.rfc-editor.org/info/rfc4890>.

[RFC5508] Srisuresh, P., Ford, B., Sivakumar, S., and S. Guha, «NAT Behavioral Requirements for ICMP», BCP 148, RFC 5508, DOI 10.17487/RFC5508, April 2009, <https://www.rfc-editor.org/info/rfc5508>.

[RFC8900] Bonica, R., Baker, F., Huston, G., Hinden, R., Troan, O., and F. Gont, «IP Fragmentation Considered Fragile», RFC 8900, BCP 230, September 2020, <https://www.rfc-editor.org/info/rfc8900>.

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

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

Эта работа частично финансировалась в рамках программы European Union Horizon 2020 Research and Innovation по гранту No. 644334, A New, Evolutive API and Transport-Layer Architecture for the Internet (NEAT). Выраженные здесь взгляды принадлежат исключительно авторам.

Спасибо всем, кто участвовал в работе или комментировал документ, рабочим группам TSVWG и QUIC, а также Mathew Calder и Julius Flohr за предоставление предварительных реализаций.

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

Godred Fairhurst

University of Aberdeen

School of Engineering

Fraser Noble Building

Aberdeen

AB24 3UE

United Kingdom

Email: gorry@erg.abdn.ac.uk

Tom Jones

University of Aberdeen

School of Engineering

Fraser Noble Building

Aberdeen

AB24 3UE

United Kingdom

Email: tom@erg.abdn.ac.uk

Michael Tüxen

Münster University of Applied Sciences

Stegerwaldstrasse 39

48565 Steinfurt

Germany

Email: tuexen@fh-muenster.de

Irene Rüngeler

Münster University of Applied Sciences

Stegerwaldstrasse 39

48565 Steinfurt

Germany

Email: i.ruengeler@fh-muenster.de

Timo Völker

Münster University of Applied Sciences

Stegerwaldstrasse 39

48565 Steinfurt

Germany

Email: timo.voelker@fh-muenster.de


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

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

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Equal-Cost Multipath — множество равноценных путей.

4Maximum Receive Unit — максимальный принимаемый блок.

5Congestion control MPS.

6Authenticated Encryption with Associated Data — аутентифицированное шифрование со связанными данными.

7Документ опубликован в RFC 9000. Прим. перев.

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

RFC 8900 IP Fragmentation Considered Fragile

Internet Engineering Task Force (IETF)                         R. Bonica
Request for Comments: 8900                              Juniper Networks
BCP: 230                                                        F. Baker
Category: Best Current Practice                             Unaffiliated
ISSN: 2070-1721                                                G. Huston
                                                                   APNIC
                                                               R. Hinden
                                                    Check Point Software
                                                                O. Troan
                                                                   Cisco
                                                                 F. Gont
                                                            SI6 Networks
                                                          September 2020

IP Fragmentation Considered Fragile

Проблемы, связанные с фрагментацией IP

PDF

Аннотация

В этом документе описывается фрагментация IP и её влияние на нестабильность Internet-коммуникаций. Документ также предлагает альтернативу фрагментации IP и даёт рекомендации для разработчиков и сетевых операторов.

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

Документ относится к категории Internet Best Current Practice.

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

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

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

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

Опыт эксплуатации [Kent] [Huston] [RFC7872] показывает, что фрагментация IP ведёт к уязвимости коммуникаций Internet. Этот документ описывает фрагментацию IP и разъясняет её «хрупкость», а также предлагает альтернативу фрагментации и рекомендации для разработчиков и сетевых операторов.

Хотя в документе идентифицированы проблемы, связанные с фрагментацией IP, он не предлагает отказа от неё. Унаследованные протоколы, зависящие от фрагментации IP, следует обновить для исключения зависимости. Однако некоторые приложения и среды (см. раздел 5) требуют использовать фрагментацию IP. В таких случаях протокол будет продолжать её использование, но разработчикам следует осознавать, что фрагментированные пакеты могут приводить к «чёрным дырам». При разработке следует предусматривать соответствующие меры предосторожности.

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

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

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

2. Фрагментация IP

2.1. Каналы, пути, MTU, PMTU

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

Для каждого канала число октетов, которые можно передать в одном пакете IP, ограничено. Этот параметр называют максимальным передаваемым блоком (Maximum Transmission Unit или MTU). В IPv4 [RFC0791] от каждого канала требуется поддержка MTU не менее 68 октетов3. В IPv6 [RFC8200] от каждого канала требуется поддержка MTU не менее 1280 октетов. Эти значения называются минимальными MTU для каналов IPv4 и IPv6.

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

Точно также размер пакетов IP ограничен на каждом пути Internet. Это ограничение называют MTU для пути (Path MTU или PMTU). Для любого пути PMTU совпадает с наименьшим значением MTU образующих путь каналов. Пути в Internet имеют динамическую природу и значения PMTU также являются динамическими.

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

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

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

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

С помощью процедур определения PMTU (Path MTU Discovery или PMTUD) [RFC1191] [RFC8201] узел-источник может более точно оценить PMTU между собой и получателем. В PMTUD узел-источник выполняет начальную оценку PMTU как значение MTU на первом канале пути к получателю. Это значение может быть больше фактического PMTU.

Получив начальную оценку PMTU, узел-источник передаёт получателю нефрагментируемые4 пакеты IP. Если какой-то из этих пакетов окажется больше фактического PMTU, маршрутизатор не сможет его переслать, поэтому он отбросит пакет и передаст сообщение ICMP [RFC0792] [RFC4443] Packet Too Big (PTB — пакет слишком велик) узлу-источнику5. Сообщение ICMP PTB указывает значение MTU на канале, в который не удалось передать пакет. Узел-источник использует эти сведения для уточнения оценки PMTU.

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

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

  • PMTUD полагается на способность сети доставлять сообщения ICMP PTB узлу-источнику и при неспособности сети доставить сообщения ICMP PTB возникает отказ PMTUD.

  • Механизм PMTUD уязвим для атак, поскольку сообщения ICMP легко подделать [RFC5927] и получатель не проверяет их подлинность. Такие атаки ведут PMTUD к заниженной оценке PMTU.

2.2. Процедуры фрагментации

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

Процедуры фрагментации IPv4 описаны в [RFC0791]. Пакет IPv4 с DF = 1 может быть фрагментирован узлом-источником6, но маршрутизаторы на пути не могут фрагментировать его. Пакет IPv4 с DF = 0 может фрагментировать узел-источник или маршрутизатор на пути. При фрагментировании пакета IPv4 все опции IP (из заголовка IPv4) указываются в первом фрагменте, а в последующие включаются лишь опции с установленным (1) флагом копирования.

В [RFC8200] (особенно параграф 4.5) описаны процедуры фрагментации IPv6. Пакет IPv6 может фрагментировать лишь узел-источник. При фрагментировании пакета IPv6 в первом фрагменте присутствуют все заголовки расширения, но в последующих присутствуют лишь заголовки фрагмента, включающие:

  • заголовок IPv6;

  • Hop-by-Hop Options (при наличии);

  • Destination Options (при наличии и размещении до заголовка Routing);

  • Routing (при наличии);

  • Fragment.

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

2.3. Зависимость вышележащего уровня от фрагментации IP

Протоколы вышележащего уровня могут работать в нескольких режимах:

  • не полагаться на фрагментацию IP;

  • полагаться на фрагментацию лишь узлом-источником;

  • полагаться на фрагментацию любым узлом.

Протоколы вышележащего уровня на основе IPv4 могут работать во всех перечисленных режимах, протоколы на основе IPv6 — лишь в первом и втором. Протоколам, работающим в первых двух режимах, требуется оценка PMTU, для чего они могут:

  • задать PMTU равным минимальному MTU канала IPv4 или IPv6;

  • использовать оценку, выполненную PMTUD;

  • выполнить PMTUD самостоятельно;

  • выполнить процедуры PMTUD уровня пакетизации (Packetization Layer PMTUD или PLPMTUD) [RFC4821] [RFC8899].

В соответствии с процедурами PLPMTUD протокол вышележащего уровня поддерживает текущую оценку PMTU путём отправки зондов разного размера вышележащему уровню своего партнёра и обработки подтверждений от того. Эта стратегия отличается от PMTUD тем, что полагается на подтверждения принятых сообщений, а не на ICMP PTB для отброшенных сообщений. Поэтому PLPMTUD не зависит от возможности сети доставлять сообщения ICMP PTB.

3. Связанные с фрагментацией проблемы

В этом разделе разъясняется, как фрагментация IP приводит к уязвимости коммуникаций Internet.

3.1. Виртуальная сборка

Виртуальной сборкой называют процедуру, в которой устройство концептуально собирает пакет, пересылает его фрагменты и отбрасывает собранную копию. В системах A+P (Address plus Port) [RFC6346] и NAT операторского класса (Carrier Grade NAT или CGN) [RFC6888] виртуальная сборка требуется для корректной трансляции адресов во фрагментах. Такая сборка может быть полезна для решения проблем, указанных в параграфах 3.2, 3.3, 3.4, 3.5.

Виртуальная сборка требует больших вычислительных ресурсов и хранения состояний в течение неопределённого времени, поэтому она подвержена ошибкам и атакам (параграф 3.7).

3.2. Маршрутизация на основе правил

Фрагментация IP вызывает проблемы в маршрутизаторах, реализующих пересылку на основе правил. При получении маршрутизатором пакета он определяет следующий интервал пересылки (next hop) на маршруте к адресату и пересылает пакет туда. Для определения next hop маршрутизатор обращается к локальной структуре данных, называемой базой данных о пересылке (Forwarding Information Base или FIB).

Обычно FIB содержит записи, сопоставляющие префикс получателей с next hop и организованные по префиксам. Маршрутизация на основе правил позволяет держать в одной базе FIB записи, организованные по префиксам и правилам маршрутизации. Записи FIB на основе правил сопоставляют несколько полей из заголовка IP или транспортного уровня с next hop.

Таблица 1. Routing FIB на основе правил.

Запись

Тип

Префикс адресата

След. заголовок/порт адресата

Next Hop

1

По префиксам

2001:db8::1/128

Any/Any

2001:db8:2::2

2

По правилам

2001:db8::1/128

TCP/80

2001:db8:3::3

Предположим, что маршрутизатор поддерживает базу FIB, показанную в таблице 1. Первая запись FIB сопоставляет префикс 2001:db8::1/128 со следующим узлом пересылки 2001:db8:2::2. Вторая запись FIB связана с правилом и сопоставляет тот же префикс 2001:db8::1/128 и порт получателя TCP/80 с другим next hop (2001:db8:3::3). Вторая запись более конкретна (специфична) по сравнению с первой. Когда маршрутизатор получает первый фрагмент пакета, направленного в порт TCP 80 по адресу 2001:db8::1, он обращается к FIB. Этому запросу соответствуют обе записи и маршрутизатор выберет вторую, как более конкретную, и перешлёт пакет по адресу 2001:db8:3::3. При получении второго фрагмента маршрутизатор снова обратится к FIB и в этом случае запросу будет соответствовать лишь первая запись, поскольку во втором фрагменте порт TCP 80 не указан. В результате маршрутизатор выберет первую запись и перешлёт пакет по адресу 2001:db8:2::2.

Маршрутизацию на основе правил (policy-based) называют также маршрутизацией на основе фильтров (filter-based).

3.3. Трансляция сетевых адресов (NAT)

Фрагментация IP вызывает проблемы для устройств трансляции сетевых адресов (Network Address Translation или NAT). Когда устройство NAT обнаруживает новый исходящий поток, оно отображает его порт-источник и адрес IP на другой порт и IP-адрес. Создав такое отображение, устройство NAT транслирует:

  • IP-адрес отправителя и порт-источник для каждого исходящего пакета;

  • IP-адрес и порт получателя для каждого входящего пакета.

Двумя основными стратегиями NAT являются A+P [RFC6346] и CGN [RFC6888]. В обоих случаях устройство NAT должно выполнять виртуальную сборку фрагментов для трансляции и корректной пересылки каждого фрагмента.

3.4. Межсетевые экраны без поддержки состояний

Как подробно рассматривается в параграфе 3.7, фрагментация IP вызывает проблемы для межсетевых экранов (МСЭ) без поддержки состояния, которые используют правила, включающие порты TCP и UDP. Поскольку сведения о портах имеются лишь в первом фрагменте, для МСЭ возможны два варианта:

  • воспринимать все последующие фрагменты, которые могут быть частью атаки;

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

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

3.5. ECMP, LAG и балансировщики без учёта состояния

Фрагментация IP вызывает проблемы для балансировщиков нагрузки на основе ECMP (Equal-Cost Multipath — множество равноценных путей), LAG (Link Aggregate Group — группировка каналов) и других технологий без учёта состояния. Для направления пакета или фрагмента в канал промежуточный узел применяет хэш-алгоритм (распределение нагрузки). Ниже перечислены наиболее распространённые алгоритмы хэширования.

Если пакет или фрагмент содержит заголовок транспортного уровня, алгоритм принимает на входе квинтет (5-tuple):

  • IP-адрес отправителя;

  • IP-адрес получателя;

  • IPv4 Protocol или IPv6 Next Header;

  • порт отправителя на транспортном уровне;

  • порт получателя на транспортном уровне.

Если в пакете или фрагменте нет заголовка транспортного уровня, алгоритм получает на входе лишь триплет (3-tuple):

  • IP-адрес отправителя;

  • IP-адрес получателя;

  • IPv4 Protocol или IPv6 Next Header.

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

В [RFC6438] предложено частичное решение этой проблемы для IPv6.

На промежуточных маршрутизаторах с распределением нагрузки на основе алгоритма хэширования для определения исходящего канала ECMP или LAG в направлении следующего узла, должен учитываться по меньшей мере триплет {dest addr, source addr, flow label} и могут использоваться оставшиеся компоненты 5-tuple.

Если алгоритм включает лишь триплет {dest addr, source addr, flow label}, он направит все фрагменты пакета в один канал (см. [RFC6437] и [RFC7098]).

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

3.6. Ошибки сборки IPv4 при высоких скоростях

Фрагментация IPv4 недостаточно отказоустойчива в современной сети Internet. При высоких скоростях передачи 16-битовое поле IP identification недостаточно велико для предотвращения дубликатов, что ведёт к частым ошибкам при сборке фрагментов, а контрольные суммы TCP и UDP не смогут предотвратить доставку собранных некорректно дейтаграмм протоколам вышележащих уровней. В [RFC4963] описаны некоторые легко воспроизводимые эксперименты, демонстрирующие проблему, и рассмотрено практическое влияние этих наблюдений.

Эти проблемы сборки не возникают часто в IPv6, поскольку там применяется 32-битовое поле идентификации.

3.7. Уязвимости безопасности

Исследователи безопасности описали несколько атак с использованием фрагментации IP, включая:

  • атаки с перекрытием фрагментов [RFC1858] [RFC3128] [RFC5722];

  • атаки на исчерпание ресурсов;

  • атаки на основе предсказуемости идентификации фрагментов [RFC7739];

  • обход систем обнаружения вторжений (Network Intrusion Detection System или NIDS) [Ptacek1998].

В атаках с перекрывающимися фрагментами злоумышленник создаёт серию фрагментов пакетов, где первый фрагмент содержит заголовки IP и транспортного уровня, а также часть данных транспортного уровня (payload). Этот фрагмент соответствует локальной политике безопасности и может пройти через МСЭ без учёта состояния. Второй фрагмент с отличным от 0 смещением перекрывается с первым и тоже проходит через МСЭ. При сборке фрагментов заголовок транспортного уровня из первого фрагмента переписывается данными из второго фрагмента и полученный пакет уже не соответствует локальной политике безопасности. При попытке передачи через МСЭ без фрагментации пакет был бы отвергнут. МСЭ без учёта состояния не могут защитить от атак с перекрывающимися фрагментами. Однако целевой узел может обеспечить свою защиту путём реализации процедур, описанных в RFC 1858, RFC 3128, RFC 8200. Эти процедуры сборки обнаруживают наложение фрагментов и отбрасывают пакет.

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

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

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

3.8. Чёрные дыры PMTU в результате потери ICMP

Как отмечено в параграфе 2.3, протоколы вышележащего уровня можно настроить на использование PMTUD. Поскольку PMTUD полагается на доставку сообщений ICMP PTB, эти протоколы также будут зависеть от доставки. В соответствии с [RFC4890] фильтрация сообщений ICMPv6 PTB недопустима. Однако доставка ICMP PTB не гарантируется из-за временных и сохраняющихся потерь.

Временная потеря сообщений ICMP PTB может вызвать временные «чёрные дыры» PMTU, которые исчезают при восстановлении доставки сообщений ICMP PTB и восстановлении совместимости между отправителем и получателем. В параграфе 3.8.1 этого документа описаны условия, при которых возникают временные потери сообщений ICMP PTB.

Постоянные потери ICMP PTB вызывают сохраняющиеся чёрные дыры и в параграфах 3.8.2 — 3.8.4 описаны условия, ведущие к постоянной потере сообщений ICMP PTB.

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

3.8.1. Временные потери

Причинами временных потерь сообщений ICMP PTB могут быть:

  • перегрузки в сети;

  • повреждение пакетов;

  • временные петли в маршрутизации;

  • ограничение скорости отправки ICMP.

Влияние ограничения скорости может быть серьёзным, поскольку RFC 4443 рекомендует строго ограничивать частоту передачи трафика ICMPv6.

3.8.2. Некорректная реализация правил безопасности

Некорректная реализация правил безопасности может вести к постоянной потере сообщений ICMP PTB. Предположим, например, что абонентский маршрутизатор (Customer Premises Equipment или CPE) реализует на уровне зоны правила:

  • разрешать любой трафик из зоны наружу;

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

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

Некорректная реализация этой политики будет отбрасывать сообщения ICMP PTB, поскольку адрес отправителя в них не связан с имеющимся потоком.

Ситуация с некорректной реализацией политики часто встречается на абонентских маршрутизаторах CPE.

3.8.3. Постоянные потери, вызванные Anycast

Использование Anycast может вызвать постоянную потерю сообщений ICMP PTB. Например, клиент DNS может отправлять запрос по anycast-адресу. Сеть маршрутизирует запрос DNS ближайшему экземпляру адреса (т. е. серверу DNS). Сервер генерирует отклик и отправляет его клиенту DNS. Хотя отклик не превышает оценку PMTU на сервере DNS, он может превысить фактическое значение PMTU. Маршрутизатор будет отбрасывать пакет и передавать ICMP PTB его отправителю (по anycast-адресу). Сеть маршрутизирует ICMP PTB экземпляру anycast, ближайшему к этому маршрутизатору. Этот экземпляр anycast может не быть сервером DNS, который отправил исходный отклик на запрос клиента. Это может оказаться другой сервер DNS с тем же anycast-адресом. Сервер DNS, отправивший исходный пакет, может просто не получить сообщение ICMP PTB и не обновить своё значение PMTU.

3.8.4. Постоянные потери, вызванные асимметричной маршрутизацией

Асимметричная маршрутизация может вызывать постоянные потери сообщений ICMP PTB. Например, узел-источник передаёт пакет получателю. Все промежуточные узлы поддерживают маршрут к получателю, но могут не поддерживать маршрута к отправителю. В этом случае, промежуточный узел, столкнувшийся с проблемой MTU не сможет передать отправителю сообщение ICMP PTB.

3.9. «Чёрные дыры» из-за фильтрации или потерь

В RFC 7872 исследователи выбрали пути Internet для проверки передачи по ним пакетов с заголовками расширения IPv6. Выбранные пути завершались на популярных сайтах Internet (например, серверы web, DNS, электронной почты). Исследование показало, что по меньшей мере 28% выбранных путей не поддерживали передачу пакетов с заголовками расширения IPv6 Fragment. В большинстве случаев фрагменты отбрасывались в автономной системе получателя, иногда отбрасывание происходило в транзитных автономных системах.

В другом исследовании [Huston] выводы были подтверждены и показано, что 37% выбранных конечных точек, использовавших распознаватели DNS с поддержкой IPv6, не смогли получить фрагментированные отклики IPv6.

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

  • неспособность оборудования обрабатывать фрагментированные пакеты;

  • отказ изменения от установленных производителем настроек;

  • непреднамеренные ошибки в конфигурации;

  • преднамеренная настройка (например, отбрасывание фрагментов IPv6 для предотвращения проблем, рассмотренных в параграфах 3.2 — 3.8).

4. Альтернативы фрагментации IP

4.1. Решения на транспортном уровне

Протокол управления транспортом (Transport Control Protocol или TCP) [RFC0793]) может работать в режиме, не требующем фрагментации IP. Приложения представляют протоколу TCP поток данных, которые TCP делит на сегменты размером не более TCP MSS (Maximum Segment Size — максимальный размер сегмента). Каждый сегмент инкапсулируется с заголовком TCP и представляется базовому модулю IP, который добавляет в начало заголовок IP и пересылает полученный пакет. Если значение TCP MSS достаточно мало, модуль IP не будет создавать пакетов, размер которых превосходит фактическое значение PMTU и фрагментация IP не потребуется. TCP предоставляет несколько механизмов управления MSS:

  • настройка вручную;

  • PMTUD;

  • PLPMTUD.

Ручная настройка возможна всегда. При установке достаточно малого значения MSS уровень IP никогда не создаст пакетов, размер которых превосходит минимальное значение MTU для канала. Однако ручная настройка препятствует TCP использовать преимущества больших MTU.

Протоколы вышележащего уровня могут реализовать PMTUD для обнаружения и использования больших значений Path MTU. Однако, как отмечено в параграфе 2.1, PMTUD полагается на доставку сообщений ICMP PTB, поэтому PMTUD может обеспечить оценку PMTU лишь в средах, где невысок риск потери ICMP PTB (например, известно, что сообщения не фильтруются).

PLPMTUD не использует сообщений ICMP PTB, работая на основе сообщений-зондов, передаваемых в сегментах TCP, для определения возможности использования PMTU на пути через сеть. В PLPMTUD зондирование отделено от контроля перегрузок, поэтому потеря пробного сегмента TCP не вызывает сокращения окна контроля перегрузки. В [RFC4821] определены процедуры PLPMTUD для протокола TCP.

Хотя TCP никогда осознанно не вынуждает базовый модуль IP выдавать пакеты размером больше оценённого значения PMTU, он может заставить модуль IP выдавать пакеты размером больше фактического PMTU. Например, при изменении маршрутизации, вызывающем снижение PMTU, TCP не узнает об этом до прибытия сообщения ICMP PTB. При передаче слишком большого пакета он отбрасывается, оценка PMTU обновляется и сегмент делится на меньшие с представлением каждого базовому модулю IP.

Протоколы DCCP (Datagram Congestion Control Protocol) [RFC4340] и SCTP (Stream Control Transmission Protocol) [RFC4960] также могут работать в режиме, не требующем фрагментации IP. Оба протокола воспринимают данные от приложения и делят их на сегменты, не превосходящие максимальный размер. DCCP поддерживает ручную настройку, PMTUD и PLPMTUD для установки максимального размера. Для дейтаграмм можно реализовать PLPMTUD для оценки PMTU через [RFC8899]. Это предполагает выполнение процедур PLPMTUD с UDP, опциями UDP, SCTP, QUIC и другими протоколами доставки дейтаграмм.

В настоящее время протокол UDP (User Datagram Protocol) [RFC0768] не имеет своего механизма фрагментации и применяет фрагментацию IP. Однако в [UDP-OPTIONS] предложен механизм фрагментации для протокола UDP.

4.2. Решения на прикладном уровне

В [RFC8085] отмечено, что фрагментация IP снижает надёжность коммуникаций Internet. Отмечено также отсутствие в UDP своего механизма фрагментации и работа протокола на основе фрагментации IP. Поэтому в [RFC8085] внесено специальное предложение для приложений на основе транспорта UDP.

Приложению не следует передавать дейтаграммы UDP, которые приводят в пакетам IP размером больше MTU на пути к получателю. Поэтому приложению следует использовать данные о MTU на пути от уровня IP или самостоятельно реализовать определение MTU на пути (Path MTU Discovery или PMTUD) [RFC1191] [RFC1981] [RFC4821] для определения возможности передачи сообщений без фрагментации.

В RFC 8085 также сказано:

Приложениям, не использующим PMTU или PLPMTUD, следует избегать отправки дейтаграмм UDP, которые будут приводить к передаче пакетов IP размером больше MTU. Поскольку реальное значение MTU для пути не известно, таким приложениям следует передавать сообщения, которые короче принятого по умолчанию эффективного значения MTU для передачи (EMTU_S в [RFC1122]). Для IPv4 EMTU_S будет меньшим из значение 576 байтов и MTU первого этапа пересылки [RFC1122], для IPv6 EMTU_S будет 1280 байтов [RFC2460]. Эффективное значение PMTU для подключённого напрямую адресата (без маршрутизаторов на пути) будет определяться заданным для интерфейса значением MTU, которое может быть меньше разрешённого на канале максимума. Передача дейтаграмм UDP минимального размера не эффективна для путей, поддерживающих большие PMTU, и это служит другой причиной реализации определения PMTU.

В RFC 8085 предполагается, что в IPv4 значение EMTU_S = 576 достаточно мало и поддерживается большинством современных путей Internet, несмотря на то, что минимальное значение IPv4 MTU составляет 68.

Приведённые рекомендации применимы к любым приложениям, работающим непосредственно по протоколу IP.

5. Приложения, полагающиеся на фрагментацию IPv6

Ряд приложений полагается на фрагментацию IPv6:

  • DNS [RFC1035];

  • OSPFv2 [RFC2328];

  • OSPFv3 [RFC5340];

  • инкапсуляция «пакет в пакете».

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

5.1. Служба доменных имён (DNS)

DNS использует протокол UDP для эффективности и, следовательно, полагается на фрагментацию IP для больших откликов, как это разрешено опциями механизмов расширения (Extension Mechanisms for DNS или EDNS0) в запросе. Можно смягчить проблему потери пакетов из-за фрагментации, применяя для запросов меньшие размеры буферов EDNS0 UDP или ограничивая на серверах DNS максимальный размер откликов UDP неким самоустанавливаемым размером пакета, который будет меньше предпочитаемого размера буфера EDNS0 UDP. В обоих случаях большие отклики усекаются в DNS с рекомендацией клиенту повторить запрос по протоколу TCP для получения полного отклика. Однако ограниченная поддержка DNS по протоколу TCP, особенно в случае IPv6, не позволяет эффективно реализовать этот подход [Damas].

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

5.2. Протокол OSPF

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

5.3. Инкапсуляция пакета в пакет

Этот документ подтверждает, что в некоторых случаях пакеты должны фрагментироваться в туннелях IP-in-IP, но не даёт дополнительных рекомендаций, относящихся к таким туннелям.

В этом документе инкапсуляцией пакета в пакет (packet-in-packet) считается IP-in-IP [RFC2003], GRE (Generic Routing Encapsulation) [RFC2784], GRE-in-UDP [RFC8086], Generic Packet Tunneling in IPv6 [RFC2473]. В [RFC4459] описаны проблемы фрагментации, связанные с этими методами инкапсуляции. Стратегия фрагментации для GRE, описанная в [RFC7588], была развёрнута для всех перечисленных методов инкапсуляции. Эта стратегия не полагается на фрагментацию IP за исключением одного крайнего случая (см. параграф 3.3.2.2 в [RFC7588] и параграф 7.1 в [RFC2473].) Этот случай описан в параграфе 3.3 [RFC7676].

Дополнительное рассмотрение вопросов, связанных с туннелями приведено в [TUNNELS].

5.4. Повышение производительности приложений UDP

Некоторые приложения UDP пытаются повысить производительность на основе использования фрагментации IP. В таких приложения используются размер дейтаграмм UDP, превышающий Path MTU, чтобы передать больший объем данных между приложением и ядром за один системный вызов.

Например, протокол LTP (Licklider Transmission Protocol) [RFC5326], применяемый в настоящее время на МКС (International Space Station или ISS), использует дейтаграммы UDP размером больше Path MTU для обеспечения приемлемой производительности даже при возникновении фрагментации IP. В более общем смысле SNMP и видео-приложения могут передавать кванты данных уровня приложения в зависимости сетевого уровня для фрагментации и последующей сборки при возникновении необходимости.

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

6.1. Для разработчиков приложений и протоколов

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

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

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

Протоколы могут избежать фрагментации IP за счёт применения достаточно малых значений MTU (например, минимальное значение для протокола), запрета фрагментации IP и обеспечения адаптации транспортным протоколом размера сегментов в соответствии с MTU. Другие протоколы могут реализовать достаточно надёжный механизм определения PMTU (например, PLPMTUD).

Приложениям UDP следует соблюдать рекомендации, приведённые в параграфе 3.2 [RFC8085].

6.2. Для системных разработчиков

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

6.3. Для разработчиков промежуточных устройств

Промежуточным устройствам, которые являются системами, «прозрачно» выполняющими функции политики передачи трафика, но не участвующими в маршрутизации, следует обрабатывать фрагменты IP в соответствии с [RFC0791] и [RFC8200]. Во многих случаях промежуточные устройства для этого должны поддерживать состояния.

Вопросы цены и производительности часто побуждают сетевых операторов развёртывать промежуточные устройства, не хранящие состояний. Такие устройства могут неоптимально обрабатывать фрагменты IP, не выполняя требований RFC 791 или RFC 8200, и могут даже полностью отбрасывать фрагменты IP. Такое поведение не рекомендуется. Если промежуточное устройство реализует нестандартное поведение для фрагментов IP, это поведение должно быть чётко документировано.

6.4. Для разработчиков и операторов ECMP, LAG и балансировщиков

В принятой по умолчанию конфигурации устройствам IPv6, реализующим ECMP с маршрутизацией OSPF [RFC2328] и других протоколов, LAG [RFC7424] или иную технологию распределения нагрузки для случая IPv6 Flow Label с нулевым значением, следует принимать на входе алгоритма хэширования лишь поля:

  • IP Source Address;

  • IP Destination Address;

  • Flow Label.

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

Эти рекомендации похожи на представленные в [RFC6438] и [RFC7098] и отличаются лишь выбором принятой по умолчанию конфигурации.

6.5. Для сетевых операторов

Операторы должны обеспечивать надлежащую работу PMTUD в своей сети, включая гарантию генерации сообщений PTB при отбрасывании пакетов, размер которых превышает MTU на выходном интерфейсе. Однако реализации могут ограничивать скорость генерации сообщений ICMP в соответствии с [RFC1812] и [RFC4443].

В соответствии с RFC 4890 сетевым операторам недопустимо фильтровать сообщения ICMPv6 PTB, если нет уверенности в их подделке или иных нарушениях. Как отмечено в параграфе 3.8, фильтрация пакетов ICMPv6 PTB ведёт к отказам PMTUD. Многие протоколы вышележащих уровней полагаются на PMTUD.

В соответствии с RFC 8200 сетевым операторам недопустимо развёртывать каналы IPv6, где MTU меньше 1280 октетов.

Сетевым операторам не следует фильтровать фрагменты IP, если известно, что они исходят от сервера DNS или направлены такому серверу. Это связано с важностью серверов имён для работы Internet.

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

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

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

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

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

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

[RFC0768] Postel, J., «User Datagram Protocol», STD 6, RFC 768, DOI 10.17487/RFC0768, August 1980, <https://www.rfc-editor.org/info/rfc768>.

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

[RFC0792] Postel, J., «Internet Control Message Protocol», STD 5, RFC 792, DOI 10.17487/RFC0792, September 1981, <https://www.rfc-editor.org/info/rfc792>.

[RFC0793] Postel, J., «Transmission Control Protocol», STD 7, RFC 793, DOI 10.17487/RFC0793, September 1981, <https://www.rfc-editor.org/info/rfc793>.

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, <https://www.rfc-editor.org/info/rfc1035>.

[RFC1191] Mogul, J. and S. Deering, «Path MTU discovery», RFC 1191, DOI 10.17487/RFC1191, November 1990, <https://www.rfc-editor.org/info/rfc1191>.

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

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

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

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

[RFC6438] Carpenter, B. and S. Amante, «Using the IPv6 Flow Label for Equal Cost Multipath Routing and Link Aggregation in Tunnels», RFC 6438, DOI 10.17487/RFC6438, November 2011, <https://www.rfc-editor.org/info/rfc6438>.

[RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, «UDP Usage Guidelines», BCP 145, RFC 8085, DOI 10.17487/RFC8085, March 2017, <https://www.rfc-editor.org/info/rfc8085>.

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

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

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

[RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. Völker, «Packetization Layer Path MTU Discovery for Datagram Transports», RFC 8899, DOI 10.17487/RFC8899, September 2020, <https://www.rfc-editor.org/info/rfc8899>.

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

[Damas] Damas, J. and G. Huston, «Measuring ATR», April 2018, <http://www.potaroo.net/ispcol/2018-04/atr.html>.

[Huston] Huston, G., «IPv6, Large UDP Packets and the DNS», August 2017, <http://www.potaroo.net/ispcol/2017-08/xtn-hdrs.html>.

[Kent] Kent, C. and J. Mogul, «Fragmentation Considered Harmful», SIGCOMM ’87: Proceedings of the ACM workshop on Frontiers in computer communications technology, DOI 10.1145/55482.55524, August 1987, <http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-87-3.pdf>.

[Ptacek1998] Ptacek, T. H. and T. N. Newsham, «Insertion, Evasion and Denial of Service: Eluding Network Intrusion Detection», 1998, <http://www.aciri.org/vern/Ptacek-Newsham-Evasion-98.ps>.

[RFC1122] Braden, R., Ed., «Requirements for Internet Hosts — Communication Layers», STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, <https://www.rfc-editor.org/info/rfc1122>.

[RFC1812] Baker, F., Ed., «Requirements for IP Version 4 Routers», RFC 1812, DOI 10.17487/RFC1812, June 1995, <https://www.rfc-editor.org/info/rfc1812>.

[RFC1858] Ziemba, G., Reed, D., and P. Traina, «Security Considerations for IP Fragment Filtering», RFC 1858, DOI 10.17487/RFC1858, October 1995, <https://www.rfc-editor.org/info/rfc1858>.

[RFC1981] McCann, J., Deering, S., and J. Mogul, «Path MTU Discovery for IP version 6», RFC 1981, DOI 10.17487/RFC1981, August 1996, <https://www.rfc-editor.org/info/rfc1981>.

[RFC2003] Perkins, C., «IP Encapsulation within IP», RFC 2003, DOI 10.17487/RFC2003, October 1996, <https://www.rfc-editor.org/info/rfc2003>.

[RFC2328] Moy, J., «OSPF Version 2», STD 54, RFC 2328, DOI 10.17487/RFC2328, April 1998, <https://www.rfc-editor.org/info/rfc2328>.

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

[RFC2784] Farinacci, D., Li, T., Hanks, S., Meyer, D., and P. Traina, «Generic Routing Encapsulation (GRE)», RFC 2784, DOI 10.17487/RFC2784, March 2000, <https://www.rfc-editor.org/info/rfc2784>.

[RFC3128] Miller, I., «Protection Against a Variant of the Tiny Fragment Attack (RFC 1858)», RFC 3128, DOI 10.17487/RFC3128, June 2001, <https://www.rfc-editor.org/info/rfc3128>.

[RFC4340] Kohler, E., Handley, M., and S. Floyd, «Datagram Congestion Control Protocol (DCCP)», RFC 4340, DOI 10.17487/RFC4340, March 2006, <https://www.rfc-editor.org/info/rfc4340>.

[RFC4459] Savola, P., «MTU and Fragmentation Issues with In-the-Network Tunneling», RFC 4459, DOI 10.17487/RFC4459, April 2006, <https://www.rfc-editor.org/info/rfc4459>.

[RFC4890] Davies, E. and J. Mohacsi, «Recommendations for Filtering ICMPv6 Messages in Firewalls», RFC 4890, DOI 10.17487/RFC4890, May 2007, <https://www.rfc-editor.org/info/rfc4890>.

[RFC4960] Stewart, R., Ed., «Stream Control Transmission Protocol», RFC 4960, DOI 10.17487/RFC4960, September 2007, <https://www.rfc-editor.org/info/rfc4960>.

[RFC4963] Heffner, J., Mathis, M., and B. Chandler, «IPv4 Reassembly Errors at High Data Rates», RFC 4963, DOI 10.17487/RFC4963, July 2007, <https://www.rfc-editor.org/info/rfc4963>.

[RFC5326] Ramadas, M., Burleigh, S., and S. Farrell, «Licklider Transmission Protocol — Specification», RFC 5326, DOI 10.17487/RFC5326, September 2008, <https://www.rfc-editor.org/info/rfc5326>.

[RFC5340] Coltun, R., Ferguson, D., Moy, J., and A. Lindem, «OSPF for IPv6», RFC 5340, DOI 10.17487/RFC5340, July 2008, <https://www.rfc-editor.org/info/rfc5340>.

[RFC5722] Krishnan, S., «Handling of Overlapping IPv6 Fragments», RFC 5722, DOI 10.17487/RFC5722, December 2009, <https://www.rfc-editor.org/info/rfc5722>.

[RFC5927] Gont, F., «ICMP Attacks against TCP», RFC 5927, DOI 10.17487/RFC5927, July 2010, <https://www.rfc-editor.org/info/rfc5927>.

[RFC6346] Bush, R., Ed., «The Address plus Port (A+P) Approach to the IPv4 Address Shortage», RFC 6346, DOI 10.17487/RFC6346, August 2011, <https://www.rfc-editor.org/info/rfc6346>.

[RFC6888] Perreault, S., Ed., Yamagata, I., Miyakawa, S., Nakagawa, A., and H. Ashida, «Common Requirements for Carrier-Grade NATs (CGNs)», BCP 127, RFC 6888, DOI 10.17487/RFC6888, April 2013, <https://www.rfc-editor.org/info/rfc6888>.

[RFC7098] Carpenter, B., Jiang, S., and W. Tarreau, «Using the IPv6 Flow Label for Load Balancing in Server Farms», RFC 7098, DOI 10.17487/RFC7098, January 2014, <https://www.rfc-editor.org/info/rfc7098>.

[RFC7424] Krishnan, R., Yong, L., Ghanwani, A., So, N., and B. Khasnabish, «Mechanisms for Optimizing Link Aggregation Group (LAG) and Equal-Cost Multipath (ECMP) Component Link Utilization in Networks», RFC 7424, DOI 10.17487/RFC7424, January 2015, <https://www.rfc-editor.org/info/rfc7424>.

[RFC7588] Bonica, R., Pignataro, C., and J. Touch, «A Widely Deployed Solution to the Generic Routing Encapsulation (GRE) Fragmentation Problem», RFC 7588, DOI 10.17487/RFC7588, July 2015, <https://www.rfc-editor.org/info/rfc7588>.

[RFC7676] Pignataro, C., Bonica, R., and S. Krishnan, «IPv6 Support for Generic Routing Encapsulation (GRE)», RFC 7676, DOI 10.17487/RFC7676, October 2015, <https://www.rfc-editor.org/info/rfc7676>.

[RFC7739] Gont, F., «Security Implications of Predictable Fragment Identification Values», RFC 7739, DOI 10.17487/RFC7739, February 2016, <https://www.rfc-editor.org/info/rfc7739>.

[RFC7872] Gont, F., Linkova, J., Chown, T., and W. Liu, «Observations on the Dropping of Packets with IPv6 Extension Headers in the Real World», RFC 7872, DOI 10.17487/RFC7872, June 2016, <https://www.rfc-editor.org/info/rfc7872>.

[RFC8086] Yong, L., Ed., Crabbe, E., Xu, X., and T. Herbert, «GRE-in-UDP Encapsulation», RFC 8086, DOI 10.17487/RFC8086, March 2017, <https://www.rfc-editor.org/info/rfc8086>.

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

[UDP-OPTIONS] Touch, J., «Transport Options for UDP», Work in Progress, Internet-Draft, draft-ietf-tsvwg-udp-options-08, 12 September 2019, <https://tools.ietf.org/html/draft-ietf-tsvwg-udp-options-08>.

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

Спасибо Mikael Abrahamsson, Brian Carpenter, Silambu Chelvan, Lorenzo Colitti, Gorry Fairhurst, Joel Halpern, Mike Heard, Tom Herbert, Tatuya Jinmei, Suresh Krishnan, Jen Linkova, Paolo Lucente, Manoj Nayak, Eric Nygren, Fred Templin, Joe Touch за их комментарии.

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

Ron Bonica

Juniper Networks

2251 Corporate Park Drive

Herndon, Virginia 20171

United States of America

Email: rbonica@juniper.net

Fred Baker

Unaffiliated

Santa Barbara, California 93117

United States of America

Email: FredBaker.IETF@gmail.com

Geoff Huston

APNIC

6 Cordelia St

Brisbane 4101 QLD

Australia

Email: gih@apnic.net

Robert M. Hinden

Check Point Software

959 Skyway Road

San Carlos, California 94070

United States of America

Email: bob.hinden@gmail.com

Ole Troan

Cisco

Philip Pedersens vei 1

N-1366 Lysaker

Norway

Email: ot@cisco.com

Fernando Gont

SI6 Networks

Evaristo Carriego 2644

Haedo

Provincia de Buenos Aires

Argentina

Email: fgont@si6networks.com


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

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

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3В IPv4 каждый хост должен быть способен собрать пакет, размером не меньше 576 октетов. Однако для IPv4 минимальное значение MTU на канале не равно 576. В параграфе 3.2 RFC 791 [RFC0791] явно указано минимальное значение IPv4 MTU в 68 октетов.

4Нефрагментируемый пакет может быть фрагментирован источником, однако другие узлы не могут фрагментировать его. В IPv4 нефрагментируемыми являются пакеты с установленным флагом DF (Don’t Fragment), а в IPv6 все пакеты являются нефрагментируемыми.

5Сообщения ICMP PTB существуют в 2 вариантах. В ICMPv4 [RFC0792] сообщением ICMP PTB служит сообщение Destination Unreachable с Code = 4 (нужна фрагментация, но установлен флаг DF). В [RFC1191] это сообщение было дополнено для указания MTU на канале, через который не удалось передать пакет. В ICMPv6 [RFC4443] роль ICMP PTB играет сообщение Packet Too Big Message с Code = 0, которое тоже включает MTU канала, где возникла проблема.

6Строго говоря, это не следует считать фрагментацией, поскольку пакета, как такового ещё нет. Это скорее часть процесса пакетизации. Прим. перев.

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