Не секрет, что OSPF – протокол маршрутизации типа link-state: он собирает информацию о топологии, строит соответствующий граф и вычисляет кратчайший путь с помощью алгоритма Дийкстры. Информация о топологии включает в себя то, что и так понадобилось бы даже для вычисления маршрута ручкой на бумаге: узлы, их интерфейсы и подсети, а также набор дополнительных технических примочек (например, флагов). Для организации этих данных OSPF использует структуру под названием LSA – link-state advertisement. Алгоритм SPF так же широко известен, задание по его реализации можно найти в программе любого современного технического вуза.

Роли LSA довольно подробно разобраны в разных источниках: router LSA описывает узлы графа, network LSA предназначен для широковещательных сегментов сети, summary LSA обеспечивает взаимодействие разных зон между собой… Однако собрать эти структуры данных воедино в целостный граф кажется мне достаточно нетривиальной задачей. Безусловно, RFC является источником абсолютного знания в такого рода вопросах, но лично мне сравнительно долго не удавалось его полноценно осознать. В этой статье я хотел бы поделиться своим представлением о назначении типов LSA, а также процессом построения графа на основе LSDB.

Тестовая топология представлена ниже:

Изображение 1. Топология
Изображение 1. Топология

В этот раз я бы хотел последовательно настраивать OSPF с нуля, чтобы отслеживать влияние каждого изменения на LSDB и граф сети. Предварительный конфиг включает в себя только адресацию (R5 приведён в качестве примера):

R5(config)#interface Loopback0
R5(config-if)# ip address 5.5.5.5 255.255.255.255
R5(config)#interface FastEthernet0/1
R5(config-if)# ip address 192.168.45.5 255.255.255.0
R5(config-if)# no shutdown

LSA1: router LSA

Чтобы построить граф, нужно определиться, с чём мы всё-таки имеем дело. Согласно RFC 2328 секции 2.1, OSPF оперирует направленным графом: узлы отражают подсети и маршрутизаторы, а ребра – соединения между ними. OSPF использует вес (cost) исходящего интерфейса в качестве веса ребра (секция  2.1.2), так что граф – направленный взвешенный.

Создадим первый узел, соответствующий R1:

R1(config)#router ospf 1
R1#show ip ospf database

            OSPF Router with ID (1.1.1.1) (Process ID 1)

В LSDB пока пусто, поскольку IOS требует хотя бы один активный с точки зрения OSPF интерфейс для инициализации процесса. Звучит разумно, однако такой подход не приближает нас к графу, который мог бы выглядеть так:

Изображение  2. LSA1, добавлен R1
Изображение 2. LSA1, добавлен R1

Порадуем IOS, добавив 1.1.1.1/32 в топологию:

R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#network 1.1.1.1 0.0.0.0 area 0
R1#
R1#show ip ospf database

            OSPF Router with ID (1.1.1.1) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         21          0x80000001 0x00D055 1

Мы получили свой первый LSA1. Перед тем, как разбираться непосредственно с его содержанием, обратимся к формату:

        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   |       1       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Link State ID                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     Advertising Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     LS sequence number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         LS checksum           |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |    0    |V|E|B|        0      |            # links            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                          Link ID                              |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Link Data                             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Type      |     # TOS     |            metric             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |      TOS      |        0      |          TOS  metric          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                          Link ID                              |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Link Data                             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |

Заголовок LSA1 позволяет построить узел графа, соответствующий маршрутизатору, на основании поля Link State ID или же Advertising Router. Остальная часть LSA1 посвящена описанию подсетей (узлы графа) и соединений (ребра графа). OSPF различает 4 типа соединений:

  1. точка-точка (point-to-point);

  2. промежуточные (transit);

  3. конечные (stub);

  4. виртуальные (virtual).

Посмотрим, к какому типу относится 1.1.1.1/32:

R1#show ip ospf database router 1.1.1.1

            OSPF Router with ID (1.1.1.1) (Process ID 1)

                Router Link States (Area 0)

  LS age: 55
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 1.1.1.1
  Advertising Router: 1.1.1.1
  LS Seq Number: 80000001
  Checksum: 0xD055
  Length: 36
  Number of Links: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 1.1.1.1
     (Link Data) Network Mask: 255.255.255.255
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

