Привет! Меня зовут Борис Хасанов — ведущий сетевой архитектор в MWS. Работаю с сетями уже много лет, а последнее время занимаюсь сетевой телеметрией. Она помогет мониторить состояние сети облака в моменте.

Это первая статья из цикла о трендах в развитии сетевой телеметрии и её имплементации в облаке MWS. Идея цикла появилась из моего несостоявшегося доклада на сетевой конференции «Яндекс nexthop 2024». Хочу поблагодарить Антона Корнелюка, Евгения Зобницева, коллег из MWS, а ещё коллег из IETF за идеи для этого цикла статей.

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

Как мы жили раньше, или что такое ОАМ

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

Телеметрия (от др.-греч. τῆλε «далеко» + μέτρεω — «измеряю») — область науки и техники, занимающаяся вопросами разработки, эксплуатации, приёма, обработки и регистрации измерительной информации о различных событиях с целью контроля на расстоянии различных объектов и процессов

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

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

В 2000-х годах телеком-индустрия стала использовать механизм (framework) OAM: Operation, Administration and Maintenance для мониторинга состояния сети.

Рассмотрим ОАМ подробнее, так как, чтобы понять векторы развития телеметрии, нам нужно ознакомиться с теми инструментами, которые были до неё и продолжают использоваться.

Я нарисовал следующую схему, описывающую базовую архитектуру и основные компоненты сетевого OAM, на которых остановлюсь подробнее:

Архитектура ОАМ
Архитектура ОАМ

Начнём с двух главных компонентов ОАМ: модуля оценки (управления) производительностью и модуля оценки сбоев. Они, как видно из названия, информируют о производительности сети и сбоях. Эти два основных модуля делятся на подмодули. В состав модуля оценки производительности входят следующие подмодули:

— измерения задержки (DM);

— измерения потерь (LM);

— измерения пропускной способности (TM).

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

— Активная оценка: модуль ОАМ посылает специальные пакеты с узла источника, а на узле назначения подсчитывает их количество и другие характеристики.

— Пассивная оценка: используются «обычные» пакеты, которые передаются во какую-либо внешнюю систему для оценки.

— Гибридная: сочетание обоих способов. Подробнее об этих способах я расскажу ниже.

В состав модуля оценки сбоев входят два подмодуля:

— проверки связности (CC);

— верификации связности (CV).

Средства и протоколы в ОАМ

Механизмы и протоколы, которые используются для оценки сбоев (FM)

Для проверки связности мы используем утилиту ping, кстати, она появилась ещё в 1983 году. Ping использует Internet Control Message Protocol (ICMP-сообщения ICMP Echo Request/Reply) и позволяет проверить IP-связность до заданного IP-адреса, а ещё измерить двустороннюю задержку (Round Trip Time — RTT). Кроме того, при использовании в сетях с Multiprotocol Label Switching (MPLS) и, в частности, в сетях MPLS-TE в утилиту ping добавили возможность проверять достижимость заданного IP-адреса не через использование маршрутизации на основе IP, а через использование Label Switch Path (LSP). Для любителей истории рекомендую почитать про возникновение утилиты ping.

Для верификации пути до заданного IP-адреса мы традиционно используем утилиты tracert (использует протокол ICMP) или traceroute (использует UDP). Принцип работы обеих утилит хорошо известен, поэтому напомню его очень коротко: в tracert узел источник посылает серию пакетов с увеличивающимся полем Time to Live (TTL), начиная с TTL=1, каждый маршрутизатор на пути, получив такой пакет, уменьшает TTL (который становится равным 0) и посылает в обратную сторону ICMP-сообщение Time Exceeded. Таким образом, узел источник получает эти сообщения от каждого узла на пути и узнаёт IP-адреса этих маршрутизаторов. Последним же будет узел назначения, который, увидев свой адрес в поле DA заголовка IP-пакета, пошлёт в ответ сообщение ICMP Echo Reply.

В traceroute, использующей UDP, посылается фрагмент, как правило, на destination port из диапазона > 30 000 (например, 33 434) и затем также каждый узел на пути уменьшает TTL и возвращает сообщения Time Exceeded. Когда фрагмент достигнет узла назначения, то он, опознав свой адрес в поле DA, отправит фрагмент для обработки и вернёт в ответ сообщение ICMP Port Unreachable (ICMP Type 3 Code 3). Утилита traceroute также была расширена для использования в MPLS/Segment Routing сетях.

