Кратко

  • Карточки DEX от A, B, C, D и E могут быть корректными, но не показывать, шёл ли E после C или после D: множество вершин не задаёт рёбра.
  • RFC 9630 вводит восьмиоктетный Multicast Branch ID и альтернативу с экспортом trace по секциям перед репликацией.
  • Для решения нужны отдельные квитанции выбора, эпохи метки, создания, транспорта, хранения, реконструкции, приёма и результата приложения.

Все вершины присутствовали, а ребро отсутствовало

Пакет проходит A и приходит в B. B создаёт две копии: одна идёт через C к E, другая — через D. Каждый маршрутизатор отправляет карточку. Коллектор видит пять узлов, но не может определить родителя E.

Это не дефект визуализации. Если система подвесит E под D ради законченной схемы, задержка и потеря окажутся на неверном линке. Автоматика способна перенести ёмкость или назначить виновника на основании ребра, которого никто не наблюдал.

Дерево control plane может дополнить данные, но тогда вывод соединяет два источника и две эпохи. Такое ребро должно остаться помеченным как вывод, а не превращаться в измерение.

Полная trace сохраняла порядок ценой повторения

IOAM Trace содержит последовательность узлов. При multicast-разветвлении каждая копия наследует весь накопленный префикс. На листьях несколько trace повторяют общий путь и расходятся лишь в конце. Широкое дерево множит заголовки, трафик и работу коллектора.

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

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

Branch ID действует между развилками

Формат объединяет трёхоктетный Branching Node ID и двухоктетный Interface Index. Ещё три октета должны быть нулевыми. Узел развилки выдаёт отдельную комбинацию каждому выходу в экземпляре дерева; значение сохраняется до следующей развилки.

Каждый нижележащий узел обязан включить полученный идентификатор в карточку. Flow ID и Sequence Number связывают одно наблюдаемое сообщение, Branch ID — одну секцию. C и E могут показать первый выход B, D — второй.

Interface Index не вечное имя. После сходимости он может использоваться снова. Namespace, дерево, flow, sequence, время и эпоха конфигурации являются частью смысла. Без эпохи допустимое повторное использование выглядит как непрерывная ветвь.

N и I нельзя читать по отдельности

Один extension flag RFC 9326 объявляет четыре октета. Восемь требуют два бита: N для узла, I для интерфейса. Оба должны быть установлены либо оба очищены. Половина идентификатора делает заголовок malformed, пакет подлежит сбросу.

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

Нужно раздельно считать отсутствие option, malformed drop и потерю карточки после forwarding. Общий статус «данных нет» скрывает место отказа.

Экспорт по секциям ставит границу в точке копирования

Второе решение не меняет Trace. Перед репликацией fork экспортирует накопленную секцию, очищает node-data list, восстанавливает RemainingLen и начинает дочерние секции со своих данных. Листья экспортируют последний отрезок.

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

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

Защита от усиления уменьшает наблюдаемое покрытие

Multicast усиливает данные, а DEX способен усилить экспорт. RFC 9630 советует выбирать пакеты, ограничивать rate или включать только часть узлов, например развилки. Конкретная sampling-политика и защита коллектора остаются вне документа.

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

Рядом с деревом нужны selector, ожидаемый набор, квоты, счётчики сбросов и окно времени. Без знаменателя «не наблюдали» незаметно превращается в «не существовало».

Mtrace2 даёт независимое сравнение

Mtrace2 идёт по сообщениям построения дерева от получателя к источнику и добавляет диагностические блоки. Он помогает обнаружить интересующие маршрутизаторы, но RFC 9630 отмечает отсутствие прямой интеграции с IOAM.

Control plane показывает намерение, карточки — выбранные наблюдения data plane. Совпадение усиливает гипотезу, расхождение открывает расследование. Ребро, заполненное из Mtrace2, должно сохранять происхождение.

Для PIM, PIM-SSM, MVPN, mLDP, P2MP RSVP-TE, Ingress Replication и PIM MDT требуется контекст VPN и туннеля. Та же последовательность узлов может принадлежать другому дереву или эпохе.

Реконструкция дерева не равна доставке

RFC 9630 нацелена на визуализацию, задержку, jitter и место потери. Branch ID позволяет соединить карточки, но не создаёт квитанцию в приложении получателя.

После последнего маршрутизатора пакет может потеряться на access. Полученные байты могут не дать декодируемый keyframe. Здоровый sample не представляет весь burst. Граф описывает evidence коллектора, не пользовательский исход.

Цепочка разделяет вход в IOAM domain, обработку, label, генерацию карточки, транспорт, custody, корреляцию, независимую проверку, приём и результат. RFC исправляет шаг корреляции.

Честный архив хранит сирот

Следует сохранять сырые bytes и разбор Branch ID, namespace, Flow ID, Sequence Number, источник, группу, дерево, туннель, окно и эпоху. Для карточки нужны exporter, данные, отправка, прибытие, duplicate, отказ и custody hash.

Graph builder обязан выдавать вершины без родителей, collisions, пропуски sequence и выведенные рёбра. Он не должен завершать картинку ради layout. Объяснённый пробел надёжнее дерева, собранного предположением.

Источники