Архитектура модульных устройств

В сетях датацентров долгое время правили огромные монстры размером со стойку - модульные коммутаторы с высокой плотностью портов. Сегодня они уступают место многоуровневым IP-фабрикам, собранным из одноюнитовых одночиповых коробок. Но такие шкафы никуда не уходят с роли бордеров и из сетей операторов. Поэтому мы разберём и их устройство. Тем более, что некоторые вещи будут актуальны и для коммутаторов попроще.

Для этой модели возьмём модульное шасси, состоящее из общей шины, интерфейсных и управляющих модулей и фабрики коммутации.


Общая шина

Общая шина (она же Back Plane, она же Midplane) устройства, связывающая друг с другом все модули. Обычно, это просто батарея медных контактов без каких-либо микросхем.

https://fs.linkmeup.ru/images/articles/buffers/backplane.png
https://fs.linkmeup.ru/images/articles/buffers/backplane_pins.jpg

Так выглядит задняя часть платы, которая вставляется в шину

https://fs.linkmeup.ru/images/articles/buffers/backplane_juniper.jpg

Так выглядит общая шина Juniper

https://fs.linkmeup.ru/images/articles/buffers/backplane_huawei.jpg

Так выглядит общая шина Huawei

Вот эти две полоски посередине, набитые медными контактами - слоты для фабрик коммутации.

Управляющий модуль

https://fs.linkmeup.ru/images/articles/buffers/control_plane_module.png
На нём расположены CPU, оперативная память, постоянная память для хранения ПО, конфигурации и логов, интерфейсы для управления.
Он отвечает за Management Plane и за Control Plane.
С ним мы работаем, когда подключаемся к устройству по telnet/ssh.
Он загружает ПО в оперативную память и запускает все другие модули при подаче питания.
Он следит за Heart beat других модулей - специальными пакетами, получение которых говорит о том, что модуль жив и работоспособен.
Он же может перезагрузить модуль, если Heart beat не получил (как программно, так и выключить питание на плате).
Протокольные пакеты доставляются на CPU и тот, обработав их, совершает какое-то действие, как то: записать обновления в таблицы коммутации, сформировать ответный пакет, запросить информацию о каком-либо компоненте итд.
Управляющий модуль занимается расчётом SPF, LSP, установлением соседств по разным протоколам. Он записывает таблицы коммутации в Soft Tables оперативной памяти.

Так выглядят управляющие платы разных устройств:

https://fs.linkmeup.ru/images/articles/buffers/control_plane_module_cisco.jpg

Cisco ASR9000 RSP (Routing and Switching). Та половина, что ближе к нам. Та, что ближе к шине, - это фабрика коммутации.

https://fs.linkmeup.ru/images/articles/buffers/control_plane_module_huawei.jpg

Huawei NE40E-X8 MPU

https://fs.linkmeup.ru/images/articles/buffers/control_plane_module_juniper.jpg

Juniper RE100

https://fs.linkmeup.ru/images/articles/buffers/control_plane_module_juniper_2.jpg

RE Juniper 1800

На всех фотографиях вы можете легко найти CPU, RAM и батарейку BIOS. На некоторых есть HDD, на других Compact Flash. Да, вы правы - это обычный ПК. Причём современные управляющие платы действительно имеют производительность на уровне компьютера 5-6 летнего возраста.


Интерфейсный модуль или линейная карта

Это модуль, который несёт на себе физические интерфейсы и FE (чип коммутации) и выполняет функции Forwarding Plane

По большому счёту линейнкая карта модульного коммутатора - это тот же самый стоечный коммутатор только в форм-факторе платы.
Кроме интерфейсов и чипа коммутации в нём так же есть и CPU, и память, и блоки TM итд. Просто вместо обычных аплинков у неё коннекторы в общую шину, ведущие в другие платы, и ещё ей нужно общаться с управляющей платой, чтобы синхронизировать своё состояние.
Поскольку вся книга посвящена устройству коммутаторов, сильно акцентироваться я в этом месте не буду.
https://fs.linkmeup.ru/images/articles/buffers/linecard.png
https://fs.linkmeup.ru/images/articles/buffers/linecard_cisco.jpg

Так выглядит линейная карта Cisco

Плата состоит из многих компонентов, которые могут быть реализованы как в одном чипе (System-on-Chip), так и на множестве отдельных в зависимости от класса устройства и архитектуры.

