Пакеты OSPF
OSPF выполняет несколько функций:
- Обнаружение соседей для формирования отношений;
- Рассылка link-state информации для формирования на каждом маршрутизаторе LSDB;
- Запуск SPF для расчёта наилучших маршрутов ко всем получателям;
- Наполнение таблицы маршрутизации наилучшими маршрутами ко всем получателям.
Изменение состояние канала может произойти уже после первичного заполнения таблицы маршрутизации. OSPF детектирует эти изменения и реагирует на них рассылкой маршрутизаторам в пределах зоны (или в другие зоны) информации об изменениях, необходимой для поддержания адекватной LSDB.
Типы пакетов:
- Hello - используется для обнаружения соседей и установления соседства между ними.
- Database description (DBD) - Проверяет синхронизацию баз данных между маршрутизаторами.
- Link-State Request (LSR) — запрашивает определенные записи о состоянии каналов от маршрутизатора к маршрутизатору.
- Link-State Update (LSU) — отправляет определенные записи о состоянии каналов в ответ на запрос.
- Link-State Acknowledgment (LSAck) — подтверждает получение других типов пакетов.
Все пять типов пакетов OSPF инкапсулированы в заголовок сетевого уровня, как показано на рисунке 5. Как показано на рисунке, для идентификации пакета используется номер 89. Каждый пакет начинается с заголовка, содержащего:
- Номер версии - 2 для OSPFv2, 3 для OSPFv3 (поддержка IPv6 );
- Тип - 5 типов пакетов (см. выше);
- Длина пакета - длина пакета в байтах;
- Router ID - определяет отправителя пакета
- Area ID - определяет область в которой возник пакет;
- Checksum - для проверки целостности пакета;
- Тип аутентификации (Authentication type) - no, plain или md5;
- Autentication - используется с типом аутентификации;
- Data - содержит различную информацию, зависящую от типа пакета OSPF:
- Hello — список известных соседей
- DBD — содержит суммарную информацию базы данных состояний каналов, которая включает в себя все известные идентификаторы маршрутизаторов и их последние номера последовательностей (sequence number) и другую информацию.
- LSR — содержит тип необходимого LSU и идентификатор маршрутизатора, у которого есть этот LSU.
- LSU — содержит полные записи объявления о состоянии канала. Несколько LSA могут передаваться в одном пакете обновлений.
- LSAck — поле пустое
Содержание
Формирование соседских отношений между соседними узлами OSPF: Hello
Маршрутизация OSPF зависит от статуса линка между двумя маршрутизаторами. Hello-протокол устанавливает и поддерживает соседские отношения с помощью двухсторонней связи между соседями. Двухсторонняя связь - когда маршрутизатор видит свой собственный ID в hello-пакете, пришедшем от соседа. Соседние маршрутизаторы должны "увидеть" друг друга прежде, чем они смогут обменяться маршрутной информацией.
Каждый интерфейс, участвующий в OSPF, использует мультикаст адрес 224.0.0.5 для рассылки hello-пакетов. Hello-пакеты содержат следующую информацию:
- Идентификатор маршрутизатора (Router ID). Идентификатор маршрутизатора — это 32-битный номер, уникальный для маршрутизатора. По умолчанию выбирается самый большой IP-адрес активного интерфейса, если не настроен интерфейс loopback или идентификатор маршрутизатора, например IP)адресу 172.16.12.1 будет отдано предпочтение над 172.16.1.1. Эта идентификация важна для установления соседских отношений и устранения неполадок в них, а также для координации обмена данными маршрутизации.
- Hello и Dead интервалы - Интервалы приветствия и простоя (Hello and dead intervals). Интервал приветствия определяет период отправки пакетов приветствия маршрутизатором. Интервал приветствия по умолчанию составляет 10 секунд. Интервал простоя — это время в секундах, в течение которого маршрутизатор ожидает пакета приветствия ососеднего маршрутизатора, прежде чем объявить его неисправным. По умолчанию интервал простоя в 4 раза превышает интервал приветствия. Эти таймеры должны быть одинаковы на соседних маршрутизаторах, в противном случае соседские отношения не будут сформированы;
- Neighbors - В поле соседей перечисляются соседние маршрутизаторы, с которыми установлено двусторонне соединение. Это двустороннее соединение устанавливается, когда маршрутизатор опознает себя в поле пакета приветствия, полученного от соседнего маршрутизатора;
- Area ID - Для успешного взаимодействия маршрутизаторы должны находиться в одном сегменте и их интерфейсы должны принадлежать к одной области OSPF в этом сегменте. Кроме того, соседние узлы должны использовать одинаковую подсеть и маску. Все эти маршрутизаторы будут иметь одинаковые данные о состоянии каналов.
- Router priority - 8-битовый номер, приоритет маршрутизатора. Используется для выбора DR и BDR.
- DR и BDR ip адреса - если известны;
- Authentication password - если аутентификация вкл, пароль должен совпадать на всех пирах.
- Флаг тупиковой области (Stub area flag). Тупиковая область — особая область среды OSPF. Два маршрутизатора должны согласовать флаг тупиковой области в пакетах приветствия. Назначение тупиковой области позволяет уменьшить число обновлений маршрутизации, заменив их на маршрут по умолчанию.
Для формирования соседства следующие поля пакета hello должны совпадать:
- Hello interval;
- Dead interval;
- Area ID;
- Authentication Password;
- Stub Area Flag.
Внимание! Для формирования соседства первичные адреса на интерфейсах маршрутизаторов должны быть в одной подсети, маска и MTU должны совпадать.
Exchange Process and OSPF Neighbor Adjacency States
Первым дело после запуска инициализации OSPF, маршрутизаторы должны пройти этап обмена hello-пакетами.
- Маршрутизатор А подключается к сети; OSPF на интерфейсе в статусе DOWN, т.к. обмена инфой ещё не было. Она начинается с рассылки hello-пакета через все интерфейсы, участвующие в OSPF, даже если маршрутизатор не в курсе о других маршрутизаторах и DR. Hello-пакеты рассылаются на мультикаст 224.0.0.5.
- Всё подключённые маршрутизаторы с запущенным OSPF получают hello-пакет от А и добавляют А в свои списки соседей. Такие маршрутизаторы сейчас находятся в neighbor init-state.
- Все маршрутизаторы, которые получили hello-пакет, отправляют юникаст пакет-ответ с соответствующей информацией маршрутизатору А. Поле Neighbor в пакете hello содержит всех других соседей, включая А.
- Когда А получает все эти hello-пакеты, он добавляет все маршрутизаторы, имеющие свои router ID в их hello-пакетах в свою собственную бд соседей (When router A recieves these hello packets, it adds all the routers that have its router ID in their hello packets to its own neighbor relation database). Маршрутизатор А теперь находится в two-way состоянии с этими маршрутизаторами. Все маршрутизаторы, которые имеют друг друга в таблицах соседей, установили двунаправленное соединение.
Маршрутизаторы периодически (по умолчанию, раз в 10 сек в широковещательных сетях) обмениваются hello-пакетами, чтобы отслеживать работоспособность связи.
Если линк - сеть широковещательная, такая как Ethernet LAN, то должны быть выбраны DR и BDR. В этом случае они сформируют отношения со всеми другими маршрутизаторами. Этот процесс должен выполниться до момента, когда маршрутизаторы начнут обмен link-state информацией.
Если маршрутизатор подключили к сети, в которой уже определены DR и BDR, то он будет в two-way состоянии со всеми маршрутизаторами (и с DR, BDR и DROTHER). Полную двухстороннюю связь (full) сформирует только с DR и BDR.
После выбора DR и BDR, маршрутизаторы переходят в состояние exstart - они готовы к обнаружению link-state информации о сети и созданию своих LSDB. Процесс, используемы для обнаружения сетевых маршрутов, называется протоколом обмена - соседи в full-state состоянии.
Хотя в hello-протоколе используются hello-пакеты (OSPF packet type 1), другие 4 типа пакетов используются в течении процесса обмена и синхронизации LSDB:
- OSPF packet type 2 DBD - используется для описания LSA, находящихся в LSDB (Elects master/slave for database exchange process).
- OSPF packet type 3 LSR - используется для запроса недостающей LSA информации (After DBD packets exchange process, the router may find it does not have an up-to-date database. The LSR packet is used to request pieces of neighbor database that is more up-to-date.)
- OSPF packet type 4 LSU - используется для отправки полных LSA (These packets implement the flooding of LSAs. Each LSA contains routing, metric and topology information to describe a portion of OSPF network. The local router advertises LSA within an LSU packet to its neighboring routers. In addition, the local router advertises the LSU packet with information in response to an LSR packet.)
- OSPF packet type 5 LSAck - используется для подтверждения LSU, для гарантированной доставки и информационного обмена (OSPF requires acknowledgment for the receipt of each LSA. Multiple LSAs can be acknowledged in a single LSAck packet.).
OSPF пакеты 4 и 5 типа рассылаются на мультикаст адрес OSPF, кроме моментов повторной пересылки, при пересылке через виртуальный канал (when sent accross a virtual link) и nonbroadcast networks. Все остальные типы пакетов рассылаются на юникаст адреса.
Процесс протокола обмена показан на рисунке выше. Первый шаг в этом процессе - установление соседства между DB и BDR с каждым из остальных маршрутизаторов. B выбран в качестве DR . Работа протокола обмена следущая:
- В neighbor exstart состоянии, отношения мастера и слейва создаются между каждым маршрутизаторам и его adjacent DR и BDR. Маршрутизатор, у которого самый высокий ID, выбирается мастером для процесса обмена.
Напоминаю, что только DR обменивается и синхронизирует link-state информацию с соседским маршрутизатором. Сделано это для сокращения трафика в сети.
- Мастер и слейв обмениваются одним или несколькими DBD пакетами (так же называемыми DDP). Маршрутизаторы в состояниии exchange.
DBD содержит информацию о заголовке записи LSA, который появляется в LSDB маршрутизатора. Запись может быть о линке или о сети. Каждый заголовок записи LSA содержит информацию о типе link-state, адресе анонсирующего маршрутизатора, стоимости линка и sequence номере. Маршрутизатор использует seq для контроля версий link-state информации.
- Когда маршрутизатор получает DBD, он выполняет следующие действия:
- Подтверждает получение DBD LSAck пакетом;
- Сравнивает информацию, которую он получил, с информацией, которая у него в базе LSDB. Если DBD содержит более современную link-state запись, маршрутизатор посылвает LSR другому маршрутизатору. В момент отправки LSR, маршрутизаторы находятся в состоянии loading.
- Другие маршрутизаторы отвечают полной информацией о запрашиваемой записи в LSU пакете. Опять, когда маршрутизатор получает LSU, он отправляет LSAck.
- Маршрутизатор добавляет новые link-state записи в свою LSDB.
После загрузки всех данных, в состоянии Loading, маршрутизаторы считаются полностью смежными (full). Соседние маршрутизаторы, находящиеся в состоянии full, не повторяют этот обмен, что описан выше, пока их состояние неизменно (т.е. пока состояние не поменяется с full на какое-либо другое). Маршрутизаторы должны быть в full-состоянии с соседом прежде, чем они смогут маршрутизировать трафик на интерфейсе. Напомню, что в широковещательной сети маршрутизатор имеет full-состояние только с DR и BDR, а с DROTHER'ами только 2Way. Сейчас всем маршрутизаторы в зоне имеют идентичные LSDB.
- Down — начальное состояние процесса обнаружения соседей. Это состояние указывает на то, что от соседей не была получена свежая информация. В NBMA сетях Hello-пакеты могут отправляться и соседям в состоянии Down, однако с меньшей частотой (PollInterval).
- Attempt — это состояние имеет смысл только для соседей, которые присоединены к NBMA сетям. Оно указывает на то, что от соседа не была получена свежая информация и что нужно сделать попытку связаться с соседом. Это делается путём отправки соседу сообщений Hello с промежутком времени HelloInterval (в Cisco в этом состоянии сообщения Hello отправляются каждый PollInterval. Имеет смысл для соседей в NBMA сетях, которые заданы командой neighbor).
- Init — состояние, в котором находится маршрутизатор, отправивший своему соседу hello и ожидающий от него ответного hello.
- Two-way — при получении ответных hello маршрутизатор должен увидеть в них свой RID в списке соседей. Если это так, то он устанавливает отношения и переходит в состояние two-way.
- Exstart — После выборов DR и BDR, между роутерами и DR, BDR начинается процесс обмена пакетами DBD (Database Descriptor) c информацией о состоянии каналов. В этом состоянии, роутеры и их DR и BDR устанавливают отношения master-slave . Роутер с самым большим Router ID (RID) становиться master и начинает обмен.
- Exchange — маршрутизаторы посылают друг другу database description пакеты (DDPs) с информацией о сетях, содержащихся в их собственной базе каналов (database).
- Loading — Если маршрутизатор видит, что части маршрутов нет в его topology table, он посылает сообщение типа LSR с перечислением тех сетей, по которым он хочет получить дополнительную информацию. Пока маршрутизатор находится в ожидании ответа в виде LSU сообщений, он пребывает в состоянии Loading.
- Full — Когда маршрутизатор получил всю информацию и database на обоих маршрутизаторах синхронизирована, оба маршрутизатора переходят в состояние fully adjacent.
OSPF Neighbor States
1. Down state.
Самое простое состояние, и не требует детального описания. В двух словах, это состояние, при котором не происходил обмен между соседними маршрутизаторами, маршрутизатор ожидает перехода в следующее состояние - Init State, состояние инициализации.
2. Init State.
В состоянии инициализации маршрутизатор OSPF посылает Hello пакеты для установки связи между соседними устройствами, по умолчанию каждые 10 секунд. Когда интерфейс получает Hello пакет, маршрутизатор переходит в состояние инициализации, другими словами, маршрутизатор "понимает" что на этом интерфейсе есть соседнее устройство.
3. Состояние двусторонней связи (Two-way).
Каждый маршрутизатор OSPF пытается установить связь со всеми своими соседями, это просиходит с помощью пакета Hello. В пакете Hello передается список всех известных соседних маршрутизаторов. Если маршрутизатор принимает пакет Hello и "видит" в этом пакете себя, то считается что состояние двусторонней связи установлено.
Данное состояние является базовым, но для совместного использования маршрутной инфомарцией этого недостаточно.
4. Состояние ExStart.
Для установки состояние ExStart использутеся пакет DBD (описание базы данных). Так же в этом состоянии "выясняется", какой из маршрутизаторов является ведущим (master), а какой ведомый (slave). Выбор осуществляется по ID маршрутизатора. Маршутизатор, у которого ID больше становится master. После того, как определены роли маршрутизаторов, маршрутизаторы переходят в следующее состояние - обмена.
5. Exchange
В состоянии Exchange, как видно из названия, происходит обмен информации о состоянии каналов. После получения маршрутизатором такой информации, маршрутизатор сравнивает с своей базой данных и если такая информация отсутсвует, то маршрутизатор запрашивает полную информацию о данном канале. Полный обмен информации происходит в следующем состоянии - Loading.
6. Loading или состояние загрузки.
В состоянии Exchange, маршрутизатор нашел информацию, которой нет в собственной базе данных, для получения полной информации об этом канале маршрутизатор посылает пакет-запрос LSR (Link State Request) соответсвующему соседу. Сосед отвечает пакетом LSU (Link State Update), в котором содержится полная информация о запрашиваемом канале. После получения пакета LSU, маршрутизатор должен подтвердить это соответсвующим пакетом (LSAck).
7. Full adjacency - Состояние полной смежности.
После загрузки всех данных, в состоянии Loading, маршрутизаторы считаются полностью смежными. Каждый маршрутизатор имеет свою таблицу смежных маршрутизаторов.
При прохождении всех этих состояний, в маршрутизаторе будет сформированы три базы данных.
1. База данных канального уровня. - в данной базе содержится вся информация о состоянии каналов всех маршрутизаторов, т.е. данная БД содержит общую топологию всей сети. Следует отметить, что все маршрутизаторы имеют одинаковую БД канального уровня.
2. База данных о смежных устройствах. - Список всех устройств, с которыми установлено двусторонние соединение.
3. Таблица маршрутизации. - Список маршрутов, который сформирован каждым маршрутизатором с помощью алгоритма SPF.