Отдельный механизм, широко используемый в сетях для проверки связности (СС), — это Bidirectional Forwarding Detection (BFD). BFD может использоваться в самых различных сценариях: начиная от проверки связности через линк и заканчивая проверкой отношений соседства в протоколах маршрутизации (IGP: ISIS, OSPF и BGP) и сетях с MPLS и MPLS-TE, SR-MPLS, SRv6.

В рамках OAM и модуля оценки сбоев (FM) нас в первую очередь интересует работа BFD для проверки физического линка или туннеля (single hop), этот алгоритм работы описан в [RFC 5881]. Прелесть BFD также заключается в том, что мы можем использовать и multihop BFD [RFC 5883] для диагностирования сбоев между удалёнными друг от друга узлами.

Причина такого широкого использования BFD: он позволяет обнаружить проблемы со связностью гораздо быстрее протоколов, которые используют механизм Hello-пакетов, например, некоторые имплементации поддерживают достаточно «агрессивные» значения таймера (minimum interval) по отправке BFD-пакетов, например в 3,3 мс. Использование таких таймеров требует аппаратной обработки BFD-пакетов на линейной карте маршрутизатора — BFD hardware offloading или distributed BFD.

Принцип работы BFD
Принцип работы BFD

Существует огромное количество имплементаций BFD, как на вендорских платформах (маршрутизаторы, коммутаторы), так и Open Source (FRR, Bird).

Хочу также кратко напомнить, что, несмотря на кажущуюся простоту BFD, этот протокол имеет достаточно сложную машинерию с переходом различных состояний:

BFD State Machine
BFD State Machine

Поэтому вполне обоснованно желание её упростить и как результат — ускорить, что и было сделано при создании упрощённого варианта BFD: S-BFD (Seamless BFD).

S-BFD State Machine
S-BFD State Machine

RFC 7881 делает некоторые важные уточнения в части S-BFD, в частности определяет UDP-порт 7784. Объективно говоря, поддержка S-BFD присутствует на меньшем количестве имплементаций сегодня, но это тонкая материя, поэтому для уточнения поддержки S-BFD — спрашивайте у вашего вендора.

Механизмы и протоколы, используемые для оценки задержек и потерь (DM, LM)

Первый и самый очевидный механизм — ping, про который мы говорили выше. Однако у него есть несколько известных ограничений:

— необходимость периодического запуска (вручную или средствами автоматизации);

— измерение только RTT (невозможность отследить асимметрию задержки);

— сбор результатов либо через screen scraping, либо по SNMP.

Поэтому в индустрии появились дополнительные механизмы, в виде специальных протоколов, например: Two-Way Active Measurement Protocol (TWAMP).

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

Протокол TWAMP

TWAMP — протокол, который используется для Performance Management (PM) в целом и для DM, LM в частности. Он появился как дальнейшая эволюция протокола OWAMP (One-Way Active Measurement Protocol) в 2008 году. TWAMP — обеспечивает активное измерение (путём посылки специальных тестовых UDP-пакетов) двусторонней задержки (RTT) и потерь пакетов (packet loss).

TWAMP состоит из четырёх логических компонентов: Session-Sender, Session-Reflector, Control-Client, Server. В свою очередь эти логические компоненты делятся на control plane (Control-Client, Server), которая отвечает за инициализацию тестовой сессии, её запуск и остановку, а ещё на data plane (Session-Sender, Session-Reflector), где Session-Sender отправляет тестовые пакеты, а Session-Reflector отвечает на них.

Пример типичной имплементации TWAMP
Пример типичной имплементации TWAMP

Control plane использует TCP, а data plane — UDP (поддерживается аутентификация и шифрация). Логически взаимодействие компонентов выглядит более понятным на этой схеме:

Взаимодействие control и data plane TWAMP
Взаимодействие control и data plane TWAMP

Как видно из схемы, управляющий центр в TWAMP — Control-Client.

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

Неудивительно, что в индустрии сразу же возникло, ещё при разработке TWAMP, желание его упростить и в IETF (www.ietf.org — Инженерный совет Интернета), в стандарте RFC 5357, описывающем TWAMP, появилось отдельное приложение, которое упоминает его «облегчённую» версию TWAMP-Light, что, вообще-то, не частый случай, когда в одном и том же стандарте предлагается как основной вариант, так и упрощённый.

В чём же отличие TWAMP-Light от TWAMP? Нагляднее всего это будет видно на схеме:

