Теоретические основы и архитектура
SRv6 переносит идею Segment Routing с меток MPLS на адреса IPv6: сегмент - это 128-битный SID, а функция, закодированная в нём, определяет, что узел сделает с пакетом. Вы разберёте структуру SID (locator, function, argument), заголовок SRH (RFC 8754) и поведения из RFC 8986: End, End.X и сервисные End.DT4, End.DT6, End.DX4. Отдельный блок посвящён сжатию: uSID (RFC 9800) укладывает несколько сегментов в один IPv6-адрес и почти убирает накладные расходы SRH. Затем строится L3VPN поверх SRv6 по BGP (RFC 9252): PE передаёт SID сервиса вместо метки VPN, а транзитные узлы пересылают пакет обычным IPv6. Урок сравнивает SRv6 и SR-MPLS по накладным расходам, MTU, зрелости оборудования, TI-LFA и модели безопасности, а также показывает разницу между инкапсуляцией и вставкой SRH.
От меток MPLS к адресам IPv6
SR-MPLS кодирует сегмент 20-битной меткой и требует MPLS-плоскости данных. SRv6 (RFC 8402 описывает архитектуру, RFC 8754 - заголовок, RFC 8986 - сетевое программирование) использует для того же IPv6: сегмент - это 128-битный адрес, а его смысл определяет узел-владелец. Так как SID выглядит как обычный IPv6-адрес, префикс locator анонсируется в IGP (для IS-IS это RFC 9352) как обычный маршрут, и узлы без поддержки SRv6 пересылают такие пакеты по longest match, не зная о SR. Это ключевое отличие: транзитный P не обязан понимать SRv6, пока он умеет пересылать IPv6. Отдельное следствие - агрегирование: locator узлов области можно суммировать одним префиксом на границе, чего с метками SR-MPLS сделать нельзя.
Структура SID: Locator : Function : Argument
128 бит делятся на locator, function и argument. Locator состоит из блока (B) и идентификатора узла (N): в уроке блок fcbb:bb00::/32, узел PE2 - 0002, locator fcbb:bb00:2::/48. Function - идентификатор действия на узле (например, End.DT4 для VRF A = e004), argument - необязательные данные для функции (в классическом SRv6 - значение, передаваемое поведению; в L3VPN обычно нулевой). Длины полей не фиксированы стандартом, поэтому узел сообщает структуру SID (Locator Block Length, Locator Node Length, Function Length, Argument Length) в IGP и в BGP, а оператор выбирает формат один раз для всей сети. Locator маршрутизируется IGP, а SID внутри locator - это локальные записи узла, они в IGP не анонсируются отдельными маршрутами (Adjacency SID, как и End.X, анонсируются в sub-TLV).
SRH и обработка пакета
SRH - заголовок маршрутизации типа 4 (RFC 8754): поля Next Header, Hdr Ext Len, Routing Type = 4, Segments Left, Last Entry, Flags, Tag и список Segment List[0..n]. Список хранится в обратном порядке: последний сегмент - Segment List[0]. В Destination Address пакета лежит активный сегмент, Segments Left указывает индекс следующего. Узел-endpoint, обнаружив свой SID в DA, выполняет поведение: для End уменьшает Segments Left на 1, копирует Segment List[Segments Left] в DA и пересылает пакет. SRH добавляет только исходный узел домена, транзитные узлы SRH не вставляют; опциональный HMAC TLV защищает от подделки списка. Варианты обработки последнего сегмента называются flavor: PSP (предпоследний сегмент снимает SRH), USP (последний снимает SRH) и USD (последний снимает внешний заголовок целиком). Узлы без собственных SID пересылают пакет по DA и SRH не просматривают.
Поведения (RFC 8986)
End - переход к узлу. End.X - пересылка через конкретного соседа (аналог Adjacency SID). End.T - lookup в указанной таблице IPv6. End.DX4, End.DX6 - декапсуляция и отправка на конкретного CE (per-CE). End.DT4, End.DT6, End.DT46 - декапсуляция и lookup в таблице VRF (per-VRF; DT46 обслуживает оба семейства). End.B6.Encaps - привязка к политике с новой инкапсуляцией (аналог Binding SID). На стороне головного узла определены H.Encaps (внешний заголовок IPv6 с SRH), H.Encaps.Red (reduced: первый SID идёт в DA, SRH не повторяет его, а при единственном SID SRH не нужен) и H.Insert (SRH вставляется в исходный пакет без внешнего заголовка). Режим вставки не изменяет адресацию внешнего пакета и экономит 40 байт, но ограничен (RFC 8754 разрешает добавлять SRH только исходному узлу) и в L3VPN не применяется: сервису нужна инкапсуляция, чтобы доставить внутренний пакет без изменения.
uSID и сжатие (RFC 9800)
Полные 128-битные SID раздувают SRH: каждый сегмент стоит 16 байт. Решение - компрессия сегментов. Микро-SID (uSID, flavor NEXT-CSID из RFC 9800) занимает 16 бит; в 128-битном контейнере умещаются блок (например, 32 бита) и до шести uSID. В DA лежит блок плюс последовательность uSID; узел с uN (End с поведением shift) сравнивает первый uSID после блока со своим, сдвигает остаток на 16 бит влево, дополняет нулями и пересылает пакет, поэтому активный uSID всегда находится сразу за блоком. Для 6 хопов SRH не нужен вообще: внешний IPv6 весит 40 байт, а не 40 + 8 + 6x16. Для более длинных путей в SRH кладут контейнеры. Службы получают собственные uSID (uDT4, uDT6) в конце списка. Блок и длины полей должны совпадать на всех узлах, а совместимость разных вендоров зависит от реализации flavor и формата locator; сверяйтесь с матрицей платформы. Альтернативные flavor компрессии существуют и в этом уроке не рассматриваются.
L3VPN поверх SRv6 (RFC 9252)
PE2 выделяет SID для VRF из своего locator: per-VRF End.DT4 (или DT6/DT46) либо per-CE End.DX4. SID передаётся в VPNv4/VPNv6 в атрибуте BGP Prefix-SID (TLV SRv6 L3 Service), вместе с поведением и структурой SID; часть бит SID может кодироваться в поле метки NLRI (transposition), чтобы уменьшить размер обновления. RT, RD, импорт и экспорт работают так же, как в MPLS L3VPN; меняются только транспорт и сервисная инкапсуляция: вместо двух меток - внешний IPv6 c DA = SID сервиса. Next hop маршрута - IPv6-адрес PE2, который IGP знает через locator. Route reflector должен сохранять атрибут Prefix-SID; для TE перед SID сервиса ставят сегменты пути (SRH или uSID). Принимающий PE при совпадении DA с End.DT4 снимает внешний заголовок и ищет внутренний адрес в VRF.