RFC 5444 Generalized Mobile Ad Hoc Network (MANET) Packet/Message Format

Network Working Group                                         T. Clausen
Request for Comments: 5444                      LIX, Ecole Polytechnique
Category: Standards Track                                    C. Dearlove
                                                         BAE Systems ATC
                                                                 J. Dean
                                               Naval Research Laboratory
                                                                C. Adjih
                                                      INRIA Rocquencourt
                                                           February 2009

Обобщенный формат пакетов/сообщений MANET

Generalized Mobile Ad Hoc Network (MANET) Packet/Message Format

PDF

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

Этот документ является проектом стандарта Internet (Internet Standards Track) и служит приглашением к дискуссии и внесению предложений с целью совершенствования протокола. Информацию о состоянии стандартизации и статусе протокола можно найти в текущей редакции документа «Internet Official Protocol Standards» (STD 1). Документ может распространяться свободно.

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

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

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

Тезисы

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

Оглавление

Исключено в версии HTML.

1. Введение

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

В данном документе приведены спецификации перечисленных ниже элементов.

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

  • Формат сообщений, состоящих из заголовка (Message Header) и тела (Message Body).

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

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

  • Формат блока адресов (Address Block), представляющего некое множество адресов или адресных префиксов в компактной форме с возможностью агрегирования.

  • Обобщенный формат TLV2 для представления атрибутов. Каждый TLV может быть связан с пакетом, сообщением, одним или множеством адресов или префиксов в одном Address Block. Возможно включение множества TLV, каждый из которых связан с пакетом, сообщением, а также одним, разными или пересекающимися наборами адресов или адресных префиксов.

Ниже приведен частичный список свойств, которые явно предусмотрены спецификацией.

Parsing logic — логика разбора

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

Extensibility — расширяемость

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

Efficiency — эффективность

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

Separation of forwarding and processing — разделение обработки и пересылки

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

2. Обозначения и терминология

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

Используемые в документе обозначения описаны в параграфе 2.1, а определения терминов — в параграфе 2.2.

2.1. Обозначения

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

Этот формат использует сетевой порядок байтов (сначала передается старший октет) для всех полей. Для старшего бита в октете используется номер 0, для младшего — 7 [Stevens].

2.1.1. Элементы

Данная спецификация определяет элемент, как группу из произвольного числа последовательных битов, которые совместно формируют синтаксический объект, представляемый обозначением <element>. Каждый элемент в данной спецификации определяется одним из двух способов:

  • битовое поле указанного размера;

  • композитный элемент, состоящий из других <element>.

Композитный элемент определяется, как:

       <element> := specification

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

<element1><element2> — за <element1> непосредственно следует <element2>;

(<element1><element2>) — указывает на группировку элементов, заключенных в скобки;

? — 0 или 1 включение предшествующего элемента или группы;

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

2.1.2. Переменные

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

<foo> — если <foo> является целым числом без знака, обозначение <foo> используется также для представления значения этого поля;

bar — переменная, обычно получаемая путем расчета на основе значений элементов.

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

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

Packet — пакет

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

Message — сообщение

Фундаментальная единица передачи протокольной информации в форме адресных объектов и TLV.

Address — адрес

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

Address Prefix — адресный префикс

Адрес и размер префикса, задаваемым числом битов адреса, отсчитываемых слева (старший бит).

Address Object — адресный объект

Адрес или адресный префикс, как указано для Address Block в данной спецификации.

TLV

Структура «тип-размер-значение» (type-length-value). Это базовый способ представления и корректного разбора атрибутов без понимания их сущности.

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

Эта спецификация описывает базовый формат пакетов, предназначенный для использования протоколами маршрутизации MANET. Основой для спецификации послужил протокол OLSR3 [RFC3626], который она расширяет.

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

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

Спецификация обеспечивает как внутреннюю, так и внешнюю расширяемость. Внешняя расширяемость обеспечивается возможностью добавления Packet TLV и определения новых типов сообщений. Внутренняя расширяемость обеспечивается возможностью добавления Message TLV и Address Block TLV в имеющиеся сообщения. Протоколы могут определять новые типы TLV и, следовательно, значения полей Value в них, а также новые типы сообщений (см. параграф 6.1). Протоколы также могут пользоваться определениями типов TLV из других протоколов, соответствующих данной спецификации.

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

Адреса в сообщении предполагаются имеющими один размер, указанный в Message Header. При смешанной адресации IPv6 и IPv4, последний тип представляется, как отображаемые на IPv4 адреса IPv6 [RFC4291].

Сообщения, определяемые данной спецификацией, предназначены для передачи сигналов протоколов маршрутизации MANET между маршрутизаторами MANET. Спецификация включает элементы, которые могут поддерживать лавинную рассылку в ограниченной области, а также пригодные для доставки сигнальных сообщений протоколов маршрутизации MANET по каналам «точка-точка» в сетях с множеством интервалов между маршрутизаторами (multi-hop network). Пакеты могут быть групповыми или индивидуальными и могут использовать любой транспортный протокол или обходиться без него.

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

4. Обзор и работа протокола

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

5. Спецификация синтаксиса

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

Графические представления элементов спецификации даны в Приложении D, а графическое представление полного примера (пакет, включающий сообщение с Address Block и TLV) — в Приложении E.

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

5.1. Пакеты

<packet> определяется, как

       <packet> := <pkt-header>
                   <message>*

где <message> определено в параграфе 5.2. Разбор пакета завершается успешно, когда использованы все октеты пакета (как указано в содержащей пакет дейтаграмме).

<pkt-header> определяется, как

       <pkt-header> := <version>
                       <pkt-flags>
                       <pkt-seq-num>?
                       <tlv-block>?

где

<version> — 4-битовое целое число без знака, указывающее версию спецификации, которой соответствует пакет и содержащееся в нем сообщение. Данный документ задает версию 0.

<pkt-flags> — 4-битовое поле, задающее интерпретацию оставшейся части Packet Header:

бит 0 (phasseqnum) — при сброшенном (0) бите <pkt-seq-num> не включается в <pkt-header>, при установленном (1) включается.

бит 1 (phastlv) — при сброшенном (0) бите <tlv-block> не включается в <pkt-header>, при установленном (1) включается.

Биты 2-3 — резарвные биты, которые следует сбрасывать (0) при передаче и игнорировать при получении.

<pkt-seq-num> отсутствует, если флаг phasseqnum сброшен (0), а при установленном бите содержит 16-битовое целое число без знака, задающее порядковый номер пакета (Packet Sequence Number).

<tlv-block> отсутствует, если флаг phastlv сброшен (0) при установленном бите содержит TLV (см. параграф 5.4).

Предполагается, что сетевой уровень способен точно передать размер содержимого (payload length), поэтому размер пакета в нем не указывается.

5.2. Сообщения

В дополнение к заголовку (Packet Header) пакет может содержать одно или множество сообщений, включающих:

  • заголовок (Message Header);

  • блок Message TLV, который может включать TLV, связанные с сообщением в целом;

  • могут включаться адресные блоки (Address Block), каждый из которых содержит один или множество адресных объектов;

  • блок Address Block TLV, который может содержать TLV, за каждым из которых следует Address Block, с адресами которого могут быть связаны другие атрибуты.

<message> определяется, как

       <message>    := <msg-header>
                       <tlv-block>
                       (<addr-block><tlv-block>)*

       <msg-header> := <msg-type>
                       <msg-flags>
                       <msg-addr-length>
                       <msg-size>
                       <msg-orig-addr>?
                       <msg-hop-limit>?
                       <msg-hop-count>?
                       <msg-seq-num>?

где

<tlv-block> определен в параграфе 5.4.

<addr-block> определен в параграфе 5.3.

<msg-type> — 8-битовое целое число без знака, указывающее тип сообщения.

<msg-flags> — 4-битовое поле, определяющее интерпретацию оставшейся части Message Header:

бит 0 (mhasorig) — при сброшенном (0) флаге <msg-orig-addr> не включается в <msg-header>, при установленном (1) включается;

бит 1 (mhashoplimit) — при сброшенном (0) флаге <msg-hop-limit> не включается в <msg-header>, при установленном (1) включается;

бит 2 (mhashopcount) — при сброшенном (0) флаге <msg-hop-count> не включается в <msg-header>, при установленном (1) включается;

бит 3 (mhasseqnum) — при сброшенном (0) флаге <msg-seq-num> не включается в <msg-header>, при установленном (1) включается.

<msg-addr-length> — 4-битовое целое число без знака, представляющее размер всех адресов, включенных в это сообщение (<msg-orig-addr>, а также адреса в Address Block, как описано в параграфе 5.3):

             <msg-addr-length> = размер адреса в октетах - 1

<msg-addr-length> — 3 для адресов IPv4, 15 для адресов IPv6.

Переменная address-length представляет размер адреса в октетах и рассчитывается по формуле:

         address-length = <msg-addr-length> + 1

<msg-size> — 16-битовое целое число без знака, указывающее число октетов в <message> с учетом <msg-header>.

<msg-orig-addr> — не указывается при сброшенном (0) флаге mhasorig, а при установленном является идентификатором с размером address-length, который может служить для уникальной идентификации маршрутизатора MANET, создавшего это сообщение.

<msg-hop-limit> — не указывается при сброшенном (0) флаге mhashoplimit, а при установленном флаге содержит 8-битовое целое число без знака, которое может указывать максимальное число интервалов для последующей пересылки сообщения.