Архитектура TWAMP-Light
Архитектура TWAMP-Light

Во-первых, три основных компонента (Server, Control-Client, Session-Sender) объединяются в одну логическую сущность — controller (контроллер), а Session-Reflector — в responder (ответчик). И тут мы получаем первое, очень значимое, преимущество TWAMP-Light — отсутствие необходимости согласовывать параметры тестовой сессии между controller и responder через control plane, то есть мы используем только data plane. Но Responder только принимает тестовые пакеты от контроллера и отвечает на них. Как же TWAMP-Light поможет нам измерить различные варианты задержки? Посмотрим на схему ниже.

Принцип измерения задержки при помощи TWAMP-Light
Принцип измерения задержки при помощи TWAMP-Light

Задержка от R1 до R2 = T2 − T1
Задержка от R2 до R1 = T4 − T3
RTT = (T2 − T1) + (T4 − T3)

Таким образом, TWAMP-Light, как и TWAMP, позволяет мерить все варианты задержек (в отличие от ping), что очень важно с учётом асимметрии задержек в сети.

Формат тестового пакета TWAMP
Формат тестового пакета TWAMP
Тестовый пакет TWAMP
Тестовый пакет TWAMP

С учётом сказанного, на практике имеет смысл при выборе между TWAMP и TWAMP-Light использовать именно последний, конечно, если ваше оборудование поддерживает его.

Практически у всех наиболее известных сетевых вендоров имеются имплементации TWAMP/TWAMP-Light для разного оборудования, ещё есть и Open Source. Я тестировал межвендорское взаимодействие (interoperability) TWAMP-Light между оборудованием трёх таких вендоров, «нюансы» были только у одного из них.

Для конфигурации TWAMP/TWAMP-Light-сессий на оборудовании мы можем воспользоваться такими вариантами, как традиционный CLI и/или Netconf со специализированной Yang-моделью. Таким же образом мы можем получать собранные TWAMP-Light результаты измерений задержки и потерь пакетов (DM, LM, TM) для OAM.

Протокол STAMP (Simple Two-Way Active Measurement Protocol)

С момента появления TWAMP-Light прошло уже более 10 лет, и за это время наша отрасль накопила большой опыт его эксплуатации. Теперь мы можем подвести некоторые итоги. Они показали, что сложность архитектуры, изначально заложенная в TWAMP, усложняет его эксплуатацию, а недостаточно чётко прописанные в стандарте рекомендации по эксплуатации TWAMP-Light, а также его совместное использование с другими приложениями затрудняют его эксплуатацию, особенно в мультивендорных вариантах. Например, в процессе собственного тестирования TWAMP-Light на оборудовании трёх очень известных вендоров у меня не заработал сценарий, когда один из вендоров был в роли TWAMP-Light контроллера, а два других были ответчиками (responder).

Поэтому, чтобы преодолеть эти противоречия, коллеги задумались над созданием ещё более простого и детерминированного протокола для активного мониторинга производительности (РМ) в ОАМ. Так в рабочей группе IP Performance Monitoring IETF и появился STAMP. Рассмотрим его сходства и отличия от TWAMP подробнее.

Архитектура STAMP
Архитектура STAMP

Мы видим существенно упрощённую в отличие от TWAMP архитектуру. Здесь нет контроллера, как и control plane в целом, сервера, распределённости этих логических модулей. Есть только отправитель тестовых пакетов (Session-Sender) и их отражатель (Session-Reflector). Конфигурация и управление сессиями осуществляются с внешнего модуля конфигурации и управления — это может быть CLI, управляющий хост с «питонячьим» скриптом с ncclient, OSS/BSS, SDN-контроллер с Netconf/Yang и так далее.

STAMP Session-Reflector может работать в двух режимах: Stateless и Stateful. В Stateless-режиме, как видно из его названия, отражатель не хранит никакого состояния, соответственно, Sequence number на входящем и исходящем будет одним и тем же. И мы сможем измерить только двустороннюю (общую) потерю пакетов (round trip packet loss). Очевидно, что это наиболее простой и наименее нагрузочный режим работы.

В Stateful-режиме отражатель поддерживает состояние сессий и поэтому отправитель (Session-Sender) при помощи комбинации полей Session Sender Sequence Number и Sequence Number может определить любой тип задержки и потерь.

Стандарт чётко задаёт, что по умолчанию для приёма STAMP-пакетов обязан использоваться UDP-порт 862 с возможностью его последующего изменения. Также заданы разные типы пакетов, отправляемых Session-Sender и Session-Reflector. Поддерживаются аутентифицированный и не аутентифицированный режимы.