1.1.1.1/32 – это конечное соединение, которое обычно соответствует префиксам конечных устройств. На уровне графа такая подсеть представляет собой лист, т.к. в ней подразумевается отсутствие OSPF-соседей. Вершина графа соединена с одним узлом маршрутизатора двумя ребрами, соответствующими каждому направлению.

Изображение 3. LSA1, добавлено конечное соединение
Изображение 3. LSA1, добавлено конечное соединение

Конечное соединение содержит в себе всю необходимую информацию для построения соответствующей части графа: подсеть, маску и исходящий вес (входящий вес ребра всегда равен нулю). Узел-маршрутизатор описан в заголовке LSA1 (LSID); однако соединение одной подсети с разными маршрутизаторами также допустимо, что позволяет реализовать ECMP.

Следующий тип соединения – точка-точка: он описывает подключение к другому маршрутизатору OSPF. Включим OSPF на R2, чтобы установить соседство на соединении R1-R2, используя вышеупомянутый тип:

R1(config)#interface f0/1
R1(config-if)#ip ospf network point-to-point
R1(config-if)#ip ospf 1 area 0
R2(config)#router ospf 1
R2(config-router)#router-id 2.2.2.2
R2(config)#interface f0/1
R2(config-if)#ip ospf network point-to-point
R2(config-if)#ip ospf 1 area 0
R1#show ip ospf database

            OSPF Router with ID (1.1.1.1) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         41          0x8000001D 0x00B441 3
2.2.2.2         2.2.2.2         42          0x80000001 0x0055CC 2

Как и можно было ожидать, появился новый LSA1, описывающий R2. Обратите внимание на «странный» шаг изменения числа соединений: OSPF заработал на одном физическом интерфейсе, а число соединений увеличилось на 2 для каждого LSA1.

R1#show ip ospf database router 1.1.1.1

            OSPF Router with ID (1.1.1.1) (Process ID 1)

                Router Link States (Area 0)

  LS age: 283
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 1.1.1.1
  Advertising Router: 1.1.1.1
  LS Seq Number: 8000001D
  Checksum: 0xB441
  Length: 60
  Number of Links: 3

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 1.1.1.1
     (Link Data) Network Mask: 255.255.255.255
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 2.2.2.2
     (Link Data) Router Interface address: 192.168.12.1
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.12.0
     (Link Data) Network Mask: 255.255.255.0
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

Один интерфейс с назначенным IP-адресом порождает 2 сущности: конечное соединение (в конце концов там тоже могут находиться адресуемые извне устройства) и соединение типа точка-точка, которая соответствует ребру графа между вершинами-маршрутизаторами. Узел-сосед обозначен с помощью ссылки на его LSID, чтобы с помощью пары LSA1 корректно описать двустороннюю связность между вершинами. Такая связность критична для ребра между узлами, хотя вес каждого из направлений может быть разным. Адрес маршрутизатора-соседа так же включен в описание соединения, чтобы впоследствии его использовать для построения локальной таблицы маршрутизации.

Веса соединений оставлены по умолчанию, так что граф теперь выглядит следующим образом:

Изображение 4. LSA1, добавлено соединение типа точка-точка
Изображение 4. LSA1, добавлено соединение типа точка-точка

Виртуальное соединение выходит за рамки этой статьи, поскольку оно относится к ad-hoc инструментам для тушения пожаров, а не к проверенным решениям в рамках продуманного дизайна. Впрочем, эта любопытная сущность может представлять интерес и сама по себе, так что если вы хотите копнуть поглубже, обратите внимание на эту статью Петра Лапухова.

Остался последний тип соединений – промежуточный (не путать с transit capability!).

LSA2: network LSA

Соединения точка-точка описывают непосредственную связь между маршрутизаторами, без промежуточных устройств. Однако в общем виде это не обязательно верно: посередине может оказаться широковещательный (например, Ethernet) или NBMA (например, DMVPN) сегмент. Впрочем, последний случай обычно можно свести к набору соединений точка-точка, что соответствует логической топологии hub-and-spoke.