<msg-hop-count> — не указывается при сброшенном (0) флаге mhashopcount, а при установленном флаге содержит 8-битовое целое число без знака, которое может указывать число интервалов, через которые уже прошло сообщение.

<msg-seq-num> — не указывается при сброшенном (0) флаге mhasseqnum, а при установленном флаге содержит 16-битовое целое число без знака, которое может указывать порядковый номер, заданный маршрутизатором MANET, создавшим сообщение.

5.3. Адресные блоки

Address Block может задавать один или множество адресов, размер которых определяется октетами address-lengthс использованием <msg-addr-length> в <msg-header> сообщения, содержащего Address Block. Блок адресов может также задавать размер префикса, который может быть применен для всех адресов в Address Block, если это приемлемо. Это позволяет задавать с помощью Address Block как адреса, так и адресные префиксы. Протокол может указать, что адреса с максимальным размером префикса (размер адреса в битах или 8 * address-length) рассматриваются, как адреса, а не префиксы — это позволяет включать в Address Block комбинации адресов и префиксов. Общий термин «адресный объект» служит для обозначения обоих типов объектов. Отметим, что такие объекты в Address Block всегда включают размер префикса.

Адреса задаются последовательностью октетов address-length в форме Head:Mid:Tail4. Семантика для Head, Mid и Tail не задается — такое представление служит исключительно для обеспечения возможности агрегирования адресов, которые зачастую имеют общие части (например, общий префикс или множество адресов IPv6 на одном интерфейсе). Address Block содержит упорядоченный список адресов, имеющих общее значение компонент Head и Tail, но свои значения Mid. Компоненты Head и Tail могут быть пустыми (независимо друг от друга), что позволяет представлять адреса объектов, не имеющих общей части в голове (пустая компонента Head) или хвосте (пустая компонента Tail). Подробные примеры списков Address Blocks приведены в Приложении C.1.

Address Block может задавать адресные префиксы:

  • с одним размером префикса для всех префиксов;

  • с указанием размера для каждого префикса.

<address-block> определяется, как

       <address-block> := <num-addr>
                          <addr-flags>
                          (<head-length><head>?)?
                          (<tail-length><tail>?)?
                          <mid>*
                          <prefix-length>*

где

<num-addr> — 8-битовое целое число без знака, указывающее количество адресов, представленных в Address Block (значение 0 недопустимо).

<addr-flags> — 8-битовое поле, определяющее интерпретацию остальной части Address Block:

бит 0 (ahashead) — при сброшенном (0) флаге <head-length> и <head> не включаются в <address-block>. Установленный флаг означает включение <head-length> в <address-block>, <head> включается в <address-block> для <head-length> отличных от 0.

бит 1 (ahasfulltail) и бит 2 (ahaszerotail) — интерпретируются в соответствии с таблицей 1. Не показанные в таблице комбинации недопустимы.

бит 3 (ahassingleprelen) и бит 4 (ahasmultiprelen) — интерпретируются в соответствии с таблицей 2. Не показанные в таблице комбинации недопустимы.

Биты 5-7 — резервные биты. Их следует сбрасывать (0) при передаче и игнорировать при получении.

Таблица 1. Интерпретация флагов ahasfulltail и ahaszerotail

ahasfulltail

ahaszerotail

<tail-length>

<tail>

0

0

Не включено

Не включено

1

0

Включено

Включено, если <tail-length> отлична от 0

0

1

Включено

Не включено

Таблица 2. Интерпретация флагов ahassingleprelen и ahasmultiprelen

ahassingleprelen

ahasmultiprelen

Число полей <prefix-length>

Размер n-го адресного префикса в битах

0

0

0

8 * address-length

1

0

1

<prefix-length>

0

1

<num-addr>

n-й <prefix-length>

<head-length> (при наличии) 8-битовое целое число без знака, указывающее количество октетов в компоненте Head всех адресов в Address Block (т. е., разамер каждого элемента <head> в <head-length> в октетах).

Размер «головы» предполагается равным <head-length> (при наличии) или 0 (в противном случае).

<head> отсутствует при нулевом размере «головы», в противном случае содержит head-length старших (левых) октетов, одинаковых для всех адресов в Address Block.

<tail-length> (при наличии) 8-битовое целое число без знака, указывающее количество октетов в компоненте Head всех адресов в Address Block (т. е., размер каждого элемента <tail> в <tail-length> в октетах).

Размер «хвоста» предполагается равным <tail-length> (при наличии) или 0 (в противном случае).

<tail> отсутствует при нулевом размере «хвоста» или установленном флаге ahaszerotail, в противном случае содержит tail-length младших (правых) октетов, одинаковых для всех адресов в Address Block. Если установлен флаг ahaszerotail, значения tail-length младших октетов для всех адресов в Address Block имеют значение 0.

Размер средней части адреса (mid-length) должен быть неотрицательным и определяется выражением

         mid-length := address-length - head-length - tail-length

т. е., каждый элемент <mid> включает mid-length октетов.

<mid> отсутствует при нулевом размере «середины», в противном случае каждая компонента <mid> представляет собой поле из mid-length октетов, представляющих среднюю часть соответствующего адреса в Address Block. При наличии этой компоненты Address Block содержит в точности <num-addr> полей <mid>.

<prefix-length> — 8-битовое целое число без знака, указывающее размер адресного префикса в битах. При установленном флаге ahassingleprelen включается единственное поле <prefix-length>, указывающее размер всех префиксов в Address Block. При установленном флаге ahasmultiprelen включается <num-addr> полей <prefix-length>, каждое из которых указывает размер соответствующего адресного префикса в Address Block (в порядке префиксов). В остальных случаях поле <prefix-length> не включается и каждый адресный объект может рассматриваться, как имеющий префикс размера 8 * address-length битов. Формат Address Block будет некорректным, если значение любого элемента <prefix-length> превышает 8 * address-length.

5.4. TLV и блоки TLV

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

TLV объединяются в блоки (TLV Block), где все TLV связываются с пакетом (TLV Block в Packet Header), сообщением (TLV Block сразу вслед за Message Header) или адресами в непосредственно предшествующем Address Block. Отдельные TLV в TLV Block, непосредственно следующие за Address Block могут связывать атрибуты с одним адресом, диапазоном адресов или всеми адресами в данном Address Block. Когда атрибут связывается с множеством адресов, TLV может включать одно значение для всех адресов или индивидуальные для каждого адреса. Детальные примеры TLV приведены в Приложении C.2.

TLV Block определяется, как

       <tlv-block> := <tlvs-length>
                      <tlv>*

где

<tlvs-length> — 16-битовое целое число без знака, указывающее общее количество октетов во всех непосредственно следующих элементах <tlv> (<tlvs-length> не учитываются).

<tlv> — см. параграф 5.4.1.

5.4.1. TLV

Существует три вида TLV, каждый из которых представляется элементом <tlv>:

  • Packet TLV включается в Packet TLV Block заголовка пакета (Packet Header);

  • Message TLV включается в Message TLV Block в теле сообщения до всех Address Block;

  • Address Block TLV включается в Address Block TLV Block, следующий за Address Block; Address Block TLV применяется для любых из перечисленных ниже объектов в Address Block:

    • всех адресных объектов;

    • любой непрерывной последовательности адресных объектов;

    • одного адресного объекта.

<tlv> определяется, как

       <tlv> := <tlv-type>
                <tlv-flags>
                <tlv-type-ext>?
                (<index-start><index-stop>?)?
                (<length><value>?)?

где

<tlv-type> — 8-битовое целое число без знака, указывающее тип TLV, зависящий от вида TLV (т. е. Packet TLV, Message TLV или Address Block TLV).

<tlv-flags> — 8-битовое поле, задающее интерпретацию оставшейся части TLV:

бит 0 (thastypeext) — при сброшенном (0) флаге <tlv-type-ext> не включается в <tlv>, при установленном включается;

бит 1 (thassingleindex) и бит 2 (thasmultiindex) — интерпретируются в соответствии с таблицей 3. Не указанные в таблице комбинации применять недопустимо; в Packet TLV и Message TLV оба флага должны быть сброшены (0);

бит 3 (thasvalue) и бит 4 (thasextlen) — интерпретируются в соответствии с таблицей 4. Не указанные в таблице комбинации применять недопустимо;

бит 5 (tismultivalue) — этот флаг указывает способ интерпретации поля <value>, описанный ниже. Этот флаг должен быть сброшен в Packet TLV и Message TLV, если сброшен флаг thasmultiindex или thasvalue;

биты 6-7: — резервные флаги, их следует сбрасывать при передаче и игнорировать при получении.

Таблица 3. Интерпретация флагов thassingleindex и thasmultiindex

thassingleindex

thasmultiindex

<index-start>

<index-stop>

0

0

Не включено

Не включено

1

0

Включено

Не включено

0

1

Включено

Включено

Таблица 4. Интерпретация флагов thasvalue и thasextlen

thasvalue

thasextlen

<length>

<value>

0

0

Не включено

Не включено

1

0

8 битов

Включено, если <length> отлично от 0

0

1

16 битов

Включено, если <length> отлично от 0

<tlv-type-ext> — 8-битовое целое число без знака, указывающее расширение TLV Type, специфическое для данного типа и вида TLV (Packet TLV, Message TLV, Address Block TLV).

Переменная tlv-type-ext имеет значение <tlv-type-ext> при наличии того или 0 при отсутствии.

Переменная tlv-fulltype определяется выражением

         tlv-fulltype := 256 * <tlv-type> + tlv-type-ext