Пакет от STAMP Session-Sender
Пакет от STAMP Session-Sender
Пакет от STAMP Session-Reflector
Пакет от STAMP Session-Reflector

Важно, что STAMP изначально проектировался совместимым с протоколом TWAMP-Light, причём в обоих вариантах:

— STAMP Session-Sender > TWAMP Light Session-Reflector.

— TWAMP Light Session-Sender > STAMP Session-Reflector.

Для того чтобы STAMP мог использоваться с разными протоколами, предложили механизм (framework) его расширения при помощи TLV — это существенное преимущество. Также стандарт даёт список используемых TLV.

Формат пакета с расширением TLV от STAMP Session-Sender
Формат пакета с расширением TLV от STAMP Session-Sender

Как одно из прикладных направлений использования, STAMP также имеет расширения для работы в сетях с Segment Routing (SR-MPLS, SRv6), и это ещё одно принципиальное отличие от TWAMP/TWAMP-Light.

Пакет STAMP с Destination Node Address TLV для SR
Пакет STAMP с Destination Node Address TLV для SR

Расширения STAMP для SR, в частности Return Path TLV, позволяют запрашивать у Session-Reflector отправку тестового пакета через определённый обратный путь (Segment List в терминах SR), соответственно, рефлектору нет необходимости хранить состояние.

Пакет STAMP с Return Path Sub-TLV для SR
Пакет STAMP с Return Path Sub-TLV для SR

Сам Segment List кодируется при помощи SR-MPLS/ SRv6 Label Stack Sub-TLV в Return Path Sub-TLV.

Более подробно процедуры использования STAMP для мониторинга производительности (РМ) в сетях с SR описаны протоколе для измерения производительности в сетях с сегментной маршрутизацией, в частности, там дана целевая архитектура использования STAMP, на которую стоит обратить внимание:

Целевая архитектура STAMP с SR
Целевая архитектура STAMP с SR

Контроллер передаёт на Session-Sender основные параметры тестовой сессии:

режим измерения, в данном случае — двухсторонний, номер порта назначения (по умолчанию UDP/862), формат таймстампа (NTP или 1588v2), тип метрики:

  • общая задержка (RTT);

  • односторонняя задержка;

  • задержка на ближнем и дальнем конце;

  • общие потери;

  • односторонние потери;

  • потери на ближнем и дальнем конце.

Для конфигурации контроллер может использовать специализированную Yang-модель и по ней же получать состояние тестовых сессий, используя телеметрию, про которую мы поговорим дальше. Надо отметить, что в дизайне STAMP изначально заложена возможность корректной работы через LAG при помощи Micro-Session ID TLV для корректной идентификации конкретного линка в LAG.

Мы кратко прошлись по возможностям использования STAMP в сетях с SR, чтобы подчеркнуть его возможности и отличия от более привычного нам TWAMP/TWAMP-Light. Но мой обзор этих протоколов не будет полным, если я не затрону вопрос использования STAMP для мониторинга Traffic Engineering в SR, в частности SR Policy, про которую я подробно рассказывал в своей статье на Хабре.

Посмотрим ещё раз, как кодируется тестовый STAMP-пакет от Session-Sender в случае SR.

Передача пакета STAMP в SR-MPLS
Передача пакета STAMP в SR-MPLS

Непосредственно перед пакетом STAMP есть некий PSID, что же это такое? Это Path Segment Identifier — недавно стандартизованный новый тип SID в SR, идентифицирующий определённый путь (Segment List), он необходим исходящему узлу (egress node, tail-end) для понимания того, каким путём шёл пакет, т. к. идентификаторы сегментов (метки, SID) удаляются либо меняются (pop, swap) в процессе транзитными узлами. В случае SR Policy PSID может идентифицировать либо Segment List, либо Candidate Path.

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

Передача пакета STAMP в SR-MPLS для L3VPN-сервиса
Передача пакета STAMP в SR-MPLS для L3VPN-сервиса

Посмотрев рисунок выше, уже можно сделать некоторые выводы по сравнению TWAMP/STAMP, но мы вернёмся к этому вопросу чуть позже.

Теперь то же самое для SRv6, тут мы увидим вариативность в зависимости от того, какой тип IPv6/SRH инкапсуляции будет использоваться, — H.Insert/H.Encaps.

