Теоретические основы и архитектура

MPLS Traffic Engineering (MPLS-TE, сигнализация RSVP-TE по RFC 3209) решает проблему IGP, который строит маршрут только по кратчайшей метрике: трафик собирается на лучших путях, а параллельные линки могут простаивать. MPLS-TE позволяет вести трафик по явному или рассчитанному с ограничениями пути. Экосистема состоит из четырёх частей: 1. расширения IGP для TE (OSPF-TE/IS-IS TE) разносят атрибуты линков; 2. база TED на каждом маршрутизаторе; 3. CSPF - расчёт пути с ограничениями; 4. RSVP-TE: сообщения PATH и RESV проходят по рассчитанному пути, раздают метки и резервируют bandwidth. Резервирование - это учёт в control plane: оно уменьшает unreserved bandwidth в TED, но не ограничивает трафик в плоскости данных.

Сессия, LSP и их идентификаторы

TE LSP в RSVP-TE (RFC 3209) однонаправленный: туннель от PE1 к PE2 не создаёт обратного пути. Сессия определяется объектом SESSION (C-Type 7, LSP_TUNNEL_IPv4): адрес конечной точки, 16-битный Tunnel ID и Extended Tunnel ID (адрес головной точки). Конкретный экземпляр LSP внутри сессии задаётся объектом SENDER_TEMPLATE: адрес отправителя и 16-битный LSP ID. При перестроении (re-optimization, смена полосы) головная точка сигнализирует новый LSP с тем же SESSION и новым LSP ID, а стиль резервации Shared Explicit (SE) позволяет старому и новому экземплярам делить одну резервацию на общих линках: так работает make-before-break.

RSVP-TE работает поверх IP (протокол 46, не TCP/UDP), Path и PathTear несут IP Router Alert, поэтому каждый транзитный узел перехватывает их в плоскость управления. Фильтры и CoPP, режущие протокол 46 или пакеты с Router Alert, ломают сигнализацию при полностью исправном IGP.

IGP-расширения и TED

Информацию для CSPF поставляет IGP. В OSPF это Opaque LSA типа 10 (area-local), opaque type 1, RFC 3630. TE LSA содержит Router Address TLV (тип 1, TE router-id) и Link TLV (тип 2) на каждый линк. Sub-TLV внутри Link TLV:

Sub-TLVТипСодержимое
Link type1point-to-point или multi-access
Link ID2router-id соседа (для p2p)
Local / Remote interface address3 / 4адреса концов линка
TE metric532 бита, независим от IGP-метрики
Maximum bandwidth6физическая полоса, IEEE float, байт/с
Maximum reservable bandwidth7сколько можно резервировать (может быть больше физической)
Unreserved bandwidth88 значений, по одному на приоритет 0-7
Administrative group932-битная маска цветов (affinity)

В IS-IS (RFC 5305) те же данные лежат в sub-TLV внутри TLV 22 (Extended IS Reachability): administrative group - 3, IPv4 interface address - 6, IPv4 neighbor address - 8, maximum link bandwidth - 9, maximum reservable bandwidth - 10, unreserved bandwidth - 11, TE default metric - 18; TE router-id - TLV 134. IS-IS должен работать в режиме wide metrics. Дополнительно RFC 4203 и RFC 5307 вводят SRLG (OSPF sub-TLV 16, IS-IS TLV 138), RFC 4124 - Bandwidth Constraints для DS-TE.

TED строится поверх LSDB: каждый узел хранит граф с атрибутами линков и использует его в CSPF. TED не заменяет IGP-таблицу маршрутов: TE-атрибуты влияют только на вычисление путей туннелей. Если на линке нет TE-атрибутов (не включено mpls traffic-eng/mpls te/rsvp), линк в TED отсутствует, и CSPF не построит через него путь, хотя IGP-маршрут существует.

Когда обновляется информация: периодически (на Cisco по умолчанию раз в 180 с) и при существенном изменении свободной полосы. Cisco флудит по порогам изменения использования (по умолчанию серия 15, 30, 45, 60, 75, 80, 85, 90, 95, 96, 97, 98, 99, 100 процентов вверх и обратная серия вниз), так что TED на удалённых узлах отстаёт от фактического состояния. Это нормальный источник гонки: голова вычислила путь по устаревшим данным, транзит отказал в admission control и вернул PathErr.

Сообщения RSVP-TE

Общий заголовок: версия 1, флаги, тип сообщения, контрольная сумма, send TTL, длина. Далее идут объекты формата Length / Class-Num / C-Type.

СообщениеТипНаправлениеЗачем
Path1голова -> хвостзапрос установки LSP, несёт ERO, SESSION_ATTRIBUTE, SENDER_TSPEC, LABEL_REQUEST
Resv2хвост -> головаподтверждение, раздача меток (LABEL), резервация (FLOWSPEC)
PathErr3к головеошибка в Path-состоянии (плохой ERO, нет маршрута, admission control)
ResvErr4к хвостуошибка резервации, в том числе вытеснение
PathTear5голова -> хвостудалить LSP
ResvTear6хвост -> головаудалить резервацию
Hello20соседуобнаружение отказа соседа (RFC 3209)
Srefresh15соседусуммарное обновление (RFC 2961)

Ключевые объекты Path: EXPLICIT_ROUTE (ERO) - список подобъектов IPv4-префикса, у каждого бит L (loose); при прохождении узла его подобъект удаляется. RECORD_ROUTE (RRO) - фактический путь и (при флаге label recording) метки, нужен для детекции петель и FRR. SESSION_ATTRIBUTE - имя туннеля, setup и hold priority, флаги (0x01 local protection, 0x02 label recording, 0x04 SE style, 0x08 bandwidth protection, 0x10 node protection) и в C-Type 1 ещё include-any/exclude-any/include-all. SENDER_TSPEC - требуемая полоса (token bucket rate, в байтах/с в IEEE float). LABEL_REQUEST - L3PID, для IPv4 это 0x0800. Resv несёт STYLE (SE), FLOWSPEC, FILTER_SPEC, LABEL и свой RRO.

Установка LSP шаг за шагом

Голова вычисляет путь по TED (CSPF) и строит ERO. Path уходит к первому узлу из ERO, каждый узел проверяет, что он указан в ERO, удаляет свой подобъект, запоминает Path State Block (PSB) с предыдущим hop (RSVP_HOP) и пересылает Path дальше. Хвост видит, что ERO пуст, выделяет метку и отвечает Resv. По умолчанию хвост анонсирует implicit-null (метка 3): предпоследний узел снимает метку (PHP). Resv идёт по цепочке RSVP_HOP обратно; каждый транзитный узел создаёт Reservation State Block (RSB), резервирует полосу в admission control, назначает входящую метку, записывает пару (входящая метка -> исходящая метка, интерфейс) в LFIB и передаёт Resv вверх. Модель распределения - downstream-on-demand с ordered control: метка не появляется, пока нижестоящий узел не ответил.

LSP считается поднятым, когда Resv дошёл до головы. До этого момента туннель в состоянии установки; без RRO головная точка не видит фактический путь.