Facebook открыл наработки, связанные с платформой маршрутизации Open/R, которая изначально развивалась как распределённая система маршрутизации для динамически меняющихся беспроводных mesh-сетей, но затем была перенесена для других сетевых применений, включая опорную сеть Facebook Express Backbone. Код эталонной реализации Open/R написан на языке C++ и распространяется под лицензией MIT. Для определения RPC-вызовов используется язык описания интерфейсов Apache Thrift, а для обмена сообщениями между узлами — шина ZeroMQ.

Для управления доступен расширяемый CLI-интерфейс Breeze, написанный на языке Python. Для интеграции с централизованными системами управления трафиком предоставляется API, позволяющих внешним обработчикам получать сведения о состоянии линков или отслеживать обновления БД, например, получать информацию об изменении пропускной способности. Также доступен эмулятор для тестирования при помощи виртуальных сетей на базе Open/R, поддерживающий симуляцию различных видов сбоев, трафика и характеристик работы участков сети (возникновения потери пакетов, перегрузки, задержек, jitter и т.п.).

Протокол Open/R подходит для создания автономных сетевых решений с построением оптимальных маршрутов на основе построения реплицируемой базы данных о состоянии каналов. Open/R может применяться как альтернатива OSPF и IS-IS, легко адаптируемая для различных применений. Распределённая система маршрутизации является одним из таких применений. Вместо реализации собственных механизмов согласования соединений, оформления кадров и других низкоуровневых элементов протокола, в Open/R применяется идея задействования языка Thrift для кодирования всех связанных с Open/R сообщений и применения для их передачи уже проверенной временем библиотеки ZeroMQ, позволяющей использовать такие расширенные схемы, как издатель-подписчик.

Open/R также изначально спроектирован как универсальная платформа, не привязанная к конкретным аппаратным системам и маршрутизаторам. Логика построения маршрутов и обмена информацией с другими узлами полностью отделена от средств установки маршрутов через специальную прослойку (модуль Platform). В качестве основной платформы для Open/R применяется сетевое оборудование на базе открытой платформы FBOSS, такое как коммутаторы Wedge 100. При этом Open/R не зависит от ASIC и также может работать как поверх обычного сетевого стека Linux, так и с операционными системами Arista EOS и Juniper JunOS (QFX и PTX) через предоставляемый ими API на базе gRPC.

Элементы архитектуры Open/R:

  • KV-STORE — отвечает за ведение распределённого хранилища в формате ключ/значение (in-memory DB на базе CRDT), синхронизацию данных и репликацию состояния между узлами;
  • Spark — выполняет задачи обнаружение соседних узлов при помощи протокола Link-Local Multicast и обрабатывает сведения об активности соседей. Каждый Hello-пакет передаётся с указанием цифровой подписи узла, что позволяет проверить его достоверность;
  • LinkMonitor — выполняет мониторинг сетевых интерфейсов, обращаясь через прослойку Platform, а также управляет сеансами модуля Spark и транслирует выявленные соседние узлы в модуль
    KV-STORE (поддерживает локальную базу соседних линков и управляет сеансами с соседними узлами);

  • PrefixManager — решает задачи автоматического распределения сетевых префиксов;
  • Decision — вычисляет оптимальные маршруты и строит локальную таблицу маршрутизации на основе информации о топологии сети и базы префиксов, полученных из хранилища KV-STORE;
  • FIB — работает как прокси для программирования вычисленных маршрутов в фактическом системном окружении, обращаясь к нему через модуль Platform. Также занимается поддержанием базы состояний вычисленных маршрутов (forwarding state);
  • Platform — прослойка для низкоуровневого программирования маршрутизации и взаимодействия с сетевыми интерфейсами. Создаётся для каждой целевой аппаратной платформы и абстрагирует доступ к ней.

Основные возможности:

  • Первоочередная поддержка IPv6 и задействование возможностей IPv6 по привязке локальных адресов для автоматической настройки без необходимости явного задания сетевой конфигурации;
  • Полноценная поддержка маршрутизации IPv4 при необходимости;
  • Распределение сетевых префиксов и настройка IP-адресов для узлов самоорганизующихся динамических сетей (Ad hoc);
  • Возможность перезапуска без остановки работы и без нарушения процессов перенаправления трафика, что позволяет организовать применение обновлений на лету;
  • Поддержка подсоединения и вывода из сети узлов и линков;
  • Динамическое вычисление метрик RTT (время приема-передачи) и их уточнение через активные проверки;
  • Возможность установки собственных значений метрик, их статическая привязка или динамическое вычисление;
  • Быстрая конвергенция сети с применением счётчиков отсрочки (backoff) для сбойных линков или узлов;
  • Python-библиотека для взаимодействия со всеми основными процессами Open/R;
  • Возможность расширения платформы путём распространения любых видов дополнительной информации и изменения логики вычисления маршрута;
  • Непрерывный контроль работоспособности сети через отправку проверочных запросов;
  • Наличие API для интеграции с централизованными системами управления.