Построение таблицы маршрутизации.
Протокол маршрутной информации (Routing Information Protocol, RIP) — внутренний протокол маршрутизации дистанционно-векторного типа. Будучи одним из наиболее ранних протоколов обмена маршрутной информацией, он до сих пор чрезвычайно распространен в вычислительных сетях ввиду простоты реализации. Версии RIP имеются как для сетей TCP/IP, так и для сетей IPX/SPX компании Novell.
В настоящее время протокол RIP для IP представлен двумя версиями. RIP v.1 не поддерживает маски, т. е. он распространяет между маршрутизаторами информацию только о номерах сетей и расстояниях до них, но не о масках этих сетей, считая, что все адреса принадлежат к стандартным классам A, B или С. RIP v.2 передает данные о масках сетей, поэтому он в большей степени соответствует современным требованиям. Так как при построении таблиц маршрутизации работа второй версии принципиально не отличается от первой, то в дальнейшем для упрощения записей будет описываться работа первой версии.
В качестве расстояния до сети стандарты протокола RIP разрешают использовать различные виды метрик: число транзитных узлов, пропускную способность, вносимые задержки и надежность сетей (т. е. соответствующие признакам D, T и R в поле «Качество сервиса» пакета IP), а также любые их комбинации. Метрика должна обладать свойством аддитивности — метрика составного пути должна быть равна сумме метрик составляющих этого пути. В большинстве реализаций RIP применяется простейшая метрика — количество транзитных узлов, т. е. промежуточных маршрутизаторов, которые пакету нужно преодолеть для достижения сети назначения.
Процесс построения таблиц маршрутизации с помощью протокола RIP мы рассмотрим на примере составной сети, изображенной на Рисунке 1.
СОЗДАНИЕ МИНИМАЛЬНЫХ ТАБЛИЦ
Как видим, восемь сетей IP связаны четырьмя маршрутизаторами с идентификаторами M1, M2, M3 и M4. Маршрутизаторы, работающие по протоколу RIP, могут иметь идентификаторы, однако они не влияют на работу протокола. В сообщениях RIP эти идентификаторы не передаются.
В исходном состоянии в каждом маршрутизаторе программным обеспечением стека TCP/IP автоматически создается минимальная таблица маршрутизации, где представлены только непосредственно подсоединенные сети. На рисунке адреса портов маршрутизаторов, в отличие от адресов сетей, помещены в овалы.
Примерный вид минимальной таблицы маршрутизации в М1 приведен в Таблице 1. Минимальные таблицы маршрутизации в других маршрутизаторах будут выглядеть аналогично: например, таблица маршрутизатора М2 состоит из трех записей (см. Таблицу 2).
РАССЫЛКА МИНИМАЛЬНЫХ ТАБЛИЦ СОСЕДЯМ
После инициализации каждого маршрутизатора он начинает посылать своим соседям сообщения протокола RIP, куда помещается его минимальная таблица. Они передаются в пакетах протокола UDP и содержат информацию о двух параметрах каждой сети: ее IP-адрес и расстояние до нее от передающего сообщение маршрутизатора.
Соседи — это те маршрутизаторы, которым данный маршрутизатор может передать пакет IP непосредственно по какой-либо сети, к которой он подключен напрямую, не пользуясь услугами промежуточных маршрутизаторов. Например, соседние маршрутизаторы для М1 — маршрутизаторы М2 и М3, а для М4 — М2 и М3.
Таким образом, маршрутизатор М1 передает маршрутизатору М2 и М3 следующее сообщение:
сеть 201.36.14.0, расстояние 1,
сеть 132.11.0.0, расстояние 1,
сеть 194.27.18.0, расстояние 1.
ОБРАБОТКА ПОЛУЧЕННОЙ ОТ СОСЕДЕЙ ИНФОРМАЦИИ
После получения аналогичных сообщений от маршрутизаторов М2 и М3 маршрутизатор М1 увеличивает каждое полученное поле метрики на единицу и запоминает, через какой порт и от какого маршрутизатора поступила новая информация (его адрес станет адресом следующего маршрутизатора, если эта запись будет внесена в таблицу). Затем маршрутизатор сравнивает новую информацию с той, которая хранится в его таблице маршрутизации (см. Таблицу 3).
Записи с четвертой по девятую получены от соседних маршрутизаторов, и они претендуют на включение в таблицу. Однако только записи с четвертой по седьмую попадают в таблицу, а восьмая и девятая — нет. Это происходит потому, что они содержат данные об уже имеющихся в таблице М1 сетях, а расстояние до них больше, чем в существующих записях.
Протокол RIP замещает запись о какой-либо сети только в том случае, если метрика новой информации лучше (расстояние в транзитных узлах меньше), чем прежняя. В результате в таблице маршрутизации о каждой сети остается только одна запись, так же как и при наличии нескольких равнозначных в отношении расстояния путей к одной и той же сети остается та, что была получена раньше всех. Для этого правила существует исключение — если худшая информация о какой-либо сети пришла от того же маршрутизатора, на основании сообщения которого была создана данная запись, то она замещает лучшую.
Аналогичные операции с новой информацией выполняют и остальные маршрутизаторы сети.
РАССЫЛКА НОВОЙ ТАБЛИЦЫ СОСЕДЯМ
Каждый маршрутизатор отсылает новое сообщение RIP всем своим соседям, помещая в нем данные обо всех известных ему сетях — как непосредственно подключенных, так и удаленных, о которых маршрутизатор узнал из сообщений RIP.
Пятый этап повторяет третий: маршрутизаторы принимают сообщения RIP, обрабатывают содержащуюся в них информацию и на ее основании корректируют свои таблицы маршрутизации.
Посмотрим, как это делает маршрутизатор М1 (см. Таблицу 4). Маршрутизатор М1 получил от М3 информацию о сети 132.15.0.0, которую тот в свою очередь на предыдущем цикле работы получил от маршрутизатора М4. М1 уже знает о сети 132.15.0.0, причем предыдущее сообщение имеет лучшую метрику, чем новое, поэтому вновь поступившее отбрасывается.
О сети 202.101.16.0 маршрутизатор М1 узнает на этом этапе впервые, данные о ней приходят сразу от двух соседей — от М3 и М4. Поскольку метрики указаны одинаковые, то в таблицу попадает информация, пришедшая раньше. В нашем примере считается, что маршрутизатор М2 опередил маршрутизатор М3 и первым переслал свое сообщение RIP маршрутизатору М1.
Если маршрутизаторы периодически повторяют этапы рассылки и обработки сообщений RIP, то за конечное время в сети установится корректный режим маршрутизации. Это понятие предполагает такое состояние таблиц маршрутизации, когда любая сеть будет достижима с помощью некоторого рационального маршрута. Пакеты будут доходить до адресатов и не зацикливаться в петлях, подобных той, которую на Рисунке 1 образуют маршрутизаторы M1-M2-M3-M4.
Очевидно, что если в сети все маршрутизаторы, их интерфейсы и соединяющие их каналы связи постоянно работоспособны, то объявления по протоколу RIP можно делать достаточно редко, например один раз в день. Однако в сетях постоянно происходят изменения — меняется как работоспособность маршрутизаторов и каналов, так и сами маршрутизаторы; каналы могут добавляться в существующую сеть или выводиться из ее состава.
Для адаптации к новым условиям в сети протокол RIP использует ряд механизмов.
АДАПТАЦИЯ МАРШРУТИЗАТОРОВ RIP К ИЗМЕНЕНИЯМ СОСТОЯНИЯ СЕТИ
К появлению новых маршрутов маршрутизаторы RIP приспосабливаются без труда: в очередном сообщении своим соседям они передают новую информацию, так что та постепенно становится известна всем маршрутизаторам сети. А вот к отрицательным изменениям, связанным с потерей какого-либо маршрута, им адаптироваться сложнее. Дело в том, что в формате сообщений протокола RIP нет поля, где бы содержалась информация об отсутствии пути к данной сети.
Понятно, что некоторый маршрут более недействителен, можно двумя способами:
- на основании истечения времени жизни маршрута;
- указанием специального расстояния до сети, ставшей недоступной, а именно — бесконечности.
Для реализации первого механизма каждая запись таблицы маршрутизации (как и записи таблицы продвижения моста/коммутатора), полученная по протоколу RIP, имеет время жизни (TTL). При поступлении очередного сообщения RIP с подтверждением того, что данная запись действительна, таймер TTL устанавливается в исходное состояние, а затем из него каждую секунду вычитается единица. Если за время тайм-аута не придет новое маршрутное сообщение об этом маршруте, то он отмечается как недействительный.
Время ожидания связано с периодом рассылки векторов по сети. Период рассылки в RIP равен 30 с, а в качестве тайм-аута принято шестикратное значение периода рассылки, т. е. 180 с. Шестикратный запас времени нужен для уверенности в том, что проблемы заключаются не в потерях сообщений RIP (а это возможно, так как RIP использует транспортный протокол UDP, который не гарантирует доставку сообщений), а в том, что сеть действительно стала недоступна. Если какой-либо маршрутизатор выходит из строя, то через 180 с все порожденные этим маршрутизатором записи станут недействительными у его ближайших соседей. После этого процесс повторится уже для соседей ближайших соседей — они вычеркнут подобные записи через 360 с, так как первые 180 с ближайшие соседи еще передавали сообщения об этих записях. Как видим, сведения о недоступных через отказавший маршрутизатор сетях распространяются по сети не очень быстро, время распространения кратно времени жизни записи, а коэффициент кратности равен количеству транзитных узлов между самыми дальними маршрутизаторами сети. В этом и заключается одна из причин выбора в качестве периода рассылки небольшой величины в 30 с.
Если сбой происходит лишь на одном из интерфейсов маршрутизатора или в сети, через которую он связан с каким-либо соседом, то ситуация сводится к только что описанной — механизм тайм-аута вновь приводится в действие, и ставшие недействительными маршруты постепенно будут вычеркнуты из всех маршрутизаторов сети.
Тайм-аут работает в тех случаях, когда маршрутизатор не может послать соседям сообщение о недоступном маршруте по причине собственной неработоспособности либо неработоспособности линии связи, по которой можно было бы передать сообщение.
Если пересылка возможна, то маршрутизаторы RIP не используют специальный признак в сообщении, а указывают бесконечное расстояние до сети, причем в протоколе RIP оно выбрано равным 16 транзитным узлам (при использовании другой метрики маршрутизатору необходимо указать ее значение, считающееся бесконечностью). При поступлении сообщения, в котором расстояние до некоторой сети равно 16 (или 15, что приводит к тому же результату, так как полученное значение увеличивается на 1), маршрутизатор должен проверить, исходит ли эта «негативная» информация о сети от того же маршрутизатора, сообщение которого послужило в свое время основанием для записи о данной сети в таблице маршрутизации. Если это так, то информация считается достоверной, и маршрут отмечается как недоступный.
Значение «бесконечного» расстояния задается столь небольшим потому, что в некоторых случаях перебои в линиях связи вызывают длительные периоды некорректной работы маршрутизаторов RIP, выражающейся в зацикливании пакетов в петлях сети. И чем меньше расстояние, используемое в качестве «бесконечного», тем такие периоды становятся короче.
Один из примеров зацикливания пакетов рассмотрим на примере сети, изображенной на Рисунке 1. Допустим, что маршрутизатор М1 обнаружил, что его связь с непосредственно подключенной сетью 201.36.14.0 потеряна (например, по причине отказа интерфейса 201.36.14.3). М1 отметил в своей таблице маршрутизации, что сеть 201.36.14.0 недоступна. В худшем случае он выяснит это сразу же после отправки очередных сообщений RIP, так что до начала нового цикла объявлений, когда он сможет сообщить соседям, что расстояние до сети 201.36.14.0 стало равным 16, останется почти 30 с.
Каждый маршрутизатор работает на основании своего внутреннего таймера, не синхронизируя рассылку объявлений с другими маршрутизаторами. Поэтому весьма вероятно, что M2 опередил M1 и отправил ему свое сообщение раньше, чем М1 успел передать новость о недостижимости сети 201.36.14.0. А в этом сообщении имеются данные, порожденные следующей записью в таблице маршрутизации М2, как показано в Таблице 5. Эта запись была получена от маршрутизатора М1 и остается корректной до отказа интерфейса 201.36.14.3. Теперь она устарела, но маршрутизатор М2 об этом не узнал.
Маршрутизатор M1 получил новые данные о сети 201.36.14.0 — эта сеть достижима через маршрутизатор M2 с метрикой 2. Раньше эта информация поступала М1 также от М2, но M1 игнорировал ее, так как его собственная метрика для 201.36.14.0 была лучше. Теперь М1 должен принять данные о сети 201.36.14.0, полученные от М2, и заменить запись в таблице маршрутизации о недостижимости этой сети на точно такую же запись, как в Таблице 6.
В результате в сети образовалась маршрутная петля: пакеты, направляемые узлам сети 201.36.14.0, будут передаваться маршрутизатором М2 маршрутизатору М1, а М1 будет возвращать их обратно. Пакеты IP будут циркулировать по этой петле до тех пор, пока не истечет время жизни каждого пакета. Так может продолжаться достаточно долго. Рассмотрим периоды времени, кратные времени жизни записей в таблицах маршрутизаторов.
Время 0—180 с. После отказа интерфейса на маршрутизаторах М1 и М2 сохранятся некорректные записи, приведенные выше. Маршрутизатор М2 по-прежнему снабжает маршрутизатор М1 своей записью о сети 201.36.14.0 с метрикой 2, так как ее время жизни не истекло. Пакеты зацикливаются.
Время 180—360 с. В начале этого периода на маршрутизаторе М2 истекает время жизни записи о сети 201.36.14.0 с метрикой 2, так как в предыдущий период маршрутизатор М1 посылал ему сообщения о сети 201.36.14.0 с худшей метрикой, чем у М2, и они не могли подтвердить эту запись. Теперь М2 принимает от М1 запись о сети 201.36.14.0 с метрикой 3 и трансформирует ее в запись с метрикой 4. М1 не получает новых сообщений от М2 о сети 201.36.14.0 с метрикой 2, поэтому время жизни его записи начинает уменьшаться. Процесс зацикливания продолжается.
Время 360—540 с. У маршрутизатора М1 истекает время жизни записи о сети 201.36.14.0 с метрикой 3. М1 и М2 опять меняются ролями — теперь М2 снабжает М1 устаревшей информацией о пути к сети 201.36.14.0, но уже с метрикой 4, которую М1 преобразует в метрику 5. Ситуация не изменилась. Пакеты все еще зацикливаются.
Если бы в протоколе RIP в качестве недостижимого не было выбрано расстояние 16, то описанный процесс длился бы до бесконечности (вернее, пока не исчерпалась бы разрядная сетка поля расстояния и не зафиксировалось переполнение при очередном увеличении расстояния).
В результате маршрутизатор М2 на очередном этапе описанного процесса получает от маршрутизатора М1 метрику 15, что дает после наращивания 16, и фиксирует недостижимость сети. Период нестабильной работы сети длился 36 мин!
Ограничение в 15 транзитных узлов сужает область применения протокола RIP до сетей, в которых число промежуточных маршрутизаторов не должно превышать 15. Для более масштабных сетей нужно использовать другие протоколы маршрутизации, например OSPF, или разбивать сеть на автономные области.
Приведенный пример хорошо иллюстрирует главную причину нестабильной работы маршрутизаторов с поддержкой RIP. Она заключается в самом принципе работы дистанционно-векторных протоколов — информация, полученная из третьих рук, не используется. Действительно, М2 передал маршрутизатору М1 сведения о достижимости сети 201.36.14.0, за достоверность которых он сам не отвечает. Избавиться от этого полностью нельзя, ведь сам способ построения таблиц маршрутизации связан с передачей чужой информации без указания источника ее происхождения.
Не следует думать, что при любых отказах интерфейсов и маршрутизаторов в сетях возникают маршрутные петли. Если бы М1 успел передать сообщение о недостижимости сети 201.36.14.0 раньше ложной информации маршрутизатора М2, то такая петля не образовалась бы. Так что подобные проблемы возникают в среднем не более чем в половине тех случаев, которые способны привести к их возникновению.
МЕТОДЫ БОРЬБЫ С ЛОЖНЫМИ МАРШРУТАМИ В ПРОТОКОЛЕ RIP
Несмотря на то что протокол RIP не способен полностью исключить переходные состояния в сети, когда некоторые маршрутизаторы пользуются устаревшей информацией о несуществующих уже маршрутах, отчасти подобные проблемы решаются при помощи специальных методов.
Так, трудности, возникающие от появления петли между соседними маршрутизаторами, предотвращаются с помощью метода, получившего название «расщепление горизонта» (split horizon). Он заключается в том, что маршрутная информация о некоторой сети, хранящаяся в таблице маршрутизации, никогда не передается маршрутизатору, от которого она получена (это тот маршрутизатор, который является следующим в данном маршруте). Если в рассмотренном выше примере маршрутизатор М2 поддерживает технику расщепления горизонта, то он не передаст маршрутизатору М1 устаревшую информацию о сети 201.36.14.0, так как получил ее именно от него.
Практически все сегодняшние маршрутизаторы, работающие по протоколу RIP, используют эту технику.
Однако расщепление горизонта не помогает в тех случаях, когда петли образуют не два, а несколько маршрутизаторов. Рассмотрим более детально ситуацию, которая возникнет в сети, приведенной на Рисунке 1, в случае потери связи маршрутизатора М2 с сетью А. Пусть все маршрутизаторы этой сети поддерживают технику расщепления горизонта. Тогда М2 и М3 не будут возвращать данные о сети 201.36.14.0 с метрикой 2, так как они получили их от маршрутизатора М1. Но они будут передавать сведения о достижимости сети 201.36.14.0 с метрикой 4 через себя, так как они дошли до них по сложному маршруту, а не от маршрутизатора М1 непосредственно. Например, на маршрутизатор М2 информация поступила по цепочке М4-М3-М1. Поэтому М1 снова может быть введен в заблуждение, пока каждый из маршрутизаторов в цепочке M3-M4-M2 не вычеркнет запись о достижимости сети А (а это произойдет через период 3 x 180 с).
Для предотвращения зацикливания пакетов по составным петлям при отказах связей применяется два других приема, называемых «принудительные обновления» (triggered update) и «замораживание изменений» (hold down).
Способ принудительных обновлений состоит в том, что, получив данные об изменении метрики до какой-либо сети, маршрутизатор не ждет истечения периода передачи таблицы маршрутизации, а передает данные об изменившемся маршруте немедленно. Этот прием помогает во многих случаях предотвратить передачу устаревших сведений об отказавшем маршруте, но он перегружает сеть служебными сообщениями, поэтому принудительные объявления также делаются с некоторой задержкой. В связи с этим возможна ситуация, когда регулярное обновление на каком-либо маршрутизаторе опередит поступление принудительного обновления от предыдущего маршрутизатора в цепочке, и данный маршрутизатор успеет передать по сети устаревшую информацию о несуществующем маршруте.
Второй прием позволяет исключить подобные ситуации. Он связан с введением тайм-аута на принятие новых данных о только что ставшей недоступной сети и предотвращает принятие устаревших сведений о конкретном маршруте от тех из них, кто находится на некотором расстоянии от отказавшей связи и передает устаревшие сведения о ее работоспособности. Предполагается, что в течение тайм-аута замораживания изменений эти маршрутизаторы вычеркнут данный маршрут из своих таблиц, так как не получат о нем новых записей и не будут распространять устаревшую информацию.
Наталья Олифер — обозреватель «Журнал сетевых решений/LAN». С ней можно связаться по адресу: olifer@lanmag.ru.