Широковещательная среда, напротив, требует другого подхода, т.к. использование соединений точка-точка было бы неэффективно. Возьмём в качестве примера L2-сегмент между R2, R3 и R4. Очевидно, что не существует ребра, которое соединяло бы больше двух вершин. Количество соединений точка-точка в такой среде растёт как O(n2), что выражается в низкой масштабируемости решения за счёт увеличения нагрузки на CPU и RAM.

Впрочем, оптимизация довольно проста: нужно всего лишь… (это не то, о чём вы подумали) использовать псевдоузел вместо L2-сегмента, который соединён с каждым маршрутизатором этого сегмента. Такой подход позволяет уменьшить число сессий OSPF с O(n2) до O(n), что в итоге повышает масштабируемость решения. Маршрутизатор, отвечающий за псевдоузел, называется designated router (DR); вершина графа, соответствующая псевдоузлу, описана с помощью LSA2; ребро графа между вершинами и псевдоузлом определено промежуточным соединением из LSA1 и содержанием LSA2.

Настроим OSPF на R2, R3 и R4, оставив настройки типа соединения без изменений (по умолчанию – промежуточное).

R2(config)#interface f0/0
R2(config-if)#ip ospf 1 area 0
R3(config)#router ospf 1
R3(config-router)#router-id 3.3.3.3
R3(config)#interface f0/0
R3(config-if)#ip ospf 1 area 0
R4(config)#router ospf 1
R4(config-router)#router-id 4.4.4.4
R4(config)#interface f0/0
R4(config-if)#ip ospf 1 area 0
R2#show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
3.3.3.3           1   FULL/BDR        00:00:38    192.168.234.3   FastEthernet0/0
4.4.4.4           1   FULL/DR         00:00:35    192.168.234.4   FastEthernet0/0
1.1.1.1           0   FULL/  -        00:00:35    192.168.12.1    FastEthernet0/1
R2#
R2#show ip ospf database

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         538         0x80000022 0x00AA46 3
2.2.2.2         2.2.2.2         116         0x80000008 0x005804 3
3.3.3.3         3.3.3.3         118         0x80000002 0x004228 1
4.4.4.4         4.4.4.4         117         0x80000002 0x00045D 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.234.4   4.4.4.4         117         0x80000001 0x00F0B8

Как мы видим, LSA2 действительно создан R4 (4.4.4.4), кто является DR на данный момент. Упрощённо процесс выбора DR можно описать так:

  1. составить список маршрутизаторов, участвующих в выборах (ненулевой приоритет);

  2. выбрать наибольший приоритет;

  3. выбрать наибольший RID.

Запасной DR (backup DR, BDR) проходит через тот же процесс согласования, что и DR, за одним важным исключением: избранный DR нельзя сместить до тех пор, пока не произойдёт отказ, тогда как роль BDR может переходить динамически к маршрутизатору с более приоритетными параметрами. DR отвечает за псевдоузел в графе, поэтому остальные участники сегмента синхронизуют с ним свои LSDB, что отражено в состоянии FULL между такими соседями. BDR ведёт себя точно так же, как и DR, кроме генерации LSA2, что позволяет снизить перебои маршрутизации при отказе DR.

Посмотрим вначале на LSA1:

R2#show ip ospf database router 2.2.2.2

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Router Link States (Area 0)

  LS age: 425
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 2.2.2.2
  Advertising Router: 2.2.2.2
  LS Seq Number: 8000000F
  Checksum: 0x4A0B
  Length: 60
  Number of Links: 3

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.234.4
     (Link Data) Router Interface address: 192.168.234.2
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 1.1.1.1
     (Link Data) Router Interface address: 192.168.12.2
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.12.0
     (Link Data) Network Mask: 255.255.255.0
      Number of MTID metrics: 0
       TOS 0 Metrics: 1