https://fs.linkmeup.ru/images/articles/buffers/linecard_details.png

Основные части линейной карты:

  • Собственно интерфейс
  • PHY
  • MAC
  • FE - Forwardin Engine (Ingress/Egress)
  • TM - Traffic Manager (QoS)
  • Fabric Interface
Иногда часть этих компонентов может выноситься на отдельный извлекаемый модуль - PIC (Physical Interface Card). | Например, на нём могут быть интерфейсы, PHY и MAC.
https://fs.linkmeup.ru/images/articles/buffers/pic_juniper.jpg

Так выглядит Juniper MIC (Modular Interface Card), совмещённый с чипом PIC

Интерфейс

Электрический/оптический любого форм-фактора.
Реализует возможность подключения провода в устройство через стандартный тип порта.

PHY

PHY занимается задачами физического уровня:

  • Конвертация сигнала между средами (оптика-медь), если это нужно
  • Восстановление битов из сигналов и наоборот
  • Коррекция ошибок
  • Синхронизация
Если интерфейс обычный медный, интегрированный, то чип PHY находится на плате и металлическими дорожками соединён с самим интерфейсом.
Если же интерфейс предполагает использование трансивера, то чип PHY обычно находится уже на этом трансивере.

MAC

Модуль MAC выполняет задачи канального уровня - Ethernet. Чаще всего является частью чипа коммутации, но не всегда.

FE - Forwarding Engine

FE или чип коммутации реализует все функции, связанные с коммутацией и маршрутизацией:

  • Запросы к CAM/TCAM
  • Трансформация Soft Table в Hard Table
  • Принятие решения о передаче пакета (ACL, полисинг)
  • Коммутация/Маршрутизация
  • Маркировка приоритетов
  • Зеркалирование
  • Обнаружение протокольных пакетов
  • Обработка сигналов/пакетов от CPU.

Далее ВНИМАНИЕ! Это один из очень важных моментов!

Во-первых, FE делится на Ingress FE и Egress FE. Первый обрабатывает соответственно пакеты на входном тракте, второй - на выходном.
С одной стороны это разделение терминологическое - пакет пришёл на Ingress FE и далее должен быть отправлен на Egress FE, возможно, другой платы.
С другой, разделение - зачастую вполне физическое: внутри одного FE чипа живут эти две сущности: Ingress и Egress. Это и логично - ведь плата может быть как точкой входа, так и точкой выхода.
Это же верно и для одночиповых коробок, монолитный чип коммутации резделяется на входной и выходной тракты.

Во-вторых, именно входной FE входной линейной карты определяет всю дальнейшую судьбу пакета в пределах узла:

  • Вид будущих заголовков
  • Приоритет внутри узла и при передаче вовне
  • Выходной FE и интерфейс
  • Какой именно из физических членов LAG или ECMP

с небольшой оговоркой, что выходной тракт всё-таки может ещё произвести репликацию пакета или зарезать его по ACL

В-третьих, FE должен идентифицировать протокольные и исключительные пакеты в транзитном трафике и передавать их на CPU.
Соответственно и получать пакеты (или инструкции) от CPU - тоже его работа.
Рядом с FE находятся CAM, TCAM и RAM, куда FE обращается в поиске выходного интерфейса и проверки ACL.
Они хранят Hard Tables.

QoS или TM - Traffic Manager

В одночиповых коммутаторах TM обычно является частью чипа коммутации, в модульных может стоять отдельно.
Управлению трафиком, памяти и буферам посвящена львиная часть этой книги, поэтому здесь коснусь этого только вскользь.

Задача TM - выделять очереди, следить за перегрузками и рапоряжаться трафиком таким образом, как того требует дизайн QoS и маркировка пакетов (Congestion Avoidance и Congestion Management). Он же занимается репликацией BUM-трафика.

Fabric Interface

Чип, который обеспечивает взаимодействие с фабрикой коммутации. Может быть как частью FE, так и самостоятельным. Зачастую трафик на фабрику отправляется не как есть, а разбивается на ячейки одинакого размера, чтобы максимально равномерно загрузить все существующие линии. Это, а также передача метаданных - задача данного чипа.


Фабрика коммутации

Если мы возьмём Hi-End маршрутизатор операторского класса, то обычно в нём может насчитываться до двух десятков интерфейсных плат, в каждой из которых установлен как минимум один чип коммутации FE. Каждый чип коммутации смотрит частью своих ног в сторону интерфейсов, а частью в сторону задней шины. И ног там предостаточно, потому что медная среда имеет свой предел по пропускной способности - нам не хватит одного-двух выходов.

https://fs.linkmeup.ru/images/articles/buffers/fabric_1.png

Как связать друг с другом два чипа коммутации? Ну просто же:

https://fs.linkmeup.ru/images/articles/buffers/fabric_2.png

Как связать друг с другом три чипа? Ну, наверное, как-то так?

https://fs.linkmeup.ru/images/articles/buffers/fabric_3.png

Как связать 8?

https://fs.linkmeup.ru/images/articles/buffers/fabric_8.png

Уверены? Ничего не смущает?

Пропускная способность системы из 8 чипов остаётся той же, что и у пары - ведь каждый раз мы уменьшаем количество ног для связи.
Второй момент, как нам вообще создать полносвязную топологию, если чипов, допустим, 16, и каждый из них имеет по 32 контакта? 16*15/2 пучков кабелей по 32 жилы в каждом?
Эта проблема была адресована неблокирующимся сетям Клоза или сетям без переподписки.
У нас есть входные коммутационные элементы (Ingress FE), выходные (Egress FE) и транзитные. Задача транзитных - связать входные с выходными. Любой входной связан с любым выходным через транзитный.
https://fs.linkmeup.ru/images/articles/buffers/3_stage_fabric.png

Входные и выходные не связаны друг с другом напрямую, транзитные также не имеют связи.

Вот этим и напичканы фабрики коммутации в современных маршрутизаторах - очень тупые ASIC, которые только и умеют, что быстро перекладывать пакеты со входа на выход.
Плата коммутации подключается к задней шине и имеет связность со всеми другими платами.
Обычно они работают в режиме N+1 - то есть все разделяют нагрузку, но при выходе из строя одной платы, оставшиеся берут всё на себя.
Кстати, сами платы можно вполне назвать верхним каскадом иерархии фабрики Клоза.

Очень подробно топологии Клоза и их применения в современных ДЦ я разбирал в статье Как построить Гугл. Или сети современных датацентров

Остался только вопрос по ячейкам. Ну и перекладывали бы эти ASICи пакеты сразу, зачем их ещё нарезать?
Здесь можно провести аналогию с ECMP. Если кто-то когда-либо настраивал попакетную балансировку между различными путями, то он, наверняка, помнит, сколько боли это доставляло. Неупорядоченная доставка пакетов, с которой с горем пополам справляется TCP, может основательно поломать IP-телефонию или видео, например.
Проблема в попакетной балансировке в том, что два пакета одного потока спокойно могут пойти разными путями. При этом один из них маленький и очень быстро долетит до получателя, а другой акселерат-переросток - застрянет в узком буфере. Вот они и разупорядочились.
https://fs.linkmeup.ru/images/articles/buffers/fabric_cells.png

То же происходит и на фабрике.

Неплохой метод борьбы с этим - попоточная балансировка - вычисляется хэш по кортежу значений (SMAC, DMAC, SIP, DIP, Protocol, SPort, DPort, MPLS-метка итд.) и все пакеты одного потока начинают передаваться одним путём.

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

Элегантное решение выглядит следующим образом:
Пакеты нарезаются на ячейки одинакового маленького размера.
Ячейки балансируются поячеечно. То есть одна ячейка сюда, другая - туда, третья - в следующий линк итд.
Каждая ячейка пронумерована, поэтому, когда она приходит на нужный FE - легко собирается обратно в целостный пакет.
Поскольку расстояние от входа до выхода примерно одинаковое, размеры ячеек одинаковые, время их доставки тоже примерно одинаковое.

Идея Чарльза Клоза, которая сначала была реализована на телефонных станциях, затем была заимствована в Ethernet-коммутаторы и далее маршрутизаторы, ныне нашла своё место в сетях ЦОДов, заменив собой классическую трёхуровневую модель.

Так выглядят фабрики коммутации

https://fs.linkmeup.ru/images/articles/buffers/fabric_card_huawei.jpg

Huawei NE40E-X16

Часто фабрика совмещается с управляющим модулем в одном слоту для экономии пространства в шасси и оптимизации вентиляции.

https://fs.linkmeup.ru/images/articles/buffers/fabric_card_juniper.jpg

Juniper

https://fs.linkmeup.ru/images/articles/buffers/fabric_card_huawei_x8.jpg

Huawei NE40E-X8