<index-start> и <index-stop> при их наличии (только в Address Block TLV) представляют собой 8-битовые числа без знака.

Переменные index-start и index-stop определяются в соответствии с таблицей 5. Переменная end-index определяется, как

  • для Message TLV и Packet TLV

    end-index := 0
  • для Address Block TLV

    end-index := <num-addr> - 1

Address Block TLV применяется к адресам объектов с позиции index-start до позиции index-stop (включительно) в Address Block, первый адрес имеет позицию 0.

Таблица 5. Интерпретация флагов thassingleindex и thasmultiindex

thassingleindex

thasmultiindex

index-start :=

index-stop :=

0

0

0

end-index

1

0

<index-start>

<index-start>

0

1

<index-start>

<index-stop>

Переменная number-values определяется выражением

         number-values := index-stop - index-start + 1

<length> опускается или может быть 8-ми или 16-битовым целым числом без знака, как указано в таблице 4. Если установлен (1) флаг tismultivalue, поле <length> должно быть целым кратным number-values и переменной single-length, определяемой выражением

         single-length := <length> / number-values

Если флаг tismultivalue сброшен (0), переменная single-length определяется выражением

         single-length := <length>

<value> при его наличии (см. таблицу 4) имеет размер <length> октетов. В Address Block TLV поле <value> связано с адресными объектами в позициях от index-start до index-stop, включительно. Если флаг tismultivalue сброшен (0), это поле целиком связано с каждым из указанных адресных объектов. При установленном (1) флаге tismultivalue это поле делится на number-values полей одного размера single-length, которые связываются в порядке следования с указанными адресными объектами.

5.4.2. Применение TLV

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

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

5.5. Элементы с некорректным форматом

Формат элемента считается некорректным, если его невозможно разобрать в соответствии со спецификацией синтаксиса (включая и нехватку октетов). Если некорректный элемент содержится в Packet Header, пакет должен отбрасываться без уведомления, а содержащееся в нем сообщение недопустимо обрабатывать или пересылать. Если некорректный элемент содержится в сообщении (Message TLV Block, Address Block или Address Block TLV Block), сообщение дожно отбрасываться без уведомления, его обработка или пересылка недопустимы.

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

Этот документ вводит 4 новых регистрируемых пространства имен: Message Types, Packet TLV Types, Message TLV Types и Address Block TLV Types. Данная спецификация указывает реестры IANA для этих пространств и содержит рекомендации агентству IANA по части регистрации в этих пространствах имен.

Термины Namespace, Assigned Value, Registration, Unassigned, Reserved, Hierarchical Allocation и Designated Expert трактуются в соответствии с [BCP26].

Правила Private Use, Expert Review и Standards Action трактуются в соответствии с [BCP26].

6.1. Expert Review — рекомендации по оценке

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

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

  • Все регистрации должны сопровождаться публикацией RFC.

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

  • Назначенный эксперт будет направлять в рабочую группу MANET или пришедшую ей на замену группу по указанию руководителя направления запрос для комментариев и рецензирования. Запрос будет включать ссылку на документ Internet-Draft, запрашивающий регистрацию.

  • До истечения периода в 30 дней назначенный эксперт будет ожидать одобрения или отказа в регистрации и публиковать решение в списке рассылок рабочей группы MANET или заменившей ее группы, а также информировать IANA и IESG. Сообщение об отказе должно сопровождаться объяснением причины и, по возможности, следует вносить предложения по изменению запроса для последующей попытки регистрации.

Рекомендации для реестра Message Types.

  • Регистрация Message Type предполагает создание двух реестров для Message-Type-specific Message TLV и Message-Type-specific Address Block TLV. Документ, запрашивающий регистрацию Message Type, должен указывать, как эти Message-Type-specific TLV Type будут выделяться с использованием любого из указанных в [BCP26] вариантов и любым исходным распределением значений. Назначенному эксперту (Designated Expert) следует принять во внимание правила выделения, заданные для этих реестров, при рассмотрении запроса на выделение Message Type.

Рекомендации для реестров Packet TLV Types, Message TLV Types и Address Block TLV Types.

  • Эти распределения являются иерархическими (Hierarchical Allocation), т. е., при выделении типа создается реестр для соответствующих этому типу расширенных типов. Запрашивающий регистрацию типа документ должен указывать способ выделения этих расширенных типов с использованием любого из указанных в [BCP26] вариантов и любым исходным распределением значений. Обычно для такого выделения требуется также экспертная оценка (Expert Review), но с возможностью выделения некоторых расширений типов, как резервных (Reserved), экспериментальных (Experimental) или для частных приложений (Private).

  • Запрос для TLV Type должен включать спецификацию разрешенного размера, синтаксиса, любой внутренней структуры и толкования поля Value (при его наличии) в TLV.

Рекомендации для реестров Message TLV Types и Address Block TLV Types.

  • Значения TLV Type от 0 до 127 являются общими для всех типов сообщений. TLV с типами из этого диапазона следует быть модульными для обеспечения использования разными протоколами.

  • Значения TLV Type от 128 до 223 являются специфическими для определенных типов сообщений (Message-Type-specific TLV Type) и применимы лишь в контексте соответствующего Message Type. Регистрация значений TLV Type от 128 до 223 требует наличия реестра для конкретного значения Message Type (см. параграф 6.2.1) и регистрация выполняется в соответствии с правилами, заданными для реестров этого типа сообщений. Message-Type-specific TLV Type следует регистрировать для TLV, которые назначенный эксперт счел излишне специфичными для регистрации в диапазоне от 0 до 127. В интервале от 128 до 233 одному значению TLV Type может соответствовать множество определений TLV в разных реестрах Message-Type-specific TLV Type. По возможности следует использовать имеющиеся определения глобальных TLV и модульных глобальных TLV для регистрации в диапазоне 0 — 127.

6.2. Типы сообщений

Для типов сообщений создается новый реестр Message Types, для которого начальное распределение и правила приведены в таблице 6.

Таблица 6. Т ипы сообщений

Тип

Описание

Политика присвоения значений

0 — 223

Не распределены

Expert Review

224-255

Не распределены

Экспериментальное использование

6.2.1. Создание реестра Message-Type-Specific TLV

При регистрации Message Type должны указываться реестры для Message-Type-specific Message TLV (таблица 8) и Message-Type-specific Address Block TLV (таблица 10). Документ, задающий создание реестра Message-Type-specific TLV, должен также указывать механизм выделения Message-Type-specific TLV Type из числа описанных в [BCP26].

6.3. Типы Packet TLV

Для типов Packet TLV создается новый реестр Packet TLV Types, для которого начальное распределение и правила приведены в таблице 7.

Таблица 7. Типы Packet TLV

Тип

Описание

Политика присвоения значений

0 — 223

Не распределены

Expert Review

224-255

Не распределены

Экспериментальное использование

6.3.1. Создание реестра Packet TLV Type Extension

При регистрации Packet TLV Type должен создаваться новый реестр для расширений данного типа пакетов. Документ, определяющий Packet TLV Type, должен также указывать механизм распределения расширений типа из числа описанных в [BCP26].

6.4. Типы Message TLV

Создается новый реестр для Message-Type-independent Message TLV Types с начальным распределением и правилами, показанными в таблице 8.

Таблица 8. Типы общих Message TLV

Тип

Описание

Политика присвоения значений

0 — 127

Не распределены

Expert Review

128 — 223

Зависит от типа сообщения

Резерв, см. Таблицу 9

224-255

Не распределены

Экспериментальное использование

Значения типов Message TLV от 128 до 223 резервируются для специфических для типа сообщений Message TLV и для них создается новый реестр, начальное распределение и правила выделения для которого представлены в таблице 9.

Таблица 9. Типы специфических Message TLV

Тип

Описание

Политика присвоения значений

0 — 127

Общие для всех типов сообщений

Резерв

128 — 223

Специфические для типа сообщений

См. ниже

224-255

Общие для всех типов сообщений

Резерв

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

6.4.1. Создание реестра Message TLV Type Extension

Если регистрируется тип Message TLV, для него должен создаваться новый реестр для расширений типа. Документ, определяющий Message TLV Type, должен также указывать механизм выделения расширений из числа определенных в [BCP26].

6.5. Типы Address Block TLV

Создается новый реестр Message-Type-independent Address Block TLV Types, начальное распределение и правила выделения для которого представлены в таблице 10.

Таблица 10. Типы Address Block TLV

Тип

Описание

Политика присвоения значений

0 — 127

Не распределены

Expert Review

128 — 223

Специфические для типа сообщений

Резерв, см. Таблицу 11

224-255

Не распределены

Экспериментальное использование

Значения Address Block TLV Type от 128 до 223, включительно, зарезервированы для Message-Type-specific Address Block TLV и для них при регистрации соответствующих Message Type создаются новые реестры, начальное распределение и правила выделения для которых представлены в таблице 11.

Таблица 11. Типы Address Block TLV

Тип

Описание

Политика присвоения значений

0 — 127

Общие для всех типов сообщений

Резерв

128 — 223

Специфические для типа сообщений

См. ниже

224-255

Общие для всех типов сообщений

Резерв

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

6.5.1. Создание реестра Address Block TLV Type Extension

При регистрации Address Block TLV Type создается новый реестр для расширений типа. Документ, определяющий Address Block TLV5 Type, должен также указывать механизм выделения расширений из числа определенных в [BCP26].

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

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

7.1. Предложения по аутентификации и защите целостности

