Кратко

  • Простой split horizon не показывал маршрут соседу, от которого тот был получен; poisoned reverse возвращал запись с метрикой 16 и явно запрещал использовать обучившийся маршрутизатор как обратный следующий переход.
  • Отрицательное сообщение разрушало петлю из двух узлов до тайм-аута, но увеличивало обновления и не видело круг, в котором старую веру поддерживали три маршрутизатора или больше.

Сначала работал код, потом появился RFC

RFC 1058 вышел в июне 1988 года и описывал уже распространённый RIP. Документ сводил воедино реализации, расходившиеся в деталях. Непосредственным образцом служил routed из Berkeley Unix; родословная шла через PUP и XNS компании Xerox, а дистанционно-векторные методы использовались ещё в ранней ARPANET.

Поэтому меры устойчивости в RFC выглядят как ответы на эксплуатацию. Маршрутизатор не знал общей топологии. Для каждого назначения он хранил метрику и соседа, чьё сообщение определяло лучший путь. Соседи обменивались расстояниями, а каждый участник самостоятельно пересчитывал таблицу.

RIP предназначался для умеренной и сравнительно однородной внутренней сети автономной системы. Простота уменьшала объём состояния, но число не несло полную историю своего происхождения.

Копия стала похожа на второго свидетеля

Пусть A достигает D через B. После потери настоящего соединения B с D сосед B всё ещё может услышать положительный маршрут от A. Выбрав A, B не находит независимый обход: он принимает обратно собственное прежнее сообщение. A смотрит на B, B — на A.

Оба корректно исполняют локальную логику, но пакеты ходят по кругу, а расстояние растёт. RIP назвал это counting to infinity: недоступная сеть временно выглядит не исчезнувшей, а всё более далёкой.

Злой умысел не нужен. Значение от соседа не показывает, является ли оно производным от старого значения самого получателя. Потерянная родословная превращает повтор в мнимое подтверждение.

Число 16 ограничивало и ошибку, и сеть

RIP назначил метрику 16 бесконечностью, оставив полезными пути от 1 до 15 переходов. Известный предел масштаба был одновременно пределом сходимости. Более далёкая бесконечность позволила бы представить крупную сеть, но ложная дистанция считала бы дольше.

RFC 1058 формулирует компромисс: граница обязана быть выше любого допустимого маршрута, но не должна быть больше необходимого. Поэтому 16 не означает глобального исчезновения D. Оно помечает конкретный RIP-путь в данном обмене и в данный момент. Иной интерфейс, протокол или последующее обновление могут дать путь.

Молчание убирало эхо, яд отзывал старую запись

Простой split horizon не отправляет маршрут назад соседу или через интерфейс, где маршрут был выучен. Если A узнал D от B, в обновлении A для B назначения D нет. Сообщение B не возвращается голосом A как подтверждение.

Poisoned reverse оставляет строку, но ставит 16. A не утверждает, что D исчезло повсюду. Он сообщает B: A нельзя выбирать следующим переходом к D, потому что собственный лучший путь A возвращается через B.

Разницу создаёт время. Если A лишь замолкает, B может держать старый положительный путь через A до тайм-аута. Получив 16, B сразу заменяет устаревшую веру. Отсутствие предотвращает новое эхо; явный отзыв вытесняет уже сохранённое состояние.

Дополнительные байты покупали быстрый отзыв

На общей сети маршрутизатор может выучить через один интерфейс множество путей. Простой горизонт не включает их в обратное обновление. Poisoned reverse перечисляет их с 16. В спокойное время значительная часть пакета может состоять из сообщений «не ходи через меня».

После изменения эта избыточность полезна: отрицательная запись непосредственно заменяет старую положительную, не ожидая её старения. Полоса пропускания обменивается на скорость сходимости.

RFC 1058 разрешает простой горизонт, poison, настройку оператора или гибрид, где 16 передаётся ограниченное время после изменения, а потом строка опускается. Значение бесконечности не настраивается; настраиваются объём и срок доставки отрицательного доказательства.

Два зеркала разбивались, треугольник сохранялся

Если A и B указывают друг на друга, обратные объявления с 16 немедленно лишают петлю опоры. Не нужно ждать, когда старые значения истекут.

С тремя узлами происхождение скрывается за поворотом. A может зависеть от B, B от C, C от A. Никто не возвращает положительное значение непосредственно тому соседу, от которого только что его узнал, но полный круг существует. Split horizon видит лишь одну связь, и метрики продолжают расти до 16.

Триггерные обновления сокращают интервал. При ухудшении выбранного пути маршрутизатор сообщает новую метрику раньше периодического цикла; зависимые соседи принимают и передают её дальше. Однако сообщения остаются асинхронными, могут задерживаться, пересекаться с регулярными обновлениями и встречать другие изменения. Быстрая волна не равна общей транзакции.

Сначала отозвать, потом удалить

Просроченный маршрут RIP не удалял сразу. Его ставили в 16, продолжали рекламировать во время garbage collection и лишь затем убирали строку. Немедленное удаление экономит локальное состояние, но не исправляет положительные копии у соседей.

У отрицательной информации есть собственный срок. Она должна успеть дойти до тех состояний, которые отменяет. Poisoned reverse и отложенное удаление следуют одному порядку: видимый отзыв раньше освобождения памяти.

Версии менялись, граница знания оставалась

RFC 1812 потребовал split horizon от реализации RIP и рекомендовал poisoned reverse. Из-за накладных расходов он допустил операторский переключатель и советовал ограничивать срок бесконечных обратных объявлений.

RFC 2080 перенёс правило в RIPng для IPv6, назвал poison предпочтительным и предложил выбирать режим по интерфейсу. Формат префикса изменился, риск возврата производного утверждения как нового — нет.

RFC 2091 добавил для каналов по требованию упорядоченные и подтверждаемые триггерные обновления. Poison остался обязательным: надёжная доставка доказывает прибытие, а не независимость источника.

RFC 2453 сохранил в RIPv2 метрику 16, горизонт, poison, триггеры и предел петли из двух маршрутизаторов. Новые поля пакета не дали дистанционному вектору знания полного пути.

Что на самом деле доказывала недостижимость

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

Именно узость сделала правило исторически полезным. Не передавая весь путь, RIP сделал часть происхождения доступной через направление объявления, конечную метрику и время. Он быстро остановил видимую пару и честно назвал более длинную петлю, которой не видел.

Источники и границы доказательств

Документы устанавливают алгоритм и требования, но не современные настройки производителей, долю использования, время сходимости конкретной сети или намерение за петлёй. Trigger RIP относится к каналам по требованию; предпочтение RIPng не подтверждает включение poison на каждом интерфейсе.