Наконец, мы получили промежуточное соединение. Как вы могли уже догадаться, DR ID равен LSID соответствующего LSA2, т.е. IP-адресу DR. Так же, как и соединения точка-точка, промежуточное соединение описывает IP-адрес и вес интерфейса. Однако этих данных из LSA1 недостаточно для полноценного построения графа, т.к. они описывают только одно ребро из двух. Кроме того, информация о подсети самого L2-сегмента тоже недоступна. Обратимся к формату LSA2:

        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  |      2        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Link State ID                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     Advertising Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     LS sequence number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         LS checksum           |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Network Mask                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Attached Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |

LSA2 содержит недостающие части картины: список соседних RID и маска подсети.

R2#show ip ospf database network

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Net Link States (Area 0)

  Routing Bit Set on this LSA in topology Base with MTID 0
  LS age: 459
  Options: (No TOS-capability, DC)
  LS Type: Network Links
  Link State ID: 192.168.234.4 (address of Designated Router)
  Advertising Router: 4.4.4.4
  LS Seq Number: 80000002
  Checksum: 0xEEB9
  Length: 36
  Network Mask: /24
        Attached Router: 4.4.4.4
        Attached Router: 2.2.2.2
        Attached Router: 3.3.3.3

Теперь у нас есть вся необходимая информация, чтобы расширить граф промежуточным сегментом:

Изображение 5. Добавлен LSA2
Изображение 5. Добавлен LSA2

Тут стоит отметить ещё пару моментов. Во-первых, вес ребра, исходящего из псевдоузла, всегда равен нулю и не вносит изменений в стоимость маршрута. Во-вторых, информация о подсети вшита в LSA2: маска указана в явном виде, а адрес подсети можно получить из LSID и длины самого префикса.

В качестве короткого отступления от основной темы хочу заметить, что принцип работы OSPF prefix suppression должен стать теперь очевидным:

  1. отсутствуют конечные соединения, создаваемые одновременно с соединениями точка-точка;

  2. промежуточные соединения включают маску /32 в LSA2 в качестве специального признака, по которому следует игнорировать такой маршрут; в худшем случае будет доступен только адрес DR, но не остальная подсеть.

LSA1 и LSA2 позволяют целиком построить граф для одной зоны. Однако в OSPF существуют такие понятия, как внешние и межзональные маршруты – ими мы и займёмся.

LSA5: AS-external LSA

Этот LSA относительно однозначен: он анонсирует внешнюю подсеть, маску и дополнительную информацию, которая может облегчить жизнь (а может и существенно её усложнить). Формат этой структуры следующий:

        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   |      5        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Link State ID                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     Advertising Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     LS sequence number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         LS checksum           |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Network Mask                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |E|     0       |                  metric                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      Forwarding address                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      External Route Tag                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |E|    TOS      |                TOS  metric                    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      Forwarding address                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      External Route Tag                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |

LSID равен подсети, маска и метрика явно указаны… Информации достаточно, чтобы построить вершину и соответствующие ребра, в целом ситуация похожа на конечные соединения из LSA1. Если есть желание узнать побольше о нюансах Forwarding address (FA), я бы посоветовал этот блог и ссылки в начале на другие статьи. Они посвящены LSA5 FA и соответствующим спецэффектам, которые в определённый момент могут оказаться полезными. Для остальных полей LSA5 описания из RFC 2338 секция A.4.5 более чем достаточно.

В нашей схеме R3 генерирует LSA5, добавляя адреса подключенных сетей (в нашем случае – это loopback 0) в OSPF:

R3(config)#router ospf 1
R3(config-router)#redistribute connected subnets
R3#
R3#show ip ospf database

            OSPF Router with ID (3.3.3.3) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         441         0x80000025 0x00A449 3
2.2.2.2         2.2.2.2         962         0x80000011 0x00460D 3
3.3.3.3         3.3.3.3         23          0x80000009 0x003A27 1
4.4.4.4         4.4.4.4         1085        0x8000000A 0x00F365 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.234.4   4.4.4.4         835         0x80000004 0x00EABB

                Type-5 AS External Link States

