Теоретические основы и архитектура
В архитектуре Segment Routing используются два базовых типа сегментов IGP: 1. Prefix SID (сегмент префикса) — глобальный сегмент, привязанный к IP-префиксу узла (обычно Loopback0 /32). Такой сегмент называется Node SID. Он уникален во всей сети: например, PE1 имеет Node SID Index 1 (метка 16001), а PE2 — Index 2 (метка 16002). Все маршрутизаторы ядра вычисляют кратчайший путь (ECMP SPF) до префикса и транслируют Node SID в пересылку по кратчайшему пути. На предпоследнем узле по умолчанию выполняется PHP. 2. Adjacency SID (сегмент смежности) — локальный сегмент, представляющий конкретный направленный физический линк между двумя соседними маршрутизаторами. Adjacency SID выделяется маршрутизатором динамически из локального пространства меток (например, метка 24001 для линка к P1). Он имеет строго локальное значение и указывает аппаратной логике: «отправить пакет в интерфейс X без поиска в таблице маршрутизации». Комбинируя Prefix SID и Adjacency SID в одном стеке меток, можно принудительно направить пакет по абсолютно любому пути через сеть (Traffic Steering).
Два базовых сегмента IGP
RFC 8402 вводит несколько типов сегментов, но почти всё строится на двух: Prefix-SID (инструкция "доставь пакет до префикса по кратчайшему пути IGP") и Adjacency-SID (инструкция "отправь пакет в этот конкретный линк"). Первый имеет глобальное значение и привязан к индексу в SRGB, второй - локальное значение и привязан к смежности на одном узле. Стек из них даёт любой маршрут: Prefix-SID перемещают пакет по сети, Adjacency-SID фиксируют нужный линк там, где кратчайший путь не подходит.
Prefix-SID и Node-SID
Prefix-SID прикрепляется к префиксу: чаще всего это loopback /32, и тогда его называют Node-SID (в sub-TLV выставлен флаг N). Анонс содержит индекс (или абсолютное значение при флагах V/L), алгоритм и флаги. Алгоритм 0 - обычный SPF IGP, алгоритм 1 - Strict SPF (путь не меняется локальными политиками, например TI-LFA не уводит трафик с него), значения 128-255 отдаются Flex-Algo (RFC 9350). Флаги IS-IS (RFC 8667): R (re-advertisement), N (Node-SID), P (no-PHP), E (explicit-null), V (значение, а не индекс), L (локальное значение). В OSPFv2 (RFC 8665) Prefix-SID лежит в Extended Prefix Opaque LSA (Opaque тип 7), sub-TLV типа 2, флаги NP, M (mapping server), E, V, L; он же применяется для Anycast.
Каждый маршрутизатор сам строит SPF и для SID префикса берёт все равноценные кратчайшие next-hop: Prefix-SID естественно поддерживает ECMP, балансировка идёт по хешу заголовков или по entropy-метке (RFC 8662). Отдельного состояния на сегмент не создаётся.
Anycast SID
Если несколько узлов анонсируют один префикс с одним и тем же SID (флаг N сброшен), получается Anycast-SID: пакет идёт к ближайшему узлу группы по метрике, а при отказе ближайшего - к следующему. Применение: пара ABR или шлюзов, балансировка между центрами. Условия: у всех участников одинаковые индекс и алгоритм, а сервисное состояние за группой согласовано (иначе пакет попадёт на узел без нужных данных). Защита таких SID TI-LFA зависит от реализации: проверьте, строит ли платформа backup для anycast-префикса.
PHP или explicit-null
По умолчанию Prefix-SID анонсируется без флагов P/NP и E: предпоследний узел снимает метку (PHP), и последний принимает пакет без сегмента. Флаг P (IS-IS) или NP (OSPF) - "не выполнять PHP": предпоследний узел сохраняет метку, и конечный узел видит свой SID. Флаг E - explicit-null: предпоследний узел заменяет метку на 0 (IPv4) или 2 (IPv6). Зачем это нужно: при PHP поле TC верхней метки пропадает до выхода из туннеля (модель pipe), explicit-null сохраняет его для политики QoS на конечном PE; no-PHP требуется, когда конечный узел обязан обработать сегмент сам. Явный выбор делает владелец префикса, а не транзит, и применяется ко всем отправителям.
Операции RFC 8660
RFC 8660 описывает три операции: PUSH (положить сегмент в стек), CONTINUE (активный сегмент не завершён, транзит заменяет метку на значение для следующего хопа, swap) и NEXT (активный сегмент завершён, метка снимается, активным становится следующий). Для Prefix-SID транзитные узлы выполняют CONTINUE, а узел-владелец - NEXT. Для Adjacency-SID узел выполняет NEXT и отправляет пакет в интерфейс без поиска по FIB.
Adjacency-SID
Каждому соседу узел присваивает метку из локального пространства (динамический пул или SRLB) и анонсирует её в IGP: в IS-IS это Adj-SID sub-TLV (тип 31) внутри TLV достижимости соседа (22, 222, 23, 223, 141), а для LAN используется LAN-Adj-SID sub-TLV (тип 32); в OSPF - Adj-SID sub-TLV (тип 2) в Extended Link Opaque LSA (тип 8) и LAN Adj-SID (тип 3). Флаги IS-IS: F (семейство адресов), B (защищена backup, обычно TI-LFA), V (значение, а не индекс), L (локальное значение), S (набор Adj-SID для нескольких смежностей), P (постоянное значение, сохраняется при перезагрузке). Для S-набора один SID пересылает трафик равномерно по параллельным линкам. Многие платформы выделяют две метки на смежность: защищённую (с backup) и незащищённую.
Adjacency-SID не нужен SPF: пакет с этой меткой на узле просто выходит в линк. Значение известно только владельцу, остальные узлы получают его через IGP. Если оно выделено динамически, то после перезагрузки или потери смежности может поменяться: жёстко записанные в политики стеки с динамическим Adj-SID перестанут работать. Выход - SID из SRLB (постоянные значения), контроллер, который читает значения из IGP/BGP-LS, или использование Node-SID.