o Бит Е установлен, маршрутизатор может принимать и объявлять внешние маршруты через данный интерфейс; сброшен, данный интерфейс маршрутизатора принадлежит тупиковой области.
o Бит MCустановлен, маршрутизатор поддерживает маршрутизацию мультикастинговых дейтаграмм (RFC 1584).
o Бит N/Pустановлен, данный интерфейс маршрутизатора принадлежит не совсем тупиковой области (NSSA).
o Бит EA установлен, маршрутизатор может получать и ретранслировать объявления о «внешних атрибутах» (к настоящему моменту описание опции не разработано).
o Бит DCустановлен, маршрутизатор поддерживает работу с соединениями, устанавливаемыми по требованию (demandcircuits, RFC 1793) – это, например, означает, что записи о связях, устанавливаемых по требованию, не устаревают.
o Поле «Options» используется для согласования возможностей маршрутизаторов-соседей (маршрутизатор может прервать соседские отношения, если какие-то опции соседа его не устраивают) и для определения того, какую информацию о состоянии связей не нужно посылать маршрутизатору-соседу, потому что он все равно не сможет ее обработать.
· Priority (1 октет) – приоритет маршрутизатора; устанавливается администратором, используется при выборах выделенного маршрутизатора; маршрутизатор с нулевым приоритетом никогда не будет избран.
· DeadInterval(4 октета) – время в секундах, по истечении которого маршрутизатор-сосед, не посылающий сообщения Hello, считается отключенным.
· DesignatedRouter (DR) (4 октета) – идентификатор выделенного маршрутизатора с точки зрения маршрутизатора, посылающего сообщение (0, если выделенный маршрутизатор еще не выбран).
· BackupDesignatedRouter (BDR) (4 октета) – идентификтор запасного выделенного маршрутизатора с точки зрения маршрутизатора, посылающего сообщение (0, если запасной выделенный маршрутизатор еще не выбран).
· Neighbor,…, Neighbor– список идентификаторов соседей, от которых получены Hello‑сообщения за последние DeadInterval секунд; число полей «Neighbor» определяется из общей длины сообщения, указанной в OSPF‑заголовке. Длина одного поля – 4 октета.
После того, как пара маршрутизаторов начинает обмениваться Hello‑сообщениями с каким-то соседом, этот процесс проходит через несколько стадий:
· DOWN– сосед не обнаружен или отключился;
· INIT– послано Hello‑сообщение или получено от маршрутизатора, еще не зачисленного в список соседей;
· 2‑WAY (двусторонняя связь) – получено Hello‑сообщение, в котором данный маршрутизатор-получатель перечислен в списке соседей, а отправитель этого сообщения также зачислен в список соседей данного маршрутизатора;
· WAIT– ожидание в течение DeadInterval секунд для обнаружения всех соседей; в это время маршрутизатор передает Hello‑сообщения, но не участвует в выборах выделенного маршрутизатора и в синхронизировании баз данных;
· EXSTART– установление ролей главный / подчиненный и инициализация структур данных для обмена описаниями баз данных (протокол обмена);
· EXCHANGE– обмен описаниями баз данных (протокол обмена);
· LOADING– синхронизация баз данных, пересылка сообщений-запросов о состояниях связей и ответов на них (протокол обмена);
· FULL– базы данных синхронизированы.
Каждый маршрутизатор самостоятельно производит выборы выделенного и запасного выделенного маршрутизаторов на основании имеющихся у него данных о соседях и о том, кого каждый из соседей назначил на эту роль. Фактически процесс выборов происходит постоянно, после получения каждого Hello‑сообщения, но алгоритм гарантирует, что при стабильном состоянии сети всеми маршрутизаторами будут выбираться одни и те же DR и BDR.
Каждый маршрутизатор может объявить себя либо выделенным, либо запасным, поместив свой идентификатор в соответствующее поле своих Hello‑сообщений. Иначе он может поместить туда адреса других маршрутизаторов, если он считает их занимающими соответствующие роли. Если маршрутизатор не определился с выбором DR и (или) BDR (например, после включения), он заполняет соответствующие поля нулями.
Выбор проводится только среди соседей, с которыми установлена двусторонняя связь и приоритет которых не равен нулю; в этот список маршрутизатор включает и себя, если его приоритет не нулевой.
Итак, после получения очередного Hello‑сообщения маршрутизатор приступает к выбору DR и BDR. Он помнит мнения своих соседей по поводу того, кто является DR и BDR, которые он узнал из получаемых Hello‑сообщений, а также свой собственный предыдущий выбор.
Сначала выбирается BDR, на эту должность назначается маршрутизатор с наивысшим приоритетом из всех, объявивших себя в качестве BDR, при этом маршрутизаторы, объявившие себя в качестве DR, не рассматриваются. Если никто не объявил себя в качестве BDR, выбирается маршрутизатор с высшим приоритетом из тех, кто не объявил себя в качестве DR. В случае равных приоритетов выбирается маршрутизатор с большим идентификатором.
На должность DR выбирается маршрутизатор с наивысшим приоритетом из всех, объявивших себя в качестве DR. В случае равных приоритетов выбирается маршрутизатор с большим идентификатором.
Если никто не предложил себя в качестве DR, в поле «DesignatedRouter» заносится идентификатор BDR.
Если маршрутизатор только что выбрал себя на роль DR или BDR или только что потерял статус DR или BDR, шаги 1–3 повторяются. Термин «только что» означает «в результате выполнения непосредственно предшествующих шагов 1–3, а не предыдущих итераций алгоритма».
После выбора DR и BDR маршрутизатор сообщает их идентификаторы в своих Hello‑сообщениях. Если в результате процедуры выбора DR или BDR изменились по сравнению с предыдущим выбором данного маршрутизатора, он устанавливает необходимые отношения смежности, если они еще не были установлены, и разрывает ненужные больше отношения смежности, если таковые имеются.
Когда маршрутизатор подключается к сети, сначала он достигает состояния 2‑WAY со всеми своими соседями, а потом, прежде чем приступать к выборам, ожидает время WAIT. В течение этого времени он передает Hello‑сообщения с обнуленными полями DR и BDR. После истечения периода WAIT вновь подключившийся маршрутизатор может предлагать себя на роль BDR, производить выборы и формировать отношения смежности.
После установления отношений смежности для каждой пары смежных маршрутизаторов происходит синхронизация их баз данных. Эта же операция происходит при восстановлении ранее разорванного соединения, поскольку в образовавшихся после аварии двух изолированных подсистемах базы данных развивались независимо друг от друга. Синхронизация баз данных происходит с помощью протокола обмена (Exchange protocol).
Сначала маршрутизаторы обмениваются только описаниями своих баз данных (Database Description), содержащими идентификаторы записей и номера их версий, это позволяет избежать пересылки всего содержимого базы данных, если требуется синхронизировать только несколько записей.
Во время этого обмена каждый маршрутизатор формирует список записей, содержимое которых он должен запросить (то есть эти записи в его базе данных устарели либо отсутствуют), и соответственно отправляет пакеты запросов о состоянии связей (Link State Request). В ответ он получает содержимое последних версий нужных ему записей в пакетах типа «Обновление состояния связей (Link State Update)».
После синхронизации баз данных производится построение маршрутов.
Значения полей:
· Options (1 октет) – то же, что и в сообщениях Hello.
· IMMS (3 бита) – последние 3 бита октета, следующего за полем «Options»: I – Initialize, бит 5; M – More, бит 6, MS – Master/Slave, бит 7. Использование этих бит будет описано ниже. Остальная часть октета, где находятся эти биты, обнулена.
· DD Sequence number (DDSN) (4 октета) – порядковый номер данного сообщения.
· LSA Header (20 октетов) – описание (набор идентификаторов) записи из базы данных состояния связей, представляющее собой заголовок «Объявления о состоянии связей». В сообщении может присутствовать несколько описаний (полей «LSA Header»), следующих друг за другом; их число определяется из общей длины сообщения, указанной в OSPF заголовке.
Обмен сообщениями «Описание базы данных» происходит при работе протокола обмена (Exchange protocol) между двумя смежными маршрутизаторами. Обмен начинается с выяснения, кто из двух маршрутизаторов будет играть главную роль, а кто подчиненную.
Маршрутизатор, желающий начать обмен на правах главного, отправляет пустое сообщение с установленными битами IMMS и произвольным, но не использованным в обозримом прошлом номером DDSN (предлагается использовать время суток). Второй маршрутизатор подтверждает, что согласен играть подчиненную роль: он отправляет обратно также пустое сообщение с тем же DDSN, c установленными битами I и M и сброшенным битом MS.
Если же оба маршрутизатора одновременно решили начать процедуру обмена, то маршрутизатор, получивший в ответ на свое сообщение о начале обмена сообщение второго маршрутизатора о начале обмена вместо подтверждения подчиненной роли, сравнивает адрес второго маршрутизатора со своим. Если свой адрес меньше, маршрутизатор принимает подчиненную роль и отправляет соответствующее подтверждение, иначе принятое сообщение игнорируется.
После того, как роли распределены, начинается обмен описаниями базы данных. Главный отправляет подчиненному сообщения с описаниями своей базы данных; номера DDSN увеличиваются с каждым сообщением, бит I сброшен, бит МS установлен, бит M установлен во всех сообщениях, кроме последнего.