Link ID         ADV Router      Age         Seq#       Checksum Tag
3.3.3.3         3.3.3.3         2           0x80000001 0x000385 0
R3#
R3#show ip ospf database external

            OSPF Router with ID (3.3.3.3) (Process ID 1)

                Type-5 AS External Link States

  LS age: 38
  Options: (No TOS-capability, DC, Upward)
  LS Type: AS External Link
  Link State ID: 3.3.3.3 (External Network Number )
  Advertising Router: 3.3.3.3
  LS Seq Number: 80000001
  Checksum: 0x385
  Length: 36
  Network Mask: /32
        Metric Type: 2 (Larger than any link state path)
        MTID: 0
        Metric: 20
        Forward Address: 0.0.0.0
        External Route Tag: 0

Стоит помнить, что LSA5 распространяется по всей автономной системе OSPF, а не только в одной зоне. Чтобы продолжить граф, нужна информация о вершине (LSA5 LSID), ребре (Advertising Router) и весе ребра:

Изображение 6. Добавлен LSA5
Изображение 6. Добавлен LSA5

Это всё про роль LSA5 в построении графа. Почти всё.

LSA3: summary LSA

Переключимся пока на межзональную связность. Первое впечатление обманчиво: этот LSA не имеет никакого отношения к суммаризации префиксов в обычном смысле. Он предназначен для суммаризации информации о топологии при передаче из одной зоны в другую: LSA1 и LSA2, используемые для построения графа, не переходят между зонами, а превращаются в LSA3 на основе LSDB или RIB (об этом чуть позже). Формат LSA3 выглядит так:

        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   |       3       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Link State ID                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     Advertising Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     LS sequence number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         LS checksum           |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Network Mask                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |      0        |                  metric                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     TOS       |                TOS  metric                    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |

Идея похожа на задумку с LSA5: передать подсеть (LSA3 LSID), маску и метрику в другую зону. Передача информации о топологии между зонами не происходит, чтобы сэкономить вычислительные ресурсы маршрутизаторов и сделать сеть более масштабируемой. Таким образом, OSPF с использованием нескольких зон ведёт себя, как distance-vector (DV) протокол маршрутизации. Такое поведение является причиной, по которой некоторые авторы относят OSPF к гибридным протоколам маршрутизации (EIGRP же является DV-протоколом в чистом виде, хотя и весьма технологичным). Логика DV обычно включает в себя какой-нибудь механизм защиты от петель маршрутизации, например, расщепление горизонта (split horizon), DUAL и так далее. OSPF же использует совершенно иной подход: LSA3 может пересечь границу зоны только в том случае, если одна из зон является зоной 0 (она же – опорная, backbone). Это позволяет построить дерево высотой, равной 2: зона 0 является корнем, тогда как остальные зоны находятся на следующем уровне после зоны 0. Очевидно, что в такой схеме петли маршрутизации невозможны, поскольку существует только один путь – через опорную зону.

Настроим зону 1 на R4 и R5:

R4(config)#interface f0/1
R4(config-if)#ip ospf 1 area 1
R4(config-if)#ip ospf network point-to-point
R5(config)#router ospf 1
R5(config-router)#router-id 5.5.5.5
R5(config)#intreface f0/1
R5(config-if)#ip ospf 1 area 1
R5(config-if)#ip ospf network point-to-point
R5(config)#interface lo 1
R5(config-if)#ip address 5.5.5.5 255.255.255.255
R5(config-if)#ip ospf 1 area 1
R5(config)#interface lo 2
R5(config-if)#ip address 5.5.5.55 255.255.255.255
R5(config-if)#ip ospf 1 area 1
R2#show ip ospf database

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         782         0x80000027 0x00A04B 3
2.2.2.2         2.2.2.2         1339        0x80000013 0x00420F 3
3.3.3.3         3.3.3.3         422         0x8000000B 0x003629 1
4.4.4.4         4.4.4.4         252         0x8000000D 0x00F064 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.234.4   4.4.4.4         1235        0x80000006 0x00E6BD

                Summary Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
5.5.5.5         4.4.4.4         170         0x80000001 0x003ED8
5.5.5.55        4.4.4.4         156         0x80000001 0x00489C
192.168.45.0    4.4.4.4         242         0x80000001 0x00781D

                Type-5 AS External Link States

