Кратко

  • Treat-as-withdraw сохраняет сессию лишь в подходящих случаях: все маршруты из ошибочного UPDATE удаляются из Adj-RIB-In, а не исправляются и не сохраняются.
  • Решение требует точно знать границу NLRI, семантику атрибута и эффективную политику. Проверка продолжается через Loc-RIB, FIB и пакеты до чистого исправления отправителем.

Две карты одного события

Представим условный UPDATE без вымышленного оператора, префикса, числа маршрутов или версии с дефектом. Сообщение содержит несколько обычных направлений и общий для них набор атрибутов; один атрибут имеет неверный формат. На карте сессий ничего драматического еще не видно. На карте маршрутов результат зависит от выбранного действия.

Структура сообщения важнее того, какой префикс первым попал в журнал. BGP позволяет одному UPDATE рекламировать несколько NLRI, если к ним применяется один набор атрибутов. Ошибочный атрибут относится ко всем содержащимся направлениям. RFC 4271 задает эту основу и базовую обработку ошибки через UPDATE Message Error NOTIFICATION.

При базовом подходе сессия завершается, и вместе с ней убираются все маршруты, полученные от соседа, в том числе корректные из других сообщений. RFC 7606 вводит более узкую иерархию действий. Treat-as-withdraw оставляет сессию Established, но заставляет считать все маршруты ошибочного UPDATE отозванными и удалить их из Adj-RIB-In. Поэтому на первой карте сосед остается зеленым, на второй появляются пустоты.

Пустоты не обязательно одинаковы по последствиям. Для одного направления может быть альтернативный путь, для другого — нет. RFC 7606 прямо допускает полную недостижимость или менее оптимальный выбор для затронутых целей. Обработка не исправляет исходную информацию и не гарантирует отсутствие петли или blackhole. Она лишь не распространяет ошибку на весь маршрутный набор сессии, если границу сообщения можно надежно определить.

Также нельзя молча отбросить UPDATE и назвать это тем же действием. BGP передает изменения инкрементально. Игнорирование нового сообщения может оставить старый маршрут установленным, хотя его состояние больше недействительно. Treat-as-withdraw выполняет явное изменение состояния, и именно это изменение нужно доказать по таблицам.

Четыре уровня цены

RFC 7606 перечисляет действия от сильнейшего к слабейшему. Session reset завершает соседство. AFI/SAFI disable ограничивает действие одной семьей, но может удалить все ее маршруты и заставить приемник игнорировать последующие маршруты семьи в текущей сессии. Это не отзыв одного UPDATE. Семейную процедуру задает RFC 4760.

Treat-as-withdraw расходует маршруты конкретного распознанного сообщения. Attribute discard удаляет лишь ошибочный атрибут и продолжает обработку. Последний способ допустим, только если атрибут не влияет на выбор или установку маршрута. Реальная конфигурация может нарушить это предположение: локальная политика способна использовать информационный атрибут как условие выбора. Его удаление тогда сохранит достижимость ценой потери важной политики.

Для пересмотренных ошибок ORIGIN, AS_PATH, NEXT_HOP, MED и LOCAL_PREF RFC 7606 предписывает treat-as-withdraw. Для определенных ошибок ATOMIC_AGGREGATE и AGGREGATOR применяется attribute discard. При нескольких ошибках с разными предписаниями выбирают сильнейшее действие. Удобство или привычка оператора не меняют этого порядка.

Дубликаты тоже не образуют общей категории. Два MP_REACH_NLRI или MP_UNREACH_NLRI требуют NOTIFICATION с Malformed Attribute List. Для других повторных атрибутов сохраняется первое вхождение, остальные отбрасываются. Такая детализация показывает, почему общий флаг «терпеть ошибки» не заменяет классификацию конкретного PDU.

Граница щадящего решения проходит по парсеру

Применить treat-as-withdraw можно только после успешного определения и разбора полного NLRI либо MP_REACH_NLRI/MP_UNREACH_NLRI. Если границу найти нельзя, приемник не знает, какие маршруты должен считать отозванными. Тогда остаются session reset и/или AFI/SAFI disable по правилам RFC 4271 и RFC 4760. Невозможность прочитать цели исключает более слабый выбор независимо от его привлекательности.

Практически это требует записать длины, флаги, код атрибута и положение NLRI. Ошибка длины может сдвинуть ожидаемое начало поля. Без исходных байтов позднее невозможно доказать, что парсер действительно выделил все направления, а не получил правдоподобный неполный список. Containment начинается с уверенного знания множества, которое оно ограничивает.