Предложения по аутентификации и защите целостности сделаны на основе предполагаемого применения, описанного в Приложении B, в частности с учетом того, что:

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

  • пакеты предназначены для переноса множества сообщений между соседними маршрутизаторами MANET в один прием через один логический интервал (hop).

Следствия этого в плане аутентификации и защиты целостности приведены ниже.

  • Для пересылаемых сообщений, которые не изменяются на пересылающих их маршрутизаторах MANET, может применяться сквозная аутентификация и защита целостности между маршрутизаторами MANET с установленными защищенными связями путем включения подходящих Message TLV с криптографическими подписями сообщений. Поскольку при пересылке сообщений могут изменяться только поля <msg-hop-count> и <msg-hop-limit>, в расчет контрольной суммы можно включать все сообщение с Message Header, принимая значения полей <msg-hop-count> и <msg-hop-limit> нулевыми (если эти поля имеются).

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

7.2. Предложения по конфиденциальности

Данная спецификация не включает явной защиты конфиденциальности пакетов и сообщений. При необходимости такая защита может обеспечиваться на каждом этапе пересылки (hop-by-hop) с помощью механизмов канального уровня или IP с использованием [RFC4301] и будет применяться только для пакетов.

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

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

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

  • Сообщение, содержащее только Message Header и один экземпляр Message TLV, где Message TLV Type указывает, что поле Value содержит шифрованную версию оставшихся Message TLV, Address Block и Address Block TLV из сообщения. При получении и успешной расшифровке Message TLV полное сообщение разбирается в соответствии с данной спецификацией и процедурами использующего спецификацию протокола.

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

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

Эта спецификация является результатом работы группы OLSRv2 Design Team, перечисленных в алфавитном порядке:

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

Авторы выражают свою благодарность команде OLSR [RFC3626], включая Anis Laouiti (INT, France), Pascale Minet, Laurent Viennot (оба из INRIA, France) и Amir Qayyum (Center for Advanced Research in Engineering, Pakistan) за их вклад. Elwyn Davies (Folly Consulting, UK), Lars Eggert (Nokia, Finland), Chris Newman (Sun Microsystems, USA), Tim Polk (NIST, USA) и Magnus Westerlund (Ericsson, Sweden) предоставили подробные рецензии и значимые комментарии.

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

  • Brian Adamson (NRL);

  • Teco Boot (Infinity Networks);

  • Florent Brunneau (LIX);

  • Ian Chakeres (CenGen);

  • Alan Cullen (BAE Systems);

  • Ulrich Herberg (LIX);

  • Joe Macker (NRL);

  • Yasunori Owada (Niigata University);

  • Charlie E. Perkins (WiChorus);

  • Henning Rogge (FGAN);

  • Andreas Schjonhaug (LIX);

  • и вся рабочая группа IETF MANET.

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

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

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», RFC 2119, BCP 14, March 1997.

[RFC4291] Hinden, R. and S. Deering, «IP Version 6 Addressing Architecture», RFC 4291, February 2006.

[BCP26] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

[SingleUNIX] IEEE Std 1003.1, The Open Group, and ISO/IEC JTC 1/SC22/WG15, «Single UNIX Specification, Version 3, 2004 Edition», April 2004.

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

[RFC3626] Clausen, T. and P. Jacquet, «The Optimized Link State Routing Protocol», RFC 3626, October 2003.

[RFC4301] Kent, S. and K. Seo, «Security Architecture for the Internet Protocol», RFC 4301, December 2005.

[Stevens] Stevens, W., «TCP/IP Illustrated Volume 1 — The Protocols», 1994.

Приложение A. Мультиплексирование и демультиплексирование

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

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

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

  • Для каждого типа сообщений протокол (если явно не указано иное, один из зарезервированных IANA для данного Message Type) должен быть указан в качестве «владельца» этого Message Type.

  • Поля заголовка пакета (Packet Header), включая Packet TLV Block, используются процессами мультиплексирования и демультиплексирования, которые могут сделать эту информацию доступной для использования в своих экземплярах протокола.

  • Поле <pkt-seq-num> (при его наличии) содержит порядковый номер, который следует поддерживать для каждого6 вовлеченного интерфейса и увеличивать на 1 в каждом пакете, генерируемом узлом для данного интерфейса. По достижении значение 65535 нумерация продолжается с 0. Иными словами, нумерация является циклической.

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

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

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

Приложение B. Предусмотренное применение

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

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

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

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

  • Поле <msg-orig-addr> (при наличии) содержит уникальный идентификатор маршрутизатора MANET, создавшего сообщение.

  • Поле <msg-seq-num> (при наличии) содержит порядковый номер. Отсчет начинается с 0 при создании узлом перевого сообщения данного типа, а затем номера увеличиваются на 1 для каждого следующего сообщения этого типа. После номера 65535 снова используется 0. Иными словами, нумерация является циклической.

  • При наличии обоих полей <msg-orig-addr> и <msg-seq-num> заголовок сообщения обеспечивает подавление дубликатов с помощью идентификатора, состоящего из полей <msg-orig-addr>, <msg-seq-num> и <msg-type>. Это обеспечивает уникальную идентификацию сообщений MANET в течение цикла <msg-seq-num>.

  • Поле <msg-hop-limit> (при наличии) содержит число интервалов пересылки (hop), через которые сообщению7 разрешено пройти прежде, чем оно будет отброшено маршрутизатором MANET. Значение <msg-hop-limit> задается инициатором сообщения и служит для предотвращения бесконечной циркуляции сообщений в MANET. При пересылке сообщений маршрутизаторам MANET следует уменьшать <msg-hop-limit> на 1 и отбрасывать сообщения с <msg-hop-limit> = 0.

  • Поле <msg-hop-count> (при наличии) указывает число интервалов пересылки, через которые сообщение1 прошло в сети MANET. Это поле служит для предотвращения бесконечной циркуляции сообщений в MANET. Инициатор сообщения устанавливает <msg-hop-count> = 0 и каждому пересылающему сообщение маршрутизатору MANET следует увеличивать <msg-hop-count> на 1, а сообщения с <msg-hop-count> =255 следует отбрасывать.

  • При наличии обоих полей <msg-hop-limit> и <msg-hop-count> заголовок сообщения обеспечивает информацию для принятия решений о пересылке в режиме ограниченной лавинной рассылки (scope-limited flooding). Это может быть любой механизм рассылки, заданный протоколом, использующим данную спецификацию.

Приложение C. Примеры

В этом приложении приведены примеры для некоторых частей данной спецификации.

C.1. Примеры Address Block

Приведенные ниже примеры иллюстрируют некоторые комбинации адресов, которые могут быть включены в Address Block. Примеры даны для IPv4 с размером адреса 4. Обозначения a, b, c и т. д представляют отличные от нуля значения октетов.

Отметим, что разрешено использовать менее эффективное представление, в частности, со сброшенными флагами ahashead и ahasfulltail (0) и, следовательно, head-length = 0, tail-length = 0, mid-length = address-length, Address Block (без адресных префиксов), включающий множество адресов, <addr-flags> = 0 и список неагрегированных адресов. Это наиболее эффективная форма представления одного адреса и единственный вариант представить, например, a.b.c.d и e.f.g.h в одном Address Block.

Примеры

  • Для включения a.b.c.d, a.b.e.f и a.b.g.h:

    • head-length = 2;

    • tail-length = 0;

    • mid-length = 2;

    • <addr-flags> имеет значение ahashead = 128;

    • <tail-length> и <tail> опущены.

Address Block будет иметь вид 3 128 2 a b c d e f g h (11 октетов).

  • Для включения a.b.c.g и d.e.f.g:

    • head-length = 0;

    • tail-length = 1;

    • mid-length = 3;

    • <addr-flags> имеет значение ahasfulltail = 64;

    • <head-length> и <head> опущены.

Address Block будет иметь вид 2 64 1 g a b c d e f (10 октетов).

  • Для включения a.b.d.e и a.c.d.e:

    • head-length = 1;

    • tail-length = 2;

    • mid-length = 1;

    • <addr-flags> имеет значения ahashead и ahasfulltail, равные 192.

Address Block будет иметь вид 2 192 1 a 2 d e b c (9 октетов).

  • Для включения a.b.0.0, a.c.0.0 и a.d.0.0:

    • head-length = 1;

    • tail-length = 2;

    • mid-length = 1;

    • <addr-flags> имеет значения ahashead и ahaszerotail, равные 160;

    • <tail> опущено.

Address Block будет иметь вид 3 160 1 a 2 b c d (8 октетов).

  • Для включения a.b.0.0 и c.d.0.0:

    • head-length = 0;

    • tail-length = 2;

    • mid-length = 2;

    • <addr-flags> имеет значение ahaszerotail = 32;

    • <head> и <tail> опущены.

Address Block будет иметь вид 2 32 2 a b c d (7 октетов).

  • Для включения a.b.0.0/n и c.d.0.0/n:

    • head-length = 0;

    • tail-length = 2;

    • mid-length = 2;

    • <addr-flags> имеет значения ahaszerotail и ahassingleprelen, равные 48;

    • <head> и <tail> опущены.

Address Block будет иметь вид 2 48 2 a b c d n (8 октетов).

  • Для включения a.b.0.0/n и c.d.0.0/m:

    • head-length = 0;

    • tail-length = 2;

    • mid-length = 2;

    • <addr-flags> имеет значения ahaszerotail и ahasmultiprelen, равные 40;

    • <head> и <tail> опущены.

Address Block будет иметь вид 2 40 2 a b c d n m (9 октетов).