Link ID         ADV Router      Age         Seq#       Checksum Tag
3.3.3.3         3.3.3.3         422         0x80000003 0x00FE87 0

Как и следовало ожидать, префиксы из зоны 1 видны в виде LSA3. R4, будучи ABR, является advertising router. С точки зрения зоны 0 все такие префиксы подключены напрямую к R4, что позволяет скрыть детали топологии зоны 1.

R2#show ip ospf database summary adv-router 4.4.4.4

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Summary Net Link States (Area 0)

  Routing Bit Set on this LSA in topology Base with MTID 0
  LS age: 823
  Options: (No TOS-capability, DC, Upward)
  LS Type: Summary Links(Network)
  Link State ID: 5.5.5.5 (summary Network Number)
  Advertising Router: 4.4.4.4
  LS Seq Number: 80000001
  Checksum: 0x3ED8
  Length: 28
  Network Mask: /32
        MTID: 0         Metric: 2

  Routing Bit Set on this LSA in topology Base with MTID 0
  LS age: 809
  Options: (No TOS-capability, DC, Upward)
  LS Type: Summary Links(Network)
  Link State ID: 5.5.5.55 (summary Network Number)
  Advertising Router: 4.4.4.4
  LS Seq Number: 80000001
  Checksum: 0x489C
  Length: 28
  Network Mask: /32
        MTID: 0         Metric: 2

  Routing Bit Set on this LSA in topology Base with MTID 0
  LS age: 895
  Options: (No TOS-capability, DC, Upward)
  LS Type: Summary Links(Network)
  Link State ID: 192.168.45.0 (summary Network Number)
  Advertising Router: 4.4.4.4
  LS Seq Number: 80000001
  Checksum: 0x781D
  Length: 28
  Network Mask: /24
        MTID: 0         Metric: 1

Теперь у нас достаточно опыта, чтобы построить граф зоны 1 на основе LSDB, поэтому далее мы сконцентрируемся только на мнении зоны 0 о том, как выглядит OSPF AS.

Изображение 7. Добавлен LSA3
Изображение 7. Добавлен LSA3

Осталось только проверить, что именно является причиной создания LSA3. Удалим 5.5.5.55/32 из таблицы маршрутизации R4 и пронаблюдаем, останется ли этот маршрут в зоне 0, отсутствуя при этом в RIB на ABR.

R4(config)#ip prefix-list FILTER deny 5.5.5.55/32
R4(config)#ip prefix-list FILTER permit 0.0.0.0/0 le 32
R4(config)#router ospf 1
R4(config-router)#distribute-list prefix FILTER in
R4#
R4# show ip route ospf
<output omitted>

      1.0.0.0/32 is subnetted, 1 subnets
O        1.1.1.1 [110/3] via 192.168.234.2, 00:00:05, FastEthernet0/0
      3.0.0.0/32 is subnetted, 1 subnets
O E2     3.3.3.3 [110/20] via 192.168.234.3, 00:00:05, FastEthernet0/0
      5.0.0.0/32 is subnetted, 1 subnets
O        5.5.5.5 [110/2] via 192.168.45.5, 00:00:05, FastEthernet0/1
O     192.168.12.0/24 [110/2] via 192.168.234.2, 00:00:05, FastEthernet0/0
R2#show ip ospf database

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         228         0x80000028 0x009E4C 3
2.2.2.2         2.2.2.2         804         0x80000014 0x004010 3
3.3.3.3         3.3.3.3         1868        0x8000000B 0x003629 1
4.4.4.4         4.4.4.4         1697        0x8000000D 0x00F064 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.234.4   4.4.4.4         653         0x80000007 0x00E4BE

                Summary Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
5.5.5.5         4.4.4.4         1615        0x80000001 0x003ED8
5.5.5.55        4.4.4.4         1602        0x80000001 0x00489C
192.168.45.0    4.4.4.4         1688        0x80000001 0x00781D

                Type-5 AS External Link States

Link ID         ADV Router      Age         Seq#       Checksum Tag
3.3.3.3         3.3.3.3         1868        0x80000003 0x00FE87 0
R2#
R2#show ip route ospf
<output omitted>

      1.0.0.0/32 is subnetted, 1 subnets