Спецификации атрибутов уточняют эту логику. RFC 8092 считает Large Communities ошибочным, если длина значения не является ненулевым кратным 12, и предписывает treat-as-withdraw. Простые повторы значений не считаются ошибкой и удаляются без шума. Внешняя странность данных не равна нормативной ошибке.

RFC 6793 выбирает attribute discard и локальную запись для конкретных ошибочных или контекстно неверных AS4_PATH и AS4_AGGREGATOR. Их смысл зависит от перехода между двухбайтовыми и четырехбайтовыми ASN и возможностей собеседников. RFC 7607 запрещает AS 0 в определенных полях, направляя обработку к RFC 7606 либо RFC 6793 в зависимости от атрибута. AS 0 здесь лишь пример того, как контекст выбирает процедуру.

Реестр параметров BGP IANA остается актуальным справочником кодов атрибутов и подтипов UPDATE-ошибок. Но регистрация кода не означает, что любой приемник вправе сам назначить ему attribute discard. Безопасное действие определяется ссылочной спецификацией и применимой политикой.

Один и тот же код поэтому может быть лишь началом классификации. Нужны также направление сессии, согласованные возможности, семейство и место атрибута в сообщении. Если эти сведения потеряны, поздний анализ способен назвать номер, но не восстановить право приемника выбрать конкретное действие.

Внутри AS ошибка может разделить реальность

Treat-as-withdraw на IBGP-сессии способен создать разные картины маршрутизации. RFC 7606 предупреждает о долгоживущих петлях пересылки и blackhole при несогласованности. Один узел мог удалить маршруты, другой сохранить или получить их по иному внутреннему пути, а Route Reflector — заново распространить вариант состояния. Все соседства при этом могут оставаться рабочими.

Поэтому ошибочный маршрут рекомендуют проследить до входной точки и фильтровать источник там. Локальная терпимость на множестве получателей не заменяет коррекцию места, откуда состояние попало в AS. Сравнение должно охватить Adj-RIB-In, скрытые или отклоненные маршруты, Loc-RIB и последующую рекламу в нескольких контрольных точках.

Затем проверяется FIB. Выбранный запасной маршрут мог не установиться в оборудование или иметь неразрешимый next hop. Для разных групп направлений нужны пакетные canary-пробы и выходные счетчики. Успех одного назначения не подтверждает все NLRI исходного UPDATE. Точный перечень затронутых маршрутов — обязательная часть результата, а не оценка по изменению общего числа.

Событие должно оставить проверяемый след

RFC 7606 требует средств диагностики, перечисляющих вовлеченные NLRI и сохраняющих полный ошибочный UPDATE. Иначе исчезновение маршрута нельзя надежно связать с ошибкой: причиной мог быть обычный отзыв, политика, отказ next hop или другой процесс. Нужны PDU, сосед, направление, AFI/SAFI, код, флаги, длина и действие парсера.

BMP Route Mirroring способен перенести дословно полученное сообщение и обозначить Errored PDU, обработанный как withdraw. Но RFC 7854 также определяет Messages Lost. Очереди могут переполниться, зеркалирование может быть выборочным и требовать заметных ресурсов. Отсутствующий PDU без статуса потерь не доказывает отсутствие события.

Реализации предоставляют разные операционные поверхности. Cisco IOS XR документирует категории TreatAsWithdraw и DiscardAttr и примеры журналов с соседом, длиной, атрибутом, семейством и контекстом NLRI. Junos описывает reset, hidden-route, treat-as-withdraw и discard, включая зависимость поведения от релиза и настроек. Nokia SR OS описывает update-fault-tolerance и отличие от legacy handling. Ни один из этих источников не задает общий для всех платформ default или команду.

Восстановление проходит по обеим картам

Исправление на стороне отправителя должно породить чистый замещающий UPDATE. После его приема сравнивают состояние до и после в Adj-RIB-In и Loc-RIB, дальнейшую рекламу, FIB и пакетные результаты. Не должно остаться старых записей, различий между узлами или повторных ошибочных сообщений. Возврат сессии к Established ничего не добавляет, если она и не падала.

Reset без исправления источника может вернуть тот же PDU после подъема. Fault tolerance без исправления может создать цикл: маршрут исчезает на ошибочной версии и возвращается на чистой, пока журналы и зеркальные буферы расходуются. Поэтому прекращение разрыва сессий не является устранением причины. Оно лишь меняет форму ущерба и сигналы, по которым его видно.

Итоговая доказательная цепочка начинается с точных байтов и классификации, проходит через каждую NLRI, RIB и FIB, а заканчивается пакетами и устойчивой чистой заменой. RFC 7606 дает приемнику власть тратить меньшую область корректного состояния. Он не освобождает от обязанности назвать потраченные маршруты и показать, что восстановилось именно то, что нужно пользователям.