Теоретические основы и архитектура
Ядро оператора теряет трафик не в момент отказа, а в окне между обрывом линка и тем моментом, когда новая таблица пересылки запрограммирована на всех маршрутизаторах. Это окно складывается из обнаружения отказа, флудинга LSA/LSP, расчёта SPF, обновления RIB/FIB и пересчёта меток LDP: без настройки оно составляет от сотен миллисекунд до нескольких секунд. IP Fast Reroute (RFC 5714) убирает большую часть окна: маршрутизатор заранее вычисляет резервный next-hop и в момент отказа переключается локально, не дожидаясь SPF. Loop-Free Alternate (RFC 5286) использует соседа, который гарантированно не вернёт пакет назад; Remote LFA (RFC 7490) строит LDP-туннель до удалённого узла, когда прямого LFA нет. Урок разбирает условия выбора LFA и rLFA, причины микропетель при сходимости (RFC 5715), настройку таймеров SPF/LSA и BFD, а также Graceful Restart, NSF и NSR с их компромиссами. TI-LFA здесь только упоминается: он относится к модулю Segment Routing.
Из чего складывается время сходимости
Потери трафика после отказа линка равны сумме пяти стадий. Обнаружение: аппаратный сигнал потери несущей занимает единицы миллисекунд, BFD с интервалом 50 мс и множителем 3 - около 150 мс, тогда как Hello/Dead IS-IS (обычно 10/30 с) и OSPF (10/40 с) дают десятки секунд. Генерация и флудинг LSP/LSA: от единиц до десятков миллисекунд на хоп плюс таймеры генерации. SPF: время зависит от размера базы и CPU, на современных платформах единицы-десятки миллисекунд при сотнях узлов, плюс задержка троттлинга. Обновление RIB и FIB: от десятков миллисекунд до секунд при сотнях тысяч префиксов, если FIB не организован иерархически. Наконец, метки LDP: при liberal retention метка следующего соседа уже в LIB, и пересчёт сводится к программированию FIB. IP FRR убирает из критического пути стадии 2-4: резервный путь уже в FIB.
LFA: условие и три вида защиты
LFA (RFC 5286) выбирает соседа N маршрутизатора S, чей кратчайший путь к цели D не проходит через S. Базовое условие loop-free: D(N,D) < D(N,S) + D(S,D), где D - метрика кратчайшего пути. Пример лабораторной сети: при отказе линка PE1-P1 соседом-кандидатом является P2: D(P2,PE2)=10 меньше D(P2,PE1)+D(PE1,PE2)=20+20=40, значит P2 - loop-free alternate. Для узловой защиты (если откажет сам P1) условие строже: D(N,D) < D(N,E) + D(E,D), где E - защищаемый основной сосед; если оно не выполняется, LFA защищает только линк, а при отказе узла возможна петля. Downstream-условие D(N,D) < D(S,D) допускает альтернативы с гарантией отсутствия петли даже при отказе узла, но покрывает меньше направлений. При нескольких кандидатах реализация применяет tie-break (RFC 5286 раздел 3.8): предпочтение узловой защите, затем меньшей метке, плюс политики вроде SRLG и ECMP-совместимости. LFA не даёт стопроцентного покрытия: в кольцах и топологиях с симметричными метриками доля защищённых префиксов часто падает, а в двухслойных пирамидах Clos и full-mesh остаётся высокой. Всегда проверяйте покрытие командой платформы, а не считайте его гарантированным.
Remote LFA и PQ-узлы
Когда прямого LFA нет, Remote LFA (RFC 7490) ищет удалённый узел PQ, одновременно лежащий в P-пространстве (достижим от S без прохода по защищаемому линку) и в Q-пространстве (достижим от PQ до D без прохода по защищаемому линку). S строит туннель до PQ: на практике targeted-сессия LDP и метка PQ для FEC цели. Резервный пакет получает стек из двух меток: внешняя - транспортная метка до PQ, внутренняя - метка FEC D, объявленная PQ. Поэтому rLFA требует LDP на всех узлах пути и targeted Hello (UDP 646, unicast вместо 224.0.0.2) до PQ-кандидатов, а на PQ - принять такую сессию (команда типа "discovery targeted-hello accept" или автоматическая реализация). Ограничения: защита только от отказа линка (не узла), покрытие зависит от топологии, а при множестве возможных PQ выбор может быть неоптимальным по задержке. TI-LFA из модуля Segment Routing решает эти задачи без LDP и даёт 100% покрытие в топологии без ограничений метрик, но здесь он только упоминается.
Микропетли
Микропетля (RFC 5715) возникает потому, что узлы сходятся не одновременно: узел, раньше обновивший FIB, отправляет пакет соседу, у которого ещё старая таблица, а тот возвращает его назад. Окно петли равно разнице моментов обновления FIB, обычно сотни миллисекунд, пока петля не рассосётся по TTL; потери вызваны ростом очередей и перегрузкой линка, не отказом. Микропетли бывают при отказе и при возврате линка (recovery): последний случай часто игнорируют, хотя именно он создаёт повторный всплеск потерь. Способы: упорядоченное обновление FIB (RFC 6976, ordered FIB: узел ждёт, пока обновятся узлы дальше от отказа), локальная задержка RIB-update (RFC 8333, "local delay": узел рядом с событием откладывает установку нового пути на время, достаточное для сходимости остальных; обычно сотни миллисекунд-несколько секунд), "make before break" при возврате линка и микропетлевая защита SR (в модуле Segment Routing). Плата за задержку: узел дольше пользуется резервным путём, так что при каждой конфигурации стоит выбирать значение под размер сети.
Тюнинг IGP
Параметры SPF и генерации LSA используют экспоненциальный бэкофф: первый запуск через initial-wait (например, 50 мс), второй через secondary-wait (200 мс), далее удвоение до max-interval (5 с). Типичная связка 50/200/5000 мс для SPF, PRC и генерации LSP даёт быструю реакцию на единичный отказ и защиту CPU при флапающем линке. Дополнительно используются fast-flood (рассылка LSP без ожидания очередного интервала), оптимизация приоритета Hello, link debounce / carrier-delay для оптики и подавление флапов (IP event dampening, exponential backoff на интерфейсе). Слишком малые значения без защиты ведут к постоянному пересчёту SPF и нестабильности.