O        1.1.1.1 [110/2] via 192.168.12.1, 06:10:34, FastEthernet0/1
      3.0.0.0/32 is subnetted, 1 subnets
O E2     3.3.3.3 [110/20] via 192.168.234.3, 01:37:25, FastEthernet0/0
      5.0.0.0/32 is subnetted, 2 subnets
O IA     5.5.5.5 [110/3] via 192.168.234.4, 00:26:58, FastEthernet0/0
O IA     5.5.5.55 [110/3] via 192.168.234.4, 00:26:44, FastEthernet0/0
O IA  192.168.45.0/24 [110/2] via 192.168.234.4, 00:28:10, FastEthernet0/0

Согласно RFC 2328 части 12.4.3, LSA3 маршруты нужно создавать на основе таблицы маршрутизации (“determined by examining the routing table structure”). Очевидно, что отсутствие 5.5.5.55/32 в RIB R4 не помешало IOS создать соответствующий LSA3 и отправить его в зону 0. В отличие от DV-протоколов, OSPF не предусматривает механизмов фильтрации маршрутов в произвольной точке сети, поэтому использование такой функции, как distribute-list in, не является в общем случае хорошей затеей.

LSA4: ASBR-summary LSA

Как вы уже могли догадаться, LSA4 суммаризует информацию об ASBR. Не забыли, что LSA5 расходится по всей AS? LSA могут быть изменены только их создателем, это сделано для того, чтобы обеспечить целостность LSDB внутри зоны. Если ASBR расположен в другой зоне, информации для создания вершины, соответствующей LSA5, недостаточно, так как LSID маршрутизатора-создателя в текущей зоне неизвестен. Задача LSA4 – исправить это недоразумение. У него такой же формат, как и у LSA3:

        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   |       4       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Link State ID                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     Advertising Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     LS sequence number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         LS checksum           |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Network Mask                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |      0        |                  metric                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     TOS       |                TOS  metric                    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |

Разница заключается в значении, придаваемом полю LSID: LSA3 в этом поле несёт номер подсети, тогда как LSA4 помещает туда RID ASBR’а. Создадим LSA5 в зоне 1 и проверим, как это отразится на опорной зоне.

R5(config)#router ospf 1
R5(config-router)#redistribute connected subnets
R2#show ip ospf database

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         1561        0x80000028 0x009E4C 3
2.2.2.2         2.2.2.2         112         0x80000015 0x003E11 3
3.3.3.3         3.3.3.3         1180        0x8000000C 0x00342A 1
4.4.4.4         4.4.4.4         1221        0x8000000E 0x00EE65 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.234.4   4.4.4.4         1986        0x80000007 0x00E4BE

                Summary Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
5.5.5.5         4.4.4.4         960         0x80000002 0x003CD9
5.5.5.55        4.4.4.4         960         0x80000002 0x00469D
192.168.45.0    4.4.4.4         960         0x80000002 0x00761E

                Summary ASB Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
5.5.5.5         4.4.4.4         10          0x80000001 0x0026F0

                Type-5 AS External Link States

Link ID         ADV Router      Age         Seq#       Checksum Tag
3.3.3.3         3.3.3.3         1180        0x80000004 0x00FC88 0
6.6.6.6         5.5.5.5         16          0x80000001 0x00E997 0

LSA4 могут быть созданы только ABR’ами, когда они передают LSA5 из одной зоны в другую. В нашем случае передача 6.6.6.6/32 из зоны 1 в опорную зону заставляет R4 сгенерировать LSA4, соответствующий R5.

R2#show ip ospf database asbr-summary

            OSPF Router with ID (2.2.2.2) (Process ID 1)

                Summary ASB Link States (Area 0)

  Routing Bit Set on this LSA in topology Base with MTID 0
  LS age: 144
  Options: (No TOS-capability, DC, Upward)
  LS Type: Summary Links(AS Boundary Router)
  Link State ID: 5.5.5.5 (AS Boundary Router address)
  Advertising Router: 4.4.4.4
  LS Seq Number: 80000001
  Checksum: 0x26F0
  Length: 28
  Network Mask: /0
        MTID: 0         Metric: 1