C.2. Примеры TLV

Предположим определение Address Block TLV с EXAMPLE1 (без расширения типа), имеющим однооктетные значения адресов. Существует много способов, которыми значения a, a, b и c можно связать с четырьмя адресами в предшествующем Address Block, где c является принятым по умолчанию значением, котором можно не указывать.

Примеры.

  • Использование многозначного TLV для покрытия всех адресов:

    • <tlv-flags> имеет значения thasvalue и tismultivalue, равные 20;

    • <index-start> и <index-stop> опущены;

    • <length> = 4 (single-length = 1).

      TLV будет иметь вид EXAMPLE1 20 4 a a b c (7 октетов).

  • Использование одного многозначного TLV без указания последнего адреса:

    • <tlv-flags> имеет значения thasmultiindex, thasvalue и tismultivalue, равные 52;

    • <index-start> = 0;

    • <index-stop> = 2;

    • <length> = 3 (single-length = 1).

    • TLV будет иметь вид EXAMPLE1 52 0 2 3 a a b (8 октетов).

  • Использование двух однозначных TLV без указания последнего адреса.

    Первый:

    • <tlv-flags> имеет значения thasmultiindex и thasvalue, равные 48;

    • <index-start> = 0;

    • <index-stop> = 1;

    • <length> = 1;

    • <value> = a.

      TLV будет иметь вид EXAMPLE1 48 0 1 1 a (6 октетов).

Второй:

      • <tlv-flags> имеет значения thassingleindex и thasvalue, равные 80;

      • <index-start> = 2;

      • <index-stop> опущено;

      • <length> = 1;

      • <value> = b.

        TLV будет иметь вид EXAMPLE1 80 2 1 b (5 октетов).

Общий размер двух TLV — 11 октетов.

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

Предположим определение Address Block TLV с типом EXAMPLE2 (без расширения типа), не имеющим значения и связанным со вторым и третьим адресом в Address Block. Это можно выразить одним TLV:

  • <tlv-flags> имеет значение thasmultiindex = 32;

  • <index-start> = 1;

  • <index-stop> = 2;

  • <length> и <value> опущены.

    TLV будет иметь вид EXAMPLE2 32 1 2 (4 октета).

Предположим определение Message TLV с типом EXAMPLE3 (без расширения типа), который может принимать поля Value любого размера. Для такого TLV с 8 октетами данных (a — h):

  • <tlv-flags> имеет значение thasvalue = 16;

  • <index-start> и <index-stop> опущены;

  • <length> = 8.

    TLV будет иметь вид EXAMPLE3 16 8 a b c d e f g h (11 октетов).

Если в этом примере число октетов составит 256 или больше, <tlv-flags> будет иметь значение thasextlen = 24. Для размера потребуется два октета (сначала старший). Размер TLV составит 4 + N октетов, где N — число октетов данных (3 + N октетов, если N не превышает 255).

Приложение D. Иллюстрации

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

