====== OSPF ======
основано на http://xgu.ru/wiki/OSPF
OSPF (**O**pen **S**hortest **P**ath **F**irst) — протокол (3его уровня) динамической маршрутизации
OSPFv2 работает поверх IP, а конкретно, он заточен только под IPv4
OSPFv3 не зависит от протоколов 3-го уровня и потому может работать с IPv6
===== Основы =====
==== Термины ====
* Канал/интерфейс (link/interface) — соединение маршрутизатора и одной из подключенных к нему сетей. При обсуждении OSPF термины интерфейс и канал (link) часто употребляются как синонимы
* Метрика (metric) — условный показатель расстояния до сети назначения
* Стоимость (cost) — условный показатель "стоимости" пересылки данных по каналу. В OSPF зависит от пропускной способности интерфейса (bandwidth)
* Автономная система (autonomous system) — группа маршрутизаторов, обменивающаяся маршрутизирующей информацией с помощью одного протокола маршрутизации (определение соответствует тому, как этот термин используется в протоколах IGP)
Базовые термины OSPF:
* Идентификатор маршрутизатора (router ID, RID) — уникальное 32-битовое число, которое уникально идентифицирует маршрутизатор в пределах одной автономной системы
* Зона (area) — совокупность сетей и маршрутизаторов, имеющих один и тот же идентификатор зоны
* Объявление о состоянии канала (link-state advertisement, LSA) — единица данных, которая описывает локальное состояние маршрутизатора или сети. Например, для маршрутизатора LSA включает описание состояния каналов и отношений соседства. Множество всех LSA, описывающих маршрутизаторы и сети, образуют базу данных состояния каналов (LSDB).
* База данных состояния каналов (link state database, LSDB) — список всех записей о состоянии каналов (LSA). Встречается также термин топологическая база данных (topological database), употребляется как синоним базы данных состояния каналов
Соседи OSPF:
* Соседи (neighbours) — два маршрутизатора, интерфейсы которых находятся в одном широковещательном сегменте (и на которых включен OSPF на этих интерфейсах)
* Отношения соседства (adjacency) — взаимосвязь между соседними маршрутизаторами, установленная с целью синхронизации информации
* Hello-протокол (hello protocol) — протокол, использующийся для установки и поддержания соседских отношений
* База данных соседей (neighbours database) — список всех соседей (также используется термин neighbour table)
Пакеты OSPF:
* Hello — пакеты, которые используются для обнаружения соседей, установки отношений соседства и мониторинга их доступности (keepalive)
* DBD — пакеты, которые описывают содержание LSDB
* LSR — пакеты, с помощью которых запрашивается полная информация об LSA, которых недостает в LSDB локального маршрутизатора
* LSU — пакеты, которые передают полную информацию, которая содержится в LSA
* LSAck — пакеты, с помощью которых подтверждается получение других пакетов
==== Описание работы протокола ====
- Включить OSPF на маршрутизаторе
- Маршрутизатор выбирает Router ID (уникальное имя маршрутизатора)
- Включить OSPF на интерфейсах (чтобы протокол знал о каких интерфейсах можно сообщать другим маршрутиазторам)
- Обнаружение соседей с помощью Hello-пакетов
- Маршрутизаторы обмениваются hello-пакетами через все интерфейсы, на которых активирован OSPF.
- Маршрутизаторы, которые находятся в одном широковещательном сегменте, становятся соседями, когда они приходят к договоренности об определенных параметрах, указанных в их hello-пакетах.
- Adjacency (отношения соседства, отношения смежности) это тип соседства между маршрутизаторами, по которому они синхронизируют LSDB. Установка этих отношений зависит от типа сети:
- Если маршрутизаторы находятся в сети с множественным доступом, они выбирают DR и выполняют синхронизацию LSDB с ним
- Если маршрутизаторы находятся в сети point-to-point, они приступают к синхронизации LSDB друг с другом
- Синхронизация LSDB. Происходит в несколько этапов. По сформированным отношениям соседства происходит обмен такими пакетами:
- DBD (краткое описание LSA в LSDB). С помощью этих пакетов маршрутизаторы сообщают друг другу о том, какую информацию они знают, в сокращенном виде
- LSR. После обмена DBD-пакетами, с помощью LSR маршрутизаторы запрашивают у соседа недостающую информацию
- LSU (содержит полное описание LSA). В ответ на LSR, который ему прислал сосед, маршрутизатор отправляет LSU, с полным описанием информации, которой не хватает у соседа
- LSAck. После получения LSU от соседа, маршрутизатор отправляет подтверждение, что он получил информацию
- Если оба маршрутизатора должны запросить друг у друга информацию, то эта процедура повторяется и в другую сторону.
- После этого, LSDB синхронизирована, а значит, полностью одинакова между соседями
- После синхронизации LSDB, маршрутизатор отправляет обновление далее, своим соседям в других широковещательных сегментах
- Рассылая объявления через зону, все маршрутизаторы строят идентичную LSDB
- Когда база данных построена, каждый маршрутизатор использует алгоритм SPF (shortest path first) для вычисления графа без петель, который будет описывать кратчайший путь к каждому известному пункту назначения с собой в качестве корня. Этот граф — дерево кратчайшего пути.
- Каждый маршрутизатор строит таблицу маршрутизации, основываясь на своем дереве кратчайшего пути.
===== Выбор Router ID =====
При запуске процесса OSPF на любом маршрутизаторе, обязательно должен быть выбран Router ID.
Router ID — это уникальное имя маршрутизатора, по которому он известен в AS.
В зависимости от реализации, Router ID может выбираться по-разному:
* минимальный IP-адрес или максимальный IP-адрес, который назначен на интерфейсах маршрутизатора
* также обычно есть способ задания Router ID вручную
* главное, чтобы Router ID был уникален в AS
После изменения Router ID, процесс OSPF должен быть перезагружен, а все LSA, которые сгенерировал этот маршрутизатор, должны быть удалены из AS, до перезагрузки.
===== Установка отношений соседства =====
Обнаружение соседей начинается после того как:
* протокол был включен глобально
* выбран Router ID
* OSPF включен на интерфейсах
Для обнаружения и мониторинга соседей используются сообщения Hello.
Процедура установки отношений соседства зависит от типа сети, в которой работает OSPF
==== Типы сетей, поддерживаемые протоколом OSPF ====
* Широковещательные сети со множественным доступом (broadcast): Ethernet
* Точка-точка (point-to-point): Туннели, T1, E1, PPP, HDLC, Frame-Relay P-to-P
* Нешироковещательные сети со множественным доступом (Non Broadcast Multiple Access, NBMA): Frame-Relay, ATM, X.25
В разных типах сетей работа OSPF отличается. В том числе отличается процесс установления отношений соседства и настройки протокола.
В реальной жизни, чаще всего используются два типа сетей:
* point-to-point
* broadcast
Для broadcast и nonbroadcast сетей (то есть, для сетей с множественным доступом), выбираются DR и BDR.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS age | Options | LS type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Любое LSA уникально идентифицируют 3 поля заголовка:
* LS type
* Link State ID
* Advertising Router
Так как может существовать несколько копий одного и того же LSA, необходимо определять какая из копий актуальна.
Это осуществляется с помощью анализа полей:
* LS age
* LS sequence number
* LS checksum
Описание полей заголовка LSA:
* LS age — время (в секундах) с момента генерации LSA
* Options — дополнительные опции, которые может поддерживать маршрутизатор. Это поле есть в пакетах hello, DBD, LSA. Согласно RFC 2328 могут быть установлены такие 5 битов:
* E-bit — указывает каким образом распространяются AS-external-LSA
* MC-bit — указывает соответствует ли IP multicast датаграмма спецификациям RFC 1584;
* N/P-bit — указывает как обрабатываются Type-7 LSA (RFC 1587);
* EA-bit — указывает желание маршрутизатора получать и отправлять External-Attributes-LSA;
* DC-bit — указывает как маршрутизатор работает с demand circuits (RFC 1793);
* LS type — тип LSA. У каждого типа LSA свой формат, который описан в соответствующем разделе
* Link State ID — о чем сообщает LSA. Содержание этого поля зависит от типа LSA. Значения поля для разных LSA описаны в соответствующих разделах
* Advertising Router — Router ID маршрутизатора, который сгенерировал LSA
* LS sequence number — версия LSA. Используется для обнаружения старых и дублирующихся LSA
* LS checksum — контрольная сумма, для проверки целостности. Контрольная сумма берется со всего LSA, кроме поля LS age
* Length — длина всего LSA (включая заголовок) в байтах
==== Type 1 LSA ====
**Type 1 LSA — Router LSA** — объявление о состоянии каналов маршрутизатора:
* LSA распространяются всеми маршрутизаторами.
* Распространяются только в пределах одной зоны.
В Router LSA содержится:
* описание всех каналов маршрутизатора
* стоимость (cost) каждого канала
* список соседей на каждом интерфейсе (в зоне маршрутизатора)
* Link-state ID — Router ID маршрутизатора, который отправляет LSA
LSA Type 1 link types и соответствующие link ID:
* Point-to-point соединение с другим маршрутизатором — Router ID соседа
* Соединение с тупиковой сетью (сеть, к которой присоединен только один маршрутизатор(локальный)) — сеть/маска
* Соединение с транзитной сетью (сеть, в которой есть как минимум два непосредственно присоединенных маршрутизатора) — IP-адрес DR
* Virtual link — Router ID соседа
==== Type 2 LSA ====
**Type 2 LSA — Network LSA** — объявление о состоянии каналов сети:
* Распространяется DR в сетях со множественным доступом
* Network LSA не создается для сетей в которых не выбирается DR
* Распространяются только в пределах одной зоны
* Link-state ID — IP-адрес интерфейса DR
В LSA содержится описание всех маршрутизаторов присоединенных к сети, включая DR и маска сети, за которую отвечает DR.
|<-------------------------- 32 бита --------------------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | Type | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Поля заголовка пакета OSPF:
* Версия протокола (Version number) — версия протокола OSPF. Текущая версия для IPv4 — 2.
* Тип пакета (Type) — указывает какой тип пакета OSPF передается:
* 1 — Hello
* 2 — Database Description
* 3 — Link State Request
* 4 — Link State Update
* 5 — Link State Acknowledgment
* Длина пакета (Packet length) — длина пакета OSPF в байтах. Длина включает в себя и заголовок.
* Идентификатор маршрутизатора (Router ID) — определяет какой маршрутизатор отправил пакет.
* Идентификатор зоны (Area ID) — определяет в какой зоне сгенерирован пакет.
* Контрольная сумма (Checksum) — используется для проверки целостности пакета OSPF, для обнаружения ошибок при передаче.
* Тип аутентификации (Authentication type) — тип аутентификации, который используется между маршрутизаторами:
* 0 — аутентификация не используется,
* 1 — аутентификация открытым текстом,
* 2 — MD5-аутентификация.
* Данные аутентификации (Authentication) — используется при аутентификации маршрутизаторов.
Поле "Данные" отличается для различных типов пакетов OSPF:
* Hello — список известных соседей
* DBD — содержит суммарную информацию базы данных состояний каналов, которая включает в себя все известные идентификаторы маршрутизаторов и их последние номера последовательностей (sequence number) и другую информацию.
* LSR — содержит тип необходимого LSU и идентификатор маршрутизатора, у которого есть этот LSU.
* LSU — содержит полные записи объявления о состоянии канала. Несколько LSA могут передаваться в одном пакете обновлений.
* LSAck — поле пустое
==== Hello ====
Hello-пакет используется для таких целей:
* С помощью него каждый маршрутизатор обнаруживает своих соседей;
* Он передает параметры о которых маршрутизаторы должны договориться прежде чем они станут соседями;
* Hello-пакеты выполняют роль keepalive-пакетов между соседями;
* Отвечает за установление двухсторонних коммуникаций между соседними маршрутизаторами (двухсторонняя коммуникация установлена тогда, когда маршрутизатор увидит себя в списке соседей hello-пакета полученного от соседнего маршрутизатора);
* Он выбирает DR и BDR в широковещательных и нешироковещательных сетях со множественным доступом.
Кроме стандартного заголовка пакета OSPF, в hello-пакете содержится такая информация:
|<-------------------------- 32 бита --------------------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 1 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HelloInterval | Options | Rtr Pri |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RouterDeadInterval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Backup Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
* Network mask — сетевая маска назначенная на интерфейсе с которого отправляется hello-пакет;
* HelloInterval — частота отправки hello-пакетов;
* Options — дополнительные опции, которые может поддерживать маршрутизатор. Это поле есть в пакетах hello, DBD, LSA. Согласно RFC 2328 могут быть установлены такие 5 битов:
* E-bit — указывает каким образом распространяются AS-external-LSA
* MC-bit — указывает соответствует ли IP multicast датаграмма спецификациям RFC 1584;
* N/P-bit — указывает как обрабатываются Type-7 LSA (RFC 1587);
* EA-bit — указывает желание маршрутизатора получать и отправлять External-Attributes-LSA;
* DC-bit — указывает как маршрутизатор работает с demand circuits (RFC 1793);
* Rtr Pri — приоритет маршрутизатора. Используется для выбора DR и BDR. Если приоритет установлен в 0, то маршрутизатор не может стать DR или BDR;
* RouterDeadInterval — интервал времени по истечению которого сосед будет считаться "мертвым";
* Designated Router — IP-адрес DR для сети в которую отправлен hello-пакет, с точки зрения отправляющего маршрутизатора. Поле установлено в значение 0.0.0.0, если в сети нет DR;
* Backup Designated Router — IP-адрес BDR для сети в которую отправлен hello-пакет, с точки зрения отправляющего маршрутизатора. Поле установлено в значение 0.0.0.0, если в сети нет BDR;
* Neighbor — идентификаторы всех маршрутизаторов от который маршрутизатор-отправитель получал hello-пакеты в течение последнего интервала RouterDeadInterval.
==== Database Description ====
DBD (Database Description) -- пакет, который описывает содержание LSDB маршрутизатора. Эти пакеты позволяют маршрутизаторам обменяться информацией о том, что они знают и чего недостает в их LSDB.
Кроме стандартного заголовка пакета OSPF, в DBD-пакете содержится такая информация:
|<-------------------------- 32 бита --------------------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 2 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Interface MTU | Options |0|0|0|0|0|I|M|MS
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DD sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+- -+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
* Interface MTU — максимальный размер IP-пакета, который можно отправить с соответствующего интерфейса без фрагментации
* Options — дополнительные опции, которые может поддерживать маршрутизатор. Это поле есть в пакетах hello, DBD, LSA. Согласно RFC 2328 могут быть установлены такие 5 битов:
* E-bit — указывает каким образом распространяются AS-external-LSA
* MC-bit — указывает соответствует ли IP multicast датаграмма спецификациям RFC 1584;
* N/P-bit — указывает как обрабатываются Type-7 LSA (RFC 1587);
* EA-bit — указывает желание маршрутизатора получать и отправлять External-Attributes-LSA;
* DC-bit — указывает как маршрутизатор работает с demand circuits (RFC 1793);
* I-bit — Init bit. Значение бита равное 1, означает, что этот пакет первый в последовательности DBD-пакетов
* M-bit — More bit. Значение бита равное 1, означает, что далее последуют дополнительные DBD-пакеты
* MS-bit — Master/Slave bit. Значение бита равное 1, означает, что маршрутизатор получил роль Master, в процессе обмена информацией в LSDB. Иначе, маршрутизатор Slave.
* DD sequence number — номер последовательности, который используется для нумерации наборов DBD-пакетов.
* Начальный номер должен быть уникальным (Init bit оповещает о начальном пакете и номер в этом пакете и есть начальный)
* В процессе обмена DBD-пакетами DD sequence number растет, пока не завершится описание LSDB
* LSA header — в этом поле передаются заголовки тех LSA, которые находятся в LSDB:
* Заголовка LSA достаточно, так как информации, которая передается в заголовке, достаточно чтобы уникально идентифицировать LSA
==== Link State Request ====
Запрос информации о состоянии канала. Этот тип пакетов запрашивает отдельные фрагменты базы данных состояния каналов маршрутизатора.
|<-------------------------- 32 бита --------------------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 3 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
==== Link State Update ====
|<-------------------------- 32 бита --------------------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 4 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| # LSAs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- +-+
| LSAs |
+- +-+
| ... |
==== Link State Acknowledgment ====
|<-------------------------- 32 бита --------------------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 5 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+- -+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
===== Выбор лучшего маршрута =====
Маршрутизатор выбирает лучший маршрут на основании наименьшего значения метрики. Однако OSPF учитывает и несколько других факторов при выборе маршрута.
==== Выбор лучшего типа маршрута ====
Если маршрутизатору известны маршруты к одной и той же сети, но эти маршруты разных типов, то маршрутизатор выбирает наиболее приоритетный тип маршрута и не учитывает стоимость маршрута.
Различные типы маршрутов, в порядке убывания приоритета:
* Внутренние маршруты зоны (intra-area)
* Маршруты между зонами (interarea)
* Внешние маршруты типа 1 (E1)
* Внешние маршруты типа 2 (E2)
Хотя стоимость маршрута E2 не меняется при передаче его по зонам (не добавляется стоимость пути к ASBR), при совпадении стоимости маршрутов E2 сравнивается стоимость пути к ASBR, который анонсирует маршрут.
==== Метрика OSPF ====
OSPF использует метрику, которая называется стоимость (cost). Стоимость сравнивается у маршрутов одного типа.
В RFC 2328 не описывается как именно должна рассчитываться стоимость (cost) интерфейса. Определен только диапазон значений: 1-65535. В мультивендорной среде на это стоит обратить внимание.
Пример (Cisco):
cost = reference bandwidth / link bandwidthReference bandwidth — пропускная способность, относительно которой вычисляется стоимость; по умолчанию 100Mb, но может быть изменена. Суммарная стоимость маршрута считается суммированием стоимости исходящих интерфейсов по пути передачи LSA. Для обозначения недоступной сети OSPF использует метрику 16777215 (2^24 — 1), которая считается недостижимой метрикой. ==== ABR Loop Prevention ==== Внутри зон OSPF использует логику link-state протокола, но между зонами он в некотором смысле работает как дистанционно-векторный протокол. При анонсировании в зону type 3 LSA передается информация о сети назначения, стоимости пути и ABR, через которого сеть достижима — параметры аналогичны дистанционно-векторным протоколам. OSPF не использует традиционные механизмы дистанционно-векторных протоколов для предотвращения петель. OSPF применяет ряд правил распространения LSA между зонами, что исключает возможность возникновения петель, но это может привести к тому, что передача данных будет не по лучшему пути. ==== Внешние маршруты ==== OSPF использует два типа маршрутов для описания сетей вне автономной системы: * Type 1 external routes (E1) * Type 2 external routes (E2) Type 1 external routes — к метрике внешнего маршрута добавляется стоимость пути к ASBR, который анонсирует этот маршрут. Используется, когда несколько маршрутизаторов анонсируют внешнюю сеть. Когда ABR передает type 5 LSA в другую зону, он создает type 4 LSA, которое указывает стоимость пути от этого ABR до ASBR, который создал type 5 LSA. Маршрутизатор (не ABR), который находится в разных зонах с ASBR, будет вычислять метрику внешнего маршрута E1 суммированием: * метрики внешнего маршрута из type 5 LSA, * стоимости пути к ASBR, которая анонсируется в type 4 LSA, * стоимости пути к ABR, который анонсировал type 4 LSA. Type 2 external routes (по умолчанию) — используется только стоимость внешнего маршрута и при передаче по сети стоимость не увеличивается. При получении type 5 LSA маршрутизаторы добавляют в таблицу маршрут во внешнюю сеть со стоимостью, указанной в type 5 LSA.