Передача пакета STAMP в SRv6 (H.Insert)
Передача пакета STAMP в SRv6 (H.Insert)
Передача пакета STAMP в SRv6 (H.Encaps)
Передача пакета STAMP в SRv6 (H.Encaps)

Для краткости я не буду приводить схему для передачи пакета STAMP L3VPN-сервиса поверх SRv6, потому что её отличие от двух последних схем будет только в том, что в заголовке SRH в поле будет Segment List[0] = End.DT6/End.DT46 SID.

Для обратных пакетов от Session-Reflector по умолчанию используется IP-инкапсуляция (IP-UDP-STAMP Payload). Как я говорил выше, по запросу Session-Sender, Session-Reflector будет использоваться тот же путь, что и первичный пакет.

Хочу отметить, что в случае TE c SR Policy, когда в активном Candidate Path будет несколько активных Segment List (например, для ECMP/w-ECMP), в случае использования STAMP с расширениями для SR будет несколько (по количеству Segment List) STAMP-сессий.  

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

Результаты сравнения этих протоколов я свёл в таблицу.

Характеристики

TWAMP

TWAMP-Light

STAMP

Архитектура

Сложная, присутствуют компоненты control + forwarding plane

Простая, только forwarding plane

Простая, только forwarding plane

Возможность расширения

Нет

Нет

Да, при помощи TLV

Провижининг и управление сессиями

OSS/BSS, SDN-контроллер и т. п., например через Netconf/Yang

OSS/BSS, SDN-контроллер и т. п., например через Netconf/Yang

OSS/BSS, SDN-контроллер и т. п., например через Netconf/Yang

Использование для РМ

Да

Да

Да

Интеграция с Segment Routing

Нет, используется только IP Path

Нет, используется только IP Path

Да, можно использовать Segment List

Возможность использования обратного пути, идентичного первичному

Нет, т. к. используется IP Path — обратный путь определяется локальной маршрутизацией

Нет, т. к. используется IP Path — обратный путь определяется локальной маршрутизацией

Да, Session-Sender может задавать Segment List (или BSID для идентификации обратной SR Policy на Session-Reflector) для обратного пути в SR-MPLS, SRv6

Наличие имплементаций

Большое: вендорские и Open Source

Большое: вендорские и Open Source

Ограниченное, только вендорская на текущий момент

Альтернативная маркировка — ещё один механизм РМ

Концепция альтернативной маркировки может использоваться для любого типа трафика (unicast, multicast, MPLS и т. д.). Её суть в следующем: трафик определённого flow делится на блоки, которые «раскрашиваются» определённым цветом, так чтобы идущие подряд блоки имели одинаковый цвет. Можно как использовать фиксированное количество блоков на цвет, так и передавать блоки одного цвета в течение заданного времени.

Пример такой раскраски:

Принципы раскраски трафика
Принципы раскраски трафика

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

Большое преимущество использования альтернативной маркировки по сравнению с другими протоколами (TWAMP, STAMP) — мы не делаем измерения при помощи дополнительных тестовых ОАМ-пакетов, посылаемых в сеть в надежде, что они последуют путём нужного нам flow, а маркируем (раскрашиваем) непосредственно сами нужные flow трафика.

Классификация ОАМ Performance management по типу измерений

На самой первой схеме показана важная часть общей архитектуры ОАМ, связанная с вариантами организации измерений или тестов, их может быть три:

Активный РМ: устройство посылает в сеть тестовые ОАМ-пакеты, примеры этого TWAMP, TWAMP-Light, STAMP.

Пассивный РМ: устройство только анализирует трафик и экспортирует его для анализа в какое-то внешнее устройство, например при помощи IPFIX.

Гибридный РМ: сочетание первых двух вариантов (альтернативная маркировка относится именно к гибридному РМ).

Более подробно почитать про различные варианты измерений можно тут.

Заключение

Итак, мы ознакомились с архитектурой ОАМ и теми механизмами и протоколами, которые лежат в её основе. На первый взгляд, может показаться, что, внедрив в сети ОАМ, мы уже закроем большинство имеющихся проблем с её мониторингом. Конечно, ОАМ закрывает многие потребности, но тем не менее в нём не хватает одной очень существенной части: получения информации о состоянии сетевых устройств в квазиреальном времени без использования традиционных poll-технологий (переход к post-SNMP-картине). Именно эту задачу призвана закрыть сетевая телеметрия, к описанию которой я и перейду в следующей части статьи.

Комментарии (0)