Резервные (Rsv0 следует сбрасывать (0), биты, помеченные M, могут быть сброшены (0) или установлены (1).

D.1. Пакет

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

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0|0|0|0|0|0|Rsv|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                            Message                            |
     |                                                               |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                            Message                            |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0|0|0|0|1|0|Rsv|    Packet Sequence Number     |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                            Message                            |
     |                                                               |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                            Message                            |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0|0|0|0|0|1|Rsv|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                                                               |
     |                       Packet TLV Block                        |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                            Message                            |
     |                                                               |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                            Message                            |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0|0|0|0|1|1|Rsv|    Packet Sequence Number     |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                       Packet TLV Block                        |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                            Message                            |
     |                                                               |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                            Message                            |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

D.2. Сообщение

В этом параграфе показаны возможные варианты элементов <message>, которые различаются октетами флагов (октет 2). Размер Message Body определяется с помощью поля Message Size, в котором указывается суммарный размер всех показанных полей. Поле MAL определяет размер всех адресов (включая Originator Address при его наличии и все адреса в Address Block) в октетах, который на единицу больше значения этого поля.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|0|0|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|0|0|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|1|0|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|1|0|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|0|1|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Count   |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|0|1|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Count   |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|1|1|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |   Hop Count   |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|1|1|0|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |   Hop Count   |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|0|0|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |    Message Sequence Number    |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|0|0|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |    Message Sequence Number    |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|1|0|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |    Message Sequence Number    |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|1|0|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |    Message Sequence Number    |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|0|1|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Count   |    Message Sequence Number    |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|0|1|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Count   |    Message Sequence Number    |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |0|1|1|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |   Hop Count   |    Message Sequence Number    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Message Type  |1|1|1|1|  MAL  |         Message Size          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Originator Address                       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Limit   |   Hop Count   |    Message Sequence Number    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                         Message Body                          |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

D.3. Тело сообщения

В этом параграфе показан формат Message Body (элемент <message> без начального <msg-header>). Message Body включает Message TLV Block (может содержать TLV) и может включать любое число (включая 0) пар Address Block и Address Block TLV Block.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                       Message TLV Block                       |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                         Address Block                         |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                    Address Block TLV Block                    |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                         Address Block                         |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                    Address Block TLV Block                    |
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

D.4. Адресный блок

В этом параграфе показаны возможные варианты элементов <addr-block>, различающиеся флагами(октет 2). Число элементов Mid совпадает с числом адресов (при mid-length = 0 элементы Mid отсутствуют). Там, где показано переменное число полей размера префикса, количество этих полей совпадает с числом адресов.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|0|0|0|0| Rsv |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Mid (продолж.)       |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Mid (продолж.)       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|0|0|0|0| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|              Mid              |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|1|0|0|0| Rsv |  Tail Length  |     Tail      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Tail (продолж.)|              Mid              |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|1|0|0|0| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|  Tail Length  |             Tail              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Mid              |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|0|1|0|0| Rsv |  Tail Length  |      Mid      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Mid (продолж.)|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|0|1|0|0| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|  Tail Length  |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     :                              ...                              :
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|0|0|1|0| Rsv |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Mid (продолж.)       |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Mid (продолж.)       | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|0|0|1|0| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|              Mid              |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|1|0|1|0| Rsv |  Tail Length  |     Tail      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Tail (продолж.)|              Mid              |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|1|0|1|0| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|  Tail Length  |             Tail              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Mid              |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Prefix Length |
     +-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|0|1|1|0| Rsv |  Tail Length  |      Mid      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Mid (продолж.)|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|0|1|1|0| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|  Tail Length  |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     :                              ...                              :
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|0|0|0|1| Rsv |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Mid (продолж.)       |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Mid (продолж.)       | Prefix Length |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|0|0|0|1| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|              Mid              |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|1|0|0|1| Rsv |  Tail Length  |     Tail      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Tail (продолж.)|              Mid              |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|1|0|0|1| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|  Tail Length  |             Tail              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Mid              |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Prefix Length |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     :                              ...                              :
     |                                               +-+-+-+-+-+-+-+-+
     |                                               | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |0|0|1|0|1| Rsv |  Tail Length  |      Mid      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Mid (продолж.)|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |              Mid              | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Number Addrs  |1|0|1|0|1| Rsv |  Head Length  |     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|  Tail Length  |              Mid              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     :                              ...                              :
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Mid              | Prefix Length |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               | Prefix Length |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

D.5. Блок TLV

В этом параграфе показан формат элемента <tlv-block>, который может включать любое число (включая 0) TLV, а общий размер TLV (в октетах) равен значению поля Length.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |            Length             |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                              TLV                              |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     :                              ...                              :
     |                                                               |
     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                               |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                              TLV                              |
     |                                               +-+-+-+-+-+-+-+-+
     |                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

D.6. TLV

В этом параграфе показаны возможные варианты элементов <tlv>, отличающиеся флагами (второй октет). Отсутствие поля Index означает Packet TLV, Message TLV или Address Block TLV, для Address Block TLV указывается одно или два поля Index. Поле Length указывает размер поля Value в октетах.

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

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|0|0|0|0|0|Rsv|   Type Ext    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|1|0|0|0|0|Rsv|  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|1|0|0|0|0|Rsv|   Type Ext    |  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|0|1|0|0|0|Rsv|  Index Start  |  Index Stop   |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|0|1|0|0|0|Rsv|   Type Ext    |  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Index Stop   |
     +-+-+-+-+-+-+-+-+
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|0|0|1|0|M|Rsv|    Length     |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|0|0|1|0|M|Rsv|   Type Ext    |    Length     |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|1|0|1|0|0|Rsv|  Index Start  |    Length     |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|1|0|1|0|0|Rsv|   Type Ext    |  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |    Length     |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|0|1|1|0|M|Rsv|  Index Start  |  Index Stop   |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |    Length     |                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|0|1|1|0|M|Rsv|   Type Ext    |  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Index Stop   |    Length     |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|0|0|1|1|M|Rsv|            Length             |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+8
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|0|0|1|1|M|Rsv|   Type Ext    |    Length     |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Length(продолж)|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|1|0|1|1|0|Rsv|  Index Start  |    Length     |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Length(продолж)|                                               |
     +-+-+-+-+-+-+-+-+                                               |
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|1|0|1|1|0|Rsv|   Type Ext    |  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |            Length             |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |0|0|1|1|1|M|Rsv|  Index Start  |  Index Stop   |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |            Length             |                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |1|0|1|1|1|M|Rsv|   Type Ext    |  Index Start  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Index Stop   |            Length             |               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
     |                                                               |
     |                             Value                             |
     |                                                               |
     |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |               |
     +-+-+-+-+-+-+-+-+

Приложение E. Полный пример

Ниже приведен пример, предназначенный для иллюстрации создания полей Packet Headers и Message Headers, а также представления адресов и атрибутов с помощью Address Block и TLV Block. При создании примера не ставилось цели снижения максимального размера сообщения или размера пакета.

Packet Header имеет флаг phasseqnum в поле флагов (значение 8) и, следовательно, имеет Packet Sequence Number, но не имеет Packet TLV Block.

Пакет содержит одно сообщение размером 559 октетов. Это сообщение имеет флаги mhasorig, mhashoplimit, mhashopcount и mhasseqnum в своем 4-битовом поле флагов (значение 15) и, следовательно, включает Originator Address, Hop Limit, Hop Count и Message Sequence Number (не зависит от типа). Четырехбитовое поле Message Address Length имеет значение 3, следовательно адрес в сообщении имеет размер 4 октета и является адресом IPv4. Сообщение имеет Message TLV Block с размером содержимого в 9 октетов, включающий один Message TLV. В этом TLV установлен флаг thasvalue в октете флагов (значение 16), следовательно имеется поле Value с Value Length = 6. Сообщение имеет два Address Block, за каждым из которых следует блок Address Block TLV.

Первый блок адресов включает два адресных префикса. Он имеет флаги ahaszerotail и ahassingleprelen в октете флагов (значение 48) и, следовательно, не имеет Head (head-length = 0). Поле tail-length указывает 2 октета, следовательно mid-length также указывает 2 октета. Два октета Tail каждого из адресов не указываются (флаг ahaszerotail установлен) и имеют значение 0. Address Block имеет один размер префикса. Следующий блок Address Block TLV пуст (размер содержимого 0).

Второй Address Block включает 3 адреса, имеет флаг ahashead (октет флагов имеет значение 128), имеет head-length в 2 октета, не имеет Tail (tail-length = 0), следовательно mid-length = 2. За ним следует блок Address Block TLV с размером содержимого 9 октетов, включающий два Address Block TLV. В первом из этих TLV установлен флаг (значение октета флагов 16) и присутствует одно значение размеров 2 октета, которое применяется ко всем адресам в Address Block. Во втором TLV установлен флаг thasmultiindex (октет флагов 32) и, следовательно, нет полей Value Length и Value. Присутствуют два поля Index (Index Start и Index Stop), которые показывают адреса, к которым применяется TLV (включительный диапазон с отсчетом от 0).

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0 0 0 0 1 0 0 0|    Packet Sequence Number     | Message Type  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |1 1 1 1 0 0 1 1|0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1|   Orig Addr   |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |           Originator Address (продолж.)       |   Hop Limit   |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Hop Count   |    Message Sequence Number    |0 0 0 0 0 0 0 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0 0 0 0 1 0 0 1|   TLV Type    |0 0 0 1 0 0 0 0|0 0 0 0 0 1 1 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                             Value                             |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |         Value (продолж.)      |0 0 0 0 0 0 1 0|0 0 1 1 0 0 0 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0 0 0 0 0 0 1 0|              Mid              |      Mid      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Mid (продолж.)| Prefix Length |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0 0 0 0 0 0 1 1|1 0 0 0 0 0 0 0|0 0 0 0 0 0 1 0|     Head      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Head (продолж.)|              Mid              |      Mid      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Mid (продолж.)|              Mid              |0 0 0 0 0 0 0 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |0 0 0 0 1 0 0 1|   TLV Type    |0 0 0 1 0 0 0 0|0 0 0 0 0 0 1 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |             Value             |   TLV Type    |0 0 1 0 0 0 0 0|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Index Start  |  Index Stop   |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

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

Thomas Heide Clausen

LIX, Ecole Polytechnique

Phone: +33 6 6058 9349

EMail: T.Clausen@computer.org

URI: http://www.thomasclausen.org/

Christopher M. Dearlove

BAE Systems ATC

Phone: +44 1245 242194

EMail: chris.dearlove@baesystems.com

URI: http://www.baesystems.com/

Justin W. Dean

Naval Research Laboratory

Phone: +1 202 767 3397

EMail: jdean@itd.nrl.navy.mil

URI: http://pf.itd.nrl.navy.mil/

Cedric Adjih

INRIA Rocquencourt

Phone: +33 1 3963 5215

EMail: Cedric.Adjih@inria.fr

URI: http://menetou.inria.fr/~adjih/

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

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

nmalykh@gmail.com

1Mobile Ad hoc NETwork — специализированная мобильная сеть.

2Type-length-value — тип-размер-значение.

3Optimized Link State Routing — оптимизированный протокол маршрутизации по состоянию каналов.

4«Голова:центральная часть:хвост»

5В оригинале ошибочно сказано Message TLV. См. https://www.rfc-editor.org/errata_search.php?eid=4178. Прим. перев.

6В оригинале по ошибке не указано, что это требование относится к каждому участвующему интерфейсу. См. https://www.rfc-editor.org/errata_search.php?eid=3496. Прим. перев.

7В оригинале ошибочно сказано «пакет». См. https://www.rfc-editor.org/errata_search.php?eid=4003. Прим. перев.

8В оригинале для бита 11 ошибочно указано значение 0. Прим. перев.

9В оригинале ошибочно сказано 54 октета. См. https://www.rfc-editor.org/errata_search.php?eid=1790. По этой причине значение бита 23 второго слова (перед Orig Addr) на рисунке ниже заменено при переводе на 1. Прим. перев.




AoE (ATA over Ethernet)

                                                              S. Hopkins
                                                                B. Coile
                                        The Brantley Coile Company, Inc.
AoEr11                                                     February 2009



AoE (ATA over Ethernet)

PDF

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

В этом документе приведена спецификация облегченного протокола доступа к устройствам ATA через сеть Ethernet.

1. Введение

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

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

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

1.1. Соединения

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

2. Формат заголовка AoE

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 0 |                    Ethernet Destination Addr                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 4 |   Ethernet Destination Addr   |      Ethernet Source Addr     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                      Ethernet Source Addr                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |     Ethernet Type (0x88A2)    |  Ver  | Flags |     Error     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 |             Major             |     Minor     |    Command    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 |                              Tag                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |                              Arg                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.1. Адреса Ethernet Source, Destination и Ethernet Type

Стандартный заголовок Ethernet MAC, используемый для кадров IEEE 802.3 Ethernet.

Протокол AoE использует зарегистрированное значение типа Ethernet — 0x88A2.

2.2. Ver (Версия)

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

Коды команд для этой версии протокола описана в параграфе 2.6. Command.

Отклик Query Config Information включает номер версии протокола, поддерживаемой сервером.

+-+-+-+-+
|R|E|Z|Z|
+-+-+-+-+

2.3. Флаги

Поле Flags содержит биты флагов, описанные ниже.

Бит R устанавливается для сообщений, являющихся откликами. Бит E устанавливается в сообщениях с откликами, если соответствующее отклику сообщение с командой привело к возникновению ошибки AoE. Флаги Z являются резервными и должны иметь значение 0.

2.4. Error

Если в поле Flags установлен бит E, это поле содержит один из определенных ниже кодов ошибок.

Error 1: Unrecognized command code — неизвестный код команды

Сервер не понял кода команды, заданного в поле Command.

Error 2: Bad argument parameter — некорректный параметр

В поле Arg имеется неприемлемое значение.

Error 3: Device unavailable — устройство недоступно

Сервер больше не способен воспринимать команды ATA.

Error 4: Config string present — присутствует строка конфигурации

Сервер не может установить строку конфигурации, поскольку она не пуста (см. параграф 3.2).

Error 5: Unsupported version — неподдерживаемая версия

Сервер не понимает номер версии протокола, указанный в поле Ver.

Error 6: Target is reserved — «цель» забронирована.

Команда не может быть выполнена, поскольку «цель» забронирована (см. параграф 3.4).

2.5. Major, Minor

Каждый сервер AoE обладает двумя адресами — старшим (major) и младшим (minor). До обработки поля Command в заголовке сервер должен сравнить свои адреса с соответствующими полями Major и Minor в заголовке. Сервер будет принимать командное сообщение для обработке при выполнении обоих приведенных ниже условий:

значение поля Major в заголовке совпадает со старшим адресом сервера или содержит только единицы (0xffff);

значение поля Minor в заголовке совпадает с младшим адресом сервера или содержит только единицы (0xff).

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

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

2.6. Command

Это поле содержит код команды. В данной версии протокола определены следующие коды команд:

Command 0: Issue ATA Command — ввести команду ATA;

Command 1: Query Config Information — запросить конфигурационные данные;

Command 2: Mac Mask List — список масрок MAC;

Command 3: Reserve / Release – обратить, освободить.

Коды 240-255 (0xf0-0xff) зарезервированы для конкретного использования производителями.

2.7. Tag

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

2.8. Arg

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

3. Коды команд

3.1. Command 0, Issue ATA Command

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |    AFlags     |  Err/Feature  |  Sector Count |   Cmd/Status  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 |     lba0      |     lba1      |     lba2      |     lba3      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32 |     lba4      |     lba5      |           Reserved            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36 |                             Data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Команда 0 используется для ввода команды ATA в подключенное к серверу устройства ATA.

Все данные, связанные с командой, должны помещаться в одно сообщение. Максимальный размер стандартного кадра Ethernet (1520 байтов) ограничивает возможность однократного считывания или записи двумя секторами.

Операции чтения/записи ATA должны быть защищены списком бронирования, как описано в параграфе 3.4. Если доступ к «цели» ограничен бронированием, должно возвращаться сообщение об ошибке AoE с кодом 6.

+-+-+-+-+-+-+-+-+
|Z|E|Z|D|Z|Z|A|W|
+-+-+-+-+-+-+-+-+

Формат поля AoE Arg показан на рисунке выше.

Поле AFlags показано на рисунке справа.

Флаг W должен устанавливаться в тех случаях, когда команда ATA требует записи в устройство. Бит A должен устанавливаться в тех случаях, когда запрос на запись будет выполняться в асинхронном режиме. Значение бита D определяется регистром ATA Device/Head и принимается во внимание только при установленном бите E. Установленный флаг E говорит о том, что команда относится к числу расширенных команд LBA48. Флаги Z являются резервными и должны иметь значение 0.

Флаг W вместе с полем Sector Count определяют направление переноса данных — на устройство или с устройства:

при записи данных на устройство бит W должен быть установлен, а поле Data должно содержать Sector Count * 512 байтов данных;

при считывании данных с устройства бит W должен быть сброшен (0), а поле Sector Count должно указывать количество секторов, считываемых с устройства; при успешном выполнении команды поле Data в отклике будет содержать считанные с устройства данные;

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

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

Если установлен флаг E, сервер будет переносить содержимое каждого поля в регистры устройства ATA, как показано ниже:

      Device        <- (AFlags & 0x50 | 0xA0)
      LBA Low       <- lba3
      LBA Low       <- lba0
      LBA Mid       <- lba4
      LBA Mid       <- lba1
      LBA High      <- lba5
      LBA High      <- lba2
      Sector Count  <- 0
      Sector Count  <- Sector Count
      Err/Feature   <- Err/Feature
      Cmd/Status    <- Cmd/Status

Биты E,D поля AFlags соответствуют битам L,D в регистрах устройства. По отношению к ним используется операция ИЛИ 0xA0 для установки утративших значение битов в 1 в соответствии со спецификацией ATA.

Если флаг E не установлен, сервер будет переносить содержимое каждого поля в регистры устройства ATA, как показано ниже:

      Device        <- lba3
      LBA Low       <- lba0
      LBA Mid       <- lba1
      LBA High      <- lba2
      Sector Count  <- Sector Count
      Err/Feature   <- Err/Feature
      Cmd/Status    <- Cmd/Status

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

      Err/Feature   <- Err/Feature
      Sector Count  <- Sector Count
      lba0          <- LBA Low
      lba1          <- LBA Mid
      lba2          <- LBA High
      Cmd/Status    <- Cmd/Status

Порядок копирования регистров в поля сообщения сохраняется независимо от состояния бита E.

При установленном бите E дополнительно будут копироваться перечисленные ниже значения регистров устройства ATA в поля lba3, lba4 и lba5 после установки флага в регистре ATA Device Control.

      lba3          <- LBA Low
      lba4          <- LBA Mid
      lba5          <- LBA High

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

3.2. Command 1, Query Config Information

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |         Buffer Count          |       Firmware Version        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 | Sector Count  |  AoE  | CCmd  |      Config String Length     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32 |         Config String         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Command 1 позволяет получить от сервера конфигурационную информацию, а в некоторых случаях — поменять параметры конфигурации. Формат поля Arg в команде и отклике показан на рисунке.

Buffer Count

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

Firmware Version

Номер версии ПО сервера (firmware).

Sector Count

Отличное от нуля значения счетчика задает число секторов, обрабатываемых по одной команде. Нулевое значение в целях совместимости со старыми устройствами трактуется, как 2.

AoE

Версия протокола AoE, поддерживаемая сервером.

CCmd

Субкоманда запроса/установки строки конфигурации (Config string).

Config String Length

Размер строки конфигурации.

Config String

Строка конфигурации размером до 1024 байтов, включительно.

В сообщениях с командами для полей Buffer Count, Firmware Version и AoE клиент должен устанавливать значение 0, а сервер должен игнорировать эти поля. Остальные поля могут использоваться для считывания или устанвоки строки конфигурации.

Допустимые значения CCmd перечислены ниже.

CCmd 0: read config string — считать строку конфигурации

Считать конфигурационную строку сервера без какой-либо проверки или отклика.

CCmd 1: test config string — проверить строку конфигурации

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

CCmd 2: test config string prefix — проверить префикс строки конфигурации

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

CCmd 3: set config string — установить строку конфигурации

Если строка конфигурации сервера пуста, она устанавливается в соответстствии со строкой в аргументе и возвращается в отклике. Если строка конфигурации сервера не пуста, возвращается отклик с установленным битом E в поле E и кодом ошибки 4 в поле Error.

CCmd 4: force set config string — принудительно установить строку конфигурации

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

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

Когда сервер завершил загрузку и готов к обработке команд, ему следует передать в широковещательном режиме отклик Query Config Information с нулевым значением тега.

3.3. Command 2, Mac Mask List

Команда Mac Mask List используется для считывания списка масок MAC для цели AoE и управления этим списком. Цель AoE может использовать список масок для контроля доступа. Предполагается, что реализации «целей» будут вести себя, как описано ниже.

Цель AoE будет воспринимать полученный кадр с командой при выполнении любого из приведенных ниже условий:

  1. список масок пуст;

  2. адрес отправителя кадра имеется в списке масок.

Если ни одно из условий не выполняется, цель должна игнорировать команду. Такая проверка должна выполняться для всех команд AoE, включая команды Mac Mask List.

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |    Reserved   |      MCmd     |     MError    |   Dir Count   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 |                         Directive 0                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32 |                         Directive 0                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Формат поля Arg показан на рисунке.

MCmd

Субкоманда Mac Mask List. MCmd может принимать значения:

MCmd 0: прочесть список;

MCmd 1: редактировать список.

MError

При возникновении ошибки в процессе обработки списка для поля MError устанавливается одно из значений:

MError 1: Unspecified Error — неизвестная ошибка;

MError 2: Bad DCmd directive — некорректная директива DCmd;

MError 3: Mask list full — список масок полон.

Dir Count

Счетчик числа директив, содержащихся в сообщении.

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 |    Reserved   |      DCmd     |       Ethernet Address        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4 |                       Ethernet Address                        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Directive

Директива для маски MAC. Каждая директива занимает 8 байтов и включает перечисленные ниже поля.

DCmd

Код директивы, который может принимать одно из значений:

0 — нет директивы;

1 — добавить MAC-адрес в список масок;

2 — удалить MAC-адрес из списка масок.


Ethernet Address

Адрес Ethernet, включаемый в список масок или удаляемый из списка.

В командах считывания списка масок должно быть установлено MCmd=0. Отклик будет возвращать MAC-адреса в директивах, следующих после заголовка. Число директив указывается в поле Dir Count.

В командах редактирования списка масок должно задаваться значение MCmd=1. Кадр с командой должен содержать число директив, указанное в поле Dir Count. Сервер, обрабатывающий такую команду, должен брать директивы в соответствии с порядком их размещения в кадре. При возникновении ошибки в процессе обработки директив сервер должен прервать обработку и возвратить отклик со значением поля Dir Count, указывающим на связанную с ошибкой директиву, и кодом ошибки в поле MError. Отклик сервера на ошибку должен содержать список масок из соответствующей команды.

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

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

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

3.4. Command 3, Reserve/Release

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |      RCmd     |     NMacs     |       Ethernet Address 0      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 |                       Ethernet Address 0                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32 |                       Ethernet Address 1                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36 |      Ethernet Address 1       |              ...              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Команда Reserve/Release служит для управления блокировкой доступа к цели AoE по списку MAC-адресов. Забронированная цель AoE будет выполнять команды ATA на чтение/запись только в тех случаях, когда MAC-адрес отправителя из кадра с командой будет присутствовать в списке бронирования. Остальные команды (запрос конфигурации, идентификация ATA и т.п.) обрабатываются независимо от адреса отправителя. Когда цель недоступна в результате бронирования, возвращается сообщение об ошибке AoE с кодом 6: Target is reserved.

Формат поля Arg показан на рисунке.

RCmd

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

0 — прочесть список бронирования;

1 — установить список бронирования;

2 — принудительно выполнить команду бронирования/освобождения.

По команде RCmd 0 возвращается список бронирования.

RCmd 1 используется для бронирования или освобождения цели. Бронирование осуществляется путем создания списка с одним или множеством MAC-адресов. Освобождение выполняется путем сброса списка адресов (организации пустого списка) за счет установки NMacs=0. Команда Rcmd 1 будет обрабатываться только в тех случаях, когда текущий список бронирования пуст или включает MAC-адрес отправителя команды. Если команда Rcmd 1 не может быть выполнена в результате бронирования, должно возвращаться сообщение об ошибке AoE с кодом 6, как сказано выше.

Команда Rcmd 2 используется для принудительного бронирования/освобождения цели, независимо от наличия MAC-адреса отправителя в списке бронирования. Эта команда используется прежде всего для изменения устаревших списков бронирования. Применять эту команду следует лишь в тех случаях, когда имеется достоверная информация о некорректности списка бронирования.

NMacs

Число MAC-адресов в сообщении.

Ethernet Address [0..n]

Один или множество 6-байтовых адресов Ethernet.

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

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

The Brantley Coile Company, Inc.

565 Research Drive

Athens, GA 30605

{sah,brantley}@borf.com

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

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

nmalykh@gmail.com

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

Большое спасибо Norman Wilson за критику и предложения.


1Remote Procedure Call. Прим. перев.

2От старшего байта к младшему — т. е., первым указывается самый старший байт. Этот порядок еще называют big-endian. Прим. перев.

3Connectionless. Прим. перев.




RFC 5492 Capabilities Advertisement with BGP-4

Network Working Group                                     J. Scudder
Request for Comments: 5492                          Juniper Networks
Obsoletes: 3392                                           R. Chandra
Category: Standards Track                              Sonoa Systems
                                                       February 2009

 

 

Анонсирование возможностей в BGP-4

Capabilities Advertisement with BGP-4

PDF

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

В этом документе содержится спецификация протокола, предложенного сообществу Internet. Документ служит приглашением к дискуссии в целях развития и совершенствования протокола. Текущее состояние стандартизации протокола вы можете узнать из документа Internet Official Protocol Standards (STD 1). Документ может распространяться без ограничений.

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

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

Этот документ является субъектом прав, указанных в BCP 78 и Legal Provisions Relating to IETF Documents, в редакции на момент публикации данного документа (http://trustee.ietf.org/license-info).

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

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

Тезисы

В этом документе определяется новый дополнительный параметр3 Capabilities, который предположительно, будет упрощать добавление новых возможностей в протокол BGP4 путем анонсирования этих возможностей партнеру без разрыва соединения BGP.

Этот документ заменяет собой RFC 3392.

1. Введение

Базовая спецификация BGP-4 [RFC4271] требует от узла BGP разрыва соединения с партнером при получении от того сообщения OPEN с одним или несколькими нераспознанными значениями дополнительных параметров. Это осложняет добавление новых возможностей в BGP.

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

2. Описание требований

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

3. Обзор

Когда узел BGP [RFC4271], поддерживающий анонсирование возможностей, передает своему партнеру сообщение OPEN, это сообщение может включать дополнительный параметр Capabilities. Данный параметр содержит список возможностей, поддерживаемых узлом.

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

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

Узел BGP считает, что его партнер не поддерживает ту или иную возможность, если в ответ на сообщение OPEN с дополнительным параметром Capabilities приходит сообщение NOTIFICATION, содержащее Error Subcode = Unsupported Optional Parameter (это следствие базовой спецификации BGP-4 [RFC4271], а не новое требование). В таких случаях узлу следует предпринять попытку заново организовать соединение BGP с этим партнером без использования дополнительного параметра Capabilities.

Если узел BGP, поддерживающий ту или иную возможность, определяет, что его партнер не поддерживает эту возможность, узел может передать партнеру сообщение NOTIFICATION и разорвать соединение с ним (см. параграф 5. Расширение для обработки ошибок). Например, узлу BGP может потребоваться разрыв соединения, если он организовал это соединение для обмена маршрутами IPv6 и узнал, что партнер не поддерживает многопротокольные расширения для BGP-4 [RFC4760]. В таких случаях в поле Error Subcode этого сообщения следует поместить значение Unsupported Capability. Сообщение должно включать возможность (возможности), которая заставила узел передать это сообщение. Решение о передаче сообщения и разрыве соединения с партнером узел принимает по своему усмотрению. При разрыве соединения не следует предпринимать попытки его автоматического восстановления.

Если узел BGP получает от своего партнера анонс возможности, которую он не поддерживает или не может распознать, данный узел должен игнорировать эту возможность. В частности, недопустимо передавать сообщение Unsupported Capability NOTIFICATION и разрывать сессию BGP в ответ на получение анонса возможности, не поддерживаемой локальным узлом.

4. Дополнительный параметр Capabilities (тип 2)

Этот дополнительный параметр (Optional Parameter) используется узлом BGP для передачи своему BGP-партнеру списка поддерживаемых данным узлом возможностей. Представление значений BGP Optional Parameter описано в параграфе 4.2 [RFC4271]. Дополнительный параметр Capabilities относится к типу 2.

+----------------------------+
| Capability Code (1 октет)  |
+----------------------------+
| Capability Length (1 октет)|
+----------------------------+
| Capability Value (перемен.)|
~                            ~
+----------------------------+

Параметр включает один или множество триплетов <Capability Code, Capability Length, Capability Value>, каждый из которых представляется в формате, показанном справа.

Использование и значение полей описано ниже.

Capability Code (код возможности)

Capability Code представляет собой 1-октетное поле, однозначно идентифицирующее данную возможность.

Capability Length (размер)

Capability Length представляет собой 1-октетное поле, указывающее размер поля Capability Value в октетах.

Capability Value (значение)

Поле Capability Value имеет переменный размер и интерпретируется в зависимости от кода возможности (Capability Code).

Узлу BGP не следует включать в сообщения дубликаты возможностей с совпадающими значениями полей Capability Code, Capability Length, Capability Value. Отметим однако, что обработка дубликатов не требует специальных действий, поскольку дополнительный экземпляр возможности ничего не изменяет в списке анонсируемых возможностей; поэтому узел BGP должен быть готов к восприятию сообщений со множеством экземпляров одной возможности.

Узлы BGP могут включать более одного экземпляра возможности (заданной значением Capability Code) с отличным от нуля значением поля Capability Length, но с разными значениями Capability Value (значения поля Capability Length могут совпадать или различаться). Обработка таких экземпляров определяется значением поля Capability Code и должна быть описана в документе, содержащем спецификации новой возможности.

Дополнительный параметр Capabilities (OPEN Optional Parameter Type 2) следует включать в сообщение OPEN только один раз. Если узел BGP хочет включть в сообщение OPEN множество возможностей, ему следует делать это, как описано выше, перечисляя все возможноссти с использованием формата TLV в одном параметре Capabilities. Однако для совместимости с более ранними версиями узел BGP должен быть готов к получению сообщений OPEN содержащих множество параметров Capabilities, каждый из которых содежит TLV для одной или множества возможностей. Набор возможностей следует обрабатывать одинаково во всех случаях независимо от того, получен этот набор в одном параметре Capabilities сообщения OPEN или распределен по множеству параметров Capabilities.

5. Расширение для обработки ошибок

В этом документе определено новый субкод ошибки (Error Subcode) – Unsupported Capability (неподдерживаемая возможность) со значением 7. В поле данных (Data) сообщения NOTIFICATION должен включаться список возможностей, которые вызвали генерацию этого сообщения. В этом случае каждая из включаемых в список возможностей кодируется так же, как в сообщении OPEN.

Как указано в параграфе 3. Обзор, сообщение Unsupported Capability NOTIFICATION обеспечивает для узла BGP способ уведомления о том, что его партнер не поддерживает возможность, без которой партнеры не смогут работать. Недопустимо использовать такие уведомления в случаях, когда узел BGP получает анонс возможности, который он не способен понять; такие анонсы должны игнорироваться.

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

В этом документе определен новый дополнительный параметр Capability с полем Capability Code. IANA поддерживает реестр значений Capability Code. Нулевое (0) значение Capability Code является резервным. Коды возможностей в диапазоне от 1 до 63 выделяются IANA после обзора IETF («IETF Review»), как описано в документе [RFC5226]. Коды из диапазона 64 — 127 распределяются IANA в порядке поступления запросов (процедура «First Come First Served»), описанном в документе [RFC5226]. Коды от 128 до 255 предназначены для приватного использования («Private Use»), как определено в [RFC5226].

IANA поддерживает реестр дополнительных параметров сообщений OPEN, называемый «BGP OPEN Optional Parameter Types». Дополнительные параметры идентифицируются однооктетными целыми числами без знака Parameter Type. Значения типов (0 — резерв) распределяются в соответствии с процедурой «IETF Review», определенной в [RFC5226].

В настоящее время реестр ыключает два значения Parameter Type:

  • Parameter Type 1: Authentication свидетельство подлинности (не рекомендуется использовать) [RFC4271] [RFC5492]
  • Parameter Type 2: Capabilities — возможности [RFC5492]

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

Данное расширение не оказывает влияния на проблемы безопасности, связанные с протоколом BGP [RFC4272].

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

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

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

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

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC4271] Rekhter, Y., Li, T., and S. Hares, «A Border Gateway Protocol 4 (BGP-4)», RFC 4271, January 2006.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

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

[RFC4272] Murphy, S., «BGP Security Vulnerabilities Analysis», RFC 4272, January 2006.

[RFC4760] Bates, T., Chandra, R., Katz, D., and Y. Rekhter, «Multiprotocol Extensions for BGP-4», RFC 4760, January 2007.

Приложение A. Сравнение RFC 2842 и RFC 3392

В дополнение к незначительным редакторским правкам в RFC 3392 разъяснен вопрос обработки множества экземпляров анонса одной возможности.

Приложение B. Сравнение RFC 3392 с данным документом

В этом документе внесены незначительные редакторские правки, обновлены ссылки, разъяснено использование сообщений Unsupported Optional Parameter NOTIFICATION и обработка множества параметров Capabilities в сообщении OPEN, а также изменен уровней требований в ряде случаев со следует на должно (MUST взамен SHOULD).

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

John G. Scudder

Juniper Networks

EMail: jgs@juniper.net

Ravi Chandra

Sonoa Systems

EMail: rchandra@sonoasystems.com


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

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

nmalykh@protocols.ru

1В оригинале — IETF Contributions. Прим. перев.

2В оригинале — IETF Standards Process. Прим. перев.

3Optional Parameter.

4Border Gateway Protocol — протокол граничного шлюза.