Помимо ASBR ID, LSA4 также несёт в себе метрику до ASBR с точки зрения ABR. Теперь не составляет труда смоделировать узел из другой зоны, создавший LSA5, что позволяет достроить граф, описывающий AS целиком.

Изображение 8. Добавлен LSA4
Изображение 8. Добавлен LSA4

LSA 6, 7 и ко

За рамками основной статьи остались несколько LSA, которые я бы хотел кратко описать в этом разделе. Некоторые из них в определённой степени модифицируют алгоритм OSPF; однако эти метаморфозы, подчас существенные, не меняют кардинальным образом основных принципов построения графа, поэтому детальное обсуждение этих LSA – тема отдельных статей.

LSA6 выделен для multicast OSPF, который устарел чуть больше, чем полностью.

LSA7 – это костыль, позволяющий создавать внешние префиксы в тупиковых (stub) зонах, превращая их в NSSA (no-so-stubby – не-такая-уж-тупиковая, звучит!). Если от FA в LSA5 у вас мурашки по коже, то LSA7 заставляет встать дыбом волосы в самых неожиданных местах.

LSA8 был предназначен для расширения функциональности LSA5 за счёт дополнительных атрибутов, однако так и не выбрался из состояния черновика.

LSA9 (link-local), 10 (area-local) and 11 (AS-local) являются opaque LSAs. Они несут дополнительную информацию, которую активно использует SPF с условиями (constrained SPF) для расчётов туннелей MPLS TE.

Спасибо за рецензию: Анастасии Куралёвой

Комментарии (5)


  1. ZiggiPop
    01.04.2022 17:57
    +2

    Про КДПВ. Тот случай, когда пытаешься поехать «на Берлин», а попадаешь в «город Ч».

    Ну серьезно, эти «шутки» до сих пор актуальны?


  1. Tuxman
    02.04.2022 06:29

    Кажется ошибка: SFP --> SPF (Shortest Path First)


    1. braonle Автор
      02.04.2022 08:32

      Да, именно так. Поправил, спасибо.


  1. kterik
    02.04.2022 21:07

    Хочу задать вопрос про построение «опорной» маршрутизации между большим количеством узлов (более ста), если связи между этими узлами никак не укладываются в схему «звезда». Особенно если в центре сети стоит не один маршрутизатор, а два (с целью резервирования). Особенно если в перспективе может появиться ещё пара десятков узлов с разнообразными связями между ними.

    Цель этой «опорной» маршрутизации — послужить основой для построения MPLS сети, с L3VPN и прочими радостями. В сеть анонсируются только loopback интерфейсы маршрутизаторов, применяются только point-to-point линки.

    При простом растягивании одной зоны OSPF на все узлы разбухает база LSDB, возникает перегрузка на некоторых (слабых) узлах при частом перестроении этой базы из-за флапающего в глубинке линка.

    При попытке поделить сеть на несколько зон получается странное поведение трафика, который начинает ходить по плохо предсказуемым путям (наблюдалось на устройствах Mikrotik). Возможно, из-за тонких нюансов протокола OSPF.

    Каким путём можно идти, желая сделать более надёжной и масштабируемой такую «опорную» маршрутизацию?


    1. braonle Автор
      02.04.2022 21:40

      Мне кажется, самое правильное решение - разобраться с multiarea, всё-таки это механизм, который предусмотрен именно для масштабирования.

      Если нужен более простой вариант в рамках одной зоны, то можно использовать incremental SPF, prefix-suppression, LSA throttling, SPF throttling в зависимости от того, что умеет коробка. Ну и замена слабых устройств - тоже рабочий вариант.

      Если хочется красивого и сложного решения, посмотрите на EPN 4.0, когда сайт закончит формирование. Технология называется Unified MPLS, более-менее описана в гайде для 5.0, если исключить часть про контроллеры. Можно собрать лабу, также есть гайд. Вкратце - нужно использовать BGP labeled unicast.