Теоретические основы и архитектура
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 type | 1 | point-to-point или multi-access |
| Link ID | 2 | router-id соседа (для p2p) |
| Local / Remote interface address | 3 / 4 | адреса концов линка |
| TE metric | 5 | 32 бита, независим от IGP-метрики |
| Maximum bandwidth | 6 | физическая полоса, IEEE float, байт/с |
| Maximum reservable bandwidth | 7 | сколько можно резервировать (может быть больше физической) |
| Unreserved bandwidth | 8 | 8 значений, по одному на приоритет 0-7 |
| Administrative group | 9 | 32-битная маска цветов (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.
| Сообщение | Тип | Направление | Зачем |
|---|---|---|---|
| Path | 1 | голова -> хвост | запрос установки LSP, несёт ERO, SESSION_ATTRIBUTE, SENDER_TSPEC, LABEL_REQUEST |
| Resv | 2 | хвост -> голова | подтверждение, раздача меток (LABEL), резервация (FLOWSPEC) |
| PathErr | 3 | к голове | ошибка в Path-состоянии (плохой ERO, нет маршрута, admission control) |
| ResvErr | 4 | к хвосту | ошибка резервации, в том числе вытеснение |
| PathTear | 5 | голова -> хвост | удалить LSP |
| ResvTear | 6 | хвост -> голова | удалить резервацию |
| Hello | 20 | соседу | обнаружение отказа соседа (RFC 3209) |
| Srefresh | 15 | соседу | суммарное обновление (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 головная точка